Przypomnienie wzoru na przerwania timera

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Awatar użytkownika
mariusz_edw
Użytkownik
Posty: 307
Rejestracja: 22 lip 2005, 13:02
Lokalizacja: Polanica Zdrój
Kontakt:

Przypomnienie wzoru na przerwania timera

Post autor: mariusz_edw » 29 mar 2006, 12:22

Witam.

Przerwań timerów dawno już nie używałem, ktoś zechciałby przypomnieć, w jaki sposób wyliczono w poniższym programie wartość Timer1, równą 64566?

Fragment programu do sterowania fazowego (włączanie triaka na pewien okres czasu), autorstwa Kamila Kozłowskiego:
$crystal = 10000000

(...)

Inttim1: 'co ok 97us
Portd.0 = Onofflmgl.0 'zapalanie/gaszenie lampy głównej
Timer1 = 64566 'timer1 liczy 970 cylki zegara, czyli przerwanie co ok 97us
If Licznik >= 50 Then
$asm
sbic pind, 6 'sprawdzaj stan końcówki PIND6, jeśli jest równa 1 to
$end Asm
Gosub Zero 'skocz do podprogramu Zero
End If
Incr Licznik
If Onoffall = 255 Then 'jeśłi zezwolenie globalne na włączanie lamp = 1 to
If Licznik > Lmram(1) Then Reset Portd.5 '}
If Licznik > Lmram(2) Then Reset Portd.4 ' } zapalaj odpowiednio lampy do wartości tablicy Lmram
If Licznik > Lmram(3) Then Reset Portd.3 '}
If Licznik > Lmram(4) Then Reset Portd.1 '}
End If
Return


Zero:
Licznik = 1 'przy kazdym przechodzeniu napiecia sieci przez zero zeuj licznik i
Portd = Portd Or &B1111110 'wygas wszystkie 4 lampy
Incr Timefader
Return

tasza
Użytkownik
Posty: 1391
Rejestracja: 21 lut 2005, 15:02

Post autor: tasza » 29 mar 2006, 12:28

napisane jest ....
Timer1 = 64566 'timer1 liczy 970 cylki zegara, czyli przerwanie co ok 97us
timer liczy w górę, od zadanej wartości do 0xFFFF (ponieważ jest 16-bitowy),
gdy się przepełni - generuje przerwanie... 64566 = 65535 - 969

Awatar użytkownika
mariusz_edw
Użytkownik
Posty: 307
Rejestracja: 22 lip 2005, 13:02
Lokalizacja: Polanica Zdrój
Kontakt:

Post autor: mariusz_edw » 29 mar 2006, 12:41

tasza pisze:napisane jest ....
Timer1 = 64566 'timer1 liczy 970 cylki zegara, czyli przerwanie co ok 97us
timer liczy w górę, od zadanej wartości do 0xFFFF (ponieważ jest 16-bitowy),
gdy się przepełni - generuje przerwanie... 64566 = 65535 - 969
No tak, rzeczywiście.
Dziękuję pięknie :-)

Awatar użytkownika
Koppel
Użytkownik
Posty: 500
Rejestracja: 24 lip 2005, 18:05
Lokalizacja: Gliwice

Post autor: Koppel » 29 mar 2006, 12:43

tasza pisze:timer liczy w górę, od zadanej wartości do 0xFFFF (ponieważ jest 16-bitowy),
gdy się przepełni - generuje przerwanie... 64566 = 65535 - 969
Tylko przerwanie jest generowane przy przy przejściu z 0xFFFF do 0 a nie przy dojściu do 0xFFFF. Tak więc obliczenie będzie miało postać:
65536 - 64566 = 970 :wink:

Nie znam dokładnie wspomnianego programu, ale w AVR'ach często można to zrobić inaczej - wykorzystując jednostki porównania. Wykorzystuje się wtedy przerwanie na porównanie i ustawia bit wywołujący zerowanie timera w chwili jego wystąpienia.

ODPOWIEDZ