1075


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.



Wyszukiwarka