Visits: 1021
Множество изготовителей для своих пультов дистанционного управления на ИК лучах используют принцип широтно-импульсной модуляции. В таких кодах бит единицы представляется импульсом большой длительности, а ноль импульсом короткой длительности.
Внешний вид последовательности имеет следующий вид (на выходе ИК приемника):
Характеристики такой передачи следующие.
Преамбула начала передачи данных – 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
64 downloads
CCP модуль для декодирования ИК-кодов пультов...
Это может быть интересно
- Часы-кухонный таймерVisits: 3868 Каждая кухня должна иметь кухонный таймер, который позволяет напоминать хозяйке когда проходить определенный промежуток времени. Например, печем пирог, варим яйца… , чтобы не смотреть постоянно на часы, установим таймер и …
- Проект с использованием MCC часть 04Visits: 1092 Теперь простого горения светиков нам не достаточно, заставим их мигать. Для начала используем первобытно простой способ, но достаточно простой. Используем функции delay, напрягаться откуда они берутся не будем, самое …
- Гаджеты для домашней автоматики – Датчик приближенияVisits: 1926 Управление светодиодным освещением – Датчик приближения. Данный гаджет предназначен для управления внутренним освещением мебели. Датчик позволяет определить закрытие или открытие дверцы или ящика и при этом включать или …
- ch-4000 – универсальная печатная платаVisits: 983 На смену устаревшей плате ch-3000, пришла новая ch-4000. Плату уже можно приобрести в магазине Ворон. Схема. Плата позволяет создавать таймеры, часы реального времени, регуляторы температуры, регуляторы влажности, вольтметры, …
- Ultrasonic Level Meters – ULM –53LVisits: 697 Измерение расстояния при помощи ультра звукового датчика ULM–53L–10. Диапазон измерения от 0,5 м до 10 м, полностью пластмассовый излучатель PVDF, механическое соединение фланцем из полиэтилена HDPE (исполнение “N”) Характеристики …
- Система отопления на солнечных коллекторах от Дмитрия (rv3dpi)Visits: 3162 Солнечные коллекторы для отопления в Европе используют в более 50% от общего количества установленных гелиосистем. Однако следует понимать, что гелиосистемы предназначены лишь для поддержки отопления и экономии затрат на основную …
- LED модуль P10C4V12Visits: 3058 LED панели на обычных регистрах типа 74HC595. Они выпускаются как монохромные так двух и полно цветные, особенность, что они предназначены для текстовой информации и имеют один уровень яркости. Общую яркость …
- Мультимедийная сеть – AVC-LAN TOYOTAVisits: 5661 AVC LAN – протокол обмена данными мультимедийных систем автомобиля. Кодирование данных. При кодировании различаться три типа данных : преамбула – её назначение, это сообщение устройствам на шине, что начинается передача данных. …
- Проект с использованием MCC часть 12-1Visits: 892 В настоящее время без визуализации информации уже не интересно. Поэтому научимся выводить информацию на дисплей. Для это возьмет простенький OLED RET012864E/REX012864J я такой приобретал в фирме “Гамма-Украина”, описание можно …
- Altium Designer my Libraries, Project templates, System settings by Catcatcat V24.0 PROVisits: 108 Назвемо цей варіант поновлення для професіоналів і не тільки. Що нового? 1. Повністю змінено структуру параметрів бази даних компонента. Це дозволило повноцінної роботи Актив ВОМ. Ви відразу отримуєте …