Sunteți pe pagina 1din 13

Lab 4 - Intreruperi & PWM

1) Obiectiv laborator
Acest laborator are ca scop familiarizarea voastr cu lucrul cu timerele
prezente n microcontrollerul Atmega32, acoperind att modul normal de
funcionare ct i cel de PWM. Folosirea timerelor implic i familiarizarea cu
ntreruperile hardware ale procesorului, prezentate n prima parte a laboratorului.

2) Sistemul de intreruperi
O ntrerupere hardware reprezint un semnal sincron sau asincron de la un
periferic ce semnalizeaz apariia unui eveniment care trebuie tratat de ctre
procesor. Tratarea ntreruperii are ca efect suspendarea firului normal de execuie
al unui program i lansarea n execuie a unei rutine de tratare a ntreruperii
(RTI).
ntreruperile hardware au fost introduse pentru a se elimina buclele pe
care un procesor ar trebui s le fac n ateptarea unui eveniment de la un
periferic. Folosind un sistem de ntreruperi, perifericele pot comunica cu
procesorul, acesta din urma fiind liber sa-i ruleze programul normal in restul
timpului i s i ntrerup execuia doar atunci cnd este necesar. nainte de a
lansa n execuie o RTI, procesorul trebuie sa aib la dispoziie un mecanism prin
care s salveze starea n care se afla n momentul apariiei ntreruperii. Aceasta
se face prin salvarea ntr-o memorie, de cele mai multe ori organizata sub forma
unei stive, a registrului contor de program (Program Counter), a registrelor de
stare precum i a tuturor variabilelor din program care sunt afectate de execuia
RTI. La sfritul execuiei RTI starea anterioar a registrelor este refcut i
programul principal este reluat din punctul de unde a fost ntrerupt.
Pentru a asocia o ntrerupere cu o anumit rutin din program, procesorul
folosete tabela vectorilor de ntrerupere (TVI), ilustrat n figura de mai jos.
n aceast tabel, fiecrei ntreruperi i este asociat adresa rutinei sale de
tratare, la care programul va face salt n cazul apariiei acesteia. Aceste adrese
sunt predefinite i sunt mapate n memoria de program ntr-un spatiu continuu
care alctuiete TVI. Adresele ntreruperilor n TVI sunt setate n funcie de
prioritatea lor, cu ct adresa este mai mic cu att prioritatea este mai mare.

#define
#define
#define
#define
#define
#define
#define
#define
#define

INT0_vect
INT1_vect
INT2_vect
TIMER2_COMP_vect
TIMER2_OVF_vect
TIMER1_CAPT_vect
TIMER1_COMPA_vect
TIMER1_COMPB_vect
TIMER1_OVF_vect

_VECTOR(1)
_VECTOR(2)
_VECTOR(3)
_VECTOR(4)
_VECTOR(5)
_VECTOR(6)
_VECTOR(7)
_VECTOR(8)
_VECTOR(9)

#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define

TIMER0_COMP_vect
TIMER0_OVF_vect
SPI_STC_vect
USART_RXC_vect
USART_UDRE_vect
USART_TXC_vect
ADC_vect
EE_RDY_vect
ANA_COMP_vect
TWI_vect
SPM_RDY_vect

_VECTOR(10)
_VECTOR(11)
_VECTOR(12)
_VECTOR(13)
_VECTOR(14)
_VECTOR(15)
_VECTOR(16)
_VECTOR(17)
_VECTOR(18)
_VECTOR(19)
_VECTOR(20)

Dup cum se observ din figura de mai sus, pe lng ntreruperile


componentelor interne uC-ului(timer-e, interfee seriale, convertor analogdigital), exist i 3 linii pentru ntreruperi de la periferice externe: INT0, INT1,
INT2. Semnalele pentru aceste ntreruperi externe vin pe pinii INT0, INT1 i INT2
(portul D pinii 2, 3 respectiv portul B pinul 2).

Microcontroller-ul ofer posibilitatea mascrii ntreruperilor prin scrierea pe


0 a bitului I din registrul de status (SREG). Valoarea iniial a acestui bit este
0, deci chiar dac ntreruperile unui periferic sunt activate din unul din registrele
acestuia, tot nu sunt luate n considerare dect cnd se scrie 1 pentru acest flag.
Totodat, la apariia unei ntreruperi, n afar de salvarea strii, procesorul
dezactiveaz ntreruperile, iar la revenirea din rutina de tratare le reactiveaz.

