Modulul periferic Intrerupere Externa - EXT INT permite detectarea schimbarilor de la unul din pinii externi al microcontrollerului cu o eventuala generare a unei situatii de intrerupere, care ar putea fi tratata de catre o subrutina de prelucrare a intreruperii EXT_INT_ISR. Totodata este unul din cele mai simple si esentiale module periferic care pot genera intreruperi.
Întreruperile externe sunt atasate de pinii INT0, INT1, si INT2 ale microconrollerului. Pinii destinati intreruperilor pot fi configuraţi si ca ca ieşiri. Această caracteristică oferă posibilitatea crearii situatiilor de intreruperi chiar din cadrul programului prin modificarea valorilor pinilor respectivi din programul din MCU.
In figura de mai jos se da un exemplu ce demonstreaza cum ar putea fi interpretata detectarea unei intreruperi externe generate de apasarea unui buton atasat la pinul de intrerupere si prelucrat de subrutina de prelucrare a situatiei de intreruperi:
Aceasta proprietate a pinului inteligent reprezentata prin modulul periferic EXT INT poate fi utilizata pentru detectarea schimbarilor asemeni unui sensor binar, adica aparitia unui efect fizic extern. De exemplu :nivelul de tensiune, temperatura, luminozitate etc. a crescut/cazut peste nivelul dorit.
Ca si orisicare modul periferic, modulului periferic EXT INT ii sunt rezevati un set de registri periferici de stare si/sau control pentru configurare si lucru cu acest modul.
Registri periferici, din cei 64 pentru microcontrillerul din seria AVR, rezervati pentru modulul periferic EXT INT, sunt: .
- GICR (GIMSK) - General Interrupt Controlserveste pentru activarea unui modul de intrerupere exetrna prin inscrierea valorii "1" logic in locatia specifca din acest registru. respectiv pentru dezactivare se inregistreaza "0" logic
bit7 - INT1 - Activarea intreruperii INT1
similar pentru intreruperea INT1 vom avea:
| ISC2 | mod de generare a intreruperii
Întreruperile externe sunt atasate de pinii INT0, INT1, si INT2 ale microconrollerului. Pinii destinati intreruperilor pot fi configuraţi si ca ca ieşiri. Această caracteristică oferă posibilitatea crearii situatiilor de intreruperi chiar din cadrul programului prin modificarea valorilor pinilor respectivi din programul din MCU.
In figura de mai jos se da un exemplu ce demonstreaza cum ar putea fi interpretata detectarea unei intreruperi externe generate de apasarea unui buton atasat la pinul de intrerupere si prelucrat de subrutina de prelucrare a situatiei de intreruperi:
Putem vedea ca pentru ca sa fie apelata subrutina de prelucrare a intreruperii este necesara satisfactia urmatoarelor conditii:
- Bitul de permisiune globala a intreruperiolor este setat - I=1
- intreruperea de la pinul EXT INT0 este activata - INT0 = 1
- a fost detectata situatia de intrerupere si reprezentata de un flag indicator al acesteia - INTF0 = 1
Aceasta proprietate a pinului inteligent reprezentata prin modulul periferic EXT INT poate fi utilizata pentru detectarea schimbarilor asemeni unui sensor binar, adica aparitia unui efect fizic extern. De exemplu :nivelul de tensiune, temperatura, luminozitate etc. a crescut/cazut peste nivelul dorit.
Ca si orisicare modul periferic, modulului periferic EXT INT ii sunt rezevati un set de registri periferici de stare si/sau control pentru configurare si lucru cu acest modul.
Registri periferici, din cei 64 pentru microcontrillerul din seria AVR, rezervati pentru modulul periferic EXT INT, sunt: .
- GICR (GIMSK) - General Interrupt Controlserveste pentru activarea unui modul de intrerupere exetrna prin inscrierea valorii "1" logic in locatia specifca din acest registru. respectiv pentru dezactivare se inregistreaza "0" logic
bit6 - INT0 - Activarea intreruperii INT0
bit5 - INT2 - Activarea intreruperii INT2
Biti 4..0 - rezervati
de notat ca pentru ca ca intreruperea sa aiba loc este necesar ca bitul global de activare a intreruperii sa fie activ.
de exemplu, pentru activarea intreruperii de la sursa INT0 se va executa urmatoarea secventa de cod, de obicei plasata in secveta de inializare a progamului principal:
ldi R16, 1<<INT0 // incarcarea valorii 0b10000000 in R16 out GICR, R16 // Activarea intreruperii Int0
sei // Activarea globala a intreruperilor
pentru activarea intreruperii in timpul executiei programului se recomanda utilizarea comenzii de setare a bitului in registrul periferic:
sbi GICR, INT0 // Activarea intreruperii Int0
- GIFR - reprezina colectia de flaguri indicatori de detectie a situatiilor de intreruperi de la diferite surse externe. acet registru nu este diponibil pentru modificare. flagurile s e seteaza automat la detectia intreruperii la pinul respectiv, si se reseteaza la deservirea acestei ntreruperi.
Bit 7 - INTF1 Flag de detectie a intreruperii de la sursa EXT INT1
Bit 6 - INTF0 Flag de detectie a intreruperii de la sursa EXT INT0
Bit 5 - INTF2 Flag de detectie a intreruperii de la sursa EXT INT2
Biti 4..0 - rezervati
- MCUCR - reprezinta registrul de configurare a modului de detectare a situatii de intrrupere. situatia de intrrupere poate fi detectata pe nivel logic cat si pe schimbare a nivelului logic.
pentru intreruperea INT0 vom avea:
| ISC01 | ISC00 | mod de generare a intreruperii
-------------------------------------------------
| 0 | 0 | pe nivel jos la pinul INT0 0-logic
| 0 | 1 | orice schimbare la pinul INT0
| 1 | 0 | caderea nivelului de la 0 la 1 la pinul INT0
| 1 | 1 | ridicarea nivelului de la 1 la 0 la pinul INT0
similar pentru intreruperea INT1 vom avea:
| ISC11 | ISC10 | mod de generare a intreruperii
-------------------------------------------------
| 0 | 0 | pe nivel jos la pinul INT1 0-logic
-------------------------------------------------
| 0 | 0 | pe nivel jos la pinul INT1 0-logic
| 0 | 1 | orice schimbare la pinul INT1
| 1 | 0 | caderea nivelului de la 0 la 1 la pinul INT1
| 1 | 1 | ridicarea nivelului de la 1 la 0 la pinul INT01
pentru configurarea modului de detectie a intreruperii INT2 se va utiliza registrul EMCUCR(extensia registrului MCUCR). in acest scop este rezervat doar un bit situat pe pozitia bit0..
| ISC2 | mod de generare a intreruperii
-------------------------------------------------
| 0 | caderea nivelului de la 0 la 1 la pinul INT2
| 1 | ridicarea nivelului de la 1 la 0 la pinul INT2
Prin urmare, ca o concluzie, pentru a configura sistemul conform figurii prezentate mai sus ca exemplu, vor fi necesare urmatoarele secvente in codul programului scris in ASM.
inregistrarea subrutinei de prelucrare a intreruperii in vectorul de intreruperi
...
.org INT0addr: // trecere la adresa INT0addr in
// memoria de program
rjmp INT0_ISR // redirectionare catre subrutina
// de prelucrare a intreruperii
...
initializarea/configurarea modulului de intreruperi in sectiune de initializare a programului principal (intreruperea reset.)
reset:
ldi R16, (1<<ISC01)|(0<<ISC00) // incarcarea valorii
// 0b00000010 in R16
out MCUCR, R16 // Aplicarea configuratiei modului de
// detectie a intreruperii
cbi DDRD, PIND3 // configurarea pinului ca intrare
sbi PORTD, PIND3 // aplicarea rezistentei pull-up pe pin
ldi R16, 1<<INT0 // incarcarea valorii 0b10000000 in R16
out GICR, R16 // Activarea intreruperii Int0
...
Activarea globala a intreruperilor: sei // Activarea globala a intreruperilor Bucla infinita de controlr: main_loop: // bucla infinita de cntrol ... rjmp main_loop
descrierea subrutine de prelucrare a intreruperii
INT0_ISR:
...
... // corpul subrutinei de prelucrare
// a intreruperii
...
reti
Exemplu: