Ć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ń?

Podobne dokumenty