Technika cyfrowa
Laboratorium
Temat: Timery/liczniki. Obsługa w trybie przeglądania.
Paweł Wańtowski 9.V.2006, Wrocław
Grzegorz Smychowski
Zadania do wykonania
Zadanie 1.
W zadaniu 1. należało utworzyć program, którego zadaniem jest generowanie opóźnień czasowych o zadanym czasie t (np. t1 oraz t2), przy czym program ten ma wykorzystywać licznik T0 lub T1. Napisanie takiego programu wymaga znajomości działania układów czasowo-licznikowych mikroprocesora 8051. Istotne jest, iż zawartość każdego licznika jest pamiętana na dwóch bajtach (dla T0: TH0-TL0 na rejestrach SFR 8Ch-8Ah, dla T1: TH1-TL1 na rejestrach SFR 8Dh-8Bh). Ważna jest też znajomość rejestrów specjalnych TCON oraz TMOD.
Zadanie 2.
Zadanie to polegało na utworzeniu programu generującego przynajmniej 3 równoległe sekwencje o zadanych czasach THIGH i TLOW. Wizualizacja czasu trwania zadanych sekwencji może być dokonana z wykorzystaniem diod LED, zaś program może być w dużej mierze oparty na programie zrealizowanym na potrzeby zadania 1.
Zadanie 3.
Celem zadania 3. było utworzenie programu o funkcjonalności stopera. Program ma za zadanie mierzyć odstęp czasu zawarty pomiędzy naciśnięciem przycisków powiązanych z portami P3.2 oraz P3.3, a następnie wyświetlać tenże czas (w sekundach) na wyświetlaczu LCD.
Opis realizacji
ad. Zadanie 1.
Koncepcja działania programu została zobrazowana na schemacie blokowym umieszczonym na schemacie 1. Utworzony program musiał zostać wyposażony w odwołania do potrzebnych do zrealizowania zadania rejestrów specjalnych (nieodzowne jest ustawienie odpowiedniego trybu pracy odpowiednio ustawiając poszczególne bity rejestru TMOD) i obsługę THx oraz TLx, odpowiedzialnych za czasy THIGH i TLOW zadawane timerowi Tx. Cykliczne generowanie opóźnienia czasowego jest zobrazowane poprzez zapalanie i gaszenie diody powiązanej z portem P1.0. Samo zapalanie i gaszenie realizowane jest w bardzo prosty sposób – następuje to poprzez zanegowanie stanu portu P1.0 poleceniem CPL. W zadaniu wykorzystany został timer T1. Odpowiednie ustawienie wartości TH1 oraz TL1 pozwala na generację impulsu czasowego o czasie trwania 50 ms. Dzięki odpowiedniemu wykorzystaniu przechowywanej w rejestrze R2 wartości 20 w pętli DJNZ zapalenie bądź wygaszenie diody trwa przez okres czasu równy jednej sekundzie. Należy wspomnieć, iż program działa w nieskończonej pętli. Dodatkowe komentarze zostały umieszczone w kodzie programu, który z kolei został umieszczony w listingu 1.
ad. Zadanie 2.
Tworzenie niniejszego programu pozwoliło wykorzystać wiedzę nabytą przy realizacji poprzedniego zadania oraz - częściowo - rozwiązania w nim zastosowane. Wygenerowanie trzech równoległych sekwencji nasunęło ideę umożliwienia deklaracji okresu stanu zapalenia i zgaszenia każdej z trzech wykorzystywanych diod podpiętych do portu P1 (jest to umożliwione poprzez deklarowanie w kodzie programu wartości TON1, TOFF1, TON2, TOFF2, TON3, TOFF3). Odpowiednie zaprojektowanie programu powoduje, iż po wykonaniu całego cyklu dla określonej diody następuje naprzemiennie zapalenie lub zgaszenie jej. Kod programu wraz z odpowiednimi komentarzami umieszczony został w listingu 2.
ad. Zadanie 3.
Zadanie miało polegać na utworzeniu stopera, czyli programu, który miałby odmierzać czas upływający pomiędzy dwoma naciśnięciami odpowiedniego przycisku (bądź przycisków). Ze względu na chęć uproszczenia interfejsu zadania oraz nadania mu specyfiki prawdziwych stoperów, zdecydowaliśmy się na użycie przycisków powiązanych z portem P3. Należy dodać, iż dla ułatwienia obsługi wyświetlacza LCD skorzystaliśmy z utworzonej na wcześniejszych zajęciach biblioteki LCD.inc, implementujące podstawowe funkcje powiązane z obsługą wyświetlacza LCD.
Z powodu niewystarczającej ilości czasu pozostałej na wykonanie tego zadania, utworzoną wersję programu można nazwać „roboczą” – chociaż implementuje ona założoną funkcjonalność, nie jest ona dopracowana w satysfakcjonującym stopniu. Kod programu został umieszczony w listingu 3.
Uwagi końcowe
Założenia wszystkich zadań przewidzianych do realizacji podczas zajęć laboratoryjnych zostały w pełni zrealizowane. Wykonywane ćwiczenia pozwoliły zapoznać się z zasadą działania timerów T0 oraz T1 poprzez odpowiednią obsługę przypisanych im wartości THx. i TLx oraz wybieranie odpowiednich trybów pracy, co w efekcie pozwoliło stworzyć funkcjonalny program użytkowy (stoper). Warto zauważyć, iż wykorzystane zostały umiejętności nabyte na poprzednich zajęciach – wykorzystanie diod LED oraz przycisków portu P3. Przydatna okazała się również napisana wcześniej biblioteka podprogramów obsługujących wyświetlacz LCD. Schemat blokowy algorytmu z zadania 1. został umieszczony na stronie 3, zaś listingi poszczególnych programów na stronach 4-7.
Schemat 1. Schemat blokowy algorytmu z zadania 1.
Listing 1. Kod programu z zadania 1.
;Lab4_Zad1_PW_GS_TC3
$NOMOD51 ; wylaczenie predefinicji rejestrow
$INCLUDE(reg517.inc) ; wlaczenie predefinicji rej. procesora 80537
CSEG AT 0000h ; adres poczatku programu
LOOP:
MOV R2,#20 ; R2*50ms
CPL P1.0
CALL OPOZN ; wezwanie procedury generujacej opoznienia
SJMP LOOP
OPOZN:
ANL TMOD,#0Fh ; wyzerowanie 4 starszych bitów odp. za ustawienia T1
ORL TMOD,#10h ; tryb pracy M0=1, M1=0
ANL TCON,#3Fh ; TF1=0, TR1=0
MOV TH1,#03Ch ; ustawienie wartosci poczatkowych dla licznika
MOV TL1,#0B0h ; 65536-50000
SETB TR1 ; start T1 (TR1=1)
LOOP2:
JNB TF1,$ ; czekanie az licznik sie przepelni i zglosi przerwanie
CLR TF1 ; zerowanie znacznika przepelnienia
MOV TH1,#3Ch ; ponowne ustawienie wartosci poczatkowych
MOV TL1,#0A9h
DJNZ R2,LOOP2
RET
END
Listing 2. Kod programu z zadania 2.
; Lab4_Zad2_PW_GS_TC3
CSEG AT 0000h
TON1 EQU 80 ; czas trwania zapalenia diody P1.0
TOFF1 EQU 7 ; czas trwania zgaszenia diody P1.0
TON2 EQU 45 ; czas trwania zapalenia diody P1.1
TOFF2 EQU 35 ; czas trwania zgaszenia diody P1.1
TON3 EQU 13 ; czas trwania zapalenia diody P1.2
TOFF3 EQU 28 ; czas trwania zgaszenia diody P1.2
START:
MOV TMOD,#01h ; ustawienie trybu pracy licznika T0
MOV R0,#TOFF1 ; przesuniecie do rejestrow okresow
MOV R2,#TOFF2 ; zgaszenia kolejnych diod LED
MOV R4,#TOFF3
LICZNIK:
LCALL OPOZN ; wywolanie opoznienia
MOV TH0,#4Ch ; ustawienia poczatkowe licznika T0
MOV TL0,#0h
SETB TR0 ; start licznika T0
JNB TF0,$ ; czekanie az do przepelnienia T0
LED0_DEC:
DEC R0
MOV A,R0
JZ LED0 ; jezeli wykonal sie pelen cykl dla P1.0 to zapal/zgas
LED1_DEC:
DEC R2
MOV A,R2
JZ LED1 ; jezeli wykonal sie pelen cykl dla P1.1 to zapal/zgas
LED2_DEC:
DEC R4
MOV A,R4
JZ LED2 ; jezeli wykonal sie pelen cykl dla P1.0 to zapal/zgas
JMP LICZNIK
LED0:
MOV A,P1
CPL ACC.0
MOV P1,A ; odczytanie stanu diody P1.0
JB ACC.0, LED0_OFF ; jezeli zapalona to zgas
LED0_ON:
MOV R0,#TON1 ; jezeli nie to zapal
JMP LED1_DEC
LED0_OFF:
MOV R0,#TOFF1
LED1:
CPL ACC.1
MOV P1,A ; odczytanie stanu diody P1.1
LCALL OPOZN
JB ACC.1, LED1_OFF ; jezeli zapalona to zgas
LED1_ON:
MOV R2,#TON2 ; jezeli nie to zapal
JMP LED2_DEC
LED1_OFF:
MOV R2,#TOFF2
LED2:
CPL ACC.2
MOV P1,A ; odczytanie stanu diody P1.2
JB ACC.0, LED2_OFF ; jezeli nie to zapal
LED2_ON:
MOV R4,#TON3 ; jezeli nie to zapal
LED2_OFF:
JMP ...
niobe666