Activarea lor poate fi realizat forat i din handler-ul de ntrerupere (de exemplu
suntem n handler-ul pt reset, i dorim s activm ntreruperile unui timer).

3) Tratarea unei intreruperi

S presupunem c programul nostru primete ntreruperea extern INT0 n


timp ce execut instructiunea ldi R16,0xFF. Dup efectuarea instruciunii, registrul
contor program (PC) este automat salvat n stiv i apoi iniializat la valoarea
corespunzatoare adresei lui INT0 ($002). Acest lucru se traduce prin saltul
programului de la adresa curent ($123) la adresa $002. Aici, programul gsete
instruciunea jmp $2FF care-i permite sa sar la rutina efectiva de tratare a
ntreruperii. La sfritul oricarei RTI trebuie s existe instruciunea reti care reface
din stiv registrul PC (programul sare napoi la adresa de unde rmsese nainte
de ntrerupere).
n timpul execuiei unei ntreruperi, bitul I din SREG este setat la 0 i
resetat la ieire, adic orice alt ntrerupere care poate aprea n timpul

ntreruperii curente nu va fi luat in seam. Cu toate acestea, utilizatorul poate


s reseteze bitul I din software, permind astfel execuia unei ntreruperi n
ntrerupere.

Registri
Descrierea complet a acestor registri o gsii n datasheet-ul
microncontrollerului n capitolele Interrupts, External Interrupts.
Status Register (SREG)

conine flag-uri setate in urma operaiilor unitii aritmetice logice

conine flag-ul I de activare/dezactivare ntreruperi

MCU Control Register (MCU CR)

Contine biti de control pentru intreruperi

General Interrupt Control Register (GICR)

biii INT2:0 controleaz dac ntreruperile externe sunt activate

pt oricare bit INT2:0, dac este 1 i bitul I din SREG este 1 atunci sunt
activate ntreruperile externe pe pinul corespunztor.

Bitul IVSEL controleaza unde se plaseaza vectorii de intreruperi

Bitul IVCE activeaza scrierea bitului IVSEL

4) Timere. Principiul de funcionare al unui Timer


Timerul/Counterul, dupa cum i spune i numele ofer facilitatea de a
msura intervale fixe de timp i de a genera ntreruperi la expirarea intervalului
masurat. Un timer, odat iniializat va funciona independent de unitatea
centrala (core P). Acest lucru permite eliminarea buclelor de delay din
programul principal.
Principiul de funcionare a unui Timer poate fi descris n linii mari de cele trei
uniti din figura de mai jos:
1.

Registrul numarator (Timer Counter, TCNT) - msoar efectiv intervalele


de timp i este incrementat automat cu o frecven dat.

2.

Prescaler-ul - are rolul de a diviza n funcie de necesitile aplicaiei


frecvena de ceas i odat cu divizarea s incrementeze registrul TCNT.

3.

La fiecare incrementare a TCNT are loc o comparaie ntre acest


registru i o valoare stocat n registrul OCRn. Aceast valoare poate fi
ncarcat de ctre programator prin scrierea registrului OCRn. Dac are loc
egalitatea se genereaz o ntrerupere, n caz contrar incrementarea continu.

Timerele sunt prevzute cu mai multe canale astfel nct se pot desfasura
diferite numratori n paralel. ATmega32a este prevzut cu diferite uniti de
timer: de opt bii i de numrare pe aisprezece bii.
Timerele pot funciona i n moduri PWM, astfel ncat s genereze pe un pin de
ieire un semnal, pentru mai multe detalii vedei seciunea PWM din acest laborator.

