Documente Academic
Documente Profesional
Documente Cultură
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:
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
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:
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.
...
.org INT0addr: // trecere la adresa INT0addr in
// memoria de program
rjmp INT0_ISR // redirectionare catre subrutina
// de prelucrare a intreruperii
...
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:
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