Systemy wbudowane Zajęcia nr 5 – Układy czasowo

Transkrypt

Systemy wbudowane Zajęcia nr 5 – Układy czasowo
Systemy wbudowane
Zajęcia nr 5 – Układy czasowo-licznikowe
Wprowadzenie do ćwiczeń
1. Układy czasowo-licznikowe
Układy czasowo-licznikowe służą do precyzyjnego odmierzania czasu i/lub zliczania impulsów ze
źródeł zewnętrznych. Każdy mikrokontroler posiada w swojej strukturze kilka takich układów o
różnych możliwościach.
Mikrokontroler 16F877A posiada trzy układy czasowo-licznikowe:
a) Timer0 – 8 bitowy licznik impulsów zegarowych (cykl instrukcji) lub impulsów zewnętrznych
doprowadzonych do wejścia T0CKI; posiada współdzielony z układem strażnika (watchdog)
preskaler o podziale w zakresie od 1:2 do 1:256;
b) Timer1 – 16 bitowy licznik impulsów zegarowych (cykl instrukcji) lub impulsów zewnętrznych
doprowadzonych do wejścia T1CKI; do jego wejścia można podłączyć rezonator kwarcowy; posiada
własny preskaler o podziale w zakresie od 1:1 do 1:8; współpracuje z układem CCP;
c) Timer2 – 8 bitowy licznik impulsów zegarowych (cykl instrukcji); maksymalna wartość licznika
ustawiana jest w rejestrze PR2; posiada własny preskaler o podziale w zakresie od 1:1 do 1:16 oraz
postskaler w zakresie od 1:1 do 1:16; współpracuje z układem CCP.
Zawartość licznika przechowywana jest w następujących rejestrach:
– TMR0 – układ Timer0;
– TMR1L – młodszy bajt licznika układu Timer1;
– TMR1H – starszy bajt licznika układu Timer1;
– TMR2 – układ Timer2.
Dodatkowo rejestr PR2 służy do przechowywania maksymalnej wartości, którą może osiągnąć
licznik układu Timer2. Po osiągnięciu tej wartości licznik jest zerowany.
Poniżej przedstawiono rejestry używane do sterowania pracą układów czasowo-licznikowych.
OPTION_REG
7
6
5
4
3
2
1
0
RBPU
INTEDG
T0CS
T0SE
PSA
PS2
PS1
PS0
– wybór źródła impulsów, które będzie zliczał Timer0; gdy T0CS = 1 źródłem impulsów jest
wyprowadzenie T0CKI, dla T0CS = 0 impulsy pochodzą od zegara systemowego;
T0SE – wybór zbocza, które powoduje zwiększenie licznika; gdy T0SE = 1 wybierane jest zbocze
opadające (z poziomu wysokiego na niski), dla T0SE = 0 zliczanie odbywa się przy zboczu
rosnącym (z poziomu niskiego na wysoki);
PSA – wybór układu, do którego dołączony jest preskaler; dla PSA = 1 preskaler jest podłączony do
układu strażnika (watchdog), gdy PSA = 0 preskaler jest podłączony do Timer0;
PS2, PS1, PS0 – wybór podziału częstotliwości przez preskaler; gdy preskaler dołączony jest do
Timer0, podział częstotliwości odbywa się w stosunku 1:2 N+1, gdzie N jest wartością binarną, w
której bity 2, 1 i 0 są określone wartościami bitów odpowiednio PS2, PS1 i PS0.
T0CS
INTCON
7
6
5
4
3
2
1
0
GIE
PEIE
TMR0IE
INTE
RBIE
TMR0IF
INTF
RBIF
TMR0IF –
bit informujący o przepełnieniu licznika; zerowany programowo.
T1CON
7
6
5
4
3
2
1
0
—
—
T1CKPS1
T1CKPS0
T1OSCEN
T1SYNC
TMR1CS
TMR1ON
T1CKPS1, T1CKPS0
– wybór podziału częstotliwości przez preskaler; podział częstotliwości odbywa
się w stosunku 1:2 , gdzie N jest wartością binarną, w której bity 1 i 0 są określone wartościami
bitów odpowiednio T1CKPS1 i T1CKPS0;
T1OSCEN – włączenie (wartością 1) lub wyłączenie (wartością 0) układu generatora zegarowego na
wyprowadzeniach T1OSI i T1OSO; gdy nie jest potrzebny należy go wyłączyć w celu zmniejszenia
poboru prądu przez układ;
T1SYNC – włączenie (wartością 0) lub wyłączenie (wartością 1) synchronizacji sygnału
zewnętrznego z wewnętrznym układem taktującym; gdy TMR1CS = 0 wartość tego bitu nie ma
znaczenia (źródłem impulsów jest zegar systemowy);
TMR1CS – wybór źródła impulsów, które będzie zliczał Timer1; gdy TMR1CS = 1 źródłem impulsów
jest wyprowadzenie T1CKI, dla TMR1CS = 0 impulsy pochodzą od zegara systemowego;
TMR1ON – włączenie (wartością 1) lub wyłączenie (wartością 0) układu Timer1.
N+1
T2CON
7
6
5
4
3
2
1
0
—
TOUTPS3
TOUTPS2
TOUTPS1
TOUTPS0
TMR2ON
T2CKPS1
T2CKPS0
TOUTPS3, TOUTPS2, TOUTPS1, TOUTPS0
– wybór podziału częstotliwości wyjściowej przez
postskaler; podział częstotliwości odbywa się w stosunku 1:(N+1), gdzie N jest wartością binarną,
w której bity 3, 2, 1 i 0 są określone wartościami bitów odpowiednio TOUTPS3, TOUTPS2, TOUTPS1 i
TOUTPS0;
TMR2ON – włączenie (wartością 1) lub wyłączenie (wartością 0) układu Timer2;
T1CKPS1, T1CKPS0 – wybór podziału częstotliwości przez preskaler; gdy preskaler dołączony jest
do Timer1, podział częstotliwości odbywa się w stosunku 1:2N+1, gdzie N jest wartością binarną, w
której bity 1 i 0 są określone wartościami bitów odpowiednio T1CKPS1 i T1CKPS0;
PIR1
7
6
5
4
3
2
1
0
PSPIF
ADIF
RCIF
TXIF
SSPIF
CCP1IF
TMR2IF
TMR1IF
TMR1IF
TMR2IF
– bit informujący o przepełnieniu licznika Timer1; zerowany programowo;
– bit informujący o przepełnieniu licznika Timer2; zerowany programowo.
Program z pliku z5_p1.asm zawiera kod, który wykorzystuje timer0 do zliczania impulsów
wewnętrznego generatora systemowego w celu wysterowania diody, w taki sposób, aby migała ona
z okresem 1 s.
Zadania do wykonania:
1. Wykorzystać inny układ czasowy (Timer 1 lub 2 do migania diodą)
2. Zmodyfikuj program, aby miganie diody było coraz szybsze.
3. Napisz stoper, który będzie odmierzał czas z dokładnością do 0,1 s. Czas ma być
wyświetlany na wyświetlaczu LCD. Start i zatrzymanie odmierzania czasu ma być
zrealizowane za pomocą przycisku S1, natomiast kasowanie za pomocą przycisku S2.
Wykorzystaj układ czasowo-licznikowy Timer 0, 1 lub 2 do odmierzania czasu.