Sunteți pe pagina 1din 9

Capitolul 4

20
S SI IS ST TE EM MU UL L D DE E N NT TR RE ER RU UP PE ER RI I
4.1. Introducere
Microcontrolerele HCS12 au n componena lor blocul INT (Interrupt)
pentru gestionarea ntreruperilor. ntreruperea poate s apar n timpul funcionrii
normale a microcontrolerului sau ntr-un regim de putere redus, de ateptare
(Wait) sau de oprire (Stop). n primul caz, dac ntreruperea este recunoscut, se
abandoneaz programul n curs de execuie, se execut subrutina de ntrerupere i
se revine n programul abandonat. n al doilea caz, dac sistemul de ntrerupere
este activ se poate scoate microcontrolerul din regimurile de ateptare sau oprire.
4.2. Descrierea sistemului de ntreruperi
ntreruperile pot fi nemascabile i mascabile. n principiu, ntreruperile
nemascabile sunt totdeauna luate n considerare iar cele mascabile trebuie n
prealabil validate. Pentru validarea ntreruperilor mascabile, n registrul de condiii
CCR sunt disponibili biii CCR_I i CCR_X. Pe de alt parte fiecare ntrerupere
mascabil cu bitul CCR_I are i un bit de validare individual. La fel, exist i
ntreruperi nemascabile care au cte un bit de validare individual a ntreruperii.
Pentru fiecare surs de ntrerupere este alocat cte un vector n memoria de
programe n zona de adresare 0xFFFF 0xFF80. Un vector ocup dou adrese
succesive i ncepe cu o adres par (de exemplu: 0xFFFE:0xFFFF vector de
ntrerupere pentru diverse resetri, 0xFFCE:0xFFCF vector de ntrerupere pentru
portul J). Un vector de ntrerupere poate fi alocat mai multor cereri similare de
ntrerupere. De exemplu, pentru interfaa SCI este alocat vectorul
0xFFD6:0xFFD7. Pe de alt parte, interfaa SCI genereaz patru tipuri de cereri de
ntrerupere, dou de la emisie i dou de la recepie. Fiecrei cereri de ntrerupere i
este ataat un indicator de ntrerupere pe baza cruia se poate depista sursa care a
generat ntreruperea. Indicatorii de ntrerupere trebuie teri n cadrul subrutinelor
de ntrerupere.
Prioritatea surselor de ntrerupere este stabilit intern n ordinea
descresctoare a adreselor vectorilor de ntrerupere. Pentru ntreruperea de
prioritate maxim este alocat vectorul de ntrerupere de la adresa 0xFFFE:0xFFFF
iar pentru ntreruperea de prioritate minim este alocat vectorul de ntrerupere de la
adresa 0xFF80:0xFF81. n total sunt 64 de vectori de ntrerupere i deci 64 de
nivele de prioriti implicite, nivelul 0 are prioritate implicit maxim i este ataat
vectorului 0xFFFE:0xFFFF, nivelul 63 are prioritate implicit minim i este ataat
vectorului 0xFF80:0xFF81. Nu toate ntreruperile sunt implementate. Toate
ntreruperile implementate la microcontrolereleHCS12 sunt listate n tabelul 4.1.
4.2. Descrierea sistemului de ntreruperi
21
4.2.1. Descrierea ntreruperilor nemascabile
n cadrul ntreruperilor nemascabile sunt luate n considerare cinci surse de
ntrerupere. Resetarea i codul neimplementat (TRAP) sunt considerate ca
excepii de la funcionarea normal a unui program i sunt tratate tot ca nite
ntreruperi. Prin resetare se aduc registrele microcontrolerului ntr-o stare iniial
bine precizat.
4.2.1.1. ntreruperea de la resetare - nivel de prioritate 0
Prima ntrerupere nemascabil i de prioritate maxim provine de la
resetarea de sistem: resetarea extern (de la pinul /RESET), resetarea de la cuplarea
tensiunii de alimentare POR (Power On Reset) i resetarea de la cderea tensiunii
de alimentare LVR (Low Voltage Reset). ntreruperilor POR i LVR le sunt ataate
indicatori de ntrerupere (CGRFLG_PORF- indicator ntrerupere POR,
CGRFLG_LVRF- indicator ntrerupere LVR). Generarea acestor ntreruperi cade
n sarcina blocului CRG (Clock and Reset Generator). Aceste surse nu au bii de
validare individual a ntreruperii. ntreruperea se genereaz ca o funcie SAU
dintre cele trei cereri de ntrerupere.
4.2.1.2. ntreruperea CMF - nivel de prioritate 1
A doua surs de ntrerupere nemascabil provine de la resetarea generat
de sistemul de monitorizare a tactului CMF (Clock Monitor Fail) din blocul CRG.
Pentru aceasta trebuie validat funcia de monitorizare a tactului
(PLLCTL_CME=1). Monitorul verific calitatea tactului, dac acesta nu are nivel
corect sau are frecvena prea joas se va genera o resetare (PLLCTL_SCME=0/1
validare resetare/tact intern SCF) sau se va intra n modul de generare intern a
tactului SCF (Self-Clock Mode).
4.2.1.3. ntreruperea COP - nivel de prioritate 2
Tot o ntrerupere nemascabil cu efect de resetare este resetarea COP
(Computer Operating Properly) provenit de la temporizatorul Watchdog.
Temporizatorul genereaz un impuls a crui durat se obine prin divizarea tactului
oscilatorului microcontrolerului f
OSCCLK
. Factorul de divizare se programeaz din
biii COPCTL_[CR2,CR1,CR0] n domeniul 2
14
2
24
. Pornirea temporizatorului
(aceasta are i efect de validare a resetrii de la Watchdog) se face simplu prin
ncrcarea celor trei bii cu o valoare diferit de zero. Dac temporizatorul termin
temporizarea programat (Time out) se va realiza o resetare a microcontrolerului.
Pentru evitarea resetrii, pe durata temporizrii, trebuie restartat acest
temporizator.
4.2.1.4. ntreruperea TRAP - nivel de prioritate 3
Pentru codificarea instruciunilor se folosesc 256 de coduri din prima
pagin a hrii codurilor i numai 54 de coduri din pagina a doua. Restul de 202
coduri din a doua pagin sunt neutilizate. Dac CPU ncearc s execute o
instruciune neimplementat (TRAP) se va genera o ntrerupere nemascabil.
SISTEMUL DE NTRERUPERI
22
4.2.1.5. ntreruperea SWI - nivel de prioritate 4
Pentru generarea prin soft a unei ntreruperi este prevzut instruciunea
SWI (Software Interrupt). Aceast ntrerupere este nemascabil.
4.2.2. Descrierea ntreruperilor mascabile CCR_X
Pentru a funciona, ntreruperile mascabile trebuie validate n prealabil.
Microcontrolerele HCS12 admit dou categorii de ntreruperi mascabile i anume
mascabile cu bitul CCR_X i mascabile cu bitul CCR_I.
4.2.2.1. ntreruperea extern XIRQ - nivel de prioritate 5
Exist o singur ntrerupere mascabil cu bitul CCR_X i aceasta provine
de la pinul extern XIRQ/PE0. Dup resetare aceast ntrerupere este inactiv
(CCR_X=1) i pinul PE0 poate fi folosit ca pin de intrare de uz general, intrare
polarizat cu o rezisten pull-up. Pentru activare trebuie ters bitul CCR_X prin
soft (CCR_X=0) i din acest moment bitul nu mai poate fi setat prin soft. Astfel,
ntreruperea de la pinul XIRQ poate fi privit i ca ntrerupere nemascabil.
ntreruperea XIRQ chiar dac nu este activat poate fi folosit pentru scoaterea
microcontrolerului din regimurile cu consum redus de ateptare sau de oprire.
4.2.3. Descrierea ntreruperilor mascabile CCR_I
Activarea general a ntreruperilor mascabile CCR_I se realizeaz prin
tergerea acestui bit. Toate aceste ntreruperi sunt prevzute cu bii individuali de
validare i indicatori de ntrerupere.
4.2.3.1. ntrerupere extern IRQ - nivel de prioritate 6
Alt ntrerupere extern se poate genera de la pinul IRQ/PE1, ntreruperea
este mascabil cu bitul CCR_I. Dac ntreruperea IRQ nu se utilizeaz atunci
pinul PE1 poate fi folosit ca pin de intrare de uz general, intrare polarizat cu o
rezisten pull-up. ntreruperea poate fi activ pe nivelul 0 sau pe frontul
descresctor al semnalului aplicat la pinul IRQ, selecia se face din bitul
IRQCR_IRQE (IRQCR_IRQE=0/1 nivel 0/front descresctor). Aceast surs de
ntrerupere este prevzut cu bit de validare IRQCR_IRQEN
(IRQCR_IRQEN=1/0 validare/invalidare) dar nu este prevzut cu indicator de
ntrerupere. ntreruperea IRQ dac este activat poate fi folosit pentru scoaterea
microcontrolerului din regimurile cu consum redus de ateptare sau de oprire.
4.2.3.2. ntreruperea RTI - nivel de prioritate 7
Folosind tactul microcontrolerului se pot genera ntreruperi periodice sau
n timp real RTI (Real Time Interrupt). Perioada ntreruperilor se obine prin
divizarea tactului microcontrolerului f
OSCCLK
. Factorul de divizare se stabilete din
biii RTICTL_[RTR6RTR0] n domeniul 2
10
2
20
. Validarea ntreruperilor se
4.2. Descrierea sistemului de ntreruperi
23
realizeaz prin setarea bitului CRGINT_RTIE, indicatorul de ntrerupere fiind
CRGFLG_RTIF.
4.2.3.3. ntreruperile TIM - nivel de prioritate 818
Blocul temporizator TIM genereaz 11 cereri de ntrerupere, astfel: 8 cereri
de ntrerupere de la canalele de comparare i captur (indicatori de ntrerupere
TFLG1_[C7FC0F], bii de validare ntrerupere TIE_[C7IC0I]), o cerere de la
depirea capacitii de numrare a numrtorului principal TCNT (indicator de
ntrerupere TFLG2_TOF, bitului de validare ntrerupere TSCR2_TOI), o cerere de
la depirea capacitii de numrare a numrtorului acumulator de impulsuri
PACNT (indicator de ntrerupere PAFLG_PAOVF, bitului de validare ntrerupere
PACTL_PAOVI) i o cerere de ntrerupere de la intrarea numrtorului PACNT
(indicator de ntrerupere PAFLG_PAIF, bitului de validare ntrerupere
PACTL_PAI).
4.2.3.4. ntreruperea SPI - nivel de prioritate 19
Interfaa SPI genereaz o singur cerere de ntrerupere ca o funcie SAU
dintre urmtoarele trei cereri de ntrerupere: la recepia complet a unui caracter i
transferarea acestuia n registrul de date (bit de validare ntrerupere SPICR1_SPIE
=1/0 validare/invalidare, bit indicator de ntrerupere SPISR_SPIF), la detectarea
modului eroare SPI (bit de validare ntrerupere SPICR1_SPIE =1/0
validare/invalidare, bit indicator de ntrerupere SPISR_MODF) i la eliberarea
registrului de date emisie (bit de validare ntrerupere SPICR1_SPTIE =1/0
validare/invalidare, bit indicator de ntrerupere SPISR_SPTEF).
4.2.3.5. ntrerupere SCI - nivel de prioritate 20
Pentru interfaa SCI este alocat un singur vector de ntrerupere dei
interfaa genereaz patru cereri de ntrerupere: dou de la emisie i dou de la
recepie. La emisie se genereaz o cerere de ntrerupere la golirea registrelor de
date de emisie SCIDRH:SCIDRL (bit de validare ntrerupere SCICR2_TIE =1/0
validare/invalidare, bit indicator de ntrerupere SCISR1_TDRE) i la una la
transmiterea complet a unui caracter (bit de validare ntrerupere SCICR2_TCIE
=1/0 validare/invalidare, bit indicator de ntrerupere SCISR1_TC). La recepie se
genereaz cereri de ntrerupere n situaiile: recepia unui caracter (bit de validare
ntrerupere SCICR2_RIE, bit indicator de ntrerupere SCISR1_RDRF), la recepia
unui caracter nainte ca precedentul caracter recepionat s fi fost citit din registrele
de date de recepie (bit de validare ntrerupere SCICR2_RIE, bit indicator de
ntrerupere SCISR1_OR), la recepia secvenei Idle adic 10/11 bii consecutivi de
1 (bit de validare ntrerupere SCICR2_ILIE, bit indicator de ntrerupere
SCISR1_IDLE). ntreruperea se genereaz ca o funcie SAU dintre cele patru
cereri de ntrerupere. Cererile de ntrerupere indicate de biii SCISR1_RDRF i
SCISR1_OR sunt tratate mpreun (validare ntrerupere numai din bitul
SCICR2_RIE).
SISTEMUL DE NTRERUPERI
24
4.2.3.6. ntrerupere ATD - nivel de prioritate 22
Convertorul analog numeric ATD genereaz o cerere de ntrerupere la
terminarea unei secvene de conversie (bit de validare ntrerupere
ATDCTL2_ASCIE, bit indicator de ntrerupere ATDCTL2_ASCIF).
4.2.3.7. ntrerupere Port J - nivel de prioritate 24
Portul J format din dou linii PJ7 i PJ6 poate genera ntreruperi externe
pentru aceste linii definite ca intrri sau ntreruperi interne pentru aceste linii
definite ca ieiri. Frontul activ ce genereaz o ntrerupere se stabilete din biii
registrului PPSJ (de exemplu pentru linia PJ7: PPSJ_PPSJ7 =0/1 front activ
descresctor/cresctor). Se genereaz o singur cerere de ntrerupere ca o funcie
SAU dintre cele dou cereri de ntrerupere. Validarea ntreruperilor se realizeaz
din biii PIEJ_[PIEJ7,PIEJ6], indicatorii de ntrerupere fiind PIFJ_[PIFJ7,PIFJ6].
4.2.3.8. ntrerupere PLL-CRG - de nivel de prioritate 28
Microcontrolerele HCS12 utilizeaz o bucl PLL pentru a multiplica
frecvena oscilatorului de tact f
OSCCLK
. Utilizarea buclei are ca efect obinerea unei
game variate de frecvene de tact i reducerea emisiei de cmp electromagnetic.
Cererea de ntrerupere apare la modificarea strii de calare a buclei PLL (bit de
validare ntrerupere CRGINT_LOCKIE, bit indicator de ntrerupere
CRGFLG_LOCKIF).
4.2.3.9. ntrerupere SCF-CRG - nivel de prioritate 29
Dup cum am artat mai sus, n cazul n care oscilatorul de tact nu
funcioneaz corect se poate realiza o resetare sau funcionarea microcontrolerului
continu pe baza unui tact intern de joas frecven f
SCM
. Pentru aceasta trebuie s
fie activ circuitul de monitorizare a tactului (PLLCTL_CME=1). Selecia
funcionrii n modul tact intern se realizeaz prin setarea bitului PLLCTL_SCME
(PLLCTL_SCME=1- self clock mode). Starea oscilatorului de tact este indicat de
bitul CRGFLG_SCM (CRGFLG_SCM=0/1 CPU lucreaz normal i oscilatorul
de tact este disponibil/ CPU lucreaz cu tact intern f
SCM
). La orice modificare a
bitului CRGFLG_SCM se seteaz indicatorul de ntrerupere CRGFLG_SCMIF.
Validarea ntreruperii se realizeaz din bitul CRGINT_SCMIE.
4.2.3.10. ntrerupere FLASH - nivel de prioritate 35
Cu memoria FLASH se pot efectua diverse operaii: tergere pe sectoare
(512 octei pentru memoria FLASH de 32KB) sau tergere complet, scriere sau
programare, verificarea rezultatului tergerii sau al scrierii etc. Codurile operaiilor
se nregistreaz n nite registre de comand. Cererile de ntrerupere apar n dou
situaii : cnd registrele de comand, de date i de adrese sunt libere i deci pot fi
ncrcate din nou (indicator ntrerupere FSTAT_CBEIF, validare ntrerupere
FCNFG_CBEIE), la terminarea execuiei unei comenzi (indicator ntrerupere
FSTAT_CCIF, validare ntrerupere FCNFG_CCIE). ntreruperea se genereaz ca o
funcie SAU dintre cele dou cereri de ntrerupere.
4.2. Descrierea sistemului de ntreruperi
25
4.2.3.11. ntreruperile CAN - nivel de prioritate 3639
Blocul MSCAN poate genera patru cereri de ntrerupere i pentru fiecare
cerere este alocat cte un vector de ntrerupere. ntreruperile pot proveni de la
wake-up, emisie, recepie i eroare n funcionare. Tratarea n detaliu a acestor
ntreruperi este realizat n capitolul destinat descrierii blocului MSCAN.
4.2.3.12. ntrerupere Port P - nivel de prioritate 56
Portul P poate genera ntreruperi externe pentru liniile sale definite ca
intrri sau ntreruperi interne pentru liniile definite ca ieiri. Frontul activ ce
genereaz o ntrerupere se stabilete din biii registrului PPSP (de exemplu pentru
linia P7: PPSP_PPSP7 =0/1 front activ descresctor/cresctor). ntreruperea se
genereaz ca o funcie SAU dintre cele opt cereri de ntrerupere. Validarea
ntreruperilor se realizeaz din biii PIEP_[PIEP7PIEP0], indicatorii de
ntrerupere fiind PIFP_[PIFP7PIFP0].
4.2.3.13. ntrerupere PWM - nivel de prioritate 57
Blocul PWM genereaz o cerere de ntrerupere la modificarea nivelului de
la intrarea de supraveghere PWM5. Modul de supraveghere (Shutdown) trebuie s
fie activat (PWMSDN_PWM5ENA=1). Validarea ntreruperii se face din bitul
PWMSDN_PWMIE, indicatorul de ntrerupere este bitul PWMSDN_PWMIF.
4.2.3.14. ntrerupere VREG - nivel de prioritate 58
Tensiunea de alimentare V
DDA
, V
SSA
este supravegheat de blocul regulator
de tensiune VREG. Dac aceasta scade sub un anumit prag atunci se va seta bitul
VREGCTRL_LVDS. La revenirea tensiunii V
DDA
peste pragul respectiv, bitul
VREGCTRL_LVDS se terge. Orice modificare a bitului VREGCTRL_LVDS
produce setarea indicatorului de ntrerupere VREGCTRL_LVIF. Validarea
ntreruperii se face din bitul VREGCTRL_LVIE.
n tabelul 4.1 este prezentat sintetic sistemul de ntreruperi pentru
microcontrolerele HCS12 (nivel de prioritate implicit, adresa vectorului de
ntrerupere, sursa i blocul care genereaz ntreruperea, biii de mascare din
registrul CCR, biii de validare individual i indicatorii de ntrerupere).

