Cześć wszystkim, jestem tu nowy więc przede na wstępie chciałbym wszystkich serdecznie pozdrowić.
Piszę do Was z problemem, który mam nadzieje uda mi się dzięki wam rozwiązać - mianowicie:
Piszę procedurę obsługi pilota RC5 opartego o przerwanie zewnętrzne. Rozrysowałem sobie wszystko pięknie, algorytm, maszyna stanów itp. ale poległem już na samym początku implementacji.
Odbiornik IR podłączony do pinu INT0. Obsługa przerwania wygląda tak:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Powyższy kod po naciśnięciu przycisku pilota generuje na konsoli takiego:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
czyli powiedzmy, że OK, 24 przerwania, ale gdy zmienię kod na
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
to w wyniku dostaję:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
tym razem 30 przerwań na naciśnięcie TEGO SAMEGO przycisku.
Teraz jeszcze ciekawiej:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
skutkuje:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
każda liczba pomnożona razy 32 powinna dać liczbę mikrosekund jaka minęła od ostatniego przerwania. Pierwsza może być dowolna, ale już każda kolejna powinna zawierać się w przedziale <13-69> (kwarc 8MHz, przescaler 256 -> tick zegara co 32 us), tymczasem dostaję jakieś losowe śmieci.
Kod programu jest prawie pusty. Jest tylko inicjacja timera0 i UART.
Podpowiedzcie mi proszę, co mogę robić nie tak?

PS. Dodam jeszcze, że zachowania te są całkowicie powtarzalne. Na początku podejrzewałem zakłócenia na linii odbiornik-uC, ale za każdym razem kod #1 generuje 24 przerwania, kod #2 30 przerwań, a kod #3 śmieci. Odbiornik podłączony poprawnie - zasilanie odfiltrowane.