PODSTAWY TECHNIK MIKROPROCESOROWYCH
Temat: SYSTEM PRZERWAŃ, przerwania od timerów/liczników, przerwania zewnętrzne.
Zadania do wykonania
Zadanie 1.
Program zapalania i gaszenia diody LED co zadany odcinek czasu τ, przy czym odcinek czasu τ odmierzany jest przez licznik T0/T1 zaś program wykorzystuje system przerwań.
Zadanie 2.
Program pomiaru okresu (częstotliwości) przebiegu periodycznego z generatora NE555 zestawu ZD-537.
Zadanie 3.
Programy wykorzystujące przerwania od źródeł zewnętrznych, np. pomiar czasu pomiędzy kolejnymi naciśnięciami klawiszy na porcie P3.
REALIZACJA ZADAŃ
Ad.1.
$nomod51
$include(reg517.inc)
CSEG AT 0000h
JMP START
ORG 0Bh ; adres przerwania T0
MOV TH0, #03Ch ; wartości początkowe
MOV TL0, #0AFh
DJNZ ACC, LOOP
CPL P1.0 ; zapalenie i zgaszenie diody
MOV A, #10
LOOP:
RETI ;powrót
ORG 100h
START:
MOV TMOD,#00000001b ; rejestr TMOD
MOV TH0, #03Ch ; wartości poczatkowe
MOV TL0, #0AFh
MOV A,#10 ; czas=0,5[s]
SETB TR0 ; start T0
SETB EAL ; odblokowanie systemu przerwań
SETB ET0 ; przerwanie T0
SJMP $
END
Ad.2.
$NOMOD51
$INCLUDE(reg517.inc)
CSEG AT 0000h
TH0_SET EQU 256-180
TL0_SET EQU 0
ON1 EQU 130 ;zapalenie P1.0
OFF1 EQU 10 ;zgaszenie P1.0
ON2 EQU 30 ;zapalenia P1.1
OFF2 EQU 40 ;zgaszenie P1.1
ON3 EQU 60 ;zapalenie P1.2
OFF3 EQU 90 ;zgaszenie P1.2
LJMP START
ORG 0BH ; adres procedury T0
MOV TH0, #TH0_SET ; wartości początkowe TH
DEC R0
MOV A, R0
LCALL LED1 ; obsługa P1.0
DEC R1
MOV A, R1
LCALL LED2 ; obsługa P1.1
DEC R2
MOV A, R2
LCALL LED3 ; obsługa P1.2
RETI ; powrót z przerwania
LED1: ; obsługa P1.0
JNZ K
CPL P1.0 ; negacja P1.0
JB P1.0, LED_ON1
MOV R0, #ON1 ; czas zapalenia P1.0
LJMP K
LED_ON1:
MOV R0, #OFF1 ; czas zgaszenia P1.0
K:
RET
LED2: ; obsługa P1.1
JNZ K2
CPL P1.1 ; negacja P1.1
JB P1.1, LED_ON2
MOV R1, #ON2 ; czas zapalenia P1.1
LJMP K2
LED_ON2:
MOV R1, #OFF2 ; czas zgaszenia P1.1
K2:
RET
LED3: ; obsługa P1.2
JNZ K3
CPL P1.2 ; negacja P1.2
JB P1.2, LED_ON3
MOV R2, #ON3 ; czas zapalenia P1.2
LJMP K3
LED_ON3:
MOV R2, #OFF3 ; czas zgaszenia P1.2
K3:
RET
START:
CPL P1.0 ; negacja P1.0
CPL P1.1 ; negacja P1.1
CPL P1.2 ; negacja P1.2
MOV R0, #ON1 ; wysłanie do rejestru okresów świecenia diod
MOV R1, #ON2
MOV R2, #ON3
MOV TMOD, #00000001b ; ustawienie rejestru TMOD
MOV TH0, #TH0_SET ; wartości początkowe
MOV TL0, #TL0_SET
SETB TR0 ; start T0
SETB EAL ; odblokowanie systemu przerwań
SETB ET0 ; przerwanie T0
SJMP $
END
Ad.3.
Biblioteka inicjacji wyświetlacza LCD.
#define INITDISP 0x38
#define LCDON 0x0e
#define CLEAR 0x01
LCDcntrlWR MACRO X
MOV DPTR,#LCDcontl
MOV A, X
MOVX @DPTR,A
ENDM
CharWz MACRO
PUSH ACC
CALL busy
MOV DPTR,#LCDdataWR
POP ACC
MOVX @DPTR,A
ENDM
LCD_INIT:
LCDcntrlWR #INITDISP
LCDcntrlWR #CLEAR
LCDcntrlWR #LCDON
RET
Int_PUT:
PUSH ACC
MOV B,#10
DIV AB
MOV B,#10
DIV AB
ORL A,#00110000b
CALL WzChar
MOV A,B
ORL A,#00110000b
CALL WzChar
POP ACC
PUSH ACC
MOV B,#10
DIV AB
MOV A,B
ORL A,#00110000b
CALL WyChar
POP ACC
RET
WzChar:
CharWz
RET
LCDClear:
LCDcntrlWR #CLEAR
RET
Program właściwy.
$nomod51
$include(reg517.inc)
$include (lcd.inc)
ORG 0
LJMP PROG ; skok PROG
ORG 0Bh
LJMP PRZER ; skok PRZER
ORG 30h
PRZER:
INC B
RETI
PROG:
CALL initLCD ;start LCD
CALL LCDclear ;czyszczenie LCD
ORL TMOD,#09 ; tryb pracy T0
SETB EAL ;odblokowanie systemu przerwań
SETB ET0 ;przerwanie od T0
POM:
MOV R0,#20h
CLR A ; czyszczenie akumulatora
MOV TL0,A
MOV TH0,A
MOV B,A
JB P3.3,$ ; obsługa startu(przycisku) stopera
SETB TR0 ; start timera
JB P3.2,$ ; obsługa stopu(przycisk) stopera
CLR TR0 ; stop timera
MOV @R0,TL0
INC R0
MOV @R0,TH0
INC R0
MOV @R0,B ; przekodowanie wyniku do wyświetlenia
MOV A,B
MOV B,#15
DIV AB
CALL putInt ; zawiadomienie procedury wyświetlenia
LJMP POM ; skok do POM
END
WNIOSKI
Programy ze względy na nieobecność na zajęciach zostały wykonane przez nas samodzielnie w domu. Do sprawdzenie poprawności został wykorzystany symulator, który jednak nie oddaje fizycznego kontaktu z zestawem doświadczalnym. Programy w dużej mierze bazowały na programach wykonanych na laboratoriach 5 dotyczących timerów i liczników. Te, które zostały zamieszczone w niniejszym sprawozdaniu, są ich rozszerzeniem o wykorzystanie systemu przerwań. Dodatkowo w zadaniu 3 wykorzystana została, podobnie jak w laboratorium 5, biblioteka inicjalizacji i wyświetlania znaku na ekranie LCD, która została wykonana podczas wcześniejszych zajęć. W celu zastosowania w programach systemu przerwań zostały użyte instrukcje SetB EAL, aby zostały one odblokowane, oraz SetB ETx w celu zezwolenia na przyjęcie przerwania od timera. W programie 3 napotkane zostały problemy z wyświetleniem prawidłowego wyniku działania, co w tym wypadku nasuwa wątpliwości, gdyż podobny program wykonany na poprzednich zajęciach działał, na symulatorze, prawidłowo.