Поскольку большинство увиденных мною исходников декодирования сигнала RC5 были завязаны с таймером и прерыванием INT0, решил написать свой алгоритм обработки ИК-приемника.
Приемник RC5, код запускается по таймеру (не меньше 4кгц), принимает команду с пульта и возвращает в глобальную переменную. RC5_Receiver - вывод, куда повесили ИК-приемник.
irCode, cod - unsigned long (было сделано с запасом), остальные переменные - char
Код: Выделить всё
if (!RC5_Receiver)
{
prevState = 1;
i = 0;
biit = 1;
cod = 1;
while(!RC5_Receiver) {};// синхронизация с началом импульса
while (i < 30)
{
delta = 0;
state = RC5_Receiver;
while(state == prevState && delta < 35)
{
delta++;
delay_us(100);
state = RC5_Receiver;
}
if(!((delta > 5 && delta < 11) || (delta > 12 && delta < 26))) break;
if (delta > 12)
{
// комбинации 1-0 или 0-1 в коде, в зависимости от состояния линии
if(state == 1) biit = 0; else biit = 1;
i++;
cod = cod << 1;
cod = cod | biit;
}
else
{
if(state == 0)
{
i++;
cod = cod << 1;
cod = cod | biit;
}
}
prevState = state;
}
if (i<13) cod = 0;
irCode = cod;
}


