Politechnika Lubelska w Lublinie |
Laboratorium podstaw systemów mikroprocesorowych |
||
|
Ćwiczenie nr 7 |
||
Józwik Tomasz Krzysztof Kadłubowski |
Semestr V |
Grupa ED 5.3 |
Rok akademicki 1997/98 |
Temat ćwiczenia: System przerwań mikrokontrolera 8051. |
Data wykonania 19.12.97 |
Ocena: |
Celem ćwiczenia jest zapoznanie się ze sposobem realizacji zgłoszenia przerwania w mikrokontrolerze 8051 oraz priorytetem tych przerwań .
Zadanie nr1). Program przer01.ass zawiera procedury obsługi przerwań timerów 0 , 1 oraz
przerwania pochodzącego od linii INT1 .
Przerwanie od TIMERA 0
*************************************************************************
SYSTEM PRZERWAŃ 8051
ŹRÓDŁA PRZERWAŃ W 8051
*************************************************************************
*********************** Ustawienie TIMERÓW ****************************
;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
T1_G EQU 0 ;GATE
T1_C EQU 0 ;COUNTER/-TIMER
T1_M EQU 1 ;MODE (0..3)
TIM1 EQU T1_M+T1_C*4+T1_G*8
TMOD_SET EQU TIM0+TIM1*16
TH0_SET EQU 00H stan początkowy Timera 0. Starszy bajt.
TL0_SET EQU 00H Młodszy bajt.
TH1_SET EQU 00H stan początkowy Timera 1. Starszy bajt.
TL1_SET EQU 00H Młodszy bajt.
***********************************************************************
LJMP START
********* *************Przerwanie Timera 0 ******************************
ORG 0BH
LCALL JEST_T0
RETI
********* ************Przerwanie INT1 (AC) *****************************
ORG 13H
LCALL JEST_I1
RETI
*********************** Przerwanie Timer 1 ******************************
ORG 1BH
LCALL JEST_T1
RETI
**************************** Program główny ***************************
ORG 100H
START:
SETB ET0
LCALL INICJALIZACJA ;inicjalizacja źródeł przerwań
LOOP:
SJMP LOOP ;koniec programu głównego
*****************************************************************************
JEST_T0_TEKST:
DB "T0",0 ;tekst "T0"
*****************************************************************************
PRZERW_INT1_1:
MOV DPTR,#JEST_I1_TEKST ;wyślij na LCD
LCALL WRITE_TEXT ;tekst "I1"
SETB EA ;odblokuj przerwania
RET ;powrót z procedury
JEST_I1_TEKST:
DB "I1",0 ;tekst "I1"
*********** Procedura pomocnicza zerowania przerwania od INT1 *****************
CLR_INTF:
MOV R0,#CSIC ;Adres sterownika przerwań
MOVX A,@R0 ;Pobiera kod
ANL A,#03H ;źródła przerwania
PUSH ACC
CJNE A,#0,CLR_INTF_1 ;Czy od przetwornika A/C
MOV R0,#CSAD ;Tak. Zeruj
MOVX A,@R0 ;przetwornik
CLR_INTF_1:
POP ACC ;Kod źródła przerwania
MOV R0,#CSIC ;Adres sterownika przerwań
MOVX @R0,A ;zeruj sterownik
RET
przerwanie od TIMERA 1
*************************************************************************
SYSTEM PRZERWAŃ 8051
ŹRÓDŁA PRZERWAŃ W 8051
*************************************************************************
*********************** Ustawienie TIMERÓW ****************************
;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
T1_G EQU 0 ;GATE
T1_C EQU 0 ;COUNTER/-TIMER
T1_M EQU 1 ;MODE (0..3)
TIM1 EQU T1_M+T1_C*4+T1_G*8
TMOD_SET EQU TIM0+TIM1*16
TH0_SET EQU 00H stan początkowy Timera 0. Starszy bajt.
TL0_SET EQU 00H Młodszy bajt.
TH1_SET EQU 00H stan początkowy Timera 1. Starszy bajt.
TL1_SET EQU 00H Młodszy bajt.
***********************************************************************
LJMP START
********* *************Przerwanie Timera 0 ******************************
ORG 0BH
LCALL JEST_T0
RETI
********* ************Przerwanie INT1 (AC) *****************************
ORG 13H
LCALL JEST_I1
RETI
*********************** Przerwanie Timer 1 ******************************
ORG 1BH
LCALL JEST_T1
RETI
**************************** Program główny ***************************
ORG 100H
START:
SETB EA
SETB ET1
LCALL INICJALIZACJA ;inicjalizacja źródeł przerwań
LOOP:
SJMP LOOP ;koniec programu głównego
*****************************************************************************
JEST_T0_TEKST:
DB "T0",0 ;tekst "T0"
*****************************************************************************
PRZERW_INT1_1:
MOV DPTR,#JEST_I1_TEKST ;wyślij na LCD
LCALL WRITE_TEXT ;tekst "I1"
SETB EA ;odblokuj przerwania
RET ;powrót z procedury
JEST_I1_TEKST:
DB "I1",0 ;tekst "I1"
*********** Procedura pomocnicza zerowania przerwania od INT1 *****************
CLR_INTF:
MOV R0,#CSIC ;Adres sterownika przerwań
MOVX A,@R0 ;Pobiera kod
ANL A,#03H ;źródła przerwania
PUSH ACC
CJNE A,#0,CLR_INTF_1 ;Czy od przetwornika A/C
MOV R0,#CSAD ;Tak. Zeruj
MOVX A,@R0 ;przetwornik
CLR_INTF_1:
POP ACC ;Kod źródła przerwania
MOV R0,#CSIC ;Adres sterownika przerwań
MOVX @R0,A ;zeruj sterownik
RET
przerwanie od TIMERA 0 i INT1
*************************************************************************
SYSTEM PRZERWAŃ 8051
ŹRÓDŁA PRZERWAŃ W 8051
*************************************************************************
*********************** Ustawienie TIMERÓW ****************************
;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
T1_G EQU 0 ;GATE
T1_C EQU 0 ;COUNTER/-TIMER
T1_M EQU 1 ;MODE (0..3)
TIM1 EQU T1_M+T1_C*4+T1_G*8
TMOD_SET EQU TIM0+TIM1*16
TH0_SET EQU 00H stan początkowy Timera 0. Starszy bajt.
TL0_SET EQU 00H Młodszy bajt.
TH1_SET EQU 00H stan początkowy Timera 1. Starszy bajt.
TL1_SET EQU 00H Młodszy bajt.
***********************************************************************
LJMP START
********* *************Przerwanie Timera 0 ******************************
ORG 0BH
LCALL JEST_T0
RETI
********* ************Przerwanie INT1 (AC) *****************************
ORG 13H
LCALL JEST_I1
RETI
*********************** Przerwanie Timer 1 ******************************
ORG 1BH
LCALL JEST_T1
RETI
**************************** Program główny ***************************
ORG 100H
START:
SETB EA
SETB ET0
SETB EX1
LCALL INICJALIZACJA ;inicjalizacja źródeł przerwań
LOOP:
SJMP LOOP ;koniec programu głównego
*****************************************************************************
JEST_T0_TEKST:
DB "T0",0 ;tekst "T0"
*****************************************************************************
PRZERW_INT1_1:
MOV DPTR,#JEST_I1_TEKST ;wyślij na LCD
LCALL WRITE_TEXT ;tekst "I1"
SETB EA ;odblokuj przerwania
RET ;powrót z procedury
JEST_I1_TEKST:
DB "I1",0 ;tekst "I1"
*********** Procedura pomocnicza zerowania przerwania od INT1 *****************
CLR_INTF:
MOV R0,#CSIC ;Adres sterownika przerwań
MOVX A,@R0 ;Pobiera kod
ANL A,#03H ;źródła przerwania
PUSH ACC
CJNE A,#0,CLR_INTF_1 ;Czy od przetwornika A/C
MOV R0,#CSAD ;Tak. Zeruj
MOVX A,@R0 ;przetwornik
CLR_INTF_1:
POP ACC ;Kod źródła przerwania
MOV R0,#CSIC ;Adres sterownika przerwań
MOVX @R0,A ;zeruj sterownik
RET
Zadanie 2.).Program przerwanie 02.ass reaguje na przerwania pochodzące od TIMERÓW T0 i T1 . Timerów są uruchamiane jednocześnie zaś szybkość zgłoszenia przerwania zależy od wprowadzonych wartości początkowych . Wyniki analizy programów dla różnych ustawień
timerów zostały zestawione w tabeli .
Lp. |
stan pocz. T0 |
stan pocz. T1 |
Kolejność |
1 |
0000H |
0000H |
T0 ; T1 |
2 |
0001H |
0000H |
T0 ; T1 |
3 |
0000H |
1000H |
T1 ; T0 |
Przyczyną zaistniałej kolejności przerwań jest :
dla Lp1. - chociaż wartości początkowe wpisane do rejestru są takie same , to jednak
timer 0 posiada większy priorytet przerwania niż timer 1.
dla Lp2. - timer 0 posiada krótszy czas zgłoszenia przerwania ze względu na wpisaną wartość
dla Lp3. - timer 1 zgłosi przerwanie szybciej niż timer 0 z uwagi na krótszy czas uzyskania
przepełnienia .
Zadanie nr3.).Działanie programu przer03.ass jest analogiczne do działania programu przer01 z tym , że reaguje na przerwania z trzech źródeł : timerów 0, 1 oraz INT1.
Działanie timerów jest ustalone z góry i zależy od wartości wpisanej do nich .
Lp. |
stan pocz.T0 |
stan pocz.T1 |
kolejność |
1 |
FFFFH |
FFFFH |
T0 ;T1; Y0 |
2 |
FF80H |
FF80H |
T0; T1; Y0 |
3 |
FF40H |
FF40H |
T0 ; Y0 ; T1 |
4 |
FF10H |
FF10H |
Y0 ; T0 ; T1 |
5 |
zablokowany |
FF40H |
T1; Y0 |
Przyczyny zaistniałej kolejności zdarzeń , są analogiczne jak w zadaniu nr2).
Zadanie nr4.). Działanie programu jest podobne do działania programu przer02.ass .
Różnica tkwi w ustawianiu bitów priorytetów przerwań , tak jak na to wskazuje poniższa tabelka.
Lp. |
Timer0 |
|
Timer1 |
|
Kolejność |
|
Stan pocz. |
Pr. |
Stan pocz. |
Pr. |
|
1 |
0000 |
0 |
0000 |
0 |
T0 ; T1 |
2 |
0000 |
0 |
0000 |
1 |
T1 ; T0 |
3 |
0000 |
0 |
0001 |
0 |
T1 ; T0 |
4 |
0000 |
1 |
0001 |
0 |
T0 ; T1 |
5 |
0000 |
1 |
0001 |
1 |
T1 ; T0 |
Ustawienie bitów priorytetu przerwań odbywa się w rejestrze IP , w którym poziom 1 posiada wyższy priorytet niż poziom 0 . Przy jednakowych wartościach wpisanych do wymienionych timerów , a więc przy równoczesnych zgłoszeniach przerwań jako pierwsze zostanie przyjęte przerwanie o wyższym priorytecie. W przypadku gdy w trakcie obsługi przerwania pojawi się przerwanie o tym samym priorytecie , zostanie dokończone poprzednie a dopiero później obsłużone następne.