Ćwiczenie nr 3: TEMAT: Timery T0 T1
Transkrypt
Ćwiczenie nr 3: TEMAT: Timery T0 T1
POLITECHNIKA CZĘSTOCHOWSKA, WYDZIAŁ INŻYNIERII MECHANICZNEJ I INFORMATYKI KATEDRA INŻYNIERII KOMPUTEROWEJ Laboratorium Systemów Mikroprocesorowych TEMAT: Ćwiczenie nr 3: Timery T0 T1 mikrokontrolera SAB80C537. 1.Wiadomości podstawowe Mikrokontroler SAB80C537 wyposażony jest m.in. w dwa układy czasowo/licznikowe – timery T0 i T1. Każdy z nich może pracować w czterech trybach pracy z wyjątkiem trybu 3, w którym T1 jest zablokowany. Tryby pracy T0/T1 omówione zostaną poniżej na przykładzie timera T0 (dla timera T1 obowiązują identyczne zasady z wyjątkiem wspomnianego trybu 3): Tryb 0/Tryb 1: W trybie tym T0 pracuje jako licznik 13 bitowy, na które składa się 5 młodszych bitów rejestru TL0 oraz 8 bitów rejestru TH0. W trybie 1 T0 pracuje jako pełny licznik 16 bitowy (wykorzystywane są wszystkie bity TL0 i TH0). Poza tym praca T0 w obu trybach nie różni się niczym. Po osiągnięciu przez licznik maksymalnej reprezentowanej liczby (tryb 0: - TH0=11111111B TL0=00011111B; tryb 1: - TH0=11111111B, TL0=11111111B) ustawiony zostaje bit zgłoszenia przerwania TF0. Jeśli procesor będzie miał w takiej sytuacji zezwolenie1 na wykonanie przerwania T0 nastąpi wywołanie procedury obsługi przerwania, znajdującego się pod adresem2 000Bh dla przerwania pochodzącego od T0 lub 001Bh dla T1. Pod wskazanymi adresami powinna znajdować się instrukcje skoku do napisanych przez nas procedur obsługi przerwań. rozpoczęcie wykonywania procedury obsługi przerwania powoduje automatyczne skasowanie odpowiedniego bitu zgłoszenia przerwania TF0 lub TF1. Tryb 2: Licznik T0 pracuje jako licznik 8 bitowy (TL0), natomiast w momencie przepełnienia (zmiana stanu TL0 z FFh na 00h następuje (oprócz zgłoszenia żądania przerwania) automatyczne przepisanie zawartości rejestru TH0 do rejestru zawartości licznika TL0. W związku z czym licznik rozpoczyna kolejny cykl liczenia nie od zera ale od pewnej wartości początkowej (zawartości TH0). Taki tryb pracy umożliwia między innymi cykliczne zgłaszanie przerwania TF0 z ustaloną poprzez zawartość rejestru TH0 częstotliwością. Tryb ten wykorzystywany jest również jako źródło sygnału zegarowego taktującego transmisję poprzez łącze szeregowe. Tryb 3: Licznik T1 jest na stałe zablokowany (nie zlicza), natomiast licznik T0 podzielony jest na dwa oddzielne układy licznikowe: TL0 i TH0, każdy po 8 bitów. Część TH0 może przy tym pracować wyłącznie jako układ czasowy (zliczający cykle zegarowe), natomiast część TL0 pracuje jak w innych trybach z pełną możliwością konfiguracji pracy. Istotna uwaga dotyczy sposobu zgłaszania przerwania i zatrzymywania/uruchamiania licznika TH0. Licznik TH0 uruchamiany jest bitem TR1 („pożyczonym” od nieaktywnego w tej chwili licznika T1), oraz w momencie przepełnienia zgłasza przerwanie TF1, które normalnie zgłaszane jest przez wspomniany licznik T1. 1 Użytkownik może zezwolić na odpowiednie przerwanie ustawiając bity ET0 dla timera T0 lub ET1 dla timera T1. Bity te wchodzą w skład rejestru IEN0 (rys.3) i mogą być ustawiane instrukcjami SETB ... oraz CLR .... Dodatkowo powinien być ustawiony bit globalnego zezwolenia na przerwania EAL. 2 Uwaga w przypadku korzystania z programu monitora adresy te powinny być odpowiednio 800Bh oraz 801Bh. Procedura obsługi przerwania powinna na swoim początku odkładać na stos zawartość wszystkich rejestrów, z których korzysta a przed zakończeniem odzyskiwać ich zawartość ze stosu. (Uwaga ta dotyczy również rejestru PSW, którego zawartość może zostać zmieniona przy okazji wykonywania operacji arytmetycznych lub logicznych.). Procedura obsługi przerwania powinna kończyć się instrukcją RETI, która spowoduje powrót do wykonywania programu głównego. We wszystkich trybach obowiązują takie same reguły dotyczące sterowania licznikami T0/T1 patrz tabela 1 oraz tabela 2. |------------------------- TIMER 1 -------------------------|----------------------- TIMER 0 --------------------------| | | | GATE C\~T M1 M0 GATE C\~T M1 M0 Rys.1 Bity sterujące licznikami T0/T1 zawarte w rejestrze TMOD M1,M0 C/~T GATE bity wyboru trybu pracy timerów: 00 – tryb 0 01 – tryb 1 10 – tryb 2 11 – tryb 3 Counter/~Timer – Bit wyboru sposobu pracy timerów: C\~T = 1 – timer pracuje jako licznik impulsów zewnętrznych (podawanych na wejście odpowiednio T0 lub T1), C\~T = 0 – timer pracuje jako licznik impulsów zegarowych i może służyć do odmierzania odcinków czasu. Bit sterujący zliczaniem: GATE = 1 licznik będzie zliczał tylko wtedy gdy na wejście INT0 (INT1 dla T1) zostanie podany sygnał wysoki (logiczna jedynka) oraz bit zezwolenia zliczania TR0 (TR1) będzie ustawiony, GATE = 0 sterowanie licznikiem (zliczanie/zatrzymanie) zależy tylko od bitu TR0 (TR1). Tabela 1. Opis bitów rejestru TMOD TF1 TR1 TF0 TR0 Rys.2 Bity sterujące licznikami zawarte w rejestrze TCON TF0, TF1 bit zgłoszenia przerwania odpowiednio od licznika T0 lub T1 ustawiany przez procesor w chwili przepełnienia licznika. Jeśli procesor będzie miał zezwolenie na wykonanie przerwania(2) wykonana zostanie odpowiednia procedura obsługi przerwania. Bit zgłoszenia przerwania TF0(TF1) zostanie w takim przypadku automatycznie skasowany. TR0, TR1 Bit sterujący zliczaniem/zatrzymaniem liczników: 0 – licznik zatrzymany, 1 – licznik zlicza impulsy (zegarowe lub pochodzące z zewnątrz). Tabela 2. Opis bitów rejestru TCON 2. Przykład Przykład 1. Ustawić Timer T0 w tryb pracy 1 zliczania impulsów podawanych z zewnątrz bez zewnętrznego sterowania zliczaniem, natomiast timer T1 do pracy w trybie 2 zliczania impulsów zegarowych z wartością początkową równą 170, również bez zewnętrznego sterowania zliczaniem. Timery nie powinny generować przerwań. Następnie należy uruchomić oba timery. Rozwiązanie: Posługując się tablicami 1 i 2 ustalamy dla timera T0: M1=0, M0=1, C\~T=1, GATE=0, oraz dla timera T1: M1=1, M0=0, C\~T=0, GATE=0 oraz TH1=170 (wartość początkowa). Powyższe zadanie realizuje następująca instrukcja: MOV TMOD, #00100101b Ponieważ timery nie powinny generować przerwań należy skasować bity ET0 i ET1: CLR ET0 CLR ET1 Natomiast uruchomienie timerów następuje po instrukcjach: SETB TR0 ;timer T0 SETB TR1 ;timer T1 Przykład 2. Napisać procedurę obsługi przerwania Timera T0 zwiększającą zawartość rejestru uniwersalnego R5 w każdym cyklu przerwania oraz wpisującą wartość początkową do tego licznika równą 1000h. Timer ma pracować w trybie 16-bitowym bez przeładowywania (tryb 1). W pętli głównej programu zawartość rejestru R5 powinna być dla zobrazowania przesyłana na port, do którego podpięty jest wyświetlacz LED. Zaobserwować szybkość zmian poszczególnych bitów (poprzez obserwację odpowiadających im segmentów na wyświetlaczu LED) przy najwolniej generowanych przerwaniach (wartość początkowa licznika równa zero). Rozwiązanie: Program realizujący powyższe zadanie może wyglądać następująco: $NOMOD51 $INCLUDE (bin\REG517.INC) ;wektor przerwania T0 ORG 800Bh LJMP IRQ_T0 IRQ_T0: PUSH PSW INC R5 ;zwieksz zawartosc rejestru R5 ;wpisanie wartosci poczatkowej CLR TR0 ;na czas zmiany nalezy timer zatrzymac MOV TL0,#00h ;mlodsza czesc MOV TH0,#10h ;starsza czesc wartosci poczatkowej SETB TR0 ; juz moze liczyc POP PSW RETI ;######## POCZATEK PROGRAMU GLOWNEGO ############## ORG 8100h LCALL WLACZ_TIMERY petla: MOV P6,R5 ;pokaz zawartosc R5 na wyswietlaczu LED LJMP petla ;powtarzaj w nieskonczonej petli ;######################################################### ;###### ustawienia timerow ####### ;********* bity w rejestrze TMOD ********* ;TIMER 0 T0_G EQU 0 ;GATE T0_C EQU 0 ;COUNTER/-TIMER T0_M EQU 1 ;MODE (0..3) TIM0 EQU T0_M +T0_C*4 +T0_G*8 ;TIMER 1 - tutaj niewazne T1_G EQU 0 ;GATE T1_C EQU 0 ;COUNTER/-TIMER T1_M EQU 0 ;MODE (0..3) TIM1 EQU T1_M + T1_C*4 + T1_G*8 TMOD_SET EQU TIM0 + TIM1*16 WLACZ_TIMERY: MOV TMOD,#TMOD_SET ;Ustawienie trybu pracy Timerow 0 i 1 CLR SETB TR1 TR0 SETB CLR ET0 ET1 ;włącz zezwolenie na ;przerwanie od Timera 0, T1 ma nie generowac przerwan SETB EAL ;zezwolenie na przerwanie ogolne ;zatrzymanie Timera 1 (interesuje nas tylko timer T0) ;start Timera 0 RET END 3. Program ćwiczenia 1. Napisać procedurę obsługi przerwania Timera T0 zwiększającą o jeden liczbę hexadecymalną wyświetlaną na wyświetlaczu LED w każdym cyklu obsługi przerwania. Timer ma pracować w trybie 16-bitowym bez przeładowywania (tryb 1). Szybkość generacji przerwań należy regulować przez wpisywanie odpowiedniej wartości początkowej do licznika. Sprawdzić jaką najmniejszą i największą częstość generacji przerwań można uzyskać w ten sposób. 2. Zmodyfikować program z punktu 1 tak aby cyfry na wyświetlaczu LED zmieniały się co ok. 1 sekundę. Uwaga – można to zrealizować przez wprowadzenie dodatkowego licznika programowego (patrz przykład 2). 3. Do programu z p.2 dorobić regulację szybkości zmian cyfr na wyświetlaczu za pomocą potencjometru. Program powinien być tak napisany, aby zakres zmian liczenia częstotliwości wynosił w przybliżeniu 5Hz..0.5Hz. 4. Dorobić w programie z p.3 zmianę kierunku liczenia w reakcji na wciśnięcie wybranego przycisku, oraz zerowanie cyfry wyświetlanej na wyświetlaczu LED w reakcji na wciśnięcie innego. 4 Wnioski z ćwiczenia Opisać szczegółowo napisane programy. W jaki sposób i w jakim możemy wpływać na szybkość generacji przerwań timerów? Jak można rozszerzyć ten zakres? W jaki sposób obsługiwane są przerwania i co powinna zawierać procedura ich obsługi? Jakie są możliwości pracy timerów T0,T1, do czego mogą one być wykorzystane? Jakie są zalety korzystania z przerwań?