Цитата
Я попробовал так:
имеем внешнее прерывание по любому изменению
в прерывании смотрим чего насчитал таймер...
Пока ловим стартовый бит настраиваем внешнее прерывание только на переход 0->1
запускаем таймер с прерыванием на время 3/8 длинны стартового бита
если раньше произошло новое внешнее прерывание то сбрасываем таймер и
продолжаем считать
если оказались в прерывании таймера,
перестраиваем внешнее прерывание на ловлю любого перехода,
перестраиваем прерывание таймера на 1/4 длительности бита (не выключая таймер)
при первом переходе 1->0 после срабатывания прерывания таймера запоминаем значение
длительности стартовой единички T=3/8(базовой длинны бита)+TCNT
сбрасываем TCNT
перестраиваем таймер на 5/8T
далее просто ловим переходы, при каждом переходе считываем значение TCNT
сравниваем с 3/8 необходимой длительности бита
если TCNT < 3/8 , ошибка, начинаем все с начала
если оказались в прерывании таймера то проверяем на соответствие RC5 (четный нечетный бит)
если ошибка начинаем все с начала
если все в порядке перестраиваем таймер на 1/2 бита
если все в порядке, сбрасываем TCNT и продолжаем ловить новые битики
ну и конечно по ходу не забываем записывать что же мы там напринимали
P.S. Может чего и накосячил но вроде примерно так
ЗЫЫ 3/8 и 5/8 желательно брать не точные значения а что-то типа 3/8+20тактов ЦП и
5/8- 20 тактов