Вы находитесь на странице: 1из 10

Intreruperi.

ntreruperea reprezint suspendarea procesului normal de execuie a


programului pentru rezolvarea unei probleme prioritare.
ntreruperea de regul este generat ca rspuns la un efect fizic intern sau extern al unui modul
periferic. Efectul fizic n sine va reprezenta situaia de ntrerupere sau excepie care necesit o
tratare neintrziat. Asemenea situaii de ntreruperi pot fi ca de exemplu: schimbarea nivelului
logic la un pin, sfritul unei perioade de timp sfritul unei operaii de transmisie sau recepie,
sfritul unei conversii etc.
Majoritatea modulelor periferice pot genera una sau mai multe ntreruperi.
Tratarea situaiei de ntrerupere presupune existena unei subrutine definite n acest scop.
Odat cu apariia situaiei de ntrerupere, microcontrollerul va seta ntr-un registru de stare a
perifericului un flag de ntrerupere IF, care va fi pastrat pna la prelucrarea intreruperii date.
Pentru ca ntreruperea de la situaia de ntrerupere s fie generat va fi nevoie ca n registrul de
control al perifericului ntreruperea n cauz s fie activat prin setarea unui bit de activare IE.
Mecanismul de chemare a subrutinei de prelucrare a ntreruperii va fi iniiat doar n cazul n care:
1.
S-a detectat situaia de ntrerupere reprezentat de flagul acesteia IF==1
2.
ntreruperea de la sursa dat este permisa IE ==1
3.
Bitul de permisiune global a ntreruperilor este setat I==1 (in SREG)
mai simplu, subrutina va fi chemat cnd relaia IF & IE & I va fi adevrat.
Sistemul de ntreruperi, de exemplu, va permite un apel de subrutin automat la apsarea unui
buton, luat ca surs de ntrerupere extern EXT_INT.

Vector de ntreruperi
Odat ce o ntrerupere a fost generat sistemul va executa un apel
hardware a subrutinei de prelucrare a ntreruperii (ISR), care presupune un
salt la o adres unde este realizat aceast subrutin. Deoarece o asemenea
chemare nu este una explicit, ca i n cazul unui apel clasic cu o
instruciune de tip CALL unde adresa de salt este parametru al comenzii,
apelul hardware presupune existena n memoria de programe a unei zone
de memorie alocate pentru subrutinele de prelucrare a ntreruperilor.
Aceast zon de memorie de program este numit vector de ntreruperi.
Deci vom spune c vectorul de ntreruperi reprezint o zon de
memorie de program rezervat adreselor de referin a subrutinelor de
prelucrare a ntreruperilor.
Vectorul de ntreruperi, pentru arhitectura AVR, este localizat la nceputul
memoriei de program, ncepnd cu adresa $0000. Pentru fiecare subrutin
de prelucrare a ntreruperilor de la o anumit surs de ntrerupere i este
rezervat un spaiu de 2 comenzi (pentru versiunile mai vechi a nucleului AVR
o comanda).
n mod evident c acest spaiu de cele mai deseori nu este destul pentru a
implementa o subrutin de prelucrare a ntreruperii ns suficient pentru a
executa o redirecionare ctre implementarea subrutinei cu o instruciune de
salt necondiionat de tip JUMP. n cazul n care am dori s protejm programul
de la apeluri accidentale a unei ISR la locaia respectiv se va nregistra o
comand de returnare din subrutin. Deoarece avem la dispoziie tocmai
dou locaii de program am putea utiliza una din ele pentru tratarea

apelurilor nedorite a ISR prin setarea unui indicator, aprinderea unui becule,
sau chiar un apel de subrutin special definit n acest scop.
.org 0 ; VI plasat la inceputul MEM programe
; redirectionare catre prelucrarea inreruperii RESET
rjmp Reset
nop
; blocarea intreruperii INT0 prin returnare din VI
reti
nop
; chemarea unei rutine de tratare a intreruperii accidentale
rcall warn_isr
reti
; setarea unui pin al MCU pentru semnalizarea chemarii ISR
sbi PORTA, PINA0
reti
; blocarea ISR
reti
nop
; blocarea ISR
reti
nop
; blocarea ISR
reti
nop
; blocarea ISR
reti
nop
...
...
Un microcontroller poate avea pn la mai mult de 20 surse de ntreruperi
distincte n dependen de seria lui. De exemplu colecia de ntreruperi
pentru ATmega16 va fi urmtoarea:
(extras din datasheet-ul producatorului)

