Sunteți pe pagina 1din 28

Microcontrolere

Curs 4

Ș.l. dr. ing. Mihai Niculescu


Cuprins

 Managementul întreruperilor la ATmega32


 Module Timer/Counter0, Timer/Counter1 și
Timer/Counter2
 Noțiuni generale
 Moduri de funcționare
 Configurarea

2
Procedura de răspuns la întrerupere
PUSH PC
A DA SP=SP-2
apărut CLI
într. ? PC = Adr. vector într.

NU

SEI DA NU
POP PC RETI ?
SP=SP+2 3
Procedura de răspuns la întrerupere

 Întotdeauna se finalizează execuția instrucțiunii


curente înainte de tratarea întreruperii
 Încărcarea PC în stivă durează 4 perioade de tact
 Execuția jmp la adr. vect. într. durează 3 perioade de
tact
 Revenirea din întrerupere durează 4 perioade de tact:
 Scoaterea PC din stivă
 SP=SP+2
 SEI
4
Procedura de răspuns la întrerupere

 După revenirea din întrerupere se execută cel


puțin o instrucțiune înainte de a trata o altă
întrerupere în așteptare
 După instrucțiunea cli nu se mai tratează nici o
întrerupere, chiar dacă apare simultan cu execuția
instrucțiunii
 Întotdeauna se execută instrucțiunea de după sei
înainte de a trata o întrerupere aflată în așteptare
5
Procedura de răspuns la întrerupere

 Apariția unei întreruperi determină setarea


(schimbarea în 1) bitului de tip flag asociat cu
acea întrerupere
 De obicei bitul flag este schimbat automat în 0 la
executarea rutinei de întrerupere
 De obicei programatorul poate schimba bitul flag în
0 scriind 1 pe poziția lui. Astfel poate anula
tratarea unei întreruperi
6
Procedura de răspuns la întrerupere

 Un flag setat determină tratarea întreruperii dacă


nici o altă rutină de întrerupere nu este în
execuție și bitul I=1
 Mai multe întreruperi în așteptare vor fi tratate în
ordinea priorității
 Programatorul poate activa nested interrupts
folosind sei în rutina de întrerupere

7
Întreruperi externe

 INT0  PD2 ; INT1  PD3 ; INT2  PB2


 INT2 poate fi declanșată de o schimbare de nivel pe
pin
 INT1 și INT0 pot fi declanșante de o schimbare de
nivel pe pin sau de nivel logic zero pe pin
 De regulă pinii se configurează ca intrare
 Dacă sunt setați ca ieșire, întreruperea se va declanșa
când se scrie o valoare corespunzătoare în registrul
PORTx  se poate genera astfel o întrerupere software
8
Întreruperi externe

 Întreruperea de nivel logic zero va declanșa în


permanență atâta timp cât se menține acel nivel pe pin
 Recunoașterea schimbărilor de nivel pentru declanșarea
întreruperilor INT0 și INT1 se poate face doar dacă
semnalul de tact intern clk I/O este activ
 Recunoașterea schimbărilor de nivel pentru declanșarea
întreruperii INT2 și a nivelului logic zero pentru
declanșarea INT0/INT1 se face asincron și nu este necesar
ca semnalul de tact intern clk I/O să fie activ
 În această configurație pot fi utilizate pentru a scoate uC
din acele moduri SLEEP în care semnalul de tact intern clk I/O
este oprit 9
Întreruperi externe

 Când se folosește întreruperea de nivel zero


pentru scoaterea uC din modul sleep Power-down,
nivelul respectiv trebuie menținut o perioadă mai
mare decât valoarea start-up time cu care a fost
programat uC
 Altfelnu iese din sleep sau, chiar dacă iese, nu
tratează întreruperea

10
Întreruperi externe

 Configurarea INT0/INT1
 Esteposibil ca întreruperea să nu se declanșeze
dacă impulsul de modificare a nivelului logic
este mai scurt decât perioada semnalului de
tact
 Întreruperea de nivel zero se declanșează doar
dacă nivelul este menținut până la finalizarea
execuției instrucțiunii curente
11
Întreruperi externe

 Configurarea INT0/INT1

12
Întreruperi externe

 Configurarea INT2
 Este posibil ca întreruperea să nu se declanșeze
dacă impulsul de modificare a nivelului logic este
mai scurt de 50ns
 ISC2=0  front descrescător
 ISC2=1  front crescător

