Microprocesoare (MP) #4

Tema:  Intreruperea Externa
Laborator Nr 4
Scopul:
Studiul principiului de utilizare a intreruperilor externe.
Problema:  
Utilizind intreruperea externa sa se depisteze care taste, dintr-un set de opt taste, au fost apasate, Numarul tastei sa se afisheze la un indicator pe 7 segmente
 Notiuni Teoretice:
    Intreruperea este stoparea procesului normal de executie a programului pentru a executa o sarcina prioritara.  Dupa executarea sarcinii prioritare executia revine la normal.
Intreruperea poate fi un proces/efect fizic intern sau extern. Codul pentru  executie  a unei intreruperi se grupeaza intr-o subrutina similara cu cea normala dar se termina cu reti  nu cu  ret.
L aparitia situatiei de intrerupere, sistemul e conceput in asa mod ca sa cheme imediat subrutina intreruperii. Din punct de vedere electronic, sistemul de intreruperi se bazeaza pe initierea cu o anumita valoare  a lui PC,  specifica intreruperii date. Valoarea ce se incarca in PC este pozitia rezervata in vectorul de intreruperi pentru intreruperea data.
    ExtInt0, ExtInt1 este o intrerupere externa, un modul periferic a microcontrolerului, si este capabil sa execute intreruperea la schimbarea nivelului logic a semnalului la pin.


Lucrul cu modulul periferic a intreruperii externe se va efectua cu anumiti  registri din cei 64 de registri  I/O si anume: GICR, GIFR, MCUCR, MCUCSR
GICR- General Interrupt Control Register
            7 INT1- External Interrupt Request 1 Enabled
            6 INT0- External Interrupt Request 0 Enabled
            5 INT2- External Interrupt Request 2  Enabled
GIFR- General Interrupt Flag Register
           7 INTF1-External Interrupt Flag 1
           6 INTF0- External Interrupt Flag 0
           5 INTF2- External Interrupt Flag 2
MCUCR- MCU Control Register
              3 ISC11- Interrupt Sense Control 1 Bit 1
               2 ISC10- Interrupt Sense Control 1 Bit 0
               1 ISC01- Interrupt Sense Control 0 Bit 1
               0 ISC00- Interrupt Sense Control 0 Bit 0
MCUCSR- MCU Control and Status Register
             6 ISC2- Interrupt Sense Control 2
      
Realizarea problemei:
Pentru a soluţiona problema, alegem microprocesorul Atmega16, setăm un port de tip input şi unul de tip output. Pinii portului Input îi conectăm la butoane, pentru a stopa zgomotele din exterior asupra MC, portul de ieşire îl setăm cu zerouri, apoi la afisorul cu 7 segmente. Intreruperea externa se afla la portul D, astfel conectam pinul intreruperii externe, prin intermediul diodelor, la fiecare pin din port B. Astfel cum vedem din schema la fiecare apasare a butoanelor, se va declansa intreruperea externa. La declansarea intreruperii, functia de prelucrare va compara byte-ul de la intrare in port B cu byte-ul stabilit pentru fiecare cifra, cind acestea vor fi egale pe afisor va aparea cifra respectiva.


Schema electronică:

Listingul programului:
.include"m16def.inc"                                         ;includem fisierul unde sunt definiti registrii
.def temp = R16                                                    ;vom folosi de acest registru drept variabila intermediara
.def digit = R17
.cseg
.org 0

rjmp Reset
.org INT0addr
rjmp INT0_isr
.org 0x28                               



INT0_isr:
                                               rcall      Delay                               ;evitam zgomotul de la eliberarea butonului
                                              
                                               in temp, PinB
                                              
                                               sbrs temp, 0
                                               ldi digit, 0b00111111
                                               sbrs temp, 1
                                               ldi digit, 0b00000110
                                               sbrs temp, 2
                                               ldi digit, 0b01011011
                                               sbrs temp, 3
                                               ldi digit, 0b01001111
                                               sbrs temp, 4
                                               ldi digit, 0b01100110
                                               sbrs temp, 5
                                               ldi digit, 0b01101101
                                               sbrs temp, 6
                                               ldi digit, 0b01111101
                                               sbrs temp, 7
                                               ldi digit, 0b00100111

                                               out portc, digit

                                               rcall Delay                              ;evitam zgomotele de la tastarea butonului

reti



Reset:
                                                                                                  ; Regulam Stack-ul
                               ldi temp, LOW(RAMEND)                         ;initializam pointerul stivei
                               out SPL, temp                                                 ;el contine 2 registri - SPL si SPH
                               ldi temp, HIGH(RAMEND)                        ;comandam cu stiva din program
                               out SPH, temp
                              

                               ldi temp, 0x00
                               out ddrb, temp
                               out ddrd, temp
                               out portc, temp
                              
                               ldi temp, 0xFF
                               out ddrc, temp
                               out portb, temp
                               out portd, temp
                              

                                                              ; Regulam Setarile pentru intrerupere
                               ldi temp, 0x40
                               out GICR, temp

                               ldi temp, 0x02
                               out MCUCR, temp

                               clr temp
                               out MCUCSR, temp

                               ldi temp, 0x40
                                out GIFR, temp

                              
                               sei

                Main:                                                                   ;bucla infinita  
                               rjmp Main                                                                       

reti       





Delay:                                                                                 ;Functia de retinere de 256*3 tacturi
                  ldi temp, 0xFF                                               ;Incarcam unitati in temp
                 Loop: dec temp                                             ;decrementam temp
                 cpi temp, 0x00                                               ;comparam continutul cu zero
                 brne loop                                                          ;daca nu este egalitate goto LOOP
ret                                                                                        ;reintoarcerea in program.




Concluzii:
       Efectuind lucrarea data de laborator, am studiat intreruperile externe, si am observat ca cu ajutorul lor se poate de realizat o multime de probleme si in plus utilizarea intreruperilor este destul de simpla. Ea se poate configura de fiecare data diferit, adica independent pentru orice problema, aceasta se face cu ajutorul registrilor  GICR, GIFR, MCUCR, MCUCSR.  Controlerul Atmega16 are un vector relativ mare de intreruperi, si mecaniasmul de utilizare este asemanator la majoritatea, deci ne permite sa realizam multe probleme cu efort minim.