Timery w uC - jak to ustawić? [BASCOM]
Timery w uC - jak to ustawić? [BASCOM]
Witam
Mam problem odnośnie obsługi timerów w ATmega8. uC jest taktowany rezonatorem 4MHz. Czy ktoś mógłby mi podać przykładowy "wycinek" programu odpowiadającego za ustawienie TIMERA (+opis jak działa ten program)? Nie chcę całego programu jak załapię z tym timerem to resztę sam dopiszę.
P.S. Piszę w BASCOMIE więc proszę o bascomowy program.
Mam problem odnośnie obsługi timerów w ATmega8. uC jest taktowany rezonatorem 4MHz. Czy ktoś mógłby mi podać przykładowy "wycinek" programu odpowiadającego za ustawienie TIMERA (+opis jak działa ten program)? Nie chcę całego programu jak załapię z tym timerem to resztę sam dopiszę.
P.S. Piszę w BASCOMIE więc proszę o bascomowy program.
-
ZbeeGin
A który licznik sprzętowy pomieści taką liczbę?Kamil 1 pisze:Prescale dzieli sygnał z rezonatora? Czyli jak ustawie go na 1 to (chyba) powinien doliczyć do 4000000 w 1 sek.?
http://zbeegin.republika.pl/bashelp/s_c ... imer0.html
http://zbeegin.republika.pl/bashelp/s_c ... imer1.html
http://zbeegin.republika.pl/bashelp/s_c ... imer2.html
http://zbeegin.republika.pl/bashelp/v_counters.html
Więcej nie trzeba.
-
ZbeeGin
Policzmy:
f = 4 x 10^6Hz
f / 256 = 15625Hz
zatem po prekalerze f = 15,625kHz
t = 1 / f
1 / 15625 = 64 x 10^-6s
zatem t = 64us
100 x 64us = 6,4ms
Czyli w czasie 6,4ms licznik zliczy do 100.
_____
Timer0/Timer2 zliczy maks 256 impulsów.
Timer1/Timer3/Timer4/Timer5 zliczy maks 65536 impulsów.
Wszytko przy standarowym ustawieniu zliczania. W zaawansowanych opcjach można licznik skrócić nawet do jednego bitu. Czyli zliczy do 2.
f = 4 x 10^6Hz
f / 256 = 15625Hz
zatem po prekalerze f = 15,625kHz
t = 1 / f
1 / 15625 = 64 x 10^-6s
zatem t = 64us
100 x 64us = 6,4ms
Czyli w czasie 6,4ms licznik zliczy do 100.
_____
Timer0/Timer2 zliczy maks 256 impulsów.
Timer1/Timer3/Timer4/Timer5 zliczy maks 65536 impulsów.
Wszytko przy standarowym ustawieniu zliczania. W zaawansowanych opcjach można licznik skrócić nawet do jednego bitu. Czyli zliczy do 2.
Dobry program
Mam jeszcze kilka ostatnich pytań:
Z obliczeń na tym kalkulatorze wyszło mi, że przy moim kwarcu tj. 4MHz i Prescale ustawionym na 1024 przerwanie będzie wywoływane co 0,06553600s. A co mam robić żeby otrzymać ~1sek?
A jak użyję komendy LOAD TIMER0 , np. 2 to w tym przypadku timer będzie liczył dwa razy tyle (czyli 0,131072 sek.)?
Z obliczeń na tym kalkulatorze wyszło mi, że przy moim kwarcu tj. 4MHz i Prescale ustawionym na 1024 przerwanie będzie wywoływane co 0,06553600s. A co mam robić żeby otrzymać ~1sek?
A jak użyję komendy LOAD TIMER0 , np. 2 to w tym przypadku timer będzie liczył dwa razy tyle (czyli 0,131072 sek.)?
-
K_o_n_r_a_d
- Użytkownik
- Posty: 123
- Rejestracja: 29 lip 2005, 10:21
- Lokalizacja: Lublin
Ustawić TIMERa tak, aby kilkukrotne wywołanie podprogramu obsługi przerwania dawało w sumie 1s a wewnątrz obsługi przerwania liczyć wywołania i działać.Kamil 1 pisze:Z obliczeń na tym kalkulatorze wyszło mi, że przy moim kwarcu tj. 4MHz i Prescale ustawionym na 1024 przerwanie będzie wywoływane co 0,06553600s. A co mam robić żeby otrzymać ~1sek?
Nie. Użycie LOAD TIMER0... tylko wpisuje odpowiednią wartość do rejestru licznika/timera.Kamil 1 pisze:A jak użyję komendy LOAD TIMER0 , np. 2 to w tym przypadku timer będzie liczył dwa razy tyle (czyli 0,131072 sek.)?
Wydaje mi się że jest chyba dobrze
Z moich wyliczeń wynika że dokładność jest bardzo dobra. Zegar 4MHz i prescale ustawiony na 1 daje wywołanie co 0,000064 sek. a 1sek. podzielona na tą wartość daje 15625. Tylko się zastanawiam czy A ma się równać 15625 czy 15626
Oczywiście brakuje jeszcze wyliczania minut i takich tam ale to jest chyba dobre?
Kod: Zaznacz cały
$regfile = "m8def.dat"
$crystal = 4000000
'[...] 'konfiguracja wyświetlacza
Config Timer0 = Timer , Prescale = 1
Dim A As Word
Dim Sekundy As Byte
On Timer1 Wyswietl
Enable Interrupts
Enable Timer1
'[...]
'część programu
Wyswietl:
A = A + 1
If A = 15625 Then
Sekundy = Sekundy + 1
A = 0
End If
'[...] 'reszta programu
Return
End
Ostatnio zmieniony 08 sie 2008, 20:29 przez Kamil 1, łącznie zmieniany 1 raz.
-
K_o_n_r_a_d
- Użytkownik
- Posty: 123
- Rejestracja: 29 lip 2005, 10:21
- Lokalizacja: Lublin
Działać będzie, ale jeśli program ma robić coś jeszcze to jest to BARDZO ZŁE rozwiązanie. Zauważ, że przerwanie będzie wywoływane co 256 cykli maszynowych a samo wejście w podprogram przerwania zajmuję trochę czasu w Bascomie jeszcze dodatkowa obsługa stosu itp. + jeszcze to co wewnątrz przerwania => uK nie wyrobi się.
Lepiej uzyć prescalera większego a nawet timera 16 bitowego a nie 8 i zliczać przerwania nie do kilkunastu tysięcy a do kilku(nastu).
Lepiej uzyć prescalera większego a nawet timera 16 bitowego a nie 8 i zliczać przerwania nie do kilkunastu tysięcy a do kilku(nastu).
Ostatnio zmieniony 08 sie 2008, 20:32 przez K_o_n_r_a_d, łącznie zmieniany 2 razy.
-
K_o_n_r_a_d
- Użytkownik
- Posty: 123
- Rejestracja: 29 lip 2005, 10:21
- Lokalizacja: Lublin