Systemy wbudowane – PS nr 3
Transkrypt
Systemy wbudowane – PS nr 3
Systemy wbudowane – PS nr 3. 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. Mikrokontrolery z rodziny PIC16 mogą posiadać trzy układy czasowo-licznikowe: • 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; • 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; • 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. Układ czasowy TIMER0 1.1.1. Informacje ogólne Układ czasowy TIMER0 jest 8-bitowym czasomierzem lub licznikiem impulsów. Posiada on następujące właściwości: • możliwość odczytu i zapisu; • możliwość dołączenia 8-bitowego preskalera; • możliwość wyboru źródła zliczanych impulsów (wewnętrzne lub zewnętrzne); • możliwość wyboru zbocza zewnętrznego zegara, na które układ będzie reagował; • możliwość wywołania przerwania przy przepełnieniu licznika (zmianie zawartości z FFh na 00h). Układ czasowy TIMER0 występuje zarówno w mikrokontrolerze PIC16F877A, jak i w mikrokontrolerze PIC16F84. Sposób działania tego układu czasowego dla obu mikrokontrolerów jest taki sam. 1.1.2. Schemat blokowy układu TIMER0 Schemat blokowy układu czasowego TIMER0 został pokazany na rys. 2.48. Na rysunku pokazany jest rejestr licznika TMR0 oraz sposób wyboru źródła zliczanych impulsów oraz aktywnego zbocza za pomocą multiplekserów sterowanych odpowiednimi bitami z rejestru OPTION_REG. Pokazano także preskaler, który jest współdzielony z układem strażnika (watchdog). Rys. 2.48. Schemat blokowy układu czasowego TIMER0 z preskalerem Kiedy preskaler jest niewykorzystywany, wejście zegara zewnętrznego jest tożsame z wyjściem preskalera. Synchronizacja sygnału z wejścia T0CKI z zegarem wewnętrznym odbywa się za pomocą próbkowania wyjścia preskalera w cyklach Q2 i Q4 zegara wewnętrznego. Dlatego niezbędne jest to, aby sygnał z wejścia T0CKI miał poziom wysoki przynajmniej przez czas dwóch okresów oscylatora (oraz krótkie opóźnienie wynoszące 20 ns) oraz poziom niski także przynajmniej przez czas równy dwóm okresom oscylatora (z opóźnieniem 20 ns). Kiedy preskaler jest używany, częstotliwość sygnału zegara zewnętrznego jest dzielona przez szeregowy licznik asynchroniczny i na wyjściu preskalera otrzymujemy przebieg symetryczny. Z tego powodu przy określaniu wymagań próbkowania należy wziąć pod uwagę ów szeregowy licznik asynchroniczny. Niezbędne jest, aby sygnał na wejściu T0CKI miał okres przynajmniej równy czterem okresom sygnału oscylatora (plus krótkie opóźnienie wynoszące 40 ns). Z powodu synchronizacji sygnału wejściowego z wewnętrznym zegarem powstaje małe opóźnienie pomiędzy zboczem sygnału z wejścia T0CKI a momentem inkrementacji rejestru TMR0. Sposób zliczania impulsów zewnętrznych pokazano na rys. 2.49. Rys. 2.49 Zliczanie impulsów zewnętrznych w układzie czasowym TIMER0 Układ czasowy TIMER0 ma możliwość generacji przerwania w momencie przepełnienia licznika. Przepełnienie licznika skutkuje ustawieniem bitu T0IF w rejestrze INTCON na jedynkę. Przerwanie to może zostać zamaskowane poprzez wyzerowanie bitu T0IE w rejestrze INTCON. Bit T0IF powinien zostać wyzerowany programowo w procedurze obsługi przerwania przed ponownym włączeniem przerwania od układu TIMER0. Układ czasowy TIMER0 nie jest zdolny do wybudzenia mikrokontrolera ze stanu uśpienia. Układ czasowy TIMER0 posiada możliwość dołączenia wewnętrznego 8-bitowego preskalera, który jest jednocześnie postskalerem dla układu licznika nadzorcy (watchdog). Użycie preskalera z układem TIMER0 powoduje, że nie jest on dostępny dla licznika nadzorcy i odwrotnie. Wybór układu, z którym połączony jest preskaler jest dokonywany za pomocą bitu PSA w rejestrze OPTION_REG. Jeżeli bit PSA jest ustawiony na jedynkę – preskaler jest dołączony do układu strażnika (WDT), a jeśli jest wyzerowany – do układu TIMER0. Współczynnik podziału preskalera jest ustawiany za pomocą bitów PS2:PS0 w rejestrze OPTION_REG. Sposób ustalania współczynnika podziału pokazano w tab. 2.12. Kiedy preskaler jest dołączony do układu TIMER0, wszystkie instrukcje modyfikujące rejestr TMR0 zerują preskaler. Kiedy preskaler jest dołączony do licznika nadzorcy instrukcja CLRWDT zerująca licznik nadzorcy – zeruje także preskaler. Do preskalera nie można zapisywać żadnych danych ani ich odczytywać. 1.1.3. Rejestry TMR0 i OPTION_REG Rejestr TMR0 jest głównym rejestrem układu TIMER0. Do tego rejestru zapisuje się wartość od której licznik ma rozpocząć zliczanie impulsów. Przepełnienie rejestru TMR0 powoduje wywołanie przerwania oraz ustawienie bitu T0IF na jedynkę. Rejestr OPTION_REG służy głównie do ustawiania opcji układu czasowego TIMER0. Struktura rejestru OPTION_REG została pokazana na rys. 2.50 Rys. 2.50. Struktura rejestru OPTION_REG Poniżej przedstawiono opis poszczególnych bitów rejestru OPTION_REG służących do konfiguracji układu TIMER0: • • • • T0CS – 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 układu TIMER0, podział częstotliwości odbywa się w stosunku 1:2N+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 (tab. 2.12). Tabela 2.12 Konfiguracja układu preskalera Bity Podział Podział PS2,PS1,PS0 dla TIMER0 dla WDT 000 1:2 1:1 001 1:4 1:2 010 1:8 1:4 011 1:16 1:8 100 1:32 1:16 101 1:64 1:32 110 1:128 1:64 111 1:256 1:128 1.1.4. Inicjalizacja układu TIMER0 w trybie czasomierza i w trybie licznika Układ czasowy TIMER0 może pracować w dwóch trybach: w trybie licznika i trybie czasomierza. Wyboru trybu dokonuje się za pomocą ustawień bitu T0CS w rejestrze OPTION_REG. Tryb czasomierza jest wybierany poprzez wyzerowanie bitu T0CS w rejestrze OPTION_REG. W tym trybie zawartość licznika jest inkrementowana w każdym cyklu rozkazowym (bez preskalera). Jeżeli do rejestru licznika TMR0 jest zapisywana jakaś wartość, inkrementacja jest zawieszana na 2 następne cykle. Użytkownik powinien to skorygować poprzez wpisanie odpowiedniej wartości do rejestru TMR0. Tryb licznika wybiera się poprzez ustawienie na jedynkę bitu T0CS w rejestrze OPTION_REG. W trybie licznika zawartość licznika będzie inkrementowana w przypadku nadejścia każdego narastającego lub opadającego zbocza na wyprowadzeniu RA4/T0CKI. Zbocze, na które licznik ma reagować jest ustalane za pomocą bitu T0SE w rejestrze OPTION_REG. Wyzerowanie tego bitu oznacza, że układ będzie reagował na zbocze narastające, a ustawienie na jedynkę oznacza, że układ będzie reagował na zbocze opadające sygnału na wyprowadzeniu RA4/T0CKI. ZADANIA 1. Przy pomocy układu czasowego TIMER0 zaprojektować układ, który będzie migał diodą na linii RA0 z okresem 1 s. 2. Przy pomocy układu czasowego TIMER0 zaprojektować układ, który będzie co 0,5 sek. zapalać kolejną diodę z 4 diod podłączonych do portu A (RA0…RA3). Układy zasymulować w środowisku MPLAB SIM.