Tabelul 4.1. Sistemul de ntreruperi pentru microcontrolerele HCS12.
Pri-
ori-
tate
Adresa
vectorului de
ntrerupere
Sursa de ntrerupere
(Blocul surs de
ntrerupere)
Biii
CCR
Biii de validare
individual
a ntreruperilor
Indicatorii de
ntrerupere
ntreruperi nemascabile
0 0xFFFE:0xFFFF Reset sistem :/RESET,
POR,LVR (CRG)
- - CGRFLG_PORF
CGRFLG_LVRF
1 0xFFFC:0xFFFD Reset: clock monitor
(CRG)
- PLLCTL_CME=1
PLLCTL_SCME=0
-
2 0xFFFA:0xFFFB Resetare: COP
(CRG)
- COPCTL_[CR2,
CR1,CR0]
-
3 0xFFF8:0xFFF9 Instruciune
neimplementat -
- - -
SISTEMUL DE NTRERUPERI
26
TRAP
4 0xFFF6:0xFFF7 Instruciune SWI - - -
ntreruperi mascabile cu bitul CCR_X
5 0xFFF4:0xFFF5 Pin extern /XIRQ X - -
ntreruperi mascabile cu bitul CCR_I
6 0xFFF2:0xFFF3 Pin extern IRQ I IRQCR_IRQEN -
7 0xFFF0:0xFFF1 RTI (Real Time Int.)
(CRG)
I CRGINT_RTIE CRGFLG_RTIF
8 0xFFEE:0xFFEF TIM Canal 0
Captura/Comparare
I TIE_C0I TFLG1_C0F
9 0xFFEC:0xFFED TIM Canal 1
Captura/Comparare
I TIE_C1I TFLG1_C1F
10 0xFFEA:0xFFEB TIM Canal 2
Captura/Comparare
I TIE_C2I TFLG1_C2F
11 0xFFE8:0xFFE9 TIM Canal 3
Captura/Comparare
I TIE_C3I TFLG1_C3F
12 0xFFE6:0xFFE7 TIM Canal 4
Captura/Comparare
I TIE_C4I TFLG1_C4F
13 0xFFE4:0xFFE5 TIM Canal 5
Captura/Comparare
I TIE_C5I TFLG1_C5F
14 0xFFE2:0xFFE3 TIM Canal 6
Captura/Comparare
I TIE_C6I TFLG1_C6F
15 0xFFE0:0xFFE1 TIM Canal 7
Captura/Comparare
I TIE_C7I TFLG1_C7F
16 0xFFDE:0xFFDF TIM Depire TCNT I TSCR2_TOI TFLG2_TOF,
17 0xFFDC:0xFFDD TIM Depire PACNT I PACTL_PAOVI PAFLG_PAOVF
18 0xFFDA:0xFFDB TIM Intrare PACNT I PACTL_PAI PAFLG_PAIF
19 0xFFD8:0xFFD9 SPI I SPICR1_SPIE SPISR_SPIF
SPISR_MODF
SPICR1_SPTIE SPISR_SPTEF
20 0xFFD6:0xFFD7 SCI I SCICR2_TIE SCISR1_TDRE
SCICR2_TCIE SCISR1_TC
SCICR2_RIE SCISR1_RDRF
SCISR1_OR
SCICR2_ILIE SCISR1_IDLE
21 0xFFD4:0xFFD5 Rezervat
22 0xFFD2:0xFFD3 ATD I ATDCTL2_ASCIE ATDCTL2_ASCIF
23 0xFFD0:0xFFD1 Rezervat
24 0xFFCE:0xFFCF Port J I PIEJ_[PIEJ7,PIEJ6] PIFJ_[PIFJ7,PIFJ6]
25-
27
0xFFC80xFFCD Rezervat
28 0xFFC6:0xFFC7 Calare bucla PLL
(CRG)
I CRGINT_LOCKIE CRGFLG_LOCKIF
29 0xFFC4:0xFFC5 Modul tact intern
(self-clock mode CRG)
I CRGINT_SCMIE
(PLLCTL_CME=1
PLLCTL_SCME=1)
RGFLG_SCMIF
30-
34
0xFFBA0xFFC3 Rezervat
35 0xFFB8:0xFFB9 FLASH I FCNFG_CBEIE FSTAT_CBEIF
FCNFG_CCIE FSTAT_CCIF
36 0xFFB6:0xFFB7 CAN wake-up I CANRIER_WUPIE CANRFLG_WUPIF
37 0xFFB4:0xFFB5 CAN eroare I CANRIER_OVRIE CANRFLG_OVRIF
CANRIER_CSCIE CANRFLG_CSCIF
4.3. Aplicaii
27
CANRIER_[TSTATE
1, TSTATE0]
CANRIER_[RSTATE
1, RSTATE0]
38 0xFFB2:0xFFB3 CAN recepie I CANRIER_RXFIE CANRFLG_RXIF
39 0xFFB0:0xFFB1 CAN emisie I CANTIER_[TXEIE2,
TXEIE1, TXEIE0]
CANTFLG_[TXE2,
TXE1, TXE0]
40-
55
0xFF900xFFAF Rezervat
56 0xFF8E0xFF8F Port P I PIEP_[PIEP7
PIEP0]
PIFP_[PIFP7
PIFP0]
57 0xFF8C0xFF8D PWM I PWMSDN_PWMIE PWMSDN_PWMIF
58 0xFF8A0xFF8B LVI (VREG) I VREGCTRL_LVIE VREGCTRL_LVIF
59-
63
0xFF800xFF89 Rezervat

