1 16-bitowy timer

Transkrypt

1 16-bitowy timer
1 16-BITOWY TIMER
16 – bitowy timer jest to wydzielona część mikrokontrolera przeznaczona do obsługi
zdarzeń związanych z czasem takich jak zliczanie impulsów, pomiar częstotliwości, pomiar
czasu, generowanie pojedynczych lub periodycznych impulsów. Aby opisane wyżej zdania
realizowane były z dużą dokładnością wymagane jest zwykle aby dokładność timera wynosiła
ułamki mikrosekund
1.1 Źródła impulsów
Istnieją dwa źródła impulsów zliczanych przez timer: sygnał zegarowy CPU oraz sygnał
zewnętrzny dołączony do dedykowanego portu. Jeśli licznik zlicza takty wewnętrznego zegara
są one podawane na preskaler dzielący częstotliwość cpu przez 2, 4. lub 8. Częstotliwość pracy
rdzenia jest równa częstotliwości oscylatora podzielonej przez 2 (dla normalnej pracy) lub przez
większą wartość dla procy spowolnionej. Jeśli timer zlicza impulsy zewnętrzne podawane na
wybrany pin portu to przebieg ten podawany jest bezpośrednio na licznik bez preskalera.
Wymagane jest by częstotliwość tego przebiegu była 4 razy mniejsza niż częstotliwość fcpu.
0
0
1
1
Sygnał zegarowy
Sygnał zewnętrzny
0
1
0
1
1/4
1/2
1/8
zewn
Taktowanie
licznika
TACR2
CC1 CC0
EXE
DG
1
0
Stosunek podziału preskalera oraz źródło impulsów wybierane jest poprzez odpowiednie
ustawienie bitów CC1 i CC0 w rejestrze kontrolnym timera TACR2.
Zegar timera CC1 CC0
fCPU / 4
0
0
fCPU / 2
0
1
fCPU / 8
1
0
Sygnał
1
1
zewnętrzny
Uwaga: W kontrolerze ST72334 taktowanie timera sygnałem zewnętrznym jest możliwe
tylko dla Timera A.
1.2 Licznik swobodnego zliczania (Free-Running Counter)
Głównym komponentem timera jest 16 bitowy licznik swobodnego zliczania (rejestry: CHR
– starszy bajt oraz CLR młodszy bajt). Jest to licznik binarny inkrementowany przy każdym cyklu
wewnętrznego zegara timera. Istnieje możliwość odczytu tego licznika, ale nie można go
ustawiać. Można jedynie spowodować jego zresetowanie do wartości początkowej wynoszącej
FFFCh. Resetowanie licznika może nastąpić automatycznie lub programowo w zależności od
trybu pracy. Każdorazowo przy zmianie stanu licznika z FFFFh na 0000 ustawiany jest bit TOF
(Timer Over-Flow) w rejestrze statusu TSR. Odczyt młodszego bajtu licznika powoduje
wyzerowanie bitu TOF. Jeśli wymagany jest odczyt licznika bez kasowania flagi TOF należy
odczytywać stan licznika z rejestrów alternatywnych (ACHR oraz ACLR). Odczyt młodszego
bajtu rejestru alternatywnego nie resetuje flagi przepełnienia licznika.
1.2.1 Odczyt licznika swobodnego zliczania
Odczyt licznika swobodnego zliczania może być dokonywany w dowolnym momencie. Jak
wspomniano wcześniej jest to licznik 16 – bitowy, więc dla kontrolera 8-bitowego niemożliwy jest
jednoczesny odczyt całego licznika, co może powodować bardzo duże błędy (zmiana stanu
licznika między odczytem młodszego i starszego bajtu). Aby rozwiązać ten problem dodano
mechanizm buforowania młodszego bajtu licznika. W momencie odczytu starszego bajtu
wartość młodszego bajtu licznika jest zatrzaskiwana w buforze. Jeśli po odczytaniu starszego
odczytujemy młodszy bajt zawiera on wartość licznika zamrożoną w chwili odczytu starszego
bajtu. Opisywany mechanizm działa również przy odczycie rejestrów alternatywnych.
1.2.2 Resetowanie licznika swobodnego zliczania
Licznik swobodnego zliczania nie może być ustawiany. Istnieje jednak możliwość
zresetowania go poprzez zapis dowolnej wartości do rejestru CLR lub ACLR. Należy odnotować,
że w liczniku po resecie znajduje się do wartość FFFCH (lub –4), a nie zero. Należy to wziąć
pod uwagę przy wyliczaniu zależności czasowych. Również reset sprzętowy ustawia licznik na
FFFCH.
1.2.3 Flaga TOF
Flaga Timer OverFlow to bit w rejestrze statusowym timera (Timer Status Register). Flaga
ta jest ustawiana (TOF=1) każdorazowo przy zmianie stanu licznika z FFFFH na 0000.
Jej kasowanie może być dokonane programowo po wykonaniu następującej sekwencji:
odczyt rejestru statusowego (TSR)
odczyt lub zapis do młodszego bajtu rejestru licznika (rejestr CLR).
Żadna inna sekwencja nie kasuje flagi TOF w szczególności użycie rejestru
alternatywnego ACLR zamiast CLR. Pokazano to na rysunku poniżej
Flaga TOF jest ustawiana przy przejściu
16-bitowego licznika swobodnego
zliczania z wartości FFFFh na 0000h
Zerowanie flagi
TOF
Niezerowanie flagi
TOF
Krok 1: odczyt rejestru TSR
Krok 2: odczyt lub zapis * do młodszego
bajtu rejestru licznika swobodnego
zliczania TACLR lub TBCLR
Odczyt młodszego bajtu rejestru
alternatywnego licznika swobodnego
zliczania TAACLR lub TBACLR
* Zapis do młodszego
bajtu ustawia licznik na
wartość FFFCh
Flaga TOF została
wyzerowana
Flaga TOF nie została
wyzerowana
Przepełnienie licznika jest źródłem przerwania, które może być włączane lub blokowane
(maskowane) poprzez bit TOIE w pierwszym rejestrze kontrolnym timera (Timer Control
Register 1). Aby przerwanie mogło być zgłoszone musi byś włączony system przerwań poprzez
wyzerowanie bitu I (rozkaz RIM) w rejestrze wskaźników (Condition Code Register):
FFFh-0000h
TSR
TCR1
TOF
TOIE
CCR
I
Przerwanie
od licznika
Procedura obsługi przerwania musi skasować flagę TOF poprzez wykonanie sekwencji
opisanej wyżej. Flaga ta nie jest automatycznie kasowana przez system przerwań.
Przykład
Ustawianie przerwania od przepełnienia licznika oraz kasowanie flagi TOF w procedurze obsługi
przerwania.
ld A,#$20
ld TACR1,A
ld A,#$00
ld TACR2,A
...
...
.tima_rt
;TOIE = 1, uaktywnienie przerwania
;od przepełniania licznika.
;brak innych przerwań, nie aktywne
;tryby zatrzaskiwania i porównywania
;zegar timera = fcpu/4
; ******************************
; *
Kasowanie flagi TOF
*
; ******************************
ld A,TASR
ld A,TACLR
;odczyt rejestru statusowego
;odczyt młodszego bajtu licznika powoduje
;zresetowanie flagi TOF
; powrót do programu głównego
iret
1.3 Tryb wejście zatrzaskujące (Input capture)
Opisany wyżej licznik może być odczytywany w locie, jednak zastosowanie takiego
odczytywania do pomiarów zależności czasowych powodowałoby duże błędy. Aby uniknąć tych
błędów został wprowadzony tryb pracy licznika zwany wejście zatrzaskujące.
Należy odnotować, że każdy timer posiada 2 kanały zatrzaskiwania. W poniższym opisie
litera i powinna być zastępowana przez 1 lub 2.
Wejście zatrzaskujące to mechanizm pozwalający zapamiętać stan licznika w momencie
zmiany stanu zewnętrznego sygnału podłączonego do portu kontrolera. Jeśli używamy tego
mechanizmu to pin ICAPi w porcie musi być ustawiony jako wejście. Przy pomocy bitu IEDGi w
pierwszym rejestrze kontrolnym timera (Timer Control Register 1) możemy wybrać czy
zdarzeniem powodującym zatrzaśnięcie jest zbocze narastające, czy opadające. Gdy wybrane
zbocze zostanie wykryte do rejestrów ICiHR-ICiLR zostaję przepisana wartość licznika plus
jeden. Wykrycie odpowiedniego zbocza powoduje również ustawienie flagi ICFi w rejestrze
statusowym (TSR), która uruchamia przerwanie timera jeśli ustawiono flagę zezwolenia na
przerwanie od mechanizmu zatrzaskiwania ICIE w pierwszym rejestrze kontrolnym timera
(TCR1). Flaga ta jest wspólna dla obu kanałów zatrzaskiwania. Na rysunku poniżej
przedstawiono kanał 1 funkcji zatrzaskiwania timera A.
Wejście
zewnętrzne
zatrzaskujące
1
16-bitowy rejestr z zatrzaśniętą wartością
licznika swobodnego zliczania
TAIC1HR i TAIC1LR
0
TACR1
TOIE
TOIE
IIEDG1
zatrzaśnięcie
TSR
Licznik swobodnego
zliczania
ICF1
CCR
I
Przerwanie
od wejścia
zatrzaskującego
Opisany wyżej mechanizm pozwala na bardzo dokładny pomiar czasu jaki upłynął
pomiędzy wykryciem 2 różnych zdarzeń. Można dokonać między innymi pomiaru czasu trwania
impulsu (po wykryciu zbocza narastającego należy zmienić aktywne zbocze na opadające), czy
okresu przebiegu (pomiar dla zboczy narastających lub opadających). Jeśli czas mierzonego
zdarzenia przekracza wielkość licznika swobodnego zliczania to można uaktywnić przerwanie
generowane przy przepełnieniu licznika (flaga TOIE) i zliczać programowo ilość przepełnień.
W tabelach poniżej przedstawiono rejestry, bity oraz piny związane z trybem
zatrzaskiwania:
Timer A.
Kanał 1
Kanał 2
TAIC1HR & TAIC1LR
TAIC2HR & TAIC2LR
ICMP1_A
dla ST72334 PF6
ICF1
IEDG1 w TACR1
ICMP2_A
dla ST72334 PF5
ICF2
IEDG2 w TACR2
ICIE
Funkcja
Rejestry w których zatrzaskiwana jest wartość
licznika swobodnego (tylko do odczytu)
Piny wejściowe mechanizmu zatrzaskiwania
Flagi zgłoszenia przerwania (w rejestrze TASR)
Bit wyboru aktywnego zbocza
Wspólna maska przerwania w TACR1
Timer B
Kanał 1
Kanał 2
TBIC1HR & TAIC1LR
TBIC2HR & TAIC2L
ICMP1_B
dla ST72334 PC3
ICF1
IEDG1 w TBCR1
ICMP2_B
dla ST72334 PC2
ICF2
IEDG2 w TBCR2
ICIE
Funkcja
Rejestry w których zatrzaskiwana jest wartość
licznika swobodnego (tylko do odczytu)
Piny wejściowe mechanizmu zatrzaskiwania
Flagi zgłoszenia przerwania (w rejestrze TBSR)
Bit wyboru aktywnego zbocza
Wspólna maska przerwania w TBCR1
1.4 Tryb wyjście porównania (Output compare)
Tryb wyjście porównania to mechanizm pozwalający generować zdarzenia w momencie
zrównania się wartości licznika swobodnego zliczania z wartością wpisaną do rejestrów OCHR i
OCLR.
Generowane zdarzenie może powodować następujące efekty:
uruchomienie przerwania
zmiana stanu portu kontrolera
zresetowanie licznika swobodnego zliczania (tylko dla trybu PWM ).
Na rysunku poniżej przedstawiono schemat blokowy mechanizmu wyjścia porównania.
16-bitowy rejestr porównania
TAOC1HR i TAOC1LR
Licznik swobodnego zliczania
Porównanie
16
16
TACR2
TACR1
TOIE
TASR
OC1E
OLV
L1
D
OCF1
1
CCR
Wyjście
zewnętrzne
porównania
Clk
I
Przerwanie
od wyjścia
porównania
0
Funkcja portu
wejścia/wyjaścia
Podobnie jak w przypadku wejścia zatrzaskiwania każdy timer posiada 2 układy wyjścia
zatrzaskiwania. W tabelach poniżej przedstawiono nazwy rejestrów, bitów oraz pinów dla 2
układów porównania timerów A i B.
Timer A:
Kanał 1
Kanał 2
TAOC1HR & TAOC1LR
TAOC2HR & TAOC2LR
Funkcja
Rejestry z którymi porównywana jest wartości
licznika swobodnego zliczania
Piny wyjściowe mechanizmu porównania
OCMP1_A
dla ST72334 PF4
OCF1
OCMP2_A
dla ST72334 PF3
OCF2
OC1E
OC2E
Flagi zgłoszenia przerwania (w rejestrze
TASR)
Bit odblokowania wyjścia porównania w
OLVL1
OLVL2
Stan przepisywany do wyjścia porównania (bit
FOLV1
FOLV2
Bit wymuszenia przepisywania OLVL do
OCMP TACR1
Wspólna maska przerwania w TACR1
TACR2
w TACR1).
OCIE
Timer B:
Kanał 1
Kanał 2
TBOC1HR & TBOC1LR
TBOC2HR & TBOC2L
OCMP1_B
dla ST72334 PC1
OCF1
OC1E
OLVL1
OCMP2_B
dla ST72334 PC0
OCF2
OC2E
OLVL2
Funkcja
Rejestry z którymi porównywana jest wartości
licznika swobodnego zliczania
Piny wyjściowe mechanizmu porównania
Flagi zgłoszenia przerwania (w rejestrze TBSR)
Bit odblokowania wyjścia porównania w TBCR2
Stan przepisywany do wyjścia porównania (bit
w TBCR1).
FOLV1
FOLV2
Bit wymuszenia przepisywania OLVL do OCMP
TBCR1
OCIE
Wspólna maska przerwania w TBCR1
Poniższy opis odnosi się do pierwszego kanału wyjścia porównania oraz Timera A. Dla
pozostałych kombinacji należy zamienić litery oznaczające nazwę timera oraz cyfry oznaczające
numer kanału.
Para rejestrów TAOC1HR-TAOC1LR zawierająca wartość, która porównywana jest z
zawartością licznika swobodnego zliczania. Jeśli funkcja porównywania nie jest
używana można jej używać jak normalne rejestry.
Jeśli nastąpi zrównanie ustawiana jest flaga OCF1 w rejestrze TASR. Bit ten może być
skasowany tylko poprzez wykonanie następującej sekwencji: odczyt TASR, a
następnie zapis lub odczyt TAOC1LR.
Jeśli w rejestrze TACR1 ustawiony jest bit OCIE następuje zgłoszenie przerwania. Bit
OCF1 nie jest automatycznie kasowany i musi być skasowany programowo poprzez
zastosowanie sekwencji opisanej powyżej.
Jeśli w rejestrze TACR2 ustawiony jest bit OC1E to za stan pinu OCMP1_A odpowiada
Timer A. W momencie ustawienia bitu OCF1, do pinu OCMP1_A kopiowana jest
zawartość bitu OLVL1 w rejestrze TACR1.
Jeśli bit FOLV1 jest ustawiony to timer przełącza się w mod w którym pin wyjścia
porównania stale odzwierciedla stan bitu OLVL1 nie zależnie od tego czy nastąpiło
zrównanie czy nie. Bit FOLV1 może być ustawiany programowo, ale aby go wyzerować
potrzebny jest reset sprzętowy.
Opisana wyżej funkcja może być wykorzystana do generowania przebiegów prostokątnych
o zadanej częstotliwości (przy każdym zrównaniu należy zmienić stan OLVL1) lub generowania
przerwań z zadanym interwałem czasowym.
FFFFh
OCR+
OCR
0000h
Timer IT
Timer IT
Aby przerwania następowały co określony interwał do wartości rejestru OCR w procedurze
obsługi przerwania timera należy dodać wartość obliczoną ze wzoru:
∆OCiR =
∆t ⋅ f CPU
PRESC
gdzie:
∆t – interwał w sekundach
fCPU – częstotliwość pracy rdzenia w Hz (dla normalnej pracy fCPU = 0,5 fOSC)
PRESC – stosunek podziału częstotliwości ustawiany przez bity CC1,CC0 w drugim
rejestrze kontrolnym
1.5 Tryb generowania pojedynczego impulsu.
Cechy trybów wejścia zatrzaskiwania i wyjścia porównania są wykorzystywane
jednocześnie w trybie generowania pojedynczego impulsu. Tryb ten wybierany jest poprzez
ustawienie bitu OPM w rejestrze TACR2 (lub TBCR2 dla Timera B). W modzie tym aktywne
zbocze na pinie ICAP1_A zmienia stan pinu OCMP1_A, a następnie po zdefiniowanym czasie
(zapisanym w rejestrze TAOCR) pin powraca do stanu poprzedniego. Opisany mechanizm
przedstawiono na wykresie poniżej.
FFFFh
FFFCh
Compare 1
0000h
ICAP1
Input Capture pin
Timer Input
OCMP1
Output Compare pin
Timer Output
Ustawienia dla tego trybu:
do rejestrów TAOC1HR-TAOC1LR należy zapisać liczbę taktów licznika
odpowiadającą długości impulsu minus 4
ustawić bit OLVL2 w TACR1 na stan odpowiadający stanowi generowanego impulsu, a
bit OLVL1 w TACR1 na stan przeciwny.
wybrać aktywne zbocze poprzez ustawienie bitu IEDG1 w TACR1 (0 dla zbocza
opadającego, 1 dla narastającego).
ustawić bit OPM w TACR2.
ustawić bit OC1E w TACR2, aby uaktywnić wyjście.
Liczbę taktów zegara odpowiadającą długości impulsu wpisywaną do rejestru porównania
można też obliczyć ze wzoru:
OCiR =
t ⋅ f CPU
−5
PRESC
gdzie:
t – czas trwania impulsu w sekundach
fCPU – częstotliwość pracy rdzenia w Hz (dla normalnej pracy fCPU = 0,5 fOSC)
PRESC – stosunek podziału częstotliwości ustawiany przez bity CC1,CC0 w drugim
rejestrze kontrolnym
Wykrycie aktywnego zbocza zmienia stan pinu wyjściowego, ale również powoduje
zresetowanie licznika swobodnego zliczania do wartości FFFCh, następnie zrównanie się
licznika z wartością w rejestrze TAOC1R powoduje przywrócenie na pinie wyjściowym stanu
początkowego. Resetowanie licznika swobodnego zliczania do wartości FFFCh pociąga za sobą
konieczność w pisanie do rejestru porównania wartości interwału minus 4.
Jeśli istnieje taka potrzeba oba zbocza generowanego impulsu mogą zgłaszać przerwanie:
Zdarzenie zatrzaskiwania związane z pierwszym zboczem impulsu ustawia flagę ICF1
w rejestrze TASR. Jeśli ustawiona jest flaga ICIE zostanie zgłoszone przerwanie. Flaga
ICF1 musi być zerowana programowo przez zastosowanie procedury opisanej
wcześniej.
Zdarzenie zrównania związane z drugim zboczem ustawia flagę OCF2 w rejestrze
TASR. Jeśli ustawiona jest flaga OCIE zgłaszane jest przerwanie. Flaga OCF2 musi
być zerowana programowo przez zastosowanie procedury opisanej wcześniej
Flaga OCF1 nie jest nigdy ustawiana dla tego typu pracy, dzięki czemu możliwe jest
oddzielne ustawianie lub blokowanie przerwań dla dwóch zdarzeń opisanych wyżej.
Wejście
zewnętrzne
zatrzaśnięcia
Konfiguracja pinu
(patrz tryb wejścia
zatrzaskującego)
16-bitowy rejestr porównania
TAOC1HR i TAOC1LR
Licznik swobodnego zliczania
TACR2
FFFCh
Porównanie
OPM
16
16
TACR1
ICIE OCIE
TASR
ICF1
OLV
L2
OLV
L1
OCF2
CCR
D
D
I
Clk
Clk
Konfiguracja pinu
(patrz tryb wyjścia
porównania)
Wyjście
zewnętrzne
porównania
Przerwanie
1.6 Tryb modulacji szerokości impulsu (PWM)
W trybie tym wykorzystywane są jednocześnie oba kanały porównania. Wyboru trybu
modulacji szerokości impulsu dokonujemy poprzez ustawienie bitu PWM w rejestrze TACR2 (lub
TBCR2 dla Timera B). Tryby generowania pojedynczego impulsu i PWM nie mogę być
wykorzystywane jednocześnie. Jeśli zostaną ustawione bity OPM i PWM to timer będzie
pracował w trybie PWM.
W opisywanym trybie licznik swobodnego zliczania jest resetowany poprzez zastosowanie
mechanizmu porównania, a nie przez zewnętrzny sygnał jak w trybie pojedynczego impulsu. Do
rejestru porównania drugiego kanału należy wpisać wartość równą okresowi przebiegu
przekonwertowana na liczbę taktów licznika minus 4. Każdorazowe zrównanie licznika
swobodnego zliczania i rejestru TAOC2R, powoduje takie same skutki jak wystąpienie
aktywnego zbocza w trybie generowania pojedynczego impulsu: pin OCMP1_A zmienia swój
stan, a licznik jest resetowany do wartości FFFCh, następnie zrównanie się licznika i rejestru
TAOC1R powoduje powrót pinu do stanu początkowego.
Tmax = Ttimer x 65535
FFFFh
FFFCh
Compare 2
Compare 1
0000h
OLVL2=1
OCMP1
Output Compare pin
Timer Output
OLVL1=0
Ustawienia dla tego trybu:
do rejestrów TAOC1HR-TAOC1LR należy zapisać liczbę taktów licznika
odpowiadającą długości impulsu minus 4.
do rejestrów TAOC2HR-TAOC2LR należy zapisać liczbę taktów licznika
odpowiadającą okresowi przebiegu minus 4
ustawić bit OLVL2 w TACR1 na stan odpowiadający stanowi generowanego impulsu, a
bit OLVL1 w TACR1 na stan przeciwny.
ustawić bit PWM w rejestrze TACR2.
ustawić bit OC1E w TACR2, aby uaktywnić wyjście.
Dla trybu PWM flagi przerwań OCF1 i OCF2 nie są ustawiane. Przerwanie może być
jednak zgłaszane przy wystąpieniu pierwszego zbocza impulsu. Mechanizm porównania
zastępuje niejako mechanizm zatrzaskiwania więc przy wykryciu pierwszego zbocza ustawiana
jest flaga ICF1 w rejestrze TASR i jeśli ustawiona jest maska ICIE zgłaszane jest przerwanie.
Flaga ICF1 musi być wyzerowana w ten sam sposób jak w trybie wejścia zatrzaskiwania.
Liczbę taktów zegara odpowiadającą długości impulsu lub okresowi przebiegu wpisywaną
do rejestrów porównania można też obliczyć ze wzoru:
OCiR =
t ⋅ f CPU
−5
PRESC
gdzie:
t – czas trwania impulsu lub okres przebiegu w sekundach
fCPU – częstotliwość pracy rdzenia w Hz (dla normalnej pracy fCPU = 0,5 fOSC)
PRESC – stosunek podziału częstotliwości ustawiany przez bity CC1,CC0 w drugim
rejestrze kontrolnym
Licznik swobodnego zliczania
FFFCh
16-bitowy rejestr porównania
TAOC2HR i TAOC2LR
Porównanie
16
16-bitowy rejestr porównania
TAOC1HR i TAOC1LR
Porównanie
16
16
TACR2
OLV
L2
ICIE
PWM
TASR
OLV
L1
D
ICF1
D
Clk
Clk
CCR
I
Konfiguracja pinu
(patrz tryb wyjścia
porównania)
Przerwanie
Wyjście
zewnętrzne
porównania