Prioritatea Intreruperilor
n cazul n care dou sau mai multe ntreruperi intervin concomitent, va fi
prelucrat ntreruperea cu prioritatea cea mai nalt. Prioritate mai nalt vor
avea ntreruperile adresele de referin a crora n Vectorul de ntreruperi
sunt mai mici. Respectiv ntreruperea Reset, avnd adresa de referin
$0000, va avea cea mai mare prioritate. Lund n consideraie c frecvena
de lucru a microcotrollerelor de regul este mare, probabilitatea ca n acelai
moment dou sau mai multe ntreruperi s ceara prelucrare este destul de
mic. ns asemenea cazuri se pot ntampla atunci cnd pe o perioada
ndelungat au fost interzise ntreruperile prin bitul global de permisiune a
ntreruperilor - I, posibil prin resetara lui din program cu comanda CLI
pentru a trata o zona critic, sau procesorul s-a reinut cu prelucrarea unei
ntreruperi anterioare.

Mecanismul de apel a subrutinei de prelucrare a ntreruperii (ISR)

Dup cum am spus mai sus, generarea unei ntreruperi va implica un apel hardware a unei
ISR. Mecanismul de chemare a unei ISR este identic cu cel de chemare a unei subrutine
obinuite cu excepia ca pe durata executrii ISR bitul global de permisiune a ntreruperilor va fi
resetat, I=0, fapt care va interzice chemarea unei alte ISR pe durata executrii ISR. Deci
mecanismul de chemare a unei ISR va fi realizat n mai multe etape.
La detectarea situaiei de ntrerupere se va evalua o relaie de tip IF & IE & I (vezi mai
sus). Dac aceast relaie va fi adevrat se va declana mecanismul de apel hardware al ISR. n
cazul n care ntreruperea a fost detectat n timpul execuiei unei comenzi, se va atepta pn la
terminarea execuiei comenzii curente, dup care se va declana mecanismul de chemare a ISR.
Se va executa apelul hardware al ISR echivalent cu o comand de forma CALL
ISR_Addr unde ISR_Addr va fi adresa de referin din Vectorul de ntreruperi
pentru ntreruperea dat. n aa mod se va realiza un salt necondiionat la
adresa ISR_Addr, localizat n vectorul de ntreruperi, nsoit de o salvare a Contorului de
Program (PC) n stiva (Stack), PC+1->Stack.
Concomitent cu saltul la vectorul de ntreruperi se va reseta bitul global de permisiune a
ntrerulerilor, I = 0, un echivalent a comenzii CLI, fapt ce va interzice ntreruperea
execuiei ISR de o alt ISR detectate n acest timp.
Execuia secvenei de instruciuni din cadrul ISR. Pentru ISR sunt valide
recomandrile pentru subrutinele obinuite referitor la pstrarea strii
globale a regitrilor de uz general utilizai n cadrul ISR, ce se realizeaz prin
salvarea lor n stiv la nceputul subrutinei i restabilirea acestora nainte de
returnarea din subrutin.
Returnarea din ISR realizat cu comanda RETI. Aceast comand este
echivalent cu comanda de returnare din subrutina obinuit RET, cu
excepia ca concomitent se va seta bitul de permisiune global a
ntreruperilor, I = 1. Putem spune ca RETI este echivalent cu RET+SEI. Deci,
returnarea din ISR va implica restabilirea adresei Contorului de Program din
stiv, care fusese salvat n procesul de chemare a ISR, PC->Stack i execuia
programului va continua exact din locul unde a fost suspendat de ctre
ntrerupere.

Principiul ca o ISR nu poate fi ntrerupt de o alt ntrerupere se datoreaz


