
Множество изготовителей для своих пультов дистанционного управления на ИК лучах используют принцип широтно-импульсной модуляции. В таких кодах бит единицы представляется импульсом большой длительности, а ноль импульсом короткой длительности.
Внешний вид последовательности имеет следующий вид (на выходе ИК приемника):
Характеристики такой передачи следующие.
Преамбула начала передачи данных – 13510 мс*
Бит нуля – 1131 мс*
Бит единицы – 2257 мс*
Преамбула авто повтора – 11270 мс*
Период между преамбулами авто повтора – 96270 мс*
*-все величины могут иметь допуск ± 5%
Количество передаваемых бит 32 (4 байта).
Декодирование такого типа передач заключается в измерении периода импульсов и при помощи простой логики определения к какому типу они относятся – преамбуле или битам данных. Вот для такой процедуры, очень удобно использовать стандартный модуль CCP в режиме захвате для определения длительности импульса.
А теперь с самого начала как настроить модуль для измерения как измерять и как декодировать. Для примера выберем микроконтроллер PIC16F1936. Мы видим, что все данные измеряются в миллисекундах, для этого нам необходим источник тактовых импульсов длительностью 1 миллисекунда.
Контроллер настроен для работы с внутренним генератором и тактовая составляет 32 МГц.
Для работы выберем модуль CCP4, вход его подключен к выводу порта RB0. Настройка, для работы по каждому отрицательному перепаду:
1 2 |
CCP4CON=0b00000100; // вход RB0 // ++++-- CCPxM<3:0>: режим работы - Capture mode: <strong>every falling edge</strong> |
Модуль работает совместно с таймером, для этого настроим Т1:
1 2 3 4 5 6 7 |
T1CON=0b00110001; // настройка таймера T1CON // |||||| | // |||||| +-- TMR1ON таймер включить // |||||+---- T1SYNC синхронизация отключена // ||||+----- T1OSCEN генератор отключен // ||++------ T1CKPS настройка предделителя 11 = 1:8 Prescale value // ++-------- TMR1CS выбор тактовой частоты FOSC |
Вся обработка будет происходить через прерывания, для этого настроим прерывания:
1 2 3 |
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 модуля отключены.
Для начала приведем пример для обычного приема ИК команд
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
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
41 downloads
CCP модуль для декодирования ИК-кодов пультов...
Это может быть интересно
LCD индикаторы на драйвере ML1001
ML1001 – статический LCD GOG (чип в стекле) драйвер для 40-сегментного LCD в позолоченном противоударном исполнении. На них можно каскадно строить цельные из 80 или 120 сегментов LCD индикаторы. Описание драйвера …Емкостной сенсор
Изучаем изготовление емкостных сенсоров на PIC-микроконтроллере. Конструкция емкостных сенсоров имеет вид: Емкостные сенсоры строятся по схеме высокочастотного генератора, сам принцип основан на измерение частоты этого генератора. Частота зависит от емкости …LM317 и светодиоды
LM317 и светодиоды статья с переработанная с сайта http://invent-systems.narod.ru/LM317.htm Долговечность светодиодов определяется качеством изготовления кристалла, а для белых светодиодов еще и качеством люминофора. В процессе эксплуатации скорость деградации кристалла зависит от …Мониторинг температуры
Настоящий проект создан как обучающий с применением библиотек ds18b20 и LCDHD44780 и компилятора Microchip MPLAB XC8 C Compiler V1.12. Если необходимо иметь информацию по состоянию температуры в помещении или в здании, с количеством до 6 точек (16), то вы сможете …ch-4000 – универсальная печатная плата
На смену устаревшей плате ch-3000, пришла новая ch-4000. Плату уже можно приобрести в магазине Ворон. Схема. Плата позволяет создавать таймеры, часы реального времени, регуляторы температуры, регуляторы влажности, вольтметры, дистанционное управление …Датчик приближения от Румена Желева
Проект на Болгарском языке. Автор Румен Желев. Болгария. Проект, датчик приближения в котором устранены все недостатки влияния засветки посторонними источниками. Применен совершенно оригинальный принцип контроля ИК излучения. Основната идея на …Сенсорный выключатель света
Хотя в настоящий момент актуальны системы управления освещением с передачей данных по электросети, но я думаю, что проекты такого рода тоже имеют право на жизнь. Анонс Три вида сенсора – …Trimax – кодирование и декодирование ИК-команд
Первое, что надо понять назначение кнопок клавиш пульта, а также, что за кодирование реализовано в ИК- пульте. Для назначения клавиш обратимся к описанию, а для взлома кодирования воспользуемся старым и …MPLAB® Harmony – или как это просто! Часть 3.
Часть третья – копнём немного глубже. Вы наверное заметили, что во второй главе, вроде сначала все шло как по маслу, а потом, что бы заморгали светики, я вставил в код …Бегущие огни (ch-bo-36)
Проект на PIC-микроконтроллере PIC16F648A. Количество каналов 36. Для индикации используется подключение по матрице 6х6. Расположение светодиодов в одну линию. Все эффекты написаны для возможности увеличения количества светодиодов. Рекомендуется увеличивать кратно …