B A S C O M O W E P O R A D Y
Elektronika Praktyczna 1/2004
102
W†drugiej czÍúci porad dotycz¹cych
timerÛw-licznikÛw ìwbudowanychî
w†mikrokontrolery AVR przedstawia-
my sposoby ich konfigurowania i†ob-
s³ugi podczas pracy w†trybach PWM
i † d o k ³ a d n e g o o d l i c z a n i a c z a s u .
Omawiane zagadnienia zilustrowano
przyk³adami.
Uøyteczn¹ funkcj¹ Timera 1 jest
moøliwoúÊ konfigurowania go jako ge-
neratora PWM, za pomoc¹ ktÛrego
moøna sterowaÊ wieloma urz¹dzenia-
mi, np. regulatorami silnikÛw mode-
larskich, regulatorami napiÍcia, úciem-
niaczami. Za pomoc¹ PWM moøna
zbudowaÊ takøe prosty przetwornik
C/A itp.
Timer 1 w†trybie PWM moøe ge-
n e r o w a Ê p r z e b i e g i
o†modulowanej szerokoúci na
wyjúciach OC1A oraz OC1B
(jeøeli takie posiada) mikrokon-
trolera. Timer w†trybie PWM
konfigurowany jest w†nastÍpuj¹-
cy sposÛb:
Config Timer1 = Pwm, Pwm = 8,
Compare A Pwm = Clear Up,
Compare B Pwm = Clear Down,
Prescale = 1024,
gdzie przypisanie Pwm = 8 okreúla,
jak¹ rozdzielczoúÊ bÍdzie mia³ prze-
bieg PWM (moøliwe 8, 9†lub 10 bi-
tÛw). Przy konfigurowaniu timera ja-
ko generatora PWM niezbÍdne jest
zastosowanie opcji prescale. Bez jej
uøycia nie bÍdzie generowany prze-
bieg PWM.
Dla kwarcu 8†MHz oraz przy pre-
skalerze ustawionym na stopieÒ po-
dzia³u 1:8 i†8-bitowym PWM, oblicze-
nie czÍstotliwoúci sygna³u PWM moø-
na przeprowadziÊ w†nastÍpuj¹cy spo-
sÛb: 8†MHz/(510 (dla PWM 8bitÛw))/
8(prescaler)= ok. 1,9 kHz. Przy PWM
9-bitowym nie bÍdzie to wartoúÊ 510,
lecz 1022, a†przy PWM 10-bitowym
bÍdzie to wartoúÊ 2046.
W y p e ³ n i e n i e p r z e b i e g u P W M
moøna zmieniaÊ poprzez wpisanie
wartoúci do rejestrÛw PWM1a (dla
wyjúcia OC1A) oraz PWM1b (dla
wyjúcia OC1B). Przyk³adowo, po wpi-
saniu do rejestru PWM1a wartoúci
127 (dla PWM 8-bitowego), przebieg
na wyjúciu OC1A bÍdzie mia³ wy-
pe³nienie bliskie 50%.
Na list. 3 przedstawiono przyk³ad
zmiany wype³nienia przebiegu wyj-
úciowego.
Dzia³anie programu moøna zilus-
trowaÊ na powolnym rozjaúnianiu
jednej diody LED i†powolnym gasze-
niu drugiej diody LED (do³¹czonych
do wyjúÊ OC1A i†OC1B - linie te
musz¹ zostaÊ skonfigurowane jako
wyjúciowe).
W†tym programie zmienna wype³-
nienie okreúla wype³nienie sygna³u
zarÛwno na OC1A, jak i†OC1B. Na
wyjúciu OC1B sygna³ bÍdzie zmienia³
wype³nienie przeciwnie niø na wyj-
úciu OC1A, ze wzglÍdu na inn¹ war-
toúÊ parametru COMPARE B PWM
w†instrukcji konfiguruj¹cej Timer 1.
Interesuj¹c¹ funkcj¹ Timera 1†jest
porÛwnanie (compare). Wykorzystuj¹c
ten tryb pracy do odmierzania czasu,
jak np. w†przypadku wykorzystania
przerwaÒ od przepe³nienia timera (jak
by³o w†przyk³adach z†list. 1†i†2), nie
jest potrzebne kaødorazowe zapisywa-
nie do rejestru danych timera nowej
wartoúci pocz¹tkowej po wyst¹pieniu
przerwania. W†funkcji compare prze-
rwanie jest generowane, gdy zawar-
toúÊ rejestru compare bÍdzie
rÛwna zawartoúci rejestru da-
nych. Timer 1 moøna skonfi-
gurowaÊ tak, aby przy wyst¹-
pieniu tego przypadku rejestr
danych timera by³ zerowany.
TÍ funkcjÍ moøna wykorzys-
taÊ do dok³adnego odmierza-
nia czasu, bez koniecznoúci
kaødorazowego ³adowania do timera
wartoúci pocz¹tkowej.
Istnieje rÛwnieø moøliwoúÊ wybo-
ru takiego trybu pracy compare, dziÍ-
ki ktÛremu, w†momencie spe³nienia
warunku porÛwnania, odpowiednim
wyprowadzeniom mikrokontrolera (za-
zwyczaj wyjúcia OC1A lub OC1B dla
Timera 1) moøe zostaÊ przypisany
poziom niski, wysoki lub poprzedni.
W bascomowym „kąciku” będziemy się starać w miarę przystępnie przedstawiać rozwiązania problemów
napotykanych przez naszych Czytelników podczas pisania programów w Bascomie. Rubryka ta powstała
z myślą o rozwiązywaniu problemów, jakie najczęściej napotykają programiści, zatem zachęcamy wszystkich
Czytelników do zgłaszania problemów, na jakie się natknęli podczas tworzenia własnych programów.
Timery − to nie musi być trudne, część 2
List. 3. Przykład programu realizującego generowanie przebiegów PWM
'przykład wykorzystania timer1 pracującego w trybie PWM do generowania przebiegów o zmiennym wypełnieniu
'przebieg generowany jest na wyjściach oc1a i oc1b
'wygenerowane zostaną przebiegi o narastającym oraz malejącym wypełnieniu, które sterują diodami LED
'drugi przebieg PWM ma wypełnienie odwrotne niż pierwszy
'częstotliwość przebiegu PWM będzie wynosić: 8 MHz/8/511 = ok. 1,95 kHz
$regfile = "m8def.dat"
'informuje kompilator o pliku dyrektyw wykorzystywanego mikrontrolera
$crystal = 8000000
'informuje kompilator o częstotliwości rezonatora kwarcowego
Config Pinb.1 = Output
'konfiguracja pinu B.1 jako wyjście
Config Pinb.2 = Output
'konfiguracja portu B.2 jako wyjście
'konfiguracja timera1 jako generatora PWM 8 bitów z preskalerem dzielącym przez 8.
'Wyjście oc1a zmienia wypełnienie od 0% w górę, a oc1b od 100% w dół
Config Timer1 = Pwm, Pwm = 8, Compare A Pwm = Clear Up, Compare B Pwm = Clear Down, Prescale = 8
Dim Wypelnienie As Byte
'deklaracja zmiennej wypełnienie służącej jako zmienna do przechowywania bieżącej wartości
Do
'pętla główna programu
For Wypelnienie = 0 To 255
'pętla pierwsza która liczy od 0 do 255
Pwm1a = Wypelnienie
'wyjście oc1a stopniowo zwiększa wypełnienie (clear up)
Pwm1b = Wypelnienie
'wyjście oc1b stopniowo zmniejsza wypełnienie (clear down)
Waitms 10
'opóźnienie 10 ms
Next Wypelnienie
'zwiększ wypełnienie
For Wypelnienie = 255 To 0 Step -1 'pętla druga, która liczy od 255 do 0
Pwm1a = Wypelnienie
'wyjście oc1a stopniowo zmiejsza wypełnienie (clear up)
Pwm1b = Wypelnienie
'wyjście oc1b stopniowo zwiększa wypełnienie (clear down)
Waitms 10
'opóźnienie 10 ms
Next Wypelnienie
'zmniejsz wypełnienie
Loop
End
'koniec programu
Sygnały podawane na wejścia
T0 i T1 powinny być wolne od zakłóceń,
mieć strome zbocza, a ich
częstotliwość nie może być większa niż
połowa częstotliwości sygnału taktującego
mikrokontroler.
103
Elektronika Praktyczna 1/2004
B A S C O M O W E P O R A D Y
Funkcja ta jest bardzo uøyteczna
podczas budowy generatorÛw sygna³u
prostok¹tnego o†rÛønej czÍstotliwoúci.
Licznik Timer 1 moøe mieÊ je-
d e n l u b d w a r e j e s t r y c o m p a r e ,
w†zwi¹zku z†czym s¹ dostÍpne dwa
ürÛd³a przerwaÒ zwi¹zane z†tymi re-
jestrami compare (zazwyczaj compa-
re1a i†compare1b). Na list. 4 przed-
stawiono przyk³ad wykorzystania
funkcji compare do odmierzania 1-
sekundowych odcinkÛw czasu. Co
sekundÍ jest zmieniany na przeciw-
ny stan wyjúcia steruj¹cego diod¹
LED do³¹czon¹ do wyjúcia PB1 mik-
rokontrolera ATmega8 (dioda bÍdzie
migotaÊ). Licznik Timer 1 jest kon-
figurowany jako czasomierz z†preska-
lerem ustawionym na podzia³ przez
256 oraz z†wy³¹czonymi wyjúciami
OC1A i OC1B. Ustawiony jest para-
metr clear timer, co powoduje wy-
zerowanie timera, gdy jego zawartoúÊ
bÍdzie rÛwna zawartoúci rejestru
compare. Umoøliwia to odmierzanie
dok³adnych odcinkÛw czasu.
W†dalszej kolejnoúci w†programie
zostaje skonfigurowane przerwanie
compare1a (czyli zwi¹zane z†rejestrem
COMPARE1A), ktÛre bÍdzie gene-
rowane, gdy zawartoúÊ rejestru CO-
MAPRE1A bÍdzie rÛwna zawartoúci
rejestru danych Timera 1. NastÍpnie
odblokowane zostaj¹ przerwania glo-
balne oraz przerwanie compare1a.
Aby zosta³a odmierzona jedna
sekunda, do rejestru COMPARE1A
naleøy wpisaÊ wartoúÊ 31250, co
przy rezonatorze kwarcowym 8†MHz
i†preskalerze dziel¹cym przez 256
da odmierzony czas: 8†MHz/256/
31250 = 1, czyli dok³adnie 1†se-
kundÍ. Przerwanie compare 1a, ge-
nerowane co 1†sekundÍ, powoduje
zmianÍ stanu wyjúcia PB1 na prze-
ciwny.
Wyjúcie PB1 moøe zmieniaÊ swÛj
stan na przeciwny takøe po kaødym
zrÛwnaniu siÍ zawartoúci rejestru
COMPARE1A z†zawartoúci¹ rejestru
danych Timera 1, gdyø jest to takøe
wyjúcie OC1A. Aby w³¹czyÊ tÍ funk-
cjÍ, naleøy przypisaÊ funkcji compa-
re a parametr toggle zamiast discon-
nect. Przerwanie compare1a nie bÍ-
dzie wtedy potrzebne, a†efekt bÍdzie
identyczny jak z†wykorzystaniem
przerwania. Duø¹ zaleta tego trybu
pracy timera jest to, øe nie trzeba
³adowaÊ do rejestru danych timera,
po jego przepe³nieniu, wartoúci po-
cz¹tkowej oraz wyeliminowanie wp³y-
wu na odmierzany czasu potrzebnego
na obs³ugÍ przerwania, np. przerwa-
nia compare1a.
Wspomnieliúmy, øe funkcje com-
pare Timera 1†moøna takøe wykorzys-
taÊ do generowania przebiegÛw pros-
tok¹tnych o†zmienianej w†prosty spo-
sÛb czÍstotliwoúci. Generowanie prze-
biegÛw prostok¹tnych takøe nie jest
trudne, a†nawet ³atwiejsze niø odmie-
rzanie czasu. Do tego celu doskonale
nadaje siÍ funkcja compare Timera
1†oraz zwi¹zane z†ni¹ wyjúcia OC1A
lub OC1B. Aby zilustrowaÊ sposÛb
generowania przebiegÛw prostok¹t-
nych, przedstawiony zostanie przy-
k³ad programu, ktÛry generuje na
wyjúciu OC1A przebieg prostok¹tny
o†czÍstotliwoúci 2†Hz (list. 5).
Do wizualizacji dzia³ania tego
programu moøna wykorzystaÊ takøe
schemat pokazany na rys. 1. Dioda
LED do³¹czona do wyjúcia mikrokon-
trolera bÍdzie migotaÊ z†czÍstotliwoú-
ci¹ 2†Hz.
List. 4. Przykład programu odmierzającego 1−sekundowe czasy z wykorzystaniem funkcji compare Timera 1
'Przykład wykorzystania timer1 pracującego w trybie compare do odmierzania dokładnych odcinków czasu
'W tym przykładzie odmierzane są 1-sekundowe odcinki czasu
'przerwanie compare1a timera1 jest generowane co 1s (8MHz/256/31250 = 1sek)
'przy czym po zrównaniu się wartości timera z rejestrem comapre1a licznik jest automatycznie zerowany
'Ten tryb pracy timera może być alternatywny dla sposobu odmierzania czasu z wykorzystaniem
'przerwania od przepełnienia timera. Tryb compare zwalnia od każdorazowego
'wpisywania wartości początkowej do timera
$regfile = "m8def.dat"
'informuje kompilator o pliku dyrektyw wykorzystywanego mikrontrolera
$crystal = 8000000
'informuje kompilator o częstotliwości rezonatora kwarcowego
Config Pinb.1 = Output
'konfiguracja timer1 do pracy w trybie timera z wykorzystaniem rejestrów compare
Config Timer1 = Timer, Prescale = 256, Compare A = Disconnect, Compare B = Disconnect, Clear Timer = 1
On Compare1a Odmierz_1s
'przerwanie o etykiecie odmierz_1s wywoływane przy zrównaniu się rejestru compare1a
'z zawartością timera
Led Alias Portb.1
'Przypisanie aliasu LED linii portu b.1
Enable Interrupts
'odblokowanie globalnego systemu przerwań
Enable Compare1a
'odblokowanie przerwania od compare1a timera1
Compare1a = 31250
'wartość rejestru porównania dla odmierzenia 1 sekundy
Do
'pętla główna programu
Loop
End
'koniec programu
Odmierz_1s:
'początek podprogramu obsługi przerwania porównania rejestru compare1a timera1
Toggle Led
'zmień na przeciwny stan diody LED
Return
'powrót z przerwania
List. 5. Przykład programu generującego sprzętowo przebieg prostokątny o
częstotliwości 2Hz na wyjściu OC1A mikrokontrolera
'przykład wykorzystania timer1 pracującego w trybie compare do generowania
'przebiegu na wyjściu oc1a o częstotliwości 2 Hz.
'Częstotliwość sygnału wyjściowego będzie wynosiła: c_kwarcu/presc/czest
'Aby na wyjściu oc1a był generowany przegieg o częstotliwości 2 Hz, to wartość
'wpisana do compare1a powinna wynosić 8M/256/2 Hz, czyli 15625
$regfile = "m8def.dat"
'informuje kompilator o pliku dyrektyw
'wykorzystywanego mikrontrolera
$crystal = 8000000
'informuje kompilator o częstotliwości
'rezonatora kwarcowego
Config Pinb.1 = Output
'linia oc1a jako wyjście
'konfiguracja timer1 do pracy w trybie compare
'zrównanie się wartości rejestru compare1a z timerem powoduje wyzerowanie licznika
'oraz zmianę stanu wyjścia oc1a na przeciwny
Config Timer1 = Timer, Prescale = 256, Compare A = Toggle, Compare B = Disconnect,
Clear Timer = 1
Compare1a = 15625
'wartość określająca częstotliwość sygnału
'na wyjściu oc1a
Do
'pętla główna programu
Loop
End
'koniec programu
B A S C O M O W E P O R A D Y
Elektronika Praktyczna 1/2004
104
W†programie naleøy jedynie odpo-
wiednio skonfigurowaÊ Timer 1,
a†wartoúÊ wpisana do rejestru compa-
re1a okreúla czÍstotliwoúÊ przebiegu
w y j ú c i o w e g o . P o d k r e ú l m y , ø e w
programie nie zosta³o wykorzystane
øadne przerwanie. Przebieg prostok¹t-
ny jest generowany na wyjúciu OC1a,
a wiÍc przy kaødym zrÛwnaniu siÍ
zawartoúci rejestru danej Timera 1
z†zawartoúci¹ rejestru compare1a, stan
wyjúcia OC1A zmienia siÍ na prze-
ciwny. Timer 1 skonfigurowano do
pracy jako czasomierz z†preskalerem
dziel¹cym przez 256. Funkcji compa-
re a przypisano parametr toggle,
dlatego wyjúcie OC1A zmienia stan na
przeciwnym po kaødym zrÛwnaniu siÍ
zawartoúci rejestru danej Timera 1
z†wartoúci¹ rejestru compare1a.
Aby wp³ywaÊ na czÍstotli-
woúÊ generowanego przebiegu
prostok¹tnego, zawartoúÊ rejes-
tru danych Timer 1 powinna
byÊ wyzerowana po kaødym
zrÛwnaniu siÍ jej z†wartoúci¹
z†rejestru compare1a. Dlatego
teø parametr clear timer zosta³
ustawiony (przypisanie mu je-
dynki). Bez w³¹czenia tej fun-
kcji wartoúÊ wpisana do rejes-
tru compare1a nie wp³ywa³aby na
czÍstotliwoúÊ generowanego przebiegu
prostok¹tnego.
Aby by³ generowany przebieg
2†Hz, to przy czÍstotliwoúci kwarcu
8†MHz i†z†podzia³em preskalera przez
256, wartoúÊ wpisana do compare1a
powinna wynosiÊ: 8†MHz/256/2 =
15625. Wpisanie do rejestru compa-
re1a wartoúci 15625 spowoduje gene-
rowanie na wyjúciu OC1A przebiegu
prostok¹tnego o†czÍstotliwoúci 2†Hz.
Naleøy pamiÍtaÊ, øe funkcjÍ com-
pare moøna wykorzystaÊ przy pracy
Timera 1†nie tylko jako czasomierza,
ale takøe jako licznika, ktÛry rÛøni
siÍ od timera jedynie tym, øe jest
taktowany sygna³em zewnÍtrznym.
W†mikrokontrolerach AVR najczÍú-
ciej wystÍpuj¹ dwa timery: Timer
0†oraz Timer 1, ktÛre mog¹ pracowaÊ
nie tylko jako czasomierze (taktowa-
ne wewnÍtrznym sygna³em zega-
rowym), ale takøe jako liczniki, dla
ktÛrych impulsy zewnÍtrzne (zliczane)
s¹ podawane odpowiednio na wejúcie
T0 lub T1.
ZarÛwno Timer 0, jak i†Timer 1
s¹ synchronizowane sygna³em zegaro-
wym mikrokontrolera i†stan na wej-
úciach T0 lub T1 jest kontrolowany
przez prÛbkowanie, co powoduje
ograniczenie czÍstotliwoúci impulsÛw,
jakie moøna podaÊ na te wejúcia do
po³owy wartoúci (50%) czÍstotliwoúci.
Aby zilustrowaÊ dzia³anie timera
jako licznika impulsÛw zewnÍtrznych,
przedstawiono przyk³ad prostego czÍs-
toúciomierza o†zakresie pomiarowym
od 1†Hz do 4†MHz przy czÍstotli-
woúci taktowania mikrokontrolera
8 † M H z . J e d n ¹ z † m e t o d p o m i a r u
czÍstotliwoúci sygna³u jest zliczenie
w†bramce czasowej, np. w†czasie 1
sekundy, przez licznik impulsÛw
mierzonego sygna³u. WartoúÊ zliczona
przez licznik bÍdzie zmierzon¹ czÍs-
totliwoúci¹ sygna³u podanego na wej-
úcie licznika.
Do budowy czÍstoúciomierza pra-
cuj¹cego w†oparciu o†tÍ metodÍ wy-
korzystane zosta³y dwa timery. Timer
0†pracuje jako czasomierz i†odlicza 1-
sekundowe odcinki czasu, w†ktÛrych
odbywa siÍ pomiar (timer ten bram-
kuje pracÍ drugiego timera, pracuj¹-
cego jako licznik impulsÛw), a†Timer
1†pracuje jako 16-bitowy licznik, zli-
czaj¹cy impulsy podawane na wejúcie
T1 (ktÛre jest wejúciem pomiarowym).
Na rys. 2 przedstawiono schemat
prostego czÍstoúciomierza.
Dok³adnoúÊ pomiaru czÍstotliwoúci
jest zaleøna od precyzji odmierzenia
1-sekundowego odcinka czasu, dlate-
go do taktowania mikrokontrolera za-
stosowano generator kwarcowy. Zasto-
sowanie tranzystora T1 wraz z†rezys-
torami R1...R3 umoøliwia pomiar syg-
na³Ûw o†amplitudach mniejszych niø
wymagane przez standard TTL. Na
list. 6 przedstawiono program reali-
zuj¹cy funkcjÍ czÍstoúciomierza.
Timer 0†zostaje skonfigurowany ja-
ko czasomierz z†ustalonym wspÛ³-
czynnikiem podzia³u preskalera wyno-
sz¹cym 8. Natomiast Timer 1 skonfi-
gurowano jako licznik impulsÛw z
wejúcia T1. Parametr edge okreúla
czy wejúcie T1 ma reagowaÊ na na-
rastaj¹ce zbocze sygna³u (rising), czy
na opadaj¹ce (falling). W†tym przy-
k³adzie licznik zosta³ skonfigurowany
tak, aby reagowa³ na opadaj¹ce zbo-
cza sygna³u na wejúciu T1. NastÍpnie
Timer 0†oraz Timer 1†s¹ zatrzymywa-
ne, po czym do Timera 0†jest ³ado-
wana wartoúÊ pocz¹tkowa 6 (256-
250), co powoduje, øe przerwanie bÍ-
dzie wywo³ane po zliczeniu kaødych
250 impulsÛw. Zerowany jest takøe
rejestr danych Timer 1†oraz zmienne
licz i†przep_t1.
W†zmiennej licz przechowywana
jest liczba przerwaÒ od Timer 0, ktÛ-
re s¹ wywo³ywane co 250
µ
s. Zmien-
n a p r z e p _ t 1 p r z e c h o w u j e
liczb͆przepe³nieÒ licznika T1,
ktÛre nastÍpuj¹ po zliczeniu
przez ten licznik 65536 im-
pulsÛw. W†dalszej kolejnoúci
uruchomione zostaj¹ Timer
0†oraz Timer 1. Po przeprowa-
dzeniu pomiarÛw oraz obli-
czeÒ, ustawiona zostaje flaga
wysw. Jeúli jest ona ustawio-
na, to w†g³Ûwnej pÍtli progra-
mu nastÍpuje jej wyzerowanie. Wy-
czyszczony zostaje takøe LCD oraz
wyúwietlona zostaje zawartoúÊ zmien-
nej wynik, do ktÛrej zosta³a wpisana
zmierzona i†obliczona wartoúÊ czÍstot-
liwoúci. Po wyúwietleniu wyniku na-
stÍpuje ponowne w³¹czenie Timera 0
oraz Timera 1, co jest rÛwnoznaczne
z†uruchomieniem kolejnego pomiaru.
Przerwanie zlicz_przep jest wywo³y-
wane po przepe³nieniu siÍ licznika
Timer 1. NastÍpuje w†nim g³Ûwnie
zwiÍkszenie o†jeden zawartoúci zmien-
nej przep_t1, ktÛra jest licznikiem
przepe³nieÒ Timera 1. W†przerwaniu
odmierz_1s odliczany jest czas 1†se-
kundy oraz dokonywane jest oblicze-
nie zmierzonej czÍstotliwoúci.
Rys. 2. Schemat ideowy prostego częstościomierza
Niektóre mikrokontrolery AVR są
wyposażone także w trzeci timer, który
zazwyczaj jest ośmiobitowy i również może
pracować jako timer z wieloma funkcjami
jak PWM, capture itd. Może on pracować
także jako timer asynchroniczny
(taktowany sygnałem zewnętrznym
z innego generatora).
105
Elektronika Praktyczna 1/2004
B A S C O M O W E P O R A D Y
Na pocz¹tku tej procedury do za-
wartoúci rejestru danych Timera 0†do-
dawana jest wartoúÊ pocz¹tkowa 6, tak
by licznik przepe³nia³ siÍ z†duø¹ do-
k³adnoúci¹ co 250 impulsÛw. W†dalszej
czÍúci tej procedury przerwania nastÍ-
puje zwiÍkszenie o†jeden wartoúci
zmiennej licz. Jeúli osi¹gnie ona war-
toúÊ 4000 (250
µ
s * 4000 = 1), bÍdzie
to oznaczaÊ, øe odmierzona zosta³a do-
k³adnie 1 sekunda i†naleøy zakoÒczyÊ
pomiar czÍstotliwoúci. BÍdzie wtedy
List. 6. Przykładowy program spełniający funkcję częstościomierza
'Przykład częstościomierza mierzącego częstotliwości do 4MHz.
'Częstościomierz ten wykorzystuje timer0 w roli czasomierza bramkującego timer1
'który pracuje jako 16-to bitowy licznik
'ilość zliczonych przez timer1 impulsów w czasie 1 sekundy określa częstotliwość mierzonego sygnału
'mierzony sygnał podawany jest na wejście T1.
'timer0 odmierza czas 1 sekundy (8 MHz/8/250/4000 = 1 Hz = 1 sec)
$regfile = "m8def.dat"
'informuje kompilator o pliku dyrektyw wykorzystywanego mikrontrolera
$crystal = 8000000
'informuje kompilator o czestotliwości rezonatora kwarcowego
Config Lcd = 16 * 2
'konfiguracja organizacji znaków wyświetlacza LCD
'konfiguracja pinów mikrokontrolera do których dołączone zostały linie wyświetlacza
Config Lcdpin = Pin, Db4 = Portc.3, Db5 = Portc.2, Db6 = Portc.1, Db7 = Portc.0, E = Portc.4, Rs = Portc.5
Config Timer0 = Timer, Prescale = 8
'konfiguracja timer0 jako timer z podziałem częstotliwości przez 8
Config Timer1 = Counter, Edge = Falling
'konfiguracja timer1 jako licznik reagujący na opadające zbocza sygnału na wejściu T1
On Timer0 Odmierz_1s
'przerwanie od przepełnienia timer0 o etykiecie odmierz_1s
On Timer1 Zlicz_przep
'przerwanie od przepełnienia licznika timer1 o etykiecie zlicz_przep
Dim Licz As Word
'zmienna pomocnicza zliczająca odmierzone odcinki (zlicza przerwania generowane
'przez timer0) czyli czasy 250 us
Dim Przep_t1 As Byte
'zmienna zliczająca przepełnienia licznika timer1
Dim Wysw As Bit
'flaga zezwolenia na aktualizacje wyniku na wyświetlaczu LCD
Dim Wynik As Long
'zmienna przechowująca wynik pomiaru
Enable Interrupts
'odblokowanie globalnego systemu przerwań
Enable Timer0
'odblokowanie przerwania od przepełnienia timer0
Enable Timer1
'odblokowanie przerwania od przepełnienia timer1
Stop Timer0
'zatrzymanie timer0
Stop Timer1
'zatrzymanie timer1
Load Timer0 = 250
'wartość początkowa timer0 która będzie wartość 6 (256-250)
Counter1 = 0
'wyzerowanie licznika 1
Licz = 0
'wyzerowanie zmiennej licz
Przep_t1 = 0
'wyzerowanie licznika przepełnień timera 1
Start Timer1
'start timer 1
Start Timer0
'start timer 0
Do
'pętla główna programu - nieskończona
If Wysw = 1 Then
'jeśli flaga wysw ustawiona to
Wysw = 0
'wyzeruj flagę wysw
Cls
'czyść LCD
Lcd Wynik; " Hz"
'wyświetl na LCD zmierzoną wartość częstotliwości (wartość zmniennej wynik)
Start Timer1
'start timer 1
Start Timer0
'start timer 2
End If
Loop
End
'koniec programu
Odmierz_1s:
'początek podprogramu obsługi przerwania przepełnienia od timer0
Counter0 = Counter0 + 6
'dodanie do timer0 wartości początkowej 6 (by było odliczone dokładne 250 impulsów)
'poprzez dodanie wartości początkowej nie trzeba się martwić o już zliczone
'impulsy przez timer zanim zostanie wywołane przerwanie
Incr Licz
'zwiększ o jeden wartość zmiennej pomocniczej liczs
If Licz = 4000 Then
'jeżeli watość zmiennej pomocniczej= 4000 (4000*250 us = 1), znaczy że odliczona
'została 1 sekunda
Licz = 0
'zerowanie zmiennej licznikowej licz
Stop Timer1
'zatrzymanie timer1
Stop Timer0
'zatrzymanie timer0
Wynik = 65536 * Przep_t1
'obliczenie wyniku - w pierwszej kolejności uwzględnienie ilości przepełnień
'licznika 1
Wynik = Wynik + Counter1
'dodanie do wyniku pozostałej ilości impulsów zliczonych przez licznik 1
Wysw = 1
'zezwolenie na wyświetlenie zmierzonej wartości częstotliwości
Load Timer0 = 250
'wartość początkowa 6 (256-250) timera 0 dla kolejnego pomiaru
Przep_t1 = 0
'zerowanie licznika (zmiennej) przepełnień licznika 1
Counter1 = 0
'zerowanie zawartości licznika 1
End If
'koniec warunku if
Return
'powrót z przerwania
Zlicz_przep:
'początek podprogramu obsługi przerwania przepełnienia od timer1
Enable Interrupts
'odblokowanie przerwań by było możliwe wykonanie przerwania odmierz_1s gdyby
'zostało zgłoszone przy wykonywaniu tego przerwania
Incr Przep_t1
'zwiększenie o jeden licznika przepełnień przep_t1
Return
'powrót z przerwania
wyzerowana zmienna licz oraz zostan¹
zatrzymane Timer 0†oraz Timer 1.
NastÍpnie jest obliczona czÍstotliwoúÊ
z†uwzglÍdnieniem przepe³nieÒ licznika Ti-
mera 1 oraz wartoúci pozostaj¹cej w†nim
po zatrzymaniu timerÛw. Ustawiona zo-
staje takøe flaga wysw, ktÛra zezwala na
wyúwietlenie zmierzonej czÍstotliwoúci.
NastÍpnie timery s¹ przygotowane
do kolejnego pomiaru, ktÛry nast¹pi
po wyúwietleniu aktualnej zmierzonej
czÍstotliwoúci. Do rejestru danych Ti-
mer 0†zostanie wpisana wartoúÊ po-
cz¹tkowa 6 oraz wyzerowana zmien-
na przep_t1 oraz licznik Timer 1.
Aby zwiÍkszyÊ zakres mierzonych
czÍstotliwoúci, naleøy dodaÊ zewnÍtr-
zne dzielniki, ktÛrymi mikrokontroler
moøe sterowaÊ i†odpowiednio obliczaÊ
wynik pomiaru.
Marcin Wi¹zania
marcin.wiazania@ep.com.pl
Artur Starz
artur.starz@ep.com.pl