faptului c pe durata execuiei acesteia bitul global de permisiune al
ntreruperilor I este resetat (I=0). ns aceast regul poate fi anulat odat
cu setarea n cadrul ISR a bitului de permisiune a ntreruperilor cu comanda
SEI (I=1). Aceast aciune va permite ca o ISR sa fie ntrerupt de o alt
ntrerupere.
Intreruperea Reset
Majoritatea sistemelor digitale, printre care se enumer i
Microcontrollerul, presupun existena unui semnal RESET prin intermediul
cruia sistemul se readuce o stare iniial. Semnalul de RESET ca regul este
aplicat la regitrii interni, readucnd sistemul la o stare predefinit. n modul
normal de funcionare a dispozitivului semnalul se menine ntr-o stare
predefinit fie 0 sau 1 meninut din interiorul sistemului sau din exterior.
niierea unui RESET presupune generarea unui puls de o durat anumit de
valoare invers celei din starea normal de funcionare 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 situaii cum ar fi aplicarea alimentrii
circuitului POWERON RESET, cderea 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 lng faptul ca semnalul de RESET intern iniializeaz toi regitrii
interni al microcontrollerului, se genereaz o situaie 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 dect att 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.
Programe cu intreruperi
n programarea clasica se presupune ca execuia programului ncepe de
la adresa $0000, aceast adres considerndu-se punct de intrare n
program. Pentru programele cu ntreruperi acest fapt este veridic parial.
Execuia programului va ncepe de la adresa $0000, dar acest fapt va fi
condiionat de saltul la prelucrarea ISR Reset, adresa de referin a creia
este poziionat la nceputul Vectorului de ntreruperi, adic la adresa $0000.
Deoarece odat cu pornirea Microcontrollerului se va genera o ntrerupere
RESET, ceea ce va iniia un apel a ISR de prelucrare a acestei ntreruperi, se
va considera ca ISR RESET este punctul de intrare n program. Mai mult, n
ISR RESET va fi ncadrat aa numitul programul principal din programarea
clasic, incluznd partea de iniializare a sistemului i bucla infinit care va
menine sub control microcontrollerul pe tot parcursul funcionrii lui.
Principiul ca o ISR nu poate fi ntrerupt de ctre o alt ntrerupere implic
faptul c n cazul n care dorim s scriem programe fr ntreruperi, putem
s ne permitem s scriem programul ncepnd cu adresa $0000 i ignorm
faptul c zona de la nceput a memoriei de program este rezervat Vectorului
de Intreruperi. Aceasta posibilitate vine de la faptul c se execut de fapt ISR
Reset i ea nu poate fi ntrerupt (I=0).
Pentru Programele cu ntreruperi, se recomand evitarea de a nregistra
secvene de program n zona Vectorului de ntreruperi. n acest scop avem
ne vine n ajutor directiva de preprocesare .ORG care permite poziionarea
secvenelor de cod la anumite adrese. Tot aceast directiv ne d
posibilitatea de a poziiona comanda de redirecionare ctre ISR direct la
locaia rezervat ntreruperii n cauz i deci nu va fi necesar de definit
ntreg vectorul de ntreruperi, ci se poate limita doar la nregistrarea ISR
utilizate.
n mod evident apelul ISR presupune o iniializare a stivei. Excepie sunt
Microcontrollerele fr RAM care au un mecanism specializat al stivei. Fr
iniializarea stivei va fi imposibil operarea cu ntreruperi, mai mult dect
att, Microcontrollerul va trece ntr-o stare nedefinit la prima situaie de
ntrerupere, diferite de RESET.
Lund n consideraie cele spuse n acest paragraf, un program cu
ntreruperi va avea urmtorele pri componente:
1.
Definirea vectorului de ntrerupere
2.
Programul principal nglobat n ntreruperea Reset
1.
Iniializarea stivei
2.
Iniializarea configuraiei microcontrollerului
3.
Pemiterea ntreruperilor
4.
Ciclul infinit care menine MCU sub control continuu numit i
parte de procesare

3.
Subrutine de prelucrare a intreruperilor
4.
Subrutine simple
Programzl cu ntreruperi va avea urmtorul aspect:
.include "m16def.inc" ; includem fisierul de adrese la periferice
; pentru ATmega16
.cseg
; indicam inceputul segmentului de cod
; 1. Definirea vectorului de intreruperi
.org 0
; Inregistrare la adresa rezervata ISR Reset
rjmp Reset
; Redirectionare catre ISR Reset
.org IntxAddr
; Inregistrare la adresa rezervata ISR Intx
rjmp Intx_ISR ; Redirectionare catre ISR_Intx
.org 100

; Inregistrarea secventelor de program


; incepand cu o adresa din afara
; Vectorului de intreruperi

; 2. Descrierea programului principal inglobat in ISR Reset


Reset:
init:
; punctul de intrare in program
; 2.1. Initializarea stivei
ldi R16, LOW(RAMEND) ;
out SPL, R16
ldi R16, HIGH(RAMEND)
out SPH, R16
; 2.2. Initializarea configuratiei MCU
cbi DDRD, PIND
sbi PORTD, PIND2
...
...
; 2.3. Permiterea Intreruperilor
sei
; 2.4. Bucla infinit care mentine MCU sub control
;
continuu numit si parte de procesare
mainLoop:
...
...
rjmp mainloop
reti
; Returnare din ISR reset
; in mod normal nu se va executa niciodata
; 3. Subrutine de prelucrare a Intreruperilor
Intx_ISR :
...
...
reti
; 4. Subrutine simple
sub:
...
...
ret

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 configurai si ca ca ieiri. 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
out

R16, 1<<INT0
GICR, R16

// incarcarea valorii 0b10000000 in 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:

//
//
//
//

rjmp INT0_ISR

trecere la adresa INT0addr in


memoria de program
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:
...
rjmp main_loop

// bucla infinita de cntrol

descrierea subrutine de prelucrare a intreruperii


INT0_ISR:
...
...
...
reti

// corpul subrutinei de prelucrare


// a intreruperii

Вам также может понравиться