Sunteți pe pagina 1din 6

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

Universitatea Tehnică a Moldovei

Departamentul Informatică și Ingineria Sistemelor

PSM

Lucrare de laborator nr.3


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 fisierul cu definitiile pentru procesorul


ATmega32.cseg ; Segmentul de cod.org 0x0000rjmp Reset ; Salt neconditionat la
adresa de reset.org INT0addr ; Adresa vectorului de intrerupere pentru External
Interrupt 0reti.org INT1addr ; Adresa vectorului de intrerupere pentru External
Interrupt 1reti.org OC2addr ; Adresa vectorului de intrerupere pentru Output
Compare 2reti.org OVF2addr ; Adresa vectorului de intrerupere pentru Overflow
2reti.org ICP1addr ; Adresa vectorului de intrerupere pentru Input Capture
1reti.org OC1Aaddr ; Adresa vectorului de intrerupere pentru Output Compare
1Areti.org OC1Baddr ; Adresa vectorului de intrerupere pentru Output Compare
1Breti.org OVF1addr ; Adresa vectorului de intrerupere pentru Overflow
1reti.org OC0addr ; Adresa vectorului de intrerupere pentru Output Compare
0reti.org OVF0addr ; Adresa vectorului de intrerupere pentru Overflow 0reti.org
SPIaddr ; Adresa vectorului de intrerupere pentru SPIreti.org URXCaddr ; Adresa
vectorului de intrerupere pentru USART Receive Completereti.org UDREaddr ;
Adresa vectorului de intrerupere pentru USART Data Register Emptyreti.org
UTXCaddr ; Adresa vectorului de intrerupere pentru USART Transmit
Completereti.org ADCCaddr ; Adresa vectorului de intrerupere pentru
ADCreti.org ERDYaddr ; Adresa vectorului de intrerupere pentru
EEPROMreti.org ACIaddr ; Adresa vectorului de intrerupere pentru Analog
Comparatorreti.org TWIaddr ; Adresa vectorului de intrerupere pentru Two-
Wire Interfacereti.org SPMRaddr ; Adresa vectorului de intrerupere pentru
Store Program Memory Readyreti; Variabile globale.def tmpL = r16 ; Definim
registrul temporar tmpLRESET:ldi tmpL, low(RAMEND) ; Initializam stivaout SPL,
tmpLldi tmpL, high(RAMEND)out SPH, tmpL
ldi tmpL, 0xFF ; Setam toate piniile PORTA ca intrari
out DDRA, tmpL

ldi tmpL, (1 << OCIE0) ; Activam intreruperile de comparare pentru


Timer/Counter0
out TIMSK, tmpL

ldi tmpL, (1 << TOIE0) ; Activam intreruperile de depasire pentru


Timer/Counter0
out TIMSK, tmpL

ldi tmpL, (1 << WGM01) | (1 << CS02) | (1 << CS00) ; Setam modul de operare
CTC pentru Timer/Counter0 si prescaler-ul la 1024
out TCCR0, tmpL

ldi tmpL, 63 ; Setam valoarea OCR0 pentru o perioada de 50 µs (prescaler 1024)


out OCR0, tmpL

ldi tmpL, (1 << OC0) ; Setam pinul OC0 (PD7) ca iesire


out DDRD, tmpL

ldi tmpL, (1 << PD7) ; Setam starea initiala a pinului OC0 ca fiind activ
out PORTD, tmpL

sei ; Activam intreruperile globale


MAIN:rjmp MAIN ; Bucleaza la infinit; Subrutina de intrerupere pentru
comparare Timer/Counter0COMPARE_ISR:sbis PIND, PD2 ; Verifica starea
pinului PD2 (intrarea T0)rjmp COMPARE_ISR_EXIT ; Daca pinul PD2 este inalta,
iesim din subrutina
inc tmpL ; Incrementam valoarea din registrul temporar tmpL

cpi tmpL, 100 ; Comparam valoarea din tmpL cu 100