ntreruperile nemascabile se execut n momentul apariiei. Problema
prioritilor de ntrerupere se pune n cazul ntreruperilor mascabile.
ntreruperea mascabil cu bitul CCR_X este prioritar fa de cele
mascabile cu bitul CCR_I. ntreruperea mascabil cu bitul CCR_X poate ntrerupe
execuia unei ntreruperi mascabil cu bitul CCR_I dar nu i invers.
n principiu, execuia unei ntreruperi mascabil cu bitul CCR_I nu poate fi
ntrerupt de o ntrerupere mascabil tot cu bitul CCR_I. n cazul n care apar mai
multe cereri de ntreruperi mascabile cu bitul CCDR_I, acestea vor fi triate astfel:
se elimin cele care nu sunt validate individual, cele validate individual se lanseaz
n execuie n ordinea prioritilor implicite (ordinea prezentat n tabelul 4.1,
prioritatea scade o dat cu creterea nivelului,de exemplu: ntreruperea de nivel 7
este prioritar fa de ntreruperea de nivel 10).
Conform tabelului 4.1, din cadrul ntreruperilor mascabile cu bitul CCR_I,
cea mai nalt prioritate o are ntreruperea de la intrarea IRQ/PE1 (prioritate 6,
adresa vectorului de ntrerupere 0xFFF2:0xFFF3). n cadrul ntreruperilor
mascabile cu bitul CCR_I poate fi programat o alt ntrerupere de prioritate
maxim. Aceasta se realizeaz prin programarea registrului HPRIO cu octetul
inferior al adresei pare a noului vector de ntrerupere. De exemplu, dac se dorete
ca ntreruperea de la SCI (nivel de prioritate 20, adresa vector de ntrerupere
0xFFD6:0xFFD7) s fie de prioritate maxim fa de celelalte ntreruperi mascabile
cu bitul CCR_I, n registrul HPRIO trebuie scris octetul 0xD6.

