Sunteți pe pagina 1din 11

Universitatea Tehnic a Moldovei

Facultatea Calculatoare, Informatic i Microelectronica


Catedra Microlectronica i Ingineria Biomedicala

Raport
Lucrarea de laborator 4
Disciplina: Microprocesoare
Tema: Programe cu ntreruperi. ntreruperea extern.
Prelucrarea tablourilor

A efectuat: st. gr.


MN-141
Gurduza Petru

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:

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

Activareaglobalaaintreruperilor:

sei // Activarea globala a intreruperilor


Buclainfinitadecontrolr:

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

II. Partea practic:


1.Obiecivele lucrrii:
1) Definirea vectorului de ntrerupere;
2) Definirea subrutinei de prelucrare a ntreruperii;
3) Configurarea ntreruperii externe;
4) Prelucrarea iterativ a tablourilor.
2.Scopul lucrrii:
1. S se realizeze o aplicaie pe MCU care va calcula i va afia suma elementelor unui
tablou de 10 elemente a cte 8 bii. Calculul sumei i afiarea rezultatului se va realiza
la fiecare a 11-a apsare a butonului, iar primele 10 apsri vor introduce pe rnd n
tablou numrul citit de pe PORTx al MCU, completnd astfel tot tabloul cu elemente
noi de fiecare dat.

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

.def Temp = R16


.def Count = R17
.def SumLow = R18
.def SumHigh = R19 Fig. 4.1 Schema
.def C = R20
bloc
RESET:
; initializarea stivei
Init:
StackInit:
LDI Temp, LOW(RAMEND)
OUT SPL, Temp
LDI Temp, HIGH(RAMEND)
OUT SPH, Temp

; initializarea porturilor
PortInit:
LDI Temp, 0b01000000
OUT DDRD, Temp
LDI Temp, 0b10111111
OUT PORTD, Temp

LDI Temp, 0xFF


OUT PORTC,Temp
OUT DDRA, Temp
OUT DDRB, Temp
LDI Temp, 0x00
OUT DDRC, Temp
OUT PORTA,Temp
OUT PORTb,TeMP
; initierea tabelului si setarea intreruperilor setand INT0 in
;GICR si ISC01, ISC00 in MCURC
ArrayInit:
LDI YH, HIGH(array)
LDI YL, LOW(array)
; bitul 6 in GICR este INT0
LDI Temp, 0b01000000
OUT GICR, Temp
; bitul 1 in MCUCR este ISC01 si bitul 0 e ISC00 (trebuie s fie 0 pentru
; falling front
LDI Temp, 0b00000010
OUT MCUCR, Temp
; setarea globala a intreruperilor
SEI
EndInit:

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

; subrutina pentru delay (pentru LED)


Delay:
LDI Temp, 0xFF
DelayCycle:
CPI Temp, 0x00
BREQ EndDelayCycle
DEC Temp
NOP
rjmp DelayCycle
ret

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

4. Schema circuitului n Proteus:


Fig. 4.2 Shema circuitului n
proteus

Fig. 4.2 Schema circuitului n


Proteus

Fig. 4.3 Schema circuitului cu datele iniiale introduse


Fig. 4.4 Schema circuitului n proteus dup a 11-a apsare a
butonului
FF+FF+FF+FF+FF+FF+FF+FF+FF+FF=9F6
Concluzie:
Efectund lucrarea dat de laborator am cptat cunotine n lucrul cu ntreruperile
externe. Asemenea am efectuat o subrutin care efectueaz adunarea elementelor tabloului
aflat n spaiul de memorie SRAM al microcontroller-ului. La ndeplinirea acestei sarcini am
depistat o serie de probleme n codul subrutinei, ns, pe parcurs i cu ajutor suplimentar am
efectuat dup cerin. Am deprins i abiliti de lucru cu memoria.

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