Moduri de funcionare
Timer/Counter0 i Timer/Counter2 au patru moduri de funcionare (dintre care
vom detalia 3, pentru cel de-al patrulea putei citi datasheet-ul, ce se difereniaza prin:

valorile pna la care se face incrementarea

Mod

felul n care se numr (doar cresctor, sau alternativ


cresctor/descresctor)
cnd se face resetarea contorului

Descriere

Imagine contor

Proprieti

CTC
Clear
Timer
on
Compa
re

FastP
WM

* pornete de la 0
* numr pn cnd se
atinge un prag
(OCRx adic OCR0A/OCR0B pentr
u timer-ul 0,
OCR2A/OCR2B pentru
timer-ul 2 etc)

* frecvena
este
variabil,
determinat
de
modificarea
pragului
dup fiecare
ciclu

* pornete de la 0
* numr pn la
valoarea maxim (255
pentru 8 bii, 65535
pentru 16 bii)
* pragul se atinge pe
parcursul numrtorii

* frecvena
este fixat

Phase * numr cresctor de la


correct 0 pn la valoarea
PWM maxim, apoi
descresctor pn la 0
* pragul poate fi atins i
la numrarea
cresctoare, i la cea
descresctoare

Definiii care apar n datasheet:

BOTTOM: captul inferior din intervalul de numrare

TOP: captul superior al intervalului de numrare


MAX: limita superioar a numrrii, 255 (0xff) pentru 8 bii, 65535 (0xffff)
pentru 16 bii. TOP poate fi MAX n anumite moduri de funcionare ( de
exemplu, Fast PWM).

Setarea modului de funcionare a timerului


Pentru a configura un mod de funcionare, vom seta:

biii WGM din timer-ul respectiv (care se gsesc n registrele TCCR din
datasheet, la seciunile aferente timerelor, Register Description)

pragul de numrare

* frecvena
este fixat
* folosit
pentru
proprieti
speciale ale
semnalului
n anumite
aplicaii

De exemplu, ca s setm timer-ul 0 s numere pn la 5, ne vom uita n


datasheet la capitolul 15 (8-bit Timer/Counter0 with PWM) - seciunea Register
Description TCCR0A iTCCR0B
1. gsim modul CTC ca avnd biii 0 1 0 pe biii WGM2..0
2. aflm c modul CTC numr pn la OCRA
Presupunnd c plecm de la un registru complet neiniializat (0 este
valoarea default pentru majoritatea biilor), avem urmtorul cod:

TCCR0A |= (1 << WGM01);


OCR0A = 5;

Setarea prescaler-ului
Pentru setarea prescaler-ului se vor modifica biii tip CS.. din
registrul TCCR.. al timer-ul respectiv. De exemplu, pentru setarea valorii de
prescaler 256 pentru timer-ul 2, vom urmri n datasheet capitolul 17 (8-bit
Timer/Counter2 with PWM) - seciunea Register Description TCCR2A i TCCR2B
1. gsim tabelul pentru valorile CS..
2. aflm c prescaler-ul 256 corespunde biilor 1 1 0 pentru biii CS22 CS21 CS20
Presupunnd c plecm de la un registru complet neiniializat (0 este
valoarea default pentru majoritatea biilor), avem urmtorul cod:

TCCR2B |= (1 << CS22) | (1 << CS21);

5) Pulse width modulation (PWM)


PWM (Pulse Width Modulation) este o tehnica folosita pentru a varia in
mod controlat tensiunea data unui dispozitiv electronic. Aceasta metoda schimba
foarte rapid tensiunea oferita dispozitivului respectiv din ON in OFF si invers.
Perioada de timp corespunzatoare valorii ON dintr-un ciclu ON-OFF se numeste
factor de umplere (duty cycle) si reprezinta, in medie, ce tensiune va primi
dispozitivul electronic. Astfel se pot controla circuitele analogice din domeniul
digital. Practic, asta inseamna ca un LED actionat astfel se va putea aprinde /
stinge gradual, iar in cazul unui motor acesta se va invarti mai repede sau mai
incet.
Un controller PWM este in esenta un convertor digital-analog (DAC) pe un
singur bit. Aceasta modulatie vine in sprijinul multor aplicatii deoarece inseamna
consum mic, eliminarea zgomotelor si aplicatii cu cost redus.

Principiul de functionare
Factorul de umplere se exprima in procente si reprezinta cat la suta din
perioada unui semnal acesta va fi pe ON. In Figura de mai jos(2) se pot observa
semnale PWM cu factori de umplere diferiti. Astfel, se poate deduce foarte usor
formula pentru a obtine valoarea factorului de umplere (D):
D = t_on / (t_on + t_off) * 100% = pulse_width / period * 100%

Astfel, tensiunea medie care ajunge la dispozitiv este dat de D * Vcc.

Fig. 2: Semnal PWM cu diferii factori de umplere (sursa: link [3])

Modularea folosete variaia factorului de umplere a unei forme de unda


dreptunghiular pentru a genera la ieire o tensiune analogic. Considerand o
form de und dreptunghiulara f(t) cu o valoare minim ymin i o valoare
maxim ymax i factorul de umplere D (ca in figura figure 2) valoarea medie a
formei de und e dat de relaia:

cum f(t) este o form de und dreptunghiular valoarea sa maxim se atinge


pentru 0<t<D*T.

Din punct de vedere al Atmega32a exista 3 tipuri de PWM:

Fast PWM - numrarea se face doar pe frontul crescator

Phase Correct PWM - numrarea se face pe ambele fronturi. Pentru