HIPRIO PSEL71 PSEL61 PSEL51 PSEL41 PSEL30 PSEL20 PSEL11 PSEL00
4.3. Aplicaii
Pentru fiecare ntrerupere utilizat n cadrul unui program trebuie scris
funcia de ntrerupere. Declararea unei funcii, n fiierul surs, ca fiind o funcie
de ntrerupere se poate face n dou moduri:
- cu directiva #pragma,
#pragma TRAP_PROC SAVE_ALL_REGS //directiva ce declar o funcie de ntrerupere
void PORTJ_INTR(void) {
........................
SISTEMUL DE NTRERUPERI
28
PIFJ_PIFJ7=1; //tergere indicator ntrerupere PJ7
}

- cu declaraia interrupt,
interrupt void PORTP_INTR(void) { //interrupt declar o funcie de ntrerupere
........................
PIFP_PIFP0=1; //tergere indicator ntrerupere PP0
}
n ambele situaii au fost declarate funciile PORTJ_INTR i
PORTP_INTR ca fiind funcii de ntrerupere. Mai departe trebuie ataat funciilor
fie adresa vectorului de ntrerupere, fie numrul ntreruperii care este acelai cu
nivelul de prioritate. Declaraia se d n fiierul linker SofTec_linker.prm sau
Simulator_linker.prm, depinde de inta aleas (SofTec sau Simulator).
Dm ca exemplu liniile introduse n fiierul SofTec_linker.prm prin care
se declar funcia PORTJ_INTR ca fiind funcia de ntrerupere de la portul J i
PORTP_INTR ca fiind o funcie de ntrerupere de la portul P.

