При нажатии кнопки начинает циклически передаваться пакет битов, идентифицирующий эту команду. Между пакетами есть большая и вполне определенная пауза: >10мс для радиобрелка и еще больше для ИК пульта. Т.о. надо поймать паузу и затем сам пакет битов, а последующая пауза однозначно укажет на окончание пакета.
Код программы был написан под контроллер Atmega8 с тактовым
генератором 8МГц(в моем случае внутр. RC генератор) и использует следующие
аппаратные возможности:
1. Прерывание по переполнению 8-битного таймера 2. Период
переполнения примерно 8 мс;
2. Канал внешнего прерывания INT1, срабатывающий по изменению
уровня(т.е. по любому лог. уровню). К нему подключен выход радио- или ИК-приемника.
Как все это работает(алгоритм):
1. Прерывание TIM2_OVF:
-если в нормальном режиме приемный
буфер содержит команду, то она сравнивается с образцовыми командами с временным
с допуском +/- 25%. Временное "окно" в 25% необходимо потому, что тактовая
частота контроллера и пульта задается малостабильным RC генератором.
Если команда полностью совпала, то в переменную выводится номер нажатой
кнопки;
-если находится в режиме записи команды(режим
обучения), то принятая команда из приемного буфера копируется в буфер образцовой
команды. Далее может быть вызвана подпрограмма записи образцовой команды
в ПЗУ;
-выставляет флаг переполнения(была
пауза), обнуляет счетчик принятых бит команды.
2. Прерывание EXT_INT1:
-фильтрует шум, если длительность
импульсов слишком мала(<250мкс)
-разрешает прием пакета битов, если
до этого был выставлен флаг переполения(паузы) от TIM2_OVF;
-захватывает длительность(значение
TCNT2) и лог.уровень импульса если прием был разрешен;
-сбрасывает счетный регистр TCNT2
чтобы: а)избежать прерывания TIM2_OVF во время приема битов; б)при приеме
следующего импульса иметь действительное значение TCNT2.
Если используется радиобрелок, то программная фильтрация шума имеет большое значение. Особенно с дешевыми сверхрегенеративными приемными модулями. Следующая осциллограмма показывает эфирный шум на выходе такого приемника:
Восновном это цифровой шум от жизнедеятельности микроконтроллера
и динамической светодиодной индикации. Однако, есть и достаточно сильные
всплески при включении приборов в осветительную сеть. Если фильтрацию шума
не сделать, то контроллер большую часть времени будет терять на бесполезную
расшифровку этого шума. Когда же радиобрелок выходит в эфир, то шум практически
исчезает.
ИК-канал более помехозащищеннный, на выходе оптического
приемника нет такого шума. Поэтому если предполагается работа только с
ИК ПДУ, то можно удалить часть кода, которая отвечает за фильтрацию коротких
импульсов.
Скачать:
Исходные коды проекта с достаточно подробными комментариями. В кодах есть только подпрограммы для работы с пультом. Вся лишняя информация, не касающаяся этой темы, была удалена.
Ссылки:
1. Некоторые протоколы ИК-пультов.
Часть первая
http://radiokot.ru/articles/14/
2. Некоторые протоколы ИК-пультов.
Часть вторая
http://radiokot.ru/articles/16/
3. Использование пультов ДУ от бытовой
техники (реализация без прерываний)
http://arv.radioliga.com/content/view/219/43/