aceleasi configuraii Phase Correct PWM este de 2 ori mai lent.

Phase and Frequency Correct PWM - principala diferen ntre acest


mod i cel de Phase Correct este momentul cand este actualizat
registrul OCRnx.

Multe circuite digitale pot genera semnale PWM. Majoritatea


microcontrollerelor ofer aceast facilitate, pe care o implementeaz folosind un
numrator care este incrementat periodic (conectat direct sau indirect la o
unitate de ceas) i care este resetat la sfarsitul fiecrei perioade a PWM-ului.
Cnd valoarea numaratorului este mai mare decat valoarea de referin, ieirea
PWM (output-ul) trece din starea nalt n stare joas (sau invers).
Atmega32a dispune de 6 canale de PWM distribuite astfel:
timer0 - OCR0A, OCR0B - 8 bii (cu timer0 se poate configura
doar factorul de umplere, frecvena fiind dat de prescalerul
ceasului)

timer2 - OCR2A, OCR2B - 8 bii (cu timer2 se poate configura


doar factorul de umplere, frecvena fiind dat de prescalerul
ceasului

timer1,3 - OCR1A, OCR1B respectiv OCR3A, OCR3B- 16 bii (cu


timer1,3 se poate configura att factorul de umplere ct i
frecvena semnalului)

Lucrul cu PWM-ul
Lucrul cu PWM-ul presupune iniializarea unui timer apoi configurarea
output-ului pe pin. Fiecare timer are doi pini pe care poate da output un astfel de
semnal ( Timer0 are OC0A i0C0B, Timer 1 are OC1A i OC1B etc).
De exemplu, presupunem c avem timer 1 configurat pe modul de funcionare
fastPWM (modul de funcionare nu trebuie neaprat s conin cuvntul 'PWM' ca
s poat fi folosit pentru generarea unui semnal). FastPWM este caracterizat de o
frecven fix i un prag modificat de programator. Vom configura tipul de output
cu biii tip COM.. din registrele TCCR ale timer-ului corespunztor (n exemplul
nostru timer-ul 1). Descoperim n capitolul 16 ( 16-bit Timer/Counter1 and
Timer/Counter3 with PWM) - seciunea Register
Description - TCCR1A, TCCR1B i TCCR1C.
Descoperim c:

Exist un tabel pentru biii COM.. special pentru modul fastPWM


Modul 1 0 pentru biii COM1A1 COM1A0 va lsa semnalul de pe pinul OC1A n

timpul numrtorii pe 1 pn la atingerea pragului i va seta semnalul pe 0


de la atingerea pragului pn la captul unui ciclu (numrare complet pe
65536 elemente)
Pentru a obine un factor de umplere x%, aici vom seta OCR1A = x * 65535 / 100

DDRD |= ( 1 << PD5);

// OC1A este PD5

TCCR1A |= (1 << COM1A1);


OCR1A = 65535 / 2;

// fill-rate 0.5, jumtate din timp 1, jumtate din timp 0

Aplicaii laborator - Blink cu timere i LED RGB


1. Creati o aplicatie care sa aprinda si sa stinga ledurile de 5 ori(cate 300 ms)
apasarea primului buton folosind intreruperea externa INT0 configurata sa fie
declansata la aparitia unui front crescator pe INT0.
a. Modificati aplicatia astfel incat sa utilizeze intreruperea INT1
configurata astfel incat sa fie declansata la orice schimbare de front pe
pinul corespunzator intreruperii INT1. (asignarea pinului trebuie
identificata din datasheet-ul microcontrolerului)
b. Sa se afiseze pe byte display un mesaj specific fiecarei intreruperi. (de
ex: 1 si 2).
2. Creati o aplicatie care genereaza un semnal dreptungiular modulat in
latime(Pulse Witdh Modulation - PWM). Modificarea factorului de umplere se

va face folosind 2 butoane legate de 2 pini ai portului B. Factorul de umplere


se va afisa pe byte display.
Nota: Frecventa oscilatorului extern este de 16Mhz.
3. Creati un program numit Scheduler care implementeaza un mechanism de de
planificare a task-urilor in cadrul unui RTOS. Mecanismul trebuie sa respecte
urmatoarele conditii
a. Ticker 1ms
b. Sa foloseasca un timer configurat in modul CTC
c. 1 task de init si 4 ciclice care sa ruleze la 10ms, 20ms, 40ms,
respective 80ms
d. Mai mult de 2 task-uri nu trebuie sa ruleze in acelasi timp.

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