Documente Academic
Documente Profesional
Documente Cultură
Raport
Lucrarea de laborator 4
Disciplina: Microprocesoare
Tema: Programe cu ntreruperi. ntreruperea extern.
Prelucrarea tablourilor
A verificat:
lector asistent
Lazari Eugeniu
Chiinu 2016
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 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:
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
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
...
Activareaglobalaaintreruperilor:
INT0_ISR:
...
... // corpul subrutinei de prelucrare
// a intreruperii
...
reti
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.
n acest scop se va realiza o subrutin care va face doar suma elementelor tabloului i
va fi apelat din cadrul subrutinei de prelucrare a nntreruperii externe care, la rndul
su, se va realiza completarea tabloului cu un element nou la fiecare apsare a
butonului, dar i apelul subrutinei de sumare atunci cnd tabloul este completat.
3. Mersul lucrrii:
Codul surs:
.include "m32def.inc"
.equ INT_T = 1
.equ ARRAY_SIZE = 10
.dseg
array: .byte INT_T*ARRAY_SIZE
.cseg
.org 0
jmp RESET
.org INT0ADDR
jmp INT0_ISR
.org 100
; initializarea porturilor
PortInit:
LDI Temp, 0b01000000
OUT DDRD, Temp
LDI Temp, 0b10111111
OUT PORTD, Temp
MainLoop:
; conditia si schimbarea LED-ului pe PIND6
SBIS PORTD, 6
rjmp IfLEDOf
rjmp IfLEDOn
IfLEDOn:
CBI PORTD, 6
call Delay
IfLEDOf:
SBI PORTD, 6
call Delay
; salvam registrii in stiva
SaveRegsToStack:
PUSH Temp
PUSH C
PUSH SumLow
PUSH SumHigh
PUSH Count
; afisam rezultatul sumei pe PORTC si PORTB
WriteData:
OUT PORTA, SumHigh
OUT PORTB, SumLow
; recuperam registrii din stiva
LoadRegsFromStack:
POP Count
POP SumHigh
POP SumLow
POP C
POP Temp
EndMainLoop:
rjmp MainLoop
; functia intreruperii
INT0_ISR:
; verificam daca tabloul e completat, daca da, salt la subrutina de sumare
CPI Count, ARRAY_SIZE
BREQ ArraySum
; citirea valorilor fiecarui element din tablou
In C, PINC
ST Y+, C
; incrementam counter-ul pentru verificare
INC Count
; facem rezultatul 0 ct timp este completat tabelul
LDI SumLow, 0x00
LDI SumHigh, 0x00
reti
; subrutina de sumare
ArraySum:
; stergem flagul de transport
CLC
; ciclul de sumare
Summ:
; verificam daca s-au citit toate elementele
CPI Count, 0x00
BREQ EndSumm
; citeste elementele unul cate unul
LD Temp, -Y
; sumarea valorilor, curatim registrul Temp, pastram doar flagul
; de transport
ADD SumLow, Temp
LDI Temp, 0x00
ADC SumHigh, Temp
; decrementam counter-ul pentru a reveni la 0
DEC Count
rjmp Summ
EndSumm:
ret
Dup executarea programului dat, softul cu ajutorul cruia am compilat nu a dat erori.