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
$NOMOD51 ; wylaczenie predefinicji rejestrow
$INCLUDE(reg517.inc) ; wlaczenie predefinicji rej. procesora 80537
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
JMP LED1_DEC
LED1:
MOV A,P1
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
JMP LED2_DEC
LED2:
MOV A,P1
CPL ACC.2
MOV P1,A ; odczytanie stanu diody P1.2
LCALL OPOZN
JB ACC.0, LED2_OFF ; jezeli nie to zapal
LED2_ON:
MOV R4,#TON3 ; jezeli nie to zapal
JMP LICZNIK
LED2_OFF:
MOV R4,#TOFF3
JMP LICZNIK
OPOZN:
PUSH ACC
MOV A,#1h
ORL TMOD,#10h ; ustawienie trybu pracy licznika T1
MOV TL1,#0
MOV TH1,#76 ; ustawienia poczatkowe licznika T1
CLR TF1 ; wyzerowanie znacznika przepelnienia licznika T1
SETB TR1 ; start licznika T1
OPOZN_LOOP:
JNB TF1,$ ; czekanie na przepelnienie licznika T1
MOV TH1,#4Ch
CLR TF1 ; wyzerowanie znacznika przepelnienia licznika T1
DJNZ ACC,OPOZN_LOOP ; powtorz jesli A!=0
CLR TR1 ; wyzerowanie bitu sterujacego zliczaniem licznika T1
POP ACC ; odnowienie akumlatora
RET
END
Listing 3. Kod programu z zadania 3.
;Lab4_Zad3_PW_GS_TC3
$nomod51
$include(reg517.inc)
$include (lcd.inc)
ORG 0
LJMP PROG ; skok do procedury PROG
ORG 0Bh
LJMP PRZER ; skok do procedury PRZER
ORG 30h
PRZER:
INC B
RETI
PROG:
CALL initLCD ; wezwanie procedury inicjującej LCD
CALL LCDclear ; wezwanie procedury czyszczącej LCD
ORL TMOD,#09 ; ustawienie trybu pracy timera T0
POM:
MOV R0,#20h
CLR A ; czyszczenie zawartości akumulatora
MOV TL0,A
MOV TH0,A
MOV B,A
JB P3.3,$ ; obsluga przycisku uruchamiajacego stoper
SETB TR0 ; start pracy timera
JB P3.2,$ ; obsluga przycisku wylaczajacego stoper
CLR TR0 ; koniec pracy timera
MOV @R0,TL0
INC R0
MOV @R0,TH0
INC R0
MOV @R0,B ; przeksztalcenia wyniku w celu
MOV A,B ; poprawnego wyswietlenia go
MOV B,#15 ; na LCD
DIV AB
CALL putInt ; wezwanie procedury wyprowadzajacej czas na LCD
LJMP POM ; skok do procedury POM
END
1
Oczekiwanie na przepełnienie licznika i, gdy to nastąpi, zerowanie znacznika przepełnienia
Dokonaj ustawienia trybu pracy timera T1
Czy R2 = 0 ?
Ustaw wartości początkowe TH1, TL1 dla timera T1
Start timera T1
Zaneguj stan portu P1.0 (zapalenie/zgaszenie diody)
TAK
Przechowaj w rejestrze R2 wartość `20'
Ponowne ustawienie wartości początkowych
START
NIE
R2--