Witam,
mam chyba dość banalny problem z timerem T1 w ATtiny45. Otóż celem jest generowanie przerwania co około 40 ms - czyli zadanie wydaje się praktycznie śmiesznie proste. Proste było w 8051, ale AVR mi się stawia.
Do tego celu zaprzągnąłem timer T1 w konfiguracji „match compare”. Przy kwarcu 8 MHz, preskalerze 2048 oraz wartości OCR1A = 156 powinienem uzyskać przerwanie co 39,9 ms [ (1/8 MHz) * 2048 * 156 = 39,9 ms]. Kod zamieszczam poniżej:
W obsłudze przerwania wstawiłem Breakpointa.
Reakcja symulatora jest następująca:
1. W Atmel Studio 6.1, pierwszy skok do obsługi przerwania występuje wprawdzie po około 40 milisekundach (super!), ale kolejne skoki do obsługi przerwania występują już co 65,5 milisekund (lipa!). Doszedłem do tego, że te 65,5 milisekund, to dokładnie tyle, ile potrzebuje timer by się przepełnić (skok z wartości 255 do 0). Nie rozumiem tego, bo przecież w moim OCR1A jest ciągle 156 i przerwanie jest tak skonfigurowane, że ma reagować na „match compare”, a nie na przepełnienie timera. No a nawet, jeśli miałoby to reagować na przepełnienie, to przecież obsługa tego jest pod innym wektorem przerwania, niż mój.
2. W AVR Studio 4.19 w ogóle nie następuje skok do obsługi przerwania. Symulator i debugger działają (rejestry się zmieniają, program counter i stack pointer też nie stoją w miejscu), ale nie rozumiem, dlaczego przerwanie w ogóle nie jest obsługiwane.
Widzicie tu błąd (błędy)? Dlaczego to nie działa zgodnie z założeniem? Czy Atmel robi jakąś lipę ze środowiskiem 4.19?
mam chyba dość banalny problem z timerem T1 w ATtiny45. Otóż celem jest generowanie przerwania co około 40 ms - czyli zadanie wydaje się praktycznie śmiesznie proste. Proste było w 8051, ale AVR mi się stawia.
Do tego celu zaprzągnąłem timer T1 w konfiguracji „match compare”. Przy kwarcu 8 MHz, preskalerze 2048 oraz wartości OCR1A = 156 powinienem uzyskać przerwanie co 39,9 ms [ (1/8 MHz) * 2048 * 156 = 39,9 ms]. Kod zamieszczam poniżej:
Kod: C / C++
W obsłudze przerwania wstawiłem Breakpointa.
Reakcja symulatora jest następująca:
1. W Atmel Studio 6.1, pierwszy skok do obsługi przerwania występuje wprawdzie po około 40 milisekundach (super!), ale kolejne skoki do obsługi przerwania występują już co 65,5 milisekund (lipa!). Doszedłem do tego, że te 65,5 milisekund, to dokładnie tyle, ile potrzebuje timer by się przepełnić (skok z wartości 255 do 0). Nie rozumiem tego, bo przecież w moim OCR1A jest ciągle 156 i przerwanie jest tak skonfigurowane, że ma reagować na „match compare”, a nie na przepełnienie timera. No a nawet, jeśli miałoby to reagować na przepełnienie, to przecież obsługa tego jest pod innym wektorem przerwania, niż mój.
2. W AVR Studio 4.19 w ogóle nie następuje skok do obsługi przerwania. Symulator i debugger działają (rejestry się zmieniają, program counter i stack pointer też nie stoją w miejscu), ale nie rozumiem, dlaczego przerwanie w ogóle nie jest obsługiwane.
Widzicie tu błąd (błędy)? Dlaczego to nie działa zgodnie z założeniem? Czy Atmel robi jakąś lipę ze środowiskiem 4.19?
