Timery w uC - jak to ustawić? [BASCOM]

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!
Kamil 1
-
Posty: 70
Rejestracja: 01 cze 2007, 15:20

Timery w uC - jak to ustawić? [BASCOM]

Post autor: Kamil 1 » 08 sie 2008, 15:33

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.

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 08 sie 2008, 15:45

W helpie nie ma nic na ten temat? Jakoś chyba mało prawdopodobne.

Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

Post autor: Jasam » 08 sie 2008, 16:38

W helpie jest dokładnie wyjaśnione. Należy tylko poszukać.

Kamil 1
-
Posty: 70
Rejestracja: 01 cze 2007, 15:20

Post autor: Kamil 1 » 08 sie 2008, 17:20

Wiem, szukałem.

Prescale dzieli sygnał z rezonatora? Czyli jak ustawie go na 1 to (chyba) powinien doliczyć do 4000000 w 1 sek.?

ZbeeGin

Post autor: ZbeeGin » 08 sie 2008, 17:25

Kamil 1 pisze:Prescale dzieli sygnał z rezonatora? Czyli jak ustawie go na 1 to (chyba) powinien doliczyć do 4000000 w 1 sek.?
A który licznik sprzętowy pomieści taką liczbę?

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.

Kamil 1
-
Posty: 70
Rejestracja: 01 cze 2007, 15:20

Post autor: Kamil 1 » 08 sie 2008, 17:40

Czyli jak ustawię Prescale na 256 ile mu zajmie liczenie do np. 100. I jak to się liczy?
A tak w ogóle to do ilu może liczyć taki licznik?

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 08 sie 2008, 18:04

O ile dobrze pamiętam:
f=(F_CPU/prescaler/Timer_top)*TCNTx
t=1/f

ZbeeGin

Post autor: ZbeeGin » 08 sie 2008, 18:08

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.

Kamil 1
-
Posty: 70
Rejestracja: 01 cze 2007, 15:20

Post autor: Kamil 1 » 08 sie 2008, 19:45

Dobry program :wink: 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.)?

K_o_n_r_a_d
Użytkownik
Posty: 123
Rejestracja: 29 lip 2005, 10:21
Lokalizacja: Lublin

Post autor: K_o_n_r_a_d » 08 sie 2008, 19:53

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?
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:A jak użyję komendy LOAD TIMER0 , np. 2 to w tym przypadku timer będzie liczył dwa razy tyle (czyli 0,131072 sek.)?
Nie. Użycie LOAD TIMER0... tylko wpisuje odpowiednią wartość do rejestru licznika/timera.

Kamil 1
-
Posty: 70
Rejestracja: 01 cze 2007, 15:20

Post autor: Kamil 1 » 08 sie 2008, 20:22

Wydaje mi się że jest chyba dobrze

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
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?
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

Post autor: K_o_n_r_a_d » 08 sie 2008, 20:28

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).
Ostatnio zmieniony 08 sie 2008, 20:32 przez K_o_n_r_a_d, łącznie zmieniany 2 razy.

Kamil 1
-
Posty: 70
Rejestracja: 01 cze 2007, 15:20

Post autor: Kamil 1 » 08 sie 2008, 20:30

Wiem ale to tylko tak na próbę czy dobrze to rozumiem :wink:

K_o_n_r_a_d
Użytkownik
Posty: 123
Rejestracja: 29 lip 2005, 10:21
Lokalizacja: Lublin

Post autor: K_o_n_r_a_d » 08 sie 2008, 20:32

np. Preskaler = 256. Wyjdzie 61 przerwań. Błąd wtedy na 1s wyjdzie niecałe 0,6ms.

Kamil 1
-
Posty: 70
Rejestracja: 01 cze 2007, 15:20

Post autor: Kamil 1 » 08 sie 2008, 20:40

Ok. Dziękuję za odpowiedzi, dzięki wam już rozumiem jak obchodzić się z timerami.

Szczególnie dziękuję kolegom:

K_o_n_r_a_d
ZbeeGin
Ostatnio zmieniony 19 lis 2008, 20:36 przez Kamil 1, łącznie zmieniany 1 raz.

ODPOWIEDZ