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.