sistemul de intreruperi

9
Capitolul 4 20 SISTEMUL DE ÎNTRERUPERI 4.1. Introducere Microcontrolerele HCS12 au în componenţa lor blocul INT (Interrupt) pentru gestionarea întreruperilor. Întreruperea poate să apară în timpul funcţionării normale a microcontrolerului sau într-un regim de putere redusă, de aşteptare (Wait) sau de oprire (Stop). În primul caz, dacă întreruperea este recunoscută, se abandonează programul în curs de execuţie, 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 aşteptare 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 condiţii CCR sunt disponibili biţii 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 câte un bit de validare individuală a întreruperii. Pentru fiecare sursă de întrerupere este alocat câte 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 resetări, 0xFFCE:0xFFCF – vector de întrerupere pentru portul J). Un vector de întrerupere poate fi alocat mai multor cereri similare de întrerupere. De exemplu, pentru interfaţa SCI este alocat vectorul 0xFFD6:0xFFD7. Pe de altă parte, interfaţa SCI generează patru tipuri de cereri de întrerupere, două de la emisie şi două de la recepţie. Fiecărei cereri de întrerupere îi este ataşat un indicator de întrerupere pe baza căruia se poate depista sursa care a generat întreruperea. Indicatorii de întrerupere trebuie şterşi în cadrul subrutinelor de întrerupere. Prioritatea surselor de întrerupere este stabilită intern în ordinea descrescătoare 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 priorităţi implicite, nivelul 0 are prioritate implicită maximă şi este ataşat vectorului 0xFFFE:0xFFFF, nivelul 63 are prioritate implicită minimă şi este ataşat vectorului 0xFF80:0xFF81. Nu toate întreruperile sunt implementate. Toate întreruperile implementate la microcontrolereleHCS12 sunt listate în tabelul 4.1.

Upload: stefan

Post on 22-Nov-2015

27 views

Category:

Documents


3 download

DESCRIPTION

Sistemul de Intreruperi

TRANSCRIPT

  • Capitolul 4

    20

    SSIISSTTEEMMUULL DDEE NNTTRREERRUUPPEERRII 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.

    stefanHighlight

    stefanHighlight

    stefanHighlight

  • 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 fOSCCLK. Factorul de divizare se programeaz din biii COPCTL_[CR2,CR1,CR0] n domeniul 214 224. 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 fOSCCLK. Factorul de divizare se stabilete din biii RTICTL_[RTR6RTR0] n domeniul 210 220. 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 fOSCCLK. 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 fSCM. 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 fSCM). 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 VDDA, VSSA 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 VDDA 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_[TSTATE1, TSTATE0] CANRIER_[RSTATE1, 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.