
Views: 1111
Множество изготовителей для своих пультов дистанционного управления на ИК лучах используют принцип широтно-импульсной модуляции. В таких кодах бит единицы представляется импульсом большой длительности, а ноль импульсом короткой длительности.
Внешний вид последовательности имеет следующий вид (на выходе ИК приемника):
Характеристики такой передачи следующие.
Преамбула начала передачи данных – 13510 мс*
Бит нуля – 1131 мс*
Бит единицы – 2257 мс*
Преамбула авто повтора – 11270 мс*
Период между преамбулами авто повтора – 96270 мс*
*-все величины могут иметь допуск ± 5%
Количество передаваемых бит 32 (4 байта).
Декодирование такого типа передач заключается в измерении периода импульсов и при помощи простой логики определения к какому типу они относятся – преамбуле или битам данных. Вот для такой процедуры, очень удобно использовать стандартный модуль CCP в режиме захвате для определения длительности импульса.
А теперь с самого начала как настроить модуль для измерения как измерять и как декодировать. Для примера выберем микроконтроллер PIC16F1936. Мы видим, что все данные измеряются в миллисекундах, для этого нам необходим источник тактовых импульсов длительностью 1 миллисекунда.
Контроллер настроен для работы с внутренним генератором и тактовая составляет 32 МГц.
Для работы выберем модуль CCP4, вход его подключен к выводу порта RB0. Настройка, для работы по каждому отрицательному перепаду:
CCP4CON=0b00000100; // вход RB0 // ++++-- CCPxM<3:0>: режим работы - Capture mode: every falling edge
Модуль работает совместно с таймером, для этого настроим Т1:
T1CON=0b00110001; // настройка таймера T1CON // |||||| | // |||||| +-- TMR1ON таймер включить // |||||+---- T1SYNC синхронизация отключена // ||||+----- T1OSCEN генератор отключен // ||++------ T1CKPS настройка предделителя 11 = 1:8 Prescale value // ++-------- TMR1CS выбор тактовой частоты FOSC
Вся обработка будет происходить через прерывания, для этого настроим прерывания:
INTCON = 0b11000000; // включить прерывания глобальные, от периферии и на изменение состояния на входе CCP4IE = 1; // разрешить прерывания от CCP4 TMR1IE = 1; // прерывание от таймера 1 разрешить
После этого модуль готов к работе, далее необходимо описать функцию (в прерываниях) которая позволить определять типа полученного байта и формировать данные.
Но для начала опишем логику приема сигнала, так как не удобно в WP сделать блок схему, поэтому опишем на пальцах.
- Когда нет ИК сигнала таймер Т1 считает импульсы и время от времени переполняется и вызывает прерывания. В программе прерывания выполняется сброс флага прерывания от Т1 и устанавливается флаг ожидания приема (это надо для выполнения условий помехозащищенности).
- CCP модуль ожидает прихода импульсов с ИК приемника. Как только приходит любой импульс (отрицательный перепад) на вход модуля значение таймера Т1 загружается в регистры CCPR4H и CCPR4L.
- После этого необходимо загрузить данные в регистр длительности и обнулить таймер Т1 для готовности отсчета длительности следующего байта.
- После этого проверяем полученную длительность:
- если длительность в области 13510 мс – это значит мы получили начала приема ИК кода
- если длительность в области 11270 мс – это код автоповтора, т.е. удерживается клавиша на пульте нажатой.
- если длительность в области 1131 мс – это получен бит 0.
- если длительность в области 2257 мс – это получен бит 1. Допуски для этих длительностей устанавливаем по своему опыту, но скажу одно чем ближе к полученному значению, тем выше помехозащищенность, но тем ниже чувствительность, так что тут, нужен компромисс.
- Если получено начало кода, необходимо сбросить флаг ожидания приема (идет прием данных), это запретит повторное начало. И необходимо инициализировать счетчик принимаемых бит, для нас это 32 (32 бита в команде ИК).
- Далее мы ожидаем импульсов длительностью 1131 мс или 2257 мс, если они приходят, то подсчитываем 32 бита и по получению последнего устанавливаем флаг ИК передача принята, для работы с автоповтором, устанавливает флаг разрешить прием автоповтор (это если он нужен).
Этого вполне достаточно, если нет внешних ИК помех. Дело в том, что часто лампы дневного света генерируют, очень большой спектр ИК помех и существует возможность ситуации, что ИК приемник (несмотря на свою избирательность) будет формировать на выходе импульсы. которые модулю CCP придется обрабатывать, а сформировать с него последовательность он не сможет. Тут тоже надо идти на компромисс, существует два метода:
- блокировать работу CCP модуля пока ИК – эфир не будет очищен, (т.е пока вы не найдете неисправную эконом лампу и её не замените).
- или пытаться несмотря на помехи “выдрать” из всего этого правильную последовательность.
Первый метод самый простой и не требует много ресурсов, логика работы сводиться к тому если CCP модуль получает данные не соответствующие данным ИК передатчика пульта, обработка данных блокируется и мы ждем переполнение таймера, для возобновления работы, (т.е. таймер переполниться когда не будет ИК помех). Но часто от помех избавиться не возможно, а необходимо все таки получить команду. Для этого применим следующий метод (правда он намного трудоемок, но дает отличные результаты), его работа заключается в том, что CCP модуль получает разрешения на прерывания, только в ожидаемые промежутки времени прихода данных. Во все остальное время прерывания от CCP модуля отключены.
Для начала приведем пример для обычного приема ИК команд
void interrupt my_isr(void) // прерывания { #define CLOBIT 32 // количество бит в передаче if(CCP4IF)// ИК приемник { CCP4IF=0; // сброс вектора прерывания. pwm_reg = CCPR4L; // pwm_reg += CCPR4H << 8; // TMR1L=0; // TMR1H=0; // if(pwm_reg>13400&&pwm_reg<13600&&NACH) // передача синхроимпульса должна сопровождаться переполнением таймера { chetchic=CLOBIT; //счетчик бит (3 байта 8*3=24) NACH=0; } else if (pwm_reg>11000&&pwm_reg<12000&&POV) // передача "бита автоповтора" { // POV - блокировка функции автоповтора если не было перед этим передачи команды AUTO=1; timerautopo=5;// инициализация таймера, блокировки автоповтора } else if (pwm_reg>2100&&pwm_reg<2300&&chetchic>0) // передача "1" { bait01<<=1; bait01 |= 1; chetchic--; // подсчет принятых бит if(!chetchic){PRIEM=1;POV=1;} // 32 установить флаг команда принята если переданы все 32 бита } else if (pwm_reg>1000&&pwm_reg<1200&&chetchic>0)// передача "0" { bait01<<=1; chetchic--;//подсчет принятых бит if(!chetchic){PRIEM=1;POV=1;}// установить флаг команда принята если переданы все 32 бита } else // помеха { NACH=1; chetchic=0; } } if(TMR1IF) { TMR1IF=0; // if(--timerautopo==0)POV=0; // таймер блокировки автоповтора если не было передачи команды NACH=1; chetchic=0; } }//
В процессе ожидания устанавливается флаг NACH – готовности ожидания команды. Все формируемые импульсы фотоприемником обрабатываются и проверяются на заданные длительности. Если импульс не соответствует длительности преамбулы приема данных программа находиться постоянно в поиске начала команды.
Как только получено начало, инициализируется счетчик приема количества байт chetchic=CLOBIT (счетчик бит 3 байта 8*3=24) и сбрасывается флаг ожидания начала NACH=0. Это переключает программу в работу только двух длительностей нуля или единиц. Если длительность полученного импульса не соответствует требуемых заданных данных, цикл приема прерывается и программа ждет повтора команды. Такая логика дает возможность предотвратить получение не верной команды.
Раскодирование пульта
Коды приведены в шестнадцатеричном значении, так проще понимать их структуру.
Клавиша | Код | Клавиша | Код | Клавиша | Код |
Exit | 0x00FFF906 | MUTE | 0x00FF29D6 | TV | 0x00FFBB44 |
POWER | 0x00FF21DE | * | 0x00FF8B74 | Zoom | 0x00FFb946 |
1 | 0x00FFE11E | # | 0x00FF46B4 | CHL+ | 0x00FF6996 |
2 | 0x00FF619E | Back | 0x00FF01FE | CHL- | 0x00FF8976 |
3 | 0x00FFA15E | Clear | 0x00FF2bd4 | VOL+ | 0x00FFC936 |
4 | 0x00FFD12E | ↑ | 0x00FF817E | VOL- | 0x00FF31CE |
5 | 0x00FF51AE | ↓ | 0x00FF11EE | FAV | 0x00FFA956 |
6 | 0x00FF916E | → | 0x00FF41BE | MODE | 0x00FFD926 |
7 | 0x00FFF10E | ← | 0x00FF09F6 | MENU | 0x00FF7986 |
8 | 0x00FF718E | OK | 0x00FF9966 | EPG | 0x00FF39C6 |
9 | 0x00FFB14E | º RECORD |
0x00FFC13E | SUB | 0x00FFE916 |
0 | 0x00FF49B6 | → PLAY |
0x00FF7B84 | SWAP | 0x00FF59A6 |
[] STOP |
0x00FF3BC4 | || PAUSE |
0x00FF19E6 | ←← REW |
0x00FFDB24 |
→→ FWD |
0x00FF5BA4 | |← REPLAY |
0x00FF9B64 | →| SKIP |
0x00FF1BE4 |
Сводная таблица по кодам ИК пультов дистанционного управления некоторых производителей в формате MExcel, собраны данные о кодах, изображение последовательностей, данные длительностей.
CCP модуль для декодирования ИК-кодов пультов ДУ - сводная таблица по кодам.
1.95 MB
79 downloads
CCP модуль для декодирования ИК-кодов пультов...
Это может быть интересно
Altium Designer my setup system and project structure
Views: 869 Используйте только последнее обновление!!! Updates https://catcatcat.d-lan.dp.ua/altium-designer-my-libraries-project-templates-system-settings-by-catcatcat-v23-09/ Тут хочу поделиться как я настраиваю Altium Designer и как я использую файлы DXPPreferences.DXPPrf для быстрой конфигурации и получения …PIC18F25K42 – v. A001 – выявленные баги.
Views: 709 Модуль I2C Не работает при использовании в стандартной конфигурации MCC. Требует особой нестандартной конфигурации и управления для нормальной работы. Обойти Обход проблемы возможен библиотека см статью. Модуль ADC2 На …Ultrasonic Level Meters – ULM –53L
Views: 756 Измерение расстояния при помощи ультра звукового датчика ULM–53L–10. Диапазон измерения от 0,5 м до 10 м, полностью пластмассовый излучатель PVDF, механическое соединение фланцем из полиэтилена HDPE (исполнение “N”) Характеристики …MPLAB® Harmony – или как это просто! Часть 4.
Views: 2252 Часть четвертая – это может показаться немного сложно. Структура проекта. Для облегчения конфигурирования проекты MPLAB Harmony обычно структурированы таким образом, чтобы изолировать код, необходимый для настройки «системы», от …ESP8266 процедура получение данных даты и времени от серверов точного времени.
Views: 6029 Эта функция доступна уже в версии 1.6.1. Для многих приложений, необходимо часы реального времени, если в вашем проекте есть модуль WiFI ESP8266, то легко можно сделать следующим образом. …Проект с использованием MCC часть 01
Views: 2626 Для изучения MCC я выбрал простой контроллер PIC16F1509. Выбор его был обусловлен богатой новой периферией которую можно изучить. Для начала была собрана схема на макетной плате Внешний вид …Простой сенсорный регулятор света
Views: 2450 Простой сенсорный регулятор. Проект – 2007 года. Регулятор выполнена на микроконтроллере PIC12F683 и имеет минимальное количество элементов. Выполняет стандартные функции, включение выключение света, изменение яркости, запоминание последнего установленного уровня …Мультимедийная сеть – AVC-LAN TOYOTA
Views: 5812 AVC LAN – протокол обмена данными мультимедийных систем автомобиля. Кодирование данных. При кодировании различаться три типа данных : преамбула – её назначение, это сообщение устройствам на шине, что начинается передача данных. …Проект с использованием MCC часть 07
Views: 1133 Модуль PWM – широтно импульсная модуляция (ШИМ). ПИК контроллеры часто на борту имеют модули ШИМ. На их основе строятся многие узлы управления электро приводами. В нашем варианте мы …Altium Designer my Libraries, Project templates, System settings by Catcatcat V23.04
Views: 340 Смотри как установить и подключить библиотеку тут. V. – 23_04 – Component Database Update. – configuration file name – DXPPreferences1.DXPPrf. – Added two projects for audio amplifier …