werbatyna napisał: Zaloguj się, aby zobaczyć kod
Załóżmy, że to też błąd przy wklejaniu kodu (inaczej asembler zgłosiłby błąd). Powinno być
R21, a nie
R121.
werbatyna napisał: Zaloguj się, aby zobaczyć kod
Być może to też błąd przy wklejaniu. Bity
WGM12,
CS12 oraz
CS10 nie znajdują się w rejestrze
TCCR1A tylko w
TCCR1B.
Istotne jest jednak to, że ustawiając tylko bit
WGM12 ustawiasz TIMER1 w tryb 4, czyli tryb CTC, w którym timer liczy od 0 do wartości MAX zawartej w rejestrze
OCR1A. Ty do tego rejestru nic nie wpisujesz, a po załączeniu zasilania (po
Power-on reset) jego wartość wynosi 0. Timer zlicza więc od 0 do 0, a wartość OCR1B, przy której następuje przerwanie, jest dużo większa, więc przerwanie nigdy nie wystąpi. Pomiń ustawianie bitu
WGM12 lub wpisz do
OCR1A wartość większą od
OCR1B.
Dodatkowy problem jest taki, że w przerwaniu od timera dobrze byłoby go wyłączyć (np. poprzez wyzerowanie bitów
CS12 i
CS10), bo po pierwszym naciśnięciu przycisku przerwanie będzie występować na okrągło nawet, jak przycisk nie zostanie naciśnięty. Przy tak prostym programie to może nie ma znaczenia, ale kiedy zostałby nieco rozbudowany, cykliczne zerowanie PORTA może nie być pożądane.
Podobnie może być z drganiami styków. Przy tym kodzie może będzie to niezauważalne, jednak trzeba wziąć pod uwagę, że ze względu na drgania styków procedura obsługi przerwania
int_ext może wykonać się kilkakrotnie, co (w przypadku innego kodu) może powodować problemy.
To tyle, co zauważyłem. Nie mogę całkowicie wykluczyć innych błędów.