duminică, 17 noiembrie 2013

Moduul periferic Intrerupere externa. EXT INT

Pagina principala curs          На русском
 
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:

    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
   Modulul periferic ar putea fi comparat cu un GPIO avansat, care reactioneaza in timp real la oricare schimbare pe pinul fizic, si de fapt asta si este.
    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
AVR Microcontroller GICR Register
    bit7 - INT1 - Activarea intreruperii INT1
    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.
AVR Microcontroller MCUCR Register
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   |   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..

AVR Microcontroller EMCUCR Register

|  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


Referinte externe:
http://www.avr-tutorials.com/interrupts/The-AVR-8-Bits-Microcontrollers-External-Interrupts