Tema: Intreruperea Externa
Laborator Nr 4
Laborator Nr 4
Scopul:
Studiul principiului de utilizare a intreruperilor
externe.
Problema:
Utilizind intreruperea externa sa se depisteze care
taste, dintr-un set de opt taste, au fost apasate, Numarul tastei sa se
afisheze la un indicator pe 7 segmente
Notiuni Teoretice:
Intreruperea este stoparea
procesului normal de executie a programului pentru a executa o sarcina
prioritara. Dupa executarea sarcinii
prioritare executia revine la normal.
Intreruperea poate fi un proces/efect fizic intern sau extern. Codul
pentru executie a unei intreruperi se grupeaza intr-o
subrutina similara cu cea normala dar se termina cu reti nu cu ret.
L aparitia situatiei de intrerupere, sistemul e conceput in asa mod ca sa
cheme imediat subrutina intreruperii. Din punct de vedere electronic, sistemul
de intreruperi se bazeaza pe initierea cu o anumita valoare a lui PC,
specifica intreruperii date. Valoarea ce se incarca in PC este pozitia
rezervata in vectorul de intreruperi pentru intreruperea data.
ExtInt0, ExtInt1 este o
intrerupere externa, un modul periferic a microcontrolerului, si este capabil
sa execute intreruperea la schimbarea nivelului logic a semnalului la pin.
Lucrul cu modulul periferic a intreruperii externe se va efectua cu
anumiti registri din cei 64 de
registri I/O si anume: GICR, GIFR, MCUCR, MCUCSR
GICR- General Interrupt Control
Register
7 INT1- External Interrupt Request 1 Enabled
6 INT0- External Interrupt Request 0 Enabled
5 INT2- External Interrupt Request 2 Enabled
GIFR- General Interrupt Flag
Register
7 INTF1-External Interrupt Flag 1
6 INTF0- External Interrupt Flag 0
5 INTF2- External Interrupt Flag 2
MCUCR- MCU Control Register
3 ISC11- Interrupt Sense Control 1 Bit 1
2 ISC10- Interrupt Sense Control 1 Bit 0
1 ISC01- Interrupt Sense Control 0 Bit
1
0 ISC00- Interrupt Sense Control 0 Bit 0
MCUCSR- MCU Control and Status
Register
6 ISC2- Interrupt Sense Control 2
Realizarea problemei:
Pentru a soluţiona problema, alegem microprocesorul
Atmega16, setăm un port de tip input
şi unul de tip output. Pinii portului
Input îi conectăm la butoane, pentru a stopa zgomotele din exterior asupra MC,
portul de ieşire îl setăm cu zerouri, apoi la afisorul cu 7 segmente.
Intreruperea externa se afla la portul D, astfel conectam pinul intreruperii
externe, prin intermediul diodelor, la fiecare pin din port B. Astfel cum vedem
din schema la fiecare apasare a butoanelor, se va declansa intreruperea
externa. La declansarea intreruperii, functia de prelucrare va compara byte-ul
de la intrare in port B cu byte-ul stabilit pentru fiecare cifra, cind acestea
vor fi egale pe afisor va aparea cifra respectiva.
Schema electronică:
Listingul programului:
.include"m16def.inc" ;includem
fisierul unde sunt definiti registrii
.def temp = R16 ;vom folosi de acest
registru drept variabila intermediara
.def digit = R17
.cseg
.org 0
rjmp Reset
.org INT0addr
rjmp INT0_isr
.org 0x28
INT0_isr:
rcall Delay
;evitam zgomotul de la eliberarea butonului
in
temp, PinB
sbrs
temp, 0
ldi
digit, 0b00111111
sbrs
temp, 1
ldi
digit, 0b00000110
sbrs
temp, 2
ldi
digit, 0b01011011
sbrs
temp, 3
ldi
digit, 0b01001111
sbrs
temp, 4
ldi
digit, 0b01100110
sbrs
temp, 5
ldi
digit, 0b01101101
sbrs
temp, 6
ldi
digit, 0b01111101
sbrs temp, 7
ldi
digit, 0b00100111
out
portc, digit
rcall
Delay ;evitam zgomotele de la
tastarea butonului
reti
Reset:
; Regulam Stack-ul
ldi
temp, LOW(RAMEND) ;initializam
pointerul stivei
out
SPL, temp ;el
contine 2 registri - SPL si SPH
ldi
temp, HIGH(RAMEND) ;comandam
cu stiva din program
out
SPH, temp
ldi
temp, 0x00
out
ddrb, temp
out
ddrd, temp
out
portc, temp
ldi
temp, 0xFF
out
ddrc, temp
out
portb, temp
out
portd, temp
; Regulam
Setarile pentru intrerupere
ldi
temp, 0x40
out
GICR, temp
ldi
temp, 0x02
out
MCUCR, temp
clr
temp
out
MCUCSR, temp
ldi
temp, 0x40
out GIFR, temp
sei
Main: ;bucla
infinita
rjmp
Main
reti
Delay: ;Functia
de retinere de 256*3 tacturi
ldi
temp, 0xFF ;Incarcam
unitati in temp
Loop: dec temp ;decrementam
temp
cpi
temp, 0x00 ;comparam
continutul cu zero
brne
loop ;daca
nu este egalitate goto LOOP
ret ;reintoarcerea
in program.
Concluzii:
Efectuind lucrarea data de laborator, am
studiat intreruperile externe, si am observat ca cu ajutorul lor se poate de
realizat o multime de probleme si in plus utilizarea intreruperilor este destul
de simpla. Ea se poate configura de fiecare data diferit, adica independent
pentru orice problema, aceasta se face cu ajutorul registrilor GICR, GIFR, MCUCR,
MCUCSR. Controlerul Atmega16 are un
vector relativ mare de intreruperi, si mecaniasmul de utilizare este asemanator
la majoritatea, deci ne permite sa realizam multe probleme cu efort minim.