Например TDA7294

РадиоКот > Статьи

Некоторые протоколы ИК-пультов. Часть вторая

Автор - Aheir, aheir@radiokot.ru
Опубликовано 03.03.2008.

Продолжаем разговор, начатый в первой части. Сегодня будем разбираться с протоколом RC5. В отличие от уже рассмотренных, здесь кодирование информации осуществляется не длительностью импульса, а с помощью так называемого бифазного кода. Строго говоря, согласно словарю терминов "Телевидение и радиовещание" (авторы: В.А. Хлебородов, П.П. Олефиренко, под редакцией проф. М.И. Кривошеева), бифазный код - это однополярный код, предусматривающий инвертирование выходного сигнала в начале и в середине тактового интервала для одного логического состояния и только в середине тактового интервала для его другого логического состояния. Другими словами, переход уровня из лог.0 в лог.1 следует трактовать как единичный бит, а переход из лог.1 в лог.0 - как нулевой бит... М-да, начало забористое получилось, на самом деле это довольно просто и все это безобразие можно увидеть на рисунке:

Способ кодирования информации

Такой способ кодирования информации называется еще манчестерским кодом или кодировкой и дстаточно широко применяется для передачи данных как по радиоканалу, так и в проводных или волоконно-оптических линиях связи, поскольку гарантирует смену напряжения в середине периода битов, что позволяет приемнику синхронизироваться с передатчиком без использования каких-либо дополнительных средств.
Кодовая посылка ИК-пульта, переданная по протоколу RC5, выглядит примерно так:

Кодовая посылка RC5

Как и в прошлый раз, с информацией сильно помог http://www.sbprojects.com и осциллограф. :) Напоминаю, что на картинке представлено то, что будет на выходе интегрального приемника TSOP1736, причем в инвертированном виде - такова уж специфика его работы, на выходе он дает огибающую несущей частоты, 36кГц в данном случае. На самом деле, бит 0 или 1 выглядит так:

0 и 1

а этот "забор" из импульсов не что иное, как 32 импульса несущей частоты, 36кГц - можете посчитать их длительность, все сойдется. Длина каждого бита должна быть 1.778мс.
Разберем кодовую посылку по битику... Состоит она из 14 бит. Первые два бита (S1 и S2) - стартовые, они всегда должны быть 1. Следующий бит (T; от "toggle") - триггер, он инвертируется каждый раз, когда на пульте нажимается кнопка, и служит для того, чтобы можно было отличать многократное нажатие кнопки от ее удержания, поскольку при длительном нажатии мы увидим следующее:

Длительное нажатие кнопки

Как видно, длительность посылки составляет без малого 25мс, а период их повторения - 114мс. В посылке после триггер-бита идут 5 байтов адреса устройсва, за ними - 6 бит команды. Если последний бит в посылке 0, то визуально (на экране осциллографа) посылка будет казаться короче указанных 25мс. Существуют также модернизированные версии этого протокола, где за счет одного из стартовых битов увеличивается разрядность команды, но их мы касаться не будем.

Обрабатывать полученный от приемника сигнал мы поручим, как и в прошлый раз, микроконтроллеру, более того, аппаратное обеспечение также останется неизменным. Поэтому - повторюсь: "В плане аппаратной реализации нам достаточно подсоединить выход фотоприемника к ножке свободного внешнего прерывания микроконтроллера, сконфигурированной как вход с «подтяжкой» (не лишним будет также поставить и внешний подтягивающий резистор на 10кОм к плюсу питания)".
А вот программная часть подвергнется существенной переработке. Дело в том, что решение о принятой 1 или 0 следует выносить не только на основании длительности принятого импульса, но и учитывать состояние линии в предыдущем опросе. Для более простой реализации этого внешнее прерывание будет у нас срабатывать по любому изменению сигнала, а не только по спаду, как было в прошлый раз. Алгоритм вырисовывается примерно такой:
1. По входу в прерывание зафиксировать значение в таймере-счетчике и сбросить его, запустив на новый счет.
2. По значению таймера-счетчика определить, сколько времени прошло с последнего срабатывания: примерно 889мкс или вдвое больше (примерно 1.778мс), что говорит о комбинации 1-0 или 0-1 в коде, в зависимости от состояния линии.
3. На основании измеренного времени и текущего состояния линии вынести решения о принятом бите, сохранить его в массив принятых данных.
4. Если какое-либо из граничных условий не выполнено (ошибка приема) - сбросить все переменные и подготовить устройство к новому циклу приема.
5. Если приняты все биты последовательности - сформировать набор выходных данных.
Примерно с такими мыслями я и занялся поисками информации. Естетсвенно, вопрос оказался не новым и многие люди по всему миру уже им задавались. Однако в найденных исходниках комментарии на английском были невразумительные, а немецкий я просто не знаю, к тому же все равно запустить найденное не удалось. :) Тем не менее, велосипед с нуля изобретать не пришлось, поскольку нашелся исходник коллеги Goodefine (обсуждение этого кода происходит здесь). В ходе личного общения автор любезно разрешил использовать свой код и модифицировать его, поэтому в конце этого материала желающие могут скачать соответствующий архив.
Увидев в этом коде отражение собственных мыслей, на его основе, исключив лишние функции и добавив, на мой взгляд, необходимое, я и написал свой вариант обработчика принимаемого с пульта RC5 кода. Целевой МК - ATMega16, тактируется от внутреннего генератора на частоте 8МГц. Используется нулевое прерывание (PORTD.2) и нулевой 8-ми битный таймер-счетчик. В случае изменения тактовой частоты или частоты счета таймера потребуется пропорциональное изменение значений констант, задающих диапазон, в котором должна лежать измеренная таймером длительность интервалов. Я постарался максимально подробно прокомментировать исходники, однако, если будут вопросы, то, думаю, разберемся. :)

Макет

Вопросы, как обычно, складываем тут.

Файлы:
Исходники от Goodefine (Goodefine@yandex.ru)
Альтернативный (мой :) ) вариант


ID: 20

Как вам эта статья?

 Нравится
 Так себе
 Не нравится

Заработало ли это устройство у вас?

 Заработало сразу
 Заработало после плясок с бубном
 Не заработало совсем

10
1
Подробно