guest666 napisał:
A nie ma ktoś gotowca na pomiar częstotliwości z wykorzystaniem TIMER0 i TIMER2?
Już mnie powoli trafia.... ehh
Nie,... nie mam ale powiem ci jak to zrobić...
W zasadzie wystarczyłby ci tylko jeden dowolny timer do pomiaru częstotliwości, mierząc nim czas pomiędzy dwoma kolejnymi zboczami bądź to rosnącymi lub opadającymi. Procedurę tę możesz uskutecznić wykorzystując dowolny wejściowy pin nawet nie koniecznie interrupt. Wystąpią tu pewne niedogodności: praktycznie processor tu nie może nic innego robić; zmierzyć czas, obliczyć f i display wynik.
Jezeli zechcesz zastosować metodę zliczania ilości impulsów w określonym czasie, wtedy potrzebujesz użyć dwóch timerów, z których jeden jest skonfigurowany jako Timer, drugi pełni rolę licznika (Counter). I tu również istnieje pełna dowolność w ich konfiguracji (każdy timer jest licznikiem).
Zechcesz skonfigurować Timer0 jako counter. Musisz pamiętać że ma on pojemność tylko 8 bit (256) i jeżeli zliczana wielkość przekroczy jego pojemność zajdzie potrzeba zliczania przepełnień.
Konfiguracja timera0 byłaby:
dim Pulse as word
config Timer0 = counter
on Ovf0 T0_isr
enable Ovf0
enable interrupts
label (subrutyna przepełnienia)
T0_isr:
incr Pulse
Return
W następnej kolejności konfigurujesz Timer2 aby go wykorzystać do liczenia czasu.
Najbardziej praktyczna metoda to zliczanie ilości impulsów w okresie 1 sec.
Z uwagi na fakt że timer2 tak jak i Timer0 jest też "krótki" (8-bit), więc nie jest możliwe odmierzenie 1 sec w zwykły, prosty sposób tak jak to robi Timer1.
Będziesz odmierzał krótkie np. 5 msec. interwały a po zliczeniu ich 200 (równoważne 1 sec), zfinalizujesz pomiar, postawisz flagę dla rozpoczęcia rachunków i dysplay wyniku; wyzerujesz wszystkie timery/liczniki i zmienne oraz flagę, aby zacząć 'na czysto" nowy pomiar.
Ponieważ Timer2 tego processora ma możliwość pracy w trybie CTC, wykorzystaj tę opcje i jego konfiguracja wyglądałaby:
TCCR2A = 10
TCCR2B = 6
OCR2A = 216
Enable OC2
Dim N as byte
Dim Flag as bit
On OC2 T2_isr
label (subrutyna porównania)
T2_isr:
Incr N
If N>= 200 then
Flag =1
N=0
End if
Return
Poskładaj to wszystko w jedną całość i w programie głównym 'Do.. Loop', umieść instrukcję warunkową od flagi If...Then, w której zamieścisz całą procedurę opisaną wyżej. Chyba tą część zrobisz samodzielnie...
Taktowanie processora przyjęto: f= 11.0592 MHz.
P.s. Timer2, 'by default' jest taktowany z zegara głównego (podobnie jak timer0 i Timer1), więc nie ma potrzeby referować ustawień bitu 'ASYNC'.
Wystarcza poprawnie określić prescaler.
e marcus