Sunteți pe pagina 1din 6

MINISTERUL EDUCAŢIEI, CULTURII ȘI CERCETĂRII AL REPUBLICII MOLDOVA

UNIVERSITATEA TEHNICĂ A MOLDOVEI

Facultatea Calculatoare, Informatică şi Microelectronică

Departamentul
Microelectronică și Inginerie Biomedicală

REFERAT
la lucrarea de laborator nr.4
Tema: „Întreruperi externe”
Disciplina: „Microprocesoare și interfețe”

A elaborat
A verificat asistent univ. Verjbițchii Valerii

Chișinău 2020
Scopul lucrării:
- scrierea de program bazat pe întreruperi;
- folosirea modului cu întreruperi externe;

I. Partea teoretică:
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

    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.

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..

|  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

Intreruperea Reset
Majoritatea sistemelor digitale, printre care se enumeră şi Microcontrollerul, presupun
existenţa unui semnal RESET prin intermediul căruia sistemul se readuce o stare
iniţială. Semnalul de RESET ca regulă este aplicat la regiştrii interni, readucînd sistemul
la o stare predefinită. În modul normal de funcţionare a dispozitivului semnalul se
menţine într-o stare predefinită fie 0 sau 1 menţinută din interiorul sistemului sau din
exterior. Îniţierea unui RESET presupune generarea unui puls de o durată anumită de
valoare inversă celei din starea normală de
funcţionare pe semnalul de Reset.
Microcontrollerul din seria AVR are în interior un modul specializat pentru generarea
semnalului intern de RESET. Acest modul permite generarea pulsului intern de reset în
mai multe situaţii cum ar fi aplicarea alimentării circuitului POWERON RESET, căderea
nivelului sursei de alimentare a circuitului, expirarea timpului de time-out de la modulul
WATCHDOG (Timer de veghe), sau aplicarea unui puls negativ la pinul extern RESET
al microcontrollerului.
Pe lîngă faptul ca semnalul de RESET intern iniţializează toţi regiştrii interni al
microcontrollerului, se generează o situaţie de întrerupere RESET, care va implica
prelucrarea acestei întreruperi.
Întreruperea RESET are cea mai mare prioritate şi deci adresa de referintă a ISR se
va plasa în capul Vectorului de Întreruperi, adică la adresa $0000.Mai mult decât atât
Intreruperea RESET este o întrerupere nemascată, fapt ce îi dă posibilitatea să fie
prelucrată chiar dacă întreruperile sunt interzise prin bitul de permisune a întreruperilor
(I=0). Deci această întrerupere va putea suspenda o alta întrerupere.

.include "m16def.inc"
.def temp = r16

.cseg
.org 0
jmp Reset
.org $002
jmp EXT_INT0

Reset:
ldi temp, high(RAMEND)
out sph, temp
ldi temp, low(RAMEND)
out spl, temp
ldi temp, 0xff
out DDRB, temp
ldi temp, 0b01000000
out GICR, temp
ldi temp, 0b00000001
out MCUCR, temp

sei Proga:
rjmp Proga

EXT_INT0:
cli
sbis PORTB, 0
rjmp Jet
cbi PORTB, 0
Vix:
sei
reti

Jet:
sbi PORTB, 0
rjmp Vix

Concluzia: În urma efectuării lucrării de laborator am construit un program


utilizând una din întreruperile externe

S-ar putea să vă placă și