VECTOR 24 PORTJ_INTR // 24 - nivelul de prioritate portul J
//VECTOR ADDRESS 0xFFCE PORTJ_INTR // 0xFFCE:0xFFCF - vector ntrerupere port J
VECTOR ADDRESS 0xFF8E PORTP_INTR //0xFF8E:0xFF8F - vector ntrerupere port P
//VECTOR 56 PORTP_INTR // 56- nivelul de prioritate portul P
Pentru validare, respectiv, invalidare general a ntreruperilor mascabile de
tip CCR_I trebuie ters, respectiv, setat acest bit. Pentru aceasta trebuie incluse
definiiile macro EnableInterrupts, respectiv, DisableInterrupts din fiierul
hidef.h:

#define EnableInterrupts {__asm CLI;}
#define DisableInterrupts {__asm SEI;}

Pentru ca ntreruperile mascabile cu bitul CCR_I s fie luate n considerare
acestea trebuie i fie validate individual. n cadrul funciei de ntrerupere trebuie
ters indicatorul de ntrerupere corespunztor, altfel se revine continuu n aceeai
ntrerupere.

Note bibliografice
[1] S12CPUV2 Reference Manual, Rev 4.0, 03/2006, Freescale Semiconductors.
[2] MC9S12C Family/MC9S12GC Family Reference Manual (Chapter 5 Interrupt
(INTV1) Block Description), Rev 01.24, 05/2010, Freescale Semiconductors.

S-ar putea să vă placă și