mikmas napisał: W momencie, gdy pojawi się sygnał na ICP (szczerze mówiąc traktuję go jako zwykłego INT-a, bo ICR-a nie potrzebuję) wchodzi w przerwanie i teraz odbiór sygnału RC-5 jest absolutnie priorytetowy, więc wszystko blokuję (może nawet i dałbym cli() aby globalnie wyłączyć przerwania, a sei() po zakończeniu przerwania ICP, aby nie tracić taktów na np. OVERFLOW zliczający czas rzeczywisty - jest wysoce priorytetowy, ale nie aż tak).
Więc jednak nie do końca rozumiesz, jak działają przerwania na AVR - po przyjęciu przerwania wszystkie przerwania pozostają zablokowane aż do zakończenia obsługi, chyba że jawnie je odblokujesz. Wiec to co napisałeś za bardzo nie ma sensu.
Pomijajac więc samą ideę pętli w przerwaniu (nie chcę mi się dyskutować o tym, dlaczego to jest złe podejście) to widzę takie problemy z realizacją Twojej idei:
- Dokładność liczenia opóźnień funkcją delay może nie być wystarczająca.
- Nigdzie nie upewniasz się, że odebrane zbocze jest faktycznie początkiem bitu start a nie środkiem transmisji (tzn. że od poprzedniego zbocza minęło wystarczająco dużo czasu).
- Jeżeli chcesz faktycznie robić uproszczony odbiór a'la UART, to powinieneś próbkować sygnał w środku okresu ważności, czyli idealnie po 444,5 us od pierwszego zbocza, bo na wyjściu TSOP występują przesunięcia fazy w zależności od siły sygnału itp. Twoje 5us jest zdecydowanie nie wystarczające, poza tym nie uwzględniasz czasu wejścia w obsługę przerwania.
- Nie pokazałeś gdzie ustawiasz flagę IR::capturingIR, ale nie wydaje się ona mieć żadnego sensu.
- Nie pokazałeś jak czytasz wynik odbioru, więc trudno ocenić, czy prawidłowo.