breq COMPARE_ISR_NEGATE ; Daca valoarea este 100, negam starea pinului
OC0
.include "m32def.inc" ; Includem fisierul cu definitiile pentru procesorul
ATmega32.cseg ; Segmentul de cod.org 0x0000rjmp Reset ; Salt neconditionat la
adresa de reset.org INT0addr ; Adresa vectorului de intrerupere pentru External
Interrupt 0reti.org INT1addr ; Adresa vectorului de intrerupere pentru External
Interrupt 1reti.org OC2addr ; Adresa vectorului de intrerupere pentru Output
Compare 2reti.org OVF2addr ; Adresa vectorului de intrerupere pentru Overflow
2reti.org ICP1addr ; Adresa vectorului de intrerupere pentru Input Capture
1reti.org OC1Aaddr ; Adresa vectorului de intrerupere pentru Output Compare
1Areti.org OC1Baddr ; Adresa vectorului de intrerupere pentru Output Compare
1Breti.org OVF1addr ; Adresa vectorului de intrerupere pentru Overflow
1reti.org OC0addr ; Adresa vectorului de intrerupere pentru Output Compare
0reti.org OVF0addr ; Adresa vectorului de intrerupere pentru Overflow 0reti.org
SPIaddr ; Adresa vectorului de intrerupere pentru SPIreti.org URXCaddr ; Adresa
vectorului de intrerupere pentru USART Receive Completereti.org UDREaddr ;
Adresa vectorului de intrerupere pentru USART Data Register Emptyreti.org
UTXCaddr ; Adresa vectorului de intrerupere pentru USART Transmit
Completereti.org ADCCaddr ; Adresa vectorului de intrerupere pentru
ADCreti.org ERDYaddr ; Adresa vectorului de intrerupere pentru
EEPROMreti.org ACIaddr ; Adresa vectorului de intrerupere pentru Analog
Comparatorreti.org TWIaddr ; Adresa vectorului de intrerupere pentru Two-
Wire Interfacereti.org SPMRaddr ; Adresa vectorului de intrerupere pentru
Store Program Memory Readyreti; Variabile globale.def tmpL = r16 ; Definim
registrul temporar tmpLRESET:ldi tmpL, low(RAMEND) ; Initializam stivaout SPL,
tmpLldi tmpL, high(RAMEND)out SPH, tmpLscssCopy codeldi tmpL, 0xFF ; Setam
toate piniile PORTA ca intrariout DDRA, tmpLldi tmpL, (1 << OCIE0) ; Activam
intreruperile de comparare pentru Timer/Counter0out TIMSK, tmpLldi tmpL, (1
<< TOIE0) ; Activam intreruperile de depasire pentru Timer/Counter0out TIMSK,
tmpLldi tmpL, (1 << WGM01) | (1 << CS02) | (1 << CS00) ; Setam modul de
operare CTC pentru Timer/Counter0 si prescaler-ul la 1024out TCCR0, tmpLldi
tmpL, 63 ; Setam valoarea OCR0 pentru o perioada de 50 µs (prescaler 1024)out
OCR0, tmpLldi tmpL, (1 << OC0) ; Setam pinul OC0 (PD7) ca iesireout DDRD,
tmpLldi tmpL, (1 << PD7) ; Setam starea initiala a pinului OC0 ca fiind activout
PORTD, tmpLsei ; Activam intreruperile globaleMAIN:rjmp MAIN ; Bucleaza la
infinit; Subrutina de intrerupere pentru comparare
Timer/Counter0COMPARE_ISR:sbis PIND, PD2 ; Verifica starea pinului PD2
(intrarea T0)rjmp COMPARE_ISR_EXIT ; Daca pinul PD2 este inalta, iesim din
subrutinaCopy codeinc tmpL ; Incrementam valoarea din registrul temporar
tmpLcpi tmpL, 100 ; Comparam valoarea din tmpL cu 100breq
COMPARE_ISR_NEGATE ; Daca valoarea este 100, negam starea pinului
OC0COMPARE_ISR_EXIT:reti ; Iesim din subrutina de
intrerupereCOMPARE_ISR_NEGATE:cbi PORTD, PD7 ; Negam starea pinului OC0
(PD7)reti ; Iesim din subrutina de intrerupere; Subrutina de intrerupere pentru
depasire Timer/Counter0OVERFLOW_ISR:clr tmpL ; Resetam valoarea din
registrul temporar tmpLsbi PORTD, PD7 ; Setam starea pinului OC0 (PD7) ca fiind
activreti ; Iesim din subrutina de intrerupere
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