Aeronautica | Comunicatii | Constructii | Electronica | Navigatie | Pompieri | |
Tehnica mecanica |
Sistemul de intreruperi
1. Introducere
Microcontrollerele din familia PICmicro pot avea mai multe surse de intreruperi. In general acestea includ cate o sursa de intreruperi pentru modul periferic, desi unele module pot genera intreruperi multiple (de exemplu interfata seriala - USART). Intreruperile curente sunt:
Registrii folositi pentru controlul si monitorizarea starii sistemului de intreruperi sunt:
INTCON
PIE1
PIR1
PIE2
PIR2
Ne vom referi la acestia prin INTCON, PIR, PIE.
Registrul de control al intreruperilor, INTCON contine flaguri de un bit asociate cererile de intrerupere generate de nucleul microcontrollerului. De asemeni, mai contine si diferite flaguri de activare pentru unele intreruperi si un bit de activare globala a sistemului de intreruperi.
Bitul de activare globala a sistemului de intreruperi, GIE (INTCON(7)), activeaza, daca este setat, toate intreruperile nemascate sau dezactiveaza (daca este resetat) toate intreruperile. Diferitele surse de intrerupere pot fi dezactivate prin bitii de activare asociati lor in registrul INTCON. Bitul GIE este pus pe 0 la reset.
Instructiunea de revenire din rutina de intrerupere, RETFIE, realizeaza iesirea din intrerupere si seteaza bitul GIE, ceea ce permite tratarea in continuare a cererilor de intreruperilor existente.
Registrul INTCON contine urmatoarele intreruperi: cea generata pe pinul INT, cea generata de modificarea starii pinilor RB (portul B) si cea generata de depasirea timerului 0 (TMR0). De asemeni, registrul INTCON mai contine bitul de activare a intreruperilor provenite de la periferice, PEIE. Acesta activeaza/dezactiveaza tratarea cererilor de intrerupere provenite de la periferice daca este setat/resetat.
La tratarea unei intreruperi, bitul GIE este resetat pentru a dezactiva alte intreruperi, adresa de revenire este salvata pe stiva si in PC este incarcata valoarea 0004h. In rutina de tratare a cererilor de intrerupere sursa intreruperii poate fi determinata prin verificarea flagurilor asociate intreruperilor. Flagul asociat unei intreruperi este setat indiferent de starea bitului de activare corespunzator sau a bitului GIE. In general flagul asociat intreruperii tratate trebuie resetat software inainte de re-activarea sistemului de intreruperi pentru a evita o cascadare recursiva a cererilor de intrerupere.
Nota 1 : Flagurile asociate individual intreruperilor sunt setate indiferent de starea bitilor corespunzatori de activare sau a bitului GIE.
Nota 2 : Cand se executa o instructiune care reseteaza bitul GIE, toate cererile de intrerupere care nu au fost inca tratate sunt ignorate. Microcontrollerul va executa o instructiune NOP imediat dupa instructiunea care a restetat bitul GIE. Intreruperile ignorate pot fi in continuare tratate cand bitul GIE va fi setat din nou.
Logica de generare a intreruperilor
2. Registrii de control
Microcontrollerul dispune de urmatorii registri asociati sistemului de intreruperi: INTCON care contine bitul de activare globala a sistemului de intreruperi GIE, precum si bitul de activare a intreruperilor generate de periferice (PEIE), si perechile de registri PIE/PIR care activeaza cererile de intrerupere de la periferice si contin si flagurile asociate acestora.
2.1 Registrul INTCON
Poate fi atat citit, cat si inscris. Contine diferiti biti de activare si flaguri.
Nota : flagurile asociate intreruperilor sunt setate indiferent de starea bitilor de activare corespunzatori sau a bitului GIE. Aceasta caracteristica ofera posibilitatea unui polling software.
Registrul INTCON
Bitul 7 GIE: Global Interrupt Enable bit
1 - Activeaza toate intreruperile nemascate
0 - Dezactiveaza toate intreruperile
Bitul 6 PEIE: Peripheral Interrupt Enable bit
1 - Activeaza toate intreruperile nemascate de la periferice
0 - Dezactiveaza toate intreruperile de la periferice
Bitul 5 T0IE: TMR0 Overflow Interrupt Enable bit
1 - Activeaza intreruperea la depasire la timer0
0 - Dezactiveaza intreruperea la depasire la timer0
Bitul 4 INTE: INT External Interrupt Enable bit
1 - Activeaza intreruperea externa INT
0 - Dezactiveaza intreruperea externa INT
Bitul 3 RBIE(1): RB Port Change Interrupt Enable bit
1 - Activeaza intreruperea la modificarea portului RB
0 - Dezactiveaza intreruperea la modificarea portului RB
Bitul 2 T0IF: TMR0 Overflow Interrupt Flag bit
1 - in registrul TMR0 s-a produs o depasire (trebuie resetat software)
0 - in registrul TMR0 nu s-a produs nici o depasire
Bitul 1 INTF: INT External Interrupt Flag bit
1 - s-a produs o intrerupere externa pe pinul INT (trebuie resetat software
0 - nu s-a produs o intrerupere externa
Bitul 0 RBIF(1): RB Port Change Interrupt Flag biti
1 - cel putin unul din pinii RB7:RB4 si-a schimbat starea (trebuie resetat software)
0 - nici unul din pinii RB7:RB4 nu si-a schimbat starea
Legenda: R - bitul poate fi citit
W - bitul poate fi scris
U - neimplementat, valoarea 0 la citire
-n - valoarea dupa reset
Nota 1: La unele dispozitive, RBIE este cunoscut ca GPIE si RBIF ca GPIF
2.2 Registrii PIE
Acesti registri contin biti de activare individuala pentru intreruperile provenite de la periferice. Bitul PEIE(INTCON(6)) trebuie setat pentru a putea activa intreruperile de la periferice.
Registrii PIE
Bitul 0 TMR1IE: TMR1 Overflow Interrupt Enable bit
1 - Activeaza intreruperea la depasirea in TMR1
0 - Dezactiveaza intreruperea la depasirea in TMR1
Bitul TMR2IE: TMR2 to PR2 Match Interrupt Enable bit
1 - Activeaza intreruperea la egalitatea intre TMR2 si PR2
0 - Dezactiveaza intreruperea la egalitatea intre TMR2 si PR2
Bitul CCP1IE: CCP1 Interrupt Enable bit
1 - Activeaza intreruperea CCP1
0 - Dezactiveaza intreruperea CCP1
Bitul CCP2IE: CCP2 Interrupt Enable bit
1 - Activeaza intreruperea CCP2
0 - Dezactiveaza intreruperea CCP2
Bitul SSPIE: Synchronous Serial Port Interrupt Enable bit
1 - Activeaza intreruperea SSP
0 - Dezactiveaza intreruperea SSP
Bitul RCIE: USART Receive Interrupt Enable bit
1 - Activeaza intreruperea la receptia USART
0 - Dezactiveaza intreruperea la receptia USART
Bitul TXIE: USART Transmit Interrupt Enable bit
1 - Activeaza intreruperea la transmisia USART
0 - Dezactiveaza intreruperea la transmisia USART
Bitul ADIE: A/D Converter Interrupt Enable bit
1 - Activeaza intreruperea A/D
0 - Dezactiveaza intreruperea A/D
Bitul ADCIE: Slope A/D Converter Interrupt Enable bit
1 - Activeaza intreruperea Slope A/D
0 - Dezactiveaza intreruperea Slope A/D
Bitul OVFIE: Slope A/D TMR Interrupt Enable bit
1 - Activeaza intreruperea la depasirea Slope A/D timer
0 - Dezactiveaza intreruperea la depasirea Slope A/D timer
Bitul PSPIE: Parallel Slave Port Read/Write Interrupt Enable bit
1 - Activeaza intreruperea la citire/scriere PSP
0 - Dezactiveaza intreruperea la citire/scriere PSP
Bitul EEIE EEIE Write Complete Interrupt Enable bit
1 - Activeaza intreruperea la terminarea ciclului de scriere EE
0 - Dezactiveaza intreruperea la terminarea ciclului de scriere EE
Bitul LCDIE: LCD Interrupt Enable bit
1 - Activeaza intreruperea LCD
0 - Dezactiveaza intreruperea LCD
Bitul CMIE: Comparator Interrupt Enable bit
1 - Activeaza intreruperea generata de comparator
0 - Dezactiveaza intreruperea generata de comparator
Legenda: R - bitul poate fi citit
W - bitul poate fi scris
U - neimplementat, valoarea 0 la citire
-n - valoarea dupa reset
2.3 Registrii PIR
Acesti registri contin flagurile individuale asociate intreruperilor generate de periferice.
Nota 1: Flagurile asociate intreruperilor sunt setate indifferent de starea bitilor de activare corespunzatori sau a bitului de activare globala a sistemului de intreruperi GIE.
Nota 2: Utilizatorul trebuie sa reseteze software flagurile corespunzatoare inainte de reactivarea unei intreruperi, dupa deservirea acesteia.
Registrii PIR
Bitul TMR1IF: TMR1 Overflow Interrupt Flag bit
1 - s-a produs o depasire in registrul TMR1
0 - nu s-a produs o depasire in registrul TMR1
Bitul TMR2IF: TMR2 to PR2 Match Interrupt Flag bit
1 - valorile lui TMR2 si PR2 au devenit egale
0 - valorile lui TMR2 si PR2 nu au devenit egale
Bitul CCP1IF: CCP1 Interrupt Flag bit
Mod captura:
1 - s-a produs o captura in registrul TMR1 (trebuie resetat software)
0 - nu s-a produs o captura in registrul TMR1
Mod comparare:
1 - s-a produs o potrivire prin comparare cu registrul TMR1 (trebuie resetat software)
0 - nu s-a produs nici o potrivire prin comparare cu registrul TMR1
Mod PWM
Nefolosit in acest mod
Bitul CCP2IF: CCP2 Interrupt Flag bit
Mod captura:
1 - s-a produs o captura in registrul TMR1 (trebuie resetat software)
0 - nu s-a produs o captura in registrul TMR1
Mod comparare:
1 - s-a produs o potrivire prin comparare cu registrul TMR1 (trebuie resetat software)
0 - nu s-a produs nici o potrivire prin comparare cu registrul TMR1
Mod PWM
Nefolosit in acest mod
Bitul SSPIF: Synchronous Serial Port Interrupt Flag bit
1 - transmisia/receptia s-a terminat
0 - se asteapta o transmisie/receptie
Bitul RCIF: USART Receive Interrupt Flag bit
1 - bufferul de receptie al USART, RCREG este plin (resetat la citirea RCREG)
0 - bufferul de receptie al USART este gol
Bitul TXIF: USART Transmit Interrupt Flag bit
1 - bufferul de transmisie al USART, TXREG este gol (resetat la scrierea TXEG)
0 - bufferul de transmisie al USART este plin
Bitul ADIF: A/D Converter Interrupt Flag bit
1 - s-a incheiat o conversie A/D (trebuie resetat software)
0 - nu s-a incheiat conversia A/D
Bitul ADCIF: Slope A/D Converter Comparator Trip Interrupt Flag bit
1 - s-a incheiat o conversie A/D (trebuie resetat software)
0 - nu s-a incheiat conversia A/D
Bitul OVFIF: Slope A/D TMR Overflow Interrupt Flag bit
1 - s-a produs o depasire a Slope A/D TMR (trebuie resetat software)
0 - nu s-a produs depasirea Slope A/D TMR
Bitul PSPIF: Parallel Slave Port Read/Write Interrupt Flag bit
1 - s-a produs o operatie de scriere/citire (trebuie resetat software)
0 - nu s-a produs nici o operatie de scriere/citire
Bitul EEIF: EE Write Complete Interrupt Flag bit
1 - s-a incheiat un ciclu de scriere EE (trebuie resetat software)
0 - nu s-a incheiat ciclul de scriere EE
Bitul LCDIF: LCD Interrupt Flag bit
1 - s-a produs o intrerupere LCD(trebuie resetat software)
0 - nu s-a produs nici o intrerupere LCD
Bitul CMIF: Comparator Interrupt Flag bit
1 - s-a modificat intrarea comparatorului(trebuie resetat software)
0 - nu s-a modificat intrarea comparatorului
Legenda: R - bitul poate fi citit
W - bitul poate fi scris
U - neimplementat, valoarea 0 la citire
-n - valoarea dupa reset
3. Latenta intreruperilor
Latenta intreruperilor este definita ca fiind timpul scurs intre producerea evenimentului care declanseaza cererea de intrerupere (seteaza flagul intreruperii) si momentul in care incepe executia instructiunii de la adresa 0004h (daca intreruperea respectiva este activata).
Pentru intreruperile sincrone (in general cele interne) latenta este 3Tcy.
Pentru intreruperile asincrone (in general cele externe), cum ar fi INT, sau modificarea pinilor RB, latenta va fi 3 - 3.75Tcy (cicli instructiune). Valoarea exacta a latentei/intarzierii depinde de momentul in care ea se produce in raport cu ciclul instructiune.
Latenta este la fel atat pentru instructiunile de un ciclu, cat si pentru cele de doi cicli.
Timing-ul pentru intreruperea INT si alte intreruperi externe
4. INT si intreruperile externe
Intreruperea externa pe pinul INT este declansata pe front: fie cel crescator, daca bitul INTEDG (OPTION(6)) este setat, fie cel cazator, daca INTEDG este resetat. Daca pe pinul INT se produce o tranzitie valida, bitul INTF (INTCON(1)) este setat. Aceasta intrerupere poate fi activata/dezactivata prin setarea/resetarea bitului de validare INTE (INTCON(4)). Bitul INTF trebuie resetat software in rutina de tratare a intreruperilor inainte de reactivarea ei. Intreruperea generata de INT poate reactiva microcontrollerul din modul SLEEP daca bitul INTE a fost setat inainte de a intra in mod SLEEP. Starea bitului GIE decide daca microcontrollerul va vectoriza intreruperea dupa iesirea din modul SLEEP.
5. Salvarea contextului in timpul executiei rutinei de tratare a intreruperilor
In timpul unei intreruperi, numai registrul PC este salvat pe stiva. In general, utilizatorii vor dori sa salveye continutul unor registri importanti, cum sunt W ori STATUS. Acest lucru trebuie implementat in software.
Actiunea de salvare a informatiei este in general cunoscuta ca "PUSHing", iar cea de restaurare a informatiei inainte de intoarcere este de obicei numita "POPing". Acestea (PUSH, POP) nu sunt mnemonice ale unor instructiuni, dar sunt actiuni conceptuale. Acestea pot fi implementate ca o secventa de instructiuni. Pentru usurinta in programare, aceste secvente de cod pot fi realizate sub forma de MACRO-uri.
Exemplul urmator salveaza
si restaureaza registrii STATUS si
Pasii in acest exemplu:
Daca este necesara salvarea si a altor registri, acestia trebuie salvati dupa salvarea registrului STATUS (pasul 2) si restaurati inainte de restaurarea registrului STATUS (pasul 4).
6. Initializarea
Exemplul urmator arata cum se face initializarea si activarea intreruperilor asociate dispozitivelor, unde valoarea PIE1_MASK1 este valoarea care trebuie inscrisa in registrul de activare a intreruperilor.
Exemplul urmator arata cum se pot crea macro-definitii pentru functii. Macro-urile trebuie definite inainte de a fi folosite. Pentru usurinta depanarii codului, poate fi de ajutor localizarea macro-urilor in alte fisiere ce vor fi incluse in momentul asamblarii. Aceasta permite o mai buna vizualizare a fisierelor ce contin codul sursa. Aceste fisiere trebuie incluse inainte de utilizarea macro-urilor in codul sursa, dar este mai usor de depanat programul daca toate incluziunile de fisiere se realizeaza la inceputul fisierului ce contine codul sursa al programului.
Ultimul exemplu pe care il prezentam arata structura tipica a rutinei de tratare a intreruperilor. Aceasta utilizeaza macro-uri pentru salvarea si restaurarea registrilor inainte de executia codului de tratare a cererii de intrerupere.
6. Informatii utile pentru dezvoltatorii de sisteme
Intrebarea 1: Un algoritm nu ofera rezultate corecte.
Raspunsul 1: Presupunaand ca algoritmul este corect si ca intreruperile sunt activate pe durata executiei algoritmului, asigurati-va ca toti registrii care sunt utilizati de algoritm si de catre rutina de tratare a cererilor de intrerupere sunt salvati si restaurati. Daca nu, continutul unor registri poate fi modificat de catre rutina de tratare a intreruperilor.
Intrebarea 2: Sistemul meu se blocheaza.
Raspunsul 2: Daca utilizati sistemul de intreruperi, asigurati-va ca flagul asociat intreruperii este resetat dupa tratarea cererii de intrerupere (dar inainte de executia instructiunii RETFIE). Daca flagul asociat intreruperii ramane setat, microcontrollerul va relua imediat executia rutinei de tratare a intreruperilor, deoarece cererea de intrerupere ramane.
Copyright © 2024 - Toate drepturile rezervate