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