13
Întreruperi externe

 Activarea INT0/INT1/INT2
 Se scrie 1 în bitul corespunzător din GICR
 Semnalizarea INT0/INT1/INT2
 Biții 7, 6 și 5 din GIFR

14
Exemplu cod de întrerupere în asm –
program principal
jmp RESET MEMORIA FLASH
jmp et1
jmp RESET 0x0000
jmp et2
................
20 jmp et1 0x0002
jmp et20 jmp et2 0x0004
RESET: ........................... .................
ldi r16,high(RAMEND)
out SPH,r16 jmp et20 0x0028
ldi r16,low(RAMEND) ldi r16,high(RAMEND) 0x002A
out SPL, r16
sei
15
...........................
Exemplu cod de întrerupere în asm –
rutina de întrerupere
et1:
in r20,SREG
.............. //codul rutinei care nu trebuie să modifice r20
out SREG,r20
reti

16
Exemplu cod de întrerupere în C – ATMEL
Studio
ISR (TIMER1_COMPA_vect)
{
.............. //codul rutinei

17
Exemplu cod de întrerupere în C –
mikroC
void Timer1Overflow_ISR() org IVT_ADDR_TIMER1_OVF
{
.............. //codul rutinei

18
Exercițiu 1

 Săse configureze întreruperea la atingerea


valorii de prag A și a valorii de prag B pentru
Timer/Counter 1

19
Exercițiu 1

 ASM C
in r16,TIMSK TIMSK=TIMSK|(1<<OCIE1A)|(1<<OCIE1B);
ori r16,0b00011000
out TIMSK,r16

20
Exercițiu 2

 Săse scrie un program


care schimbă starea led-
ului D4 la fiecare 10
tranziții ale semnalui de
intrare

21
Exercițiu 2
.include "m32def.inc" jmp reset reset:
jmp reset jmp reset ldi r16,high(RAMEND)
jmp semnal jmp reset out SPH,r16
jmp reset jmp reset ldi r16,low(RAMEND)
jmp reset jmp reset out SPL,r16
jmp reset jmp reset ldi r16,0x00
jmp reset jmp reset out DDRD,r16 ; portul D este
jmp reset jmp reset setat ca intrare

jmp reset jmp reset ldi r16,0xFF

jmp reset jmp reset out ddra,r16 ; portul A este


setat ca ieșire
jmp reset jmp reset
ldi r18,0x00
22 ; contor
Exercițiu 2
main: rjmp bucla eor r16,r17
cli out PORTA,r16
in r16, MCUCR semnal: semnal_end:
ori r16,0b00000001 in r20,SREG out SREG,r20
out MCUCR,r16 inc r18 reti
in r16,GICR cpi r18,10
ori r16,0b01000000 brne semnal_end ; salt în
out GICR,r16 caz de inegalitate

sei ldi r18,0x00

bucla: in r16,PINA 23

ldi r17,0b00000100
Exercițiu 2
#define F_CPU 8000000U PORTA=PINA^(1<<PA2); } }
#include <avr/io.h>
#include <avr/interrupt.h> int main(void)
{
unsigned short contor; cli();
DDRD=0x00;
ISR(INT0_vect) DDRA=0xFF;
{ MCUCR=MCUCR|(1<<ISC00);
contor++; GICR=GICR|(1<<INT0);
if (contor==10) sei();
{ for(;;);
24
contor=0; }
Noțiuni generale timere

 La modul general un timer este un contor care se


incrementează/decrementează la intervale fixe de timp
 Astfel diferența între valoarea curentă a contorului și
valoarea inițială permite determinarea timpului care a
trecut de la momentul inițial

 Valoarea maximă pe care o poate avea contorul este


stabilită de rezoluția b (numărul de biți pe care este
implementat)
 max = 2b – 1
25
Noțiuni generale timere
 Contorul se resetează când este atins maximul sau o
valoare prestabilită

 Există diverse surse de întrerupere asociate cu timerele

 Timerele pot stabili automat nivelul logic


pentru anumiți pini ai uC
 Se pot genera semnale dreptunghiulare
cu frecvența dorită, inclusiv semnale PWM
26
Exemple de utilizare timer

 Măsurarea intervalelor de timp și execuția periodică a unor


acțiuni
 Ciclul de semaforizare
 Durata de apăsare a unui buton
 Calculul frecvenței unor semnale

 Generarea de semnale PWM


 Controlul motoarelor electrice
 Generarea de sunete
 Controlul sistemelor de iluminat
 Module de conversie DAC 27
Întrebări ?

28

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