Sunteți pe pagina 1din 12

MINISTERUL EDUCATIEI AL REPUBLICII MOLDOVA

UNIVERSITATEA TEHNICA A MOLDOVEI


CATEDRA DE MICROELECTRONICA SI INGINERIE BIOMEDICALA

Raport
Lucrare de laborator Nr.4

La disciplina Microprocesoare
Tema : Programe cu intreruperi .Intreruperea
externa.Prelucrarea tablourilor

A efectuat : st. gr. MN 131,Ignat Ion


A verificat: lector asistent,Lazari Eugeniu

Chisinau 2015
Obiective:
O1 Definirea Vectorului de Intrerupere;
O2 Definirea subrutinei de prelucrare a intreruperii(ISR);
O3 Configurarea intreruperii externe;
O4 Prelucrarea iterative a tablourilor;

Definiia problemei:
Sa se realizeze o aplicatie pe MCU care va calcula si va afisa suma elementelor unui tablou de
10 elemente a cite 8biti.Calculul sumei si afisarea rezultatului se va realiza la fiecare a 11-a apasare
a butonului, iar primele zece apasari vor introduce pe rind in tablou numarul citit pe un PORTx al
microprocesorului completind astfel tot tabloul cu elemente noi de fiecare data.
In aces scop se va realiza o subrutina care va realiza doar suma elementelor tabloului si va fi
apelata din cadrul subrutinei de prelucrare a intreruperii externe care, la rindul sau,va realiza
completarea tabloului cu un element nou la fiecare apasare noua a butonului, dar si apelul
subrutinei de sumare atunci cind tabloul este completat.

Notiuni teoretice:
Intrerupere reprezinta suspendarea procesului normal de executie a programului pentru
rezolvarea unei probleme prioritare.
ntreruperea de regula este generata ca raspuns la un efect fizic intern sau extern al unui modul
periferic. Efectul fizic in sine va reprezenta sitatia de intrerupere sau exceptie care necesita o
tratare neintarziata. Asemenea situatii de intreruperi pot fi ca de exemplu: schimbarea nivelului
logic la un pin, sfarsitul unei perioade de timp sfarsitul unei operatii de transmisie sau receptie,
sfarsitul unei conversii etc.
Majoritatea modulelor periferice pot genera una sau mai multe intreruperi.
Mecanismul de chemare a subrutinei de prelucrare a intreruperii va fi initiat doar in cazul in care:
S-a detectat situatia de intrerupere reprezentata de flagul acesteia IF==1
Intreruperea de la sursa data este permisa IE ==1
Bitul de permisiune globala a intreruperilor este setat I==1 (in SREG)
mai simplu, subrutina va fi chemata cand relatia IF & IE & I va fi adevarata.
Deci vom spune ca vectorul de intreruperi reprezinta o zona de memorie de program
rezervata adreselor de referinta a subrutinelor de prelucrare a intreruperilor.
Vectorul de intreruperi, pentru arhitectura AVR, este localizat la inceputul memoriei de
program, incepand cu adresa $0000. Pentru fiecare subrutina de prelucrare a intreruperilor de la
o anumita sursa de intrerupere ii este rezervat un spatiu de 2
comenzi. In cazul in care doua sau mai multe intreruperi intervin
concomitent, va fi prelucrata intreruperea cu prioritatea cea mai
inalta. Prioritate mai inalta vor avea intreruperile adresele de
referinta a carora in Vectorul de Intreruperi sunt mai mici.

Figura 1 Reprezentarea schematica a intreruperii


Deci mecanismul de chemare a unei ISR va fi realizat in mai multe etape.
La detectarea situatiei de intrerupere se va evalua o relatie de tip IF & IE & I. Daca
aceasta relatie va fi adevarata se va declansa mecanismul de apel hardware al ISR. In cazul in
care Intreruperea a fost detectata in timpul executiei unei comenzi, se va astepta pana terminarea
executiei comenzii curente, dupa care se va declansa mecanismul de chemare a ISR.
Se va executa apelul hardware al ISR echivalent cu o comanda de forma CALL
ISR_Addr unde ISR_Addr va fi adresa de referinta din Vectorul de intreruperi pentru
Intreruperea data. In asa mod se va realiza un salt neconditionat la adresa ISR_Addr, localizata in
vectorul de intreruperi, insotit de o salvare a Contorului de Program (PC) in stiva (Stack), PC+1-
>Stack.
Concomitent cu saltul la vectorul de intreruperi se va reseta bitul global de permisiune a
intreruperilor, I = 0, un echivalent a comenzii CLI, fapt ce va interzice intreruperea executiei ISR
de o alta ISR detectate in acest timp.
Executia secventei de instructiuni din cadrul ISR. Pentru ISR sunt valide recomandarile
pentru subrutinele obisnuite referitor la pastrarea starii globale a registrilor de uz general utilizati
in cadrul ISR, ce se realizeaza prin salvarea lor in stiva la inceputul subrutinei si restabilirea
acestora la inainte de returnare din subrutina.
Returnarea din ISR realizata cu comanda RETI. Aceasta comanda este echivalenta cu
comanda de returnare din subrutina obisnuita RET, cu exceptia ca concomitent se va seta bitul de
permisiune globala a intreruperilor, I = 1. Putem spune ca RETI este echivalent cu RET+SEI.
Deci, returnarea din ISR va implica restabilirea adresei Contorului de Program din stiva, care
fusese salvat in procesul de chemare a ISR, PC->Stack si executia programului va continua exact
din locul unde a fost suspendat de catre intrerupere.
Principiul ca o ISR nu poate fi intrerupta de o alta Intrerupere se datoreaza faptului ca pe
durata executiei acesteia bitul global de permisiune al intreruperilor I este resetat (I=0). Insa acesta
regula poate fi anulata odata cu setarea in cadrul ISR a bitului de permisiune a Intreruperilor cu
comanda SEI (I=1). Aceasta actiune va permite ca o ISR sa fie intrerupta de o alta intrerupere.
Luand in consideratie cele spuse in acest paragraf, un program cu intreruperi va avea
urmatorele parti component
1. Definirea vectorului de intrerupere
2. Programul principal inglobat in intreruperea Reset
1. Initializarea stivei
2. Initializarea configuratiei microcontrollerului
3. Pemiterea intreruperilor
4. Ciclul infinit care mentine MCU sub control continuu numit si parte de
procesare
3. Subrutine de prelucrare a intreruperilor
4. Subrutine simple
Un tablou este o succesiune de variabile accesibile printrun nume unic. In limbajul ASM
nu putem vorbi despre un tip sepecial de date. Oricare structura de date simpla sau complexa este
reprezentata de o zona de memorie alocata acestei structuri. Acest lucru este valid si pentru
tablouri, adica se va rezerva o zona de memorie accesibila prin numele de regerinta a lui.
exemplu
.EQU TAB_SIZE = 10 ; declaratie constanta
.DSEG ; tablourile vor fi declarate in
; segmentul de date
tab: .byte TAB_SIZE ; utilizare constanta in
; declaratie tablou
Din acest exemplu nu putem spune cate locatii are tabloul, insa presupunand ca elementele
tabloului sunt de tip byte adica ocupa in singur byte in memorie,vom afirma ca tab este un tablou
de 10 elemente de tip byte.

Figura 2 Reprezentarea primului element al tabloului


Metoda de mai sus este una de acces direct la memorie, care este utila in cazul in care
avem un nevoie de un acces la un element fix in memorie. Insa este inacceptabila cand avem
neboie de un acces mai flexibil, cum ar fi iterarea printr-un tablou. Intrun acces care presupune
terarea prin tablou sau un acces dinamic la elementele tabloului este mai comed de utilizat
accesul indirect la memorie, care presupune ca adresa de acces la locatia de memorie dorita se
afla
intrun registru indirect.
Pentru acces indirect avem urmtoarele comenzi:
a) ncrcare indirect b) stocare indirect
ld R, X st X, R
ld R, Y st Y, R
ld R, Z st Z, R
inca o data mentionam ca in caz de acces la o locaie din RAM unul dintre registrii X,Y,Z va
trebui sa contina adresa locatiei date. Respectiv va trebui sa efectum o initializare a registrului
indirect utilizat inainte de a accesa locatia dorita.
.DSEG
a: .byte 1
.CSEG // a X
ldi XL, LOW(a)
ldi XH, HIGH(a)
ld R16, X

Acces indirect relativ la memorie (cu deplasament)


Acest tip de acces permite accesul la memorie cu un deplasament fix q. Deoarece q este
reprezentat n comanda de 6 bii respectiv accesul indirect relativ este posibil ntro zon de 64 de
adrese din apropierea registrului.
ldd R, Y+q std Y+q, R
ldd R, Z+q std Z+q, R
Deoarece alocarea memoriei pentru variabile se face la o adresa concreta, constanta, diferenta
dintre adrese este la fel una constanta, care poate servi drept deplasament pentru accesul celei de
a doua variabile, in cazul cand registrul indirect indica catre prima.
Exemplu:
.dseg
a: .byte 1
b: .byte 1
.cseg
... //a = b
ldi YH, HIGH(a)
ldi YL, LOW(a)
ld R16, Y
std Y+(b-a), R16 ; q=(b-a)
Acces indirect iterativ
Accesul indirect, presupunand ca adresa de acces se afla intrun registru, permite accesul
dinamic intro zona de memorie, modificand registrul indirect, de fapt modificam addresa de
acces la memorie.
De foarte multe ori modificarea adresei de acces este una iterativa, permitand parcurgerea
tablourilor directa si inversa.
Acces indirect cu pre-decrementare

Presupune c regitrul de acces indirect de acces X,Y,Z este decrementat nainte de a accesa o
locaie
ld R, -X st -X, R
ld R, -Y st -Y, R
ld R, -Z st -Z, R
Un asemenea acces este utilizat la prelucrri iterative a unei zone de memorie in directie inversa.

Accesul indirect cu post-incrementare


Presupune accesul la locaia dorit urmat de incrementare a registrului de acces indirect.
Acest tip de acces este utilizat n operaii iterative de prelucrare a memoriei in directia de la
primul element spre cel ultim.

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
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
Mersul lucrarii:
1) Formarea schema bloc de functionare a programului.

Start

.EQU TAB_size = 10
TAB: .byte TAB_size
counter: .byte 1
res: .byte 2

init:
r16=TAB_size
counter=r16
DDRA=0b00000000
PORTA=0b11111111
DDRB=0b11111111
PORTB=0b00000000
DDRC=0b11111111
PORTC=0b00000000
DDRD=0b00000000
PORTD=0b11111111

INT_INTR:
R16=(1<<ISC01), MCUCR=R16
R16=(1<<INT0), GICR=R16,
R16(1<<INTF0), GIFR=R16

INIT_STACK: spl,R25= low(ramend)


sph,R25= high(ramend)

SET_I:
SEI
Main_loop
r16=0xFF

r16--

F R16!=0 T

PORTD,0 = 1

r16=0xFF

r16--

F R16!=0 T

Fig. 3 Schema bloc program

PORTD,1 = 1
INT0_ISR

R16 = counter

F T
R16!=TAB_siz
e
YL=LOW(TAB)
YH=HIGH(TAB)

F R16!=0 T

r1=TAB_size,counter=r16
R17=PINA
Push r17, r18,r19,r20,
Y+=R17
r21, YL=LOW(TAB)
r16
YH=HIGH(TAB)
counter=r16
call SUM_ELEM
pop r21,r20,r19,r18,r17
lds r19,res out
PORTB,r19
lds r20,res+1
out PORTC,r20

Figura 4 Schema bloc INT0_ISR


reti
SUM_ELEM

r19,r20,r21=0
r18=TAB_size
L3:
r17=Y+
r19=r19+r17
r20=r20+r21+carry
r18--

F T
R18!=0

res=r19
Res+1=r20

Figura 5 Schema bloc SUM_ELEM


ret
3) Proiectam schema electrica pentru simulare in PROTEUS

Figura 6 Shema electrica in proteus

4) Scriem codul programului


.include "m32def.inc"
.EQU TAB_size = 10 ;declaram tabloul
.dseg
TAB: .byte TAB_size ; initiarea tabloului
counter: .byte 1
res: .byte 2
.CSEG
.org 0
RJMP RESET ;salt la subrutina pentru Reset
.org INT0addr
RJMP INT0_ISR ;salt la subrutina de intrerupere 0
.org INT1addr
RJMP INT1_ISR ;salt la subrutina de intrerupere 1
.org INT2addr
RJMP INT2_ISR
.org OC2addr ; Timer/Counter2 Compare Match
rjmp OC2_ISR
.org OVF2addr ; Timer/Counter2 Overflow
rjmp OVF2_ISR
.org ICP1addr; Timer/Counter1 Capture Event
rjmp ICP1_ISR
.org OC1Aaddr; Timer/Counter1 Compare Match A
rjmp OC1A_ISR
.org OC1Baddr ; Timer/Counter1 Compare Match B
rjmp OC1B_ISR
.org OVF1addr ; Timer/Counter1 Overflow
rjmp OVF1_ISR
.org OC0addr ; Timer/Counter0 Compare Match
rjmp OC0_ISR
.org OVF0addr ; Timer/Counter0 Overflow
rjmp OVF_ISR
.org SPIaddr ; Serial Transfer Complete
rjmp SPI_ISR
.org URXCaddr ; USART, Rx Complete
rjmp URXC_ISR
.org UDREaddr ; USART Data Register Empty
rjmp UDRE_ISR
.org UTXCaddr ; USART, Tx Complete
rjmp UTXC_ISR
.org ADCCaddr ; ADC Conversion Complete
rjmp ADCC_ISR
.org ERDYaddr ; EEPROM Ready
rjmp ERDY_ISR
.org ACIaddr ; Analog Comparator
rjmp ACI_ISR
.org TWIaddr ; 2-wire Serial Interface
rjmp TWI_ISR
.org SPMRaddr ; Store Program Memory Ready
rjmp SPMR_ISR

.org 100 ;programul incepe de la adresa aceasta


RESET:
INIT:
ldi r16,TAB_size
sts counter,r16 ;atribuim lui counter valoarea Tab_size

ldi R16,0b00000000 ;Initializare porturi


out DDRA,R16
ldi R16,0b11111111
out PORTA,R16
ldi R16,0b11111111
out DDRB,R16
ldi R16,0b00000000
out PORTB,R16
ldi R16,0b11111111
out DDRC,R16
ldi R16,0b00000000
out PORTC,R16
ldi R16,0b10000000
out DDRD,R16
ldi R16,0b01111111
out PORTD,R16
INT_INTR: ;initializarea configuratiei pentru MCUCR , GIRC
si GIFR
LDI R16, (1<<ISC01)
OUT MCUCR, R16
LDI R16, (1<<INT0)
OUT GICR, R16
LDI R16, (1<<INTF0)
OUT GIFR, R16
INIT_STACK: ;initializarea stackului
ldi R25, low(ramend)
out spl,R25
ldi R25, high(ramend)
out sph,R25
SET_I:
SEI ;setarea bitului de intrerupere
main_loop: ;atita timp cit suntem in main_loop ledul v-a clipi
ldi r16,0xFF ;atribuim 255
delay:
dec r16
brne delay ;salt daca nu este egalitate
sbi PORTD,7
ldi r16,0xFF
delay1:
dec r16
brne delay1
cbi PORTD,7
rjmp main_loop
RET

INT0_ISR:
lds r16,counter ;atribuim lui r16 valoarea lui Tab_Size
CPI r16,TAB_size
brne L0
ldi YL, LOW(TAB) ;Inscriem in Y adresa primei valori al tabloului
ldi YH, HIGH(TAB)
L0:
CPI r16,0
brne L1 ;daca counterul diferit de 0 atunci sare la L1
ldi r16,TAB_size ;Initializam registrului r16 cu numarul de elemente
in tablou
sts counter,r16 ;inscrim in variabila counter valoarea counterului
;Securizare registrilor
push r17
push r18
push r19
push r20
push r21
ldi YL, LOW(TAB) ; inceputului tabloului
ldi YH, HIGH(TAB) ; sfirsitului de tablou
call SUM_ELEM ; call subrutina de Sumare
pop r21
pop r20
pop r19
pop r18
pop r17
lds r19,res ;luam din res valoarea Low a rezultatului
out PORTB,r19 ;in portul B afisam valoarea Low
lds r20,res+1 ;valoarea high incarcam in r20
out PORTC,r20 ;afisam in port C valoarea high
reti
L1:
in R17,PINA ;incarcam datele din Port A in R17
st Y+, R17 ;datele din R17 le introducem in tablou
dec r16
sts counter,r16 ;inscrim in variabila counter valoarea decrementata
reti
SUM_ELEM: ;subrutina de sumare elementelor
clr r19 ;curatam registrii de lucru
clr r20
clr r21
ldi r18,TAB_size ;lui R18 atribuim valoarea tabloului
L3:
ld r17,Y+ ;Selectarea datelor din tablou
add r19,r17 ;Adunarea elementului la suma totala (baitul low)
adc r20,r21 ;Adunarea elementului la suma totala (baitul high)
dec r18 ;Decrementarea counterului(r18)
brne L3 ;Daca counterul este 0, atunci salt la L1
sts res,r19 ;incarcarea in r19 valoarea low a rezultatului
sts res+1,r20 ;incarcarea in r20 valoarea high a rezultatului
ret

INT1_ISR:
reti
INT2_ISR:
reti
OC2_ISR:
reti
OVF2_ISR:
reti
ICP1_ISR:
reti
OC1A_ISR:
reti
OC1B_ISR:
reti
OVF1_ISR:
reti
OC0_ISR:
reti
OVF_ISR:
reti
SPI_ISR:
reti
URXC_ISR:
reti
UDRE_ISR:
reti
UTXC_ISR:
reti
ADCC_ISR:
reti
ERDY_ISR:
reti
ACI_ISR:
reti
TWI_ISR:
reti
SPMR_ISR:

5.Rezultatele obtinute

Figura 7. Introducem elementele tabloului


Figura 7. Obtinem rezultatele: 2+2+2+2+2+2+2+2+2+2 =14 ( in hexagonal)

Concluzie:
Dupa realizarea lucrarii de laborator am insusit folosirea si utilizarea intreruperilor.Astfel incit
am ajuns la concluzia ca intreruperea are acelasi principiu de lucru ca subrutina, doar ca este
mai prioritara si in timpul efectuarii intreruperii programul se intrerupe si se indeplineste
intreruperea (inscrierea elementelor in tablou , si suma lor) In cazul cind avem o intrerupere experna
alte intreruperi sunt interzise deoareace are loc resetarea bitului global de permesiune a inreruperilor I=0.
In timpul laboratorului mai mari dificultati au aparut in declararea si lucrul cu elementele tabloului decit
cu intreruperile.

Bibliografie:
http://www.microlab.club/

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