Sunteți pe pagina 1din 7

Ministerul Educaţiei și Cercetării al Republicii Moldova

Universitatea Tehnică a Moldovei

Departamentul Informatică și Ingineria Sistemelor

PSM

Lucrare de laborator nr.2


Tema : Gestionarea întreruperilor a microcontrolerilor din seria AVR.

St. gr. Preguza Cristian, CR-201

A verificat- I.Calmîcov

2023
Scopul lucrării: studierea mecanizmului de întreruperi si utilizarea lor.
Mersul lucrarii:
1. Faceţi cunoştinţă cu controlerul de intreruperi şi modul de programare a inrteruperilor a
microcontrolerului ATMega-32.
2. Studiaţi setul de regiştri de control prin care sunt gestionate întreruperile.
3. Elaboraţi un program conform sarcinii din tabel.
4. Compilaţi programul elaborat şi verificaţi corectitudinea funcţionării utilizînd simulatorul (AVR
Studio / Proteus).
Sarcina:
Elaboraţi un program, care utilizînd întreruperile externe şi/sau întreruperile de la Timere efectuează
următoarele operaţii conform tabelului. Programul trebuie format din două sau mai multe parti parţi
independente:

∙ programul principal, care va iniţializa toate modulele, variabilele, stiva, şi va indeplini un ciclu
infinit în care va afişa rezultatele masurarii pe indicatoare utilizînd porturile de intrare/iesire;

∙ subrutinele de prelucrare a întreruperilor – în care se vor efectua toate măsurarile conform


sarcinii din tabelului.

Utilizînd Timer/Counter0, măsuraţi numărul de impulsuri aplicate la intrarea T0, şi cînd acest număr
depăşeşte 10000, negaţi starea pinului la ieşirea PA5

Codul Programului:
.include "m32def.inc" ; Includem fisirul cu definitiile de registri

; Redefinirea registrilor
.def tmpH = r16
.def tmpL = r17
.def aL = r18
.def aH = r19

.def flags = r2

.cseg ; Segmentul de cod


.org 0x0000
rjmp Reset ; Salt neconditionat la adresa Reset
.org INT0addr ; External Interrupt0 Vector Address
reti
.org INT1addr ; External Interrupt1 Vector Address
rjmp INT1_ISR

.org INT2addr ; External Interrupt2 Vector Address


reti
.org OC2addr ; Output Compare2 Interrupt Vector Address
reti
.org OVF2addr ; Overflow2 Interrupt Vector Address
reti
.org ICP1addr ; Input Capture1 Interrupt Vector Address
reti
.org OC1Aaddr ; Output Compare1A Interrupt Vector Address
reti
.org OC1Baddr ; Output Compare1B Interrupt Vector Address
reti
.org OVF1addr ; Overflow1 Interrupt Vector Address
reti
.org OC0addr ; Output Compare0 Interrupt Vector Address
reti
.org OVF0addr ; Overflow0 Interrupt Vector Address
reti
.org SPIaddr ; SPI Interrupt Vector Address
reti
.org URXCaddr ; USART Receive Complete Interrupt Vector Address
reti
.org UDREaddr ; USART Data Register Empty Interrupt Vector Address
reti
.org UTXCaddr ; USART Transmit Complete Interrupt Vector Address
reti
.org ADCCaddr ; ADC Interrupt Vector Address
reti
.org ERDYaddr ; EEPROM Interrupt Vector Address
reti
.org ACIaddr ; Analog Comparator Interrupt Vector Address
reti
.org TWIaddr ; IRQ vector address for Two-Wire Interface
reti
.org SPMRaddr ; Store Program Memory Ready Interrupt Vector Address
reti

;---------------------------------------------------------------
INT1_ISR: ; Subrutina de prelucrare a intreruperii INT1
in flags, SREG ; Memorizam temporar flagurile
sbic PIND, PD3 ; Verificam starea liniei PD3
rjmp highLvl ; Daca PD3 este "1", saltam la highLvl

; Setam durata impulsurilor la 25%


ldi tmpL, 64 ; Setam OCR0 pentru o perioada de 25 µs
out OCR0, tmpL

; Verificam daca numarul de impulsuri depaseste 10000


ldi tmpH, high(10000)
ldi tmpL, low(10000)
cpi aH, tmpH
cpc aL, tmpL
brlo exitINT1 ; Daca numarul de impulsuri este mai mic sau egal cu 10000,
iesim din subrutina

; Negați starea pinului PA5


cbi PORTA, PA5

rjmp exitINT1

highLvl: ; Setam durata impulsurilor la 75%


ldi tmpL, 192 ; Setam OCR0 pentru o perioada de 75 µs
out OCR0, tmpL

exitINT1:
out SREG, flags ; Restabilim flagurile
reti
; Programul principal
;--------------------------------------------------------------
RESET:
ldi tmpL, low(RAMEND) ; Initializam stiva
out SPL, tmpL
ldi tmpH, high(RAMEND)
out SPH, tmpH

clr tmpL ; Resetam tmpl


out DDRA, tmpL ; Setam ca intrare PORTA
out DDRC, tmpL ; Setam ca intrare PORTC
out DDRD, tmpL ; Setam ca intrare PORTD

ser tmpL
out PORTA, tmpL ; Activam rezistoarele trage-sus
out PORTC, tmpL ; Activam rezistoarele trage-sus

ldi tmpL, ~(1 << PD3)


out PORTD, tmpL
ldi tmpL, (1 << PB3)
out DDRB, tmpL

ldi tmpL, ~(1 << PB3)


out PORTB, tmpL ; Activam rezistoarele trage-sus

; Setam intreruperile externe pentru ambele fronturi la INT0


ldi tmpL, (0 << ISC11) | (1 << ISC10)
out MCUCR, tmpL

ldi tmpL, (1 << INT1) ; 10000000


out GICR, tmpL

ldi tmpL, (1 << INTF1)


out GIFR, tmpL

ldi tmpL, 64 ; Setam OCR0 pentru o perioada de 25 µs


out OCR0, tmpL
ldi tmpL, (1 << WGM01) | (1 << WGM00) | (1 << COM01) | (0 << COM00) | (0
<< CS02) | (0 << CS01) | (1 << CS00)
out TCCR0, tmpL

sei

MAIN: ; Programul principal


nop
nop
nop

rjmp MAIN
Rezultatul programului:
Concluzii:
In aceasta lucrare de laborator am facut cunostiinta cu gestionarea intreruperiilor a
microcontrolerilot din seria AVR
A fost elaborate programul si schema in proteus in urma careia sa verificat corectitudinea
conectariilor si a codului.

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