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.