Cytuj:
Jak Powinno wyglądać uruchomienie timera w ATmega8A?
Może przedstawię to na kodzie którego sam używam.
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
1/ Do tego momentu masz wszystko dobrze.
2/ Hmm dlaczego w tej linijce w nawiasach wpisałeś "OCIE1A"? Jak on nawet nie należy do timera 8 bitowego tylko 16 bitowego.
Może nie uważnie czytałeś książkę, tego nie wiem. Ale otwórz ją na stronie 199, ostatni akapit, drugie zdanie. Jest tam jasno napisane:
"
Zauważ, że część bitów przedstawiona jest na szaro. Oznacza to, że te bity nie dotyczą Timer0 (u nas to Timer2), który właśnie jest opisywany. Mamy zatem do dyspozycji tylko dwa bity - OCIE0 (u nas to OCIE2) oraz...".
Nie zauważyłem u Ciebie takiego fragmentu:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
To ten fragment odpowiada za tak "fajne" działanie przerwań.
1/ Zmienna pomocnicza na której są wykonywane obliczenia
2/ Jeżeli gdzieś w programie (ale o tym później) przypiszesz tej zmiennej (
Timer1) jakąś wartość to jest także oddawana zmiennej
n.
3/ I tutaj jest warunek. Jeżeli zmienna
n jest różna od zera wykonuje się działanie
--n, czyli odejmowane jest 1 od zmiennej
n i następnie przypisanie do
Timer1.
A teraz kod który u Ciebie mógłby zmieniać stan diody LED na przeciwny co określony czas.
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
1/ Tutaj sprawdzany jest warunek czy zmienna Timer1 jest równa 0, jeżeli tak to wykonają się następujące rzeczy.
LED_TOG; - dioda zmieni stan na przeciwny i
Timer1 = x; - do zmiennej Timer1 zostanie przypisana dowolna wartość (w miejsce x) wpisana przez Ciebie.
I później za każdym obiegiem programu jest sprawdzana ta wartość czy już osiągnęła 0, jeśli nie, nic się nie dzieje.
Aa i jeszcze jedno, z racji tego, że do przerwania dochodzi co 10ms (100Hz), to aby dioda migała co 1s w zmienną Timer1 trzeba wpisać 100.
100*10=1000ms = 1s