Академический Документы
Профессиональный Документы
Культура Документы
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.
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.
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
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:
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
R16, 1<<INT0
GICR, R16
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
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
...
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