Documente Academic
Documente Profesional
Documente Cultură
1. Rezumat
2. ntroducere
3. Fundamentare teoretic
3.1. Prezentarea microcontrorului Atmega16
3.2. Prezentarea modulului periferic Taimer
4. Proiectare i implimentare
5. Rezultate experimentale
6. Concluzii
7. Bibliografie
2
1. Rezumat
Scopul acestui proiect de an este de a modela cu ajutorul unui microcontrolerului i circuitului
electric funcionarea unui termostat, care menine o anumit temperatur a unui obiect nclzit.
2. ntroducere
n atingerea scopului vom folosi microcontrolerul Atmega16 produs de firma Atmel. n special
vom folosi portul A care are ca funcie adugtoare Convertorul Analog Digital (ADC). Semnal ce va
fi prelucrat de ADC va fi transmis la porturile de ieire B i C conectate cu un afior de 4 cifre, care
va afia temperatura. La portul D, care este deasemenea de iesire, face conexiunea cu circuitul electric
ce este format din elementul nclzitor i de rcire. De asemenea avem nevoie de un ntreruptor
electronic, care permite de a conecta sau deconecta elementului de nclzire de la sursa de tensiune i
de un amplificator operaional folosit ca un bufer.
3. Fundamentare teoretic
ATmega 16 este un microcontroler CMOS de 8biti de mica putere bazat pe arhitectura RISC
AVR imbunatatita. Dispune de un set de 131 instructiuni si 32 de registre de uz general. Cele 32 de
registre sunt direct adresabile de Unitatea Logica Aritmetica (ALU), permitand accesarea a doua
registre independente intr-o singura instructiune, se obtine astfel o eficienta sporita in executie.
Structura intern general a controlerului conine o magistral general de date la care sunt
conectate mai multe module:
1) unitatea aritmetic si logic (ALU);
2) registrele generale;
3) memoria RAM si memoria EEPROM;
4) liniile de intrare (porturile I/O Lines) si celelalte blocuri de intrare/iesire.
Memoria Flash de program mpreun cu ntreg blocul de extragere a instruciunilor, decodare si
execuie comunic printr-o magistral proprie, separat de magistrala de date menionat mai sus.
Acest tip de organizare este conform principiilor unei arhitecturi Harvad si permite controlerului s
execute instruciunile foarte rapid.
Modul Power-down salveaza continutul registrelor, dar blocheaza Oscilatorul, dezactivand toate
celelalte functii al chip-ului pana la urmatoarea Intrerupere Externa sau Reset hardware. In modul
3
Power-save, timer-ul asincron continua sa mearga, permitind userului sa mentina o baza de timp in
timp ce restul dispozitivului este oprit.
In modul Stand-by , oscilatorul functioneaza in timp ce restul despozitivului este oprit. Acest
lucru permite un start foarte rapid combinat cu un consum redus de energie. In modul stanby
extins(Extended Stanby Mode), atat oscilatorul principal cat si timer-ul asincron continua sa
functioneze.
Memoria flash (On-chip) permite sa fie reprogaramata printr-o interfata seriala SPI , de catre un
programator de memorie nonvolatila conventional, sau de catre un program de boot On-chip ce
ruleaza pe baza AVR. Programul de boot poate folosi orice interfata, sa incarce programul aplicatie in
memoria Flash de aplicatie. Combinand un CPU RISC de 8 biti cu un Flash In-system auto
programabil pe un chip monolithic, ATmega 16 este un microcontroler puternic ce ofera o solutie
extrem de flexibila si cu un cost redus in comparatie cu multe altele de pe piata. ATmega 16 AVR este
sustinut de o serie completa de instrumente de program si de dezvoltare a sistemului, care include:
compilatoare C, macroasambloare, programe debug- simulare etc.
ATmega16 dispune de 32 de linii de I/O grupate n 4 porturi de 8 bii. Porturile sunt denumite
cu literele A, B, C i D. Fiecare pin al oricrui port se poate seta individual ca intrare sau ieire fr s
afecteze ceilali pini. n plus, anumii pini se pot utiliza pentru funcii speciale ale microcontrolerului.
n figura 2 este prezentat structura general a unui pin.
Toi cei 32 de pini au fiecare cte o rezisten pull - up care poate fi activat sau dezactivat.
4
Figura 2: Structura general a unui pin
Operaiile cu porturile se fac prin intermediul unui set de trei regitri alocai fiecrui port:
PORTx, PINx i DDRx; x poate fi A, B, C sau D. Aceti registri fac parte din categoria de regitri de
intrare/ieire, de aceea instruciunile care pot lucra direct cu ei sunt CBI, SBI, IN i OUT.
Descrierea pinilor
Port A (PA7 .. PA0) serveste drept port de intrari analogice pentru Convertorul A/D si ca un port
bidirectional I/O de 8 biti, in cazul in care Convertorul A/D nu este folosit. Pinii de port pot fi
conectati optional la VCC prin rezistori interni, (selectati pentru fiecare bit). Buffer-ele de iesire ale
Portului A au caracteristici de amplificare .
Port B (PB7.. PB0) este un port I/O de 8 biti bidirectional cu rezistori interni (optionali).
Buffer-ele de iesire ale Port-ului B au caracteristici de amplificare. Port-ul B indeplineste de
asemenea functii speciale ale microcontrolerului ATmega 16.
Port C (PC7PC0) este un port I/O de 8 biti bidirectional cu rezistori interni (optionali).
Indeplineste functii ale interfetei JTAG si alte functii speciale ale ATmega 16. Daca interfata JTAG
(de depanare) este activata , rezistorii pinilor PC5(TDI), PC3(TMS) si PC2(TCK) vor fi activati, chiar
daca are loc o resetare. Buffer-ele de iesire ale Port-ului C au caracteristici de amplificare.
Port D (PD7PD0) este un port I/O de 8 biti bidirectional cu rezistori interni conectati
optional la VCC (selectati pentru fiecare bit). Buffer-ele de output ale Port-ului D au caracteristici de
amplificare. Port-ul D indeplineste de asemenea functii speciale ale ATmega 16.
Timerul/Counterul, dupa cum ii spune si numele ofera facilitatea de a masura intervale fixe de
timp si de a genera intreruperi la expirarea intervalului masurat. Un timer, odata initializat va
functiona independent de unitatea centrala. Acest lucru permite eliminarea buclelor de delay din
programul principal.
Principiul de functionare a unui Timer poate fi descris in linii mari de cele trei unitati:
1) Registrul numarator (Timer Counter, TCNT) care masoara efectiv intervalele de timp si
care este incrementat automat cu o frecventa data.
2) Avand ceasul intern sau alt ceas conectat pentru a obtine diferite intervale folosim un
Prescaler. Acesta are menirea de a diviza in functie de necesitatile aplicatiei frecventa
de ceas si odata cu divizarea sa incrementeze registrul TCNT.
5
3) La fiecare incrementare a TCNT are loc o comparatie intre acest registru si o valoare
stocata in registrul OCRn. Aceasta valoare poate fi incarcata prin software de utilizator.
Daca are loc egalitatea se genereaza o intrerupere, in caz contrar intrementarea continua.
Timerele sunt prevazute cu mai multe canale astfel in paralel se pot desfasura diferite numaratori.
ATmega16 este prevazut cu 3 unitati de timer: doua de opt biti si una de numarare pe saisprezece
biti.
Registri TCNT1, OCR1A/B si ICR1 sunt toate registre de 16 biti. Proceduri speciale trebuie
urmate cand se acceseaza registre de 16 biti.
Registrul de captura input poate captura valoarea T/C la o comanda data extern fie pe pinul de
captura input sau pe pinii analog de comparatie. Unitatea de captura imput include o unitate de filtru
digitala pentru a micsora posibilitatile de interferenta a zgomotului.
6
Figura 3: Schema bloc a modulului ADC
Rolul oricrui modul de conversie A/D este de a transforma o tensiune analogic ntr-o valoare
numeric. Cele mai importante elemente care definesc aceast transformare sunt valoarea tensiunii de
referin i rezoluia convertorului. Astfel, rezoluia stabilete numrul maxim de trepte n care se
poate cuantiza tensiunea de intrare iar tensiunea de referin stabilete valoarea maxim a tensiunii de
intrare.
Dac notm cu N rezoluia i Vref tensiunea de referin, atunci treapta unui convertor A/D sau
1 LSB se definete ca:
1 LSB = Vref/2N (V)
Valoarea treptei se exprim n voli i n funcie de aceasta i rezultatul conversiei C, se poate
afla tensiunea de intrare n convertor Vin pe baza relaiei:
Vin = C*l LSB(V)
Valoarea maxim a tensiunii de intrare care poate fi msurat este ntotdeauna Vrer - 1 LSB.
Modulul ADC din ATmegal6 poate avea trei surse ca tensiune dc referin:
- valoarea de pe pinul AVCC
- valoarea de pe pinul AREF
- o tensiune generat intern cu valoarea de 2.56V
Pentru a comanda i a utiliza modulul ADC, programatorul are la dispoziie un numr de
regitrii care pot fi grupai in urmtoarele categorii:
- regitrii ADCL i ADCH pentru stocarea rezultatului unei conversii
- regitrii generali de configurare: ADMUX i ADCSRA
7
- registrul special de configurare SFIOR, utilizat i de alte module ale microcontrolerului.
La finalul unei conversii, rezultatul acesteia se va regsi n regitrii ADCH i ADCL. n mod
normal, se citete mai nti ADCL i apoi ADCH pentru a utiliza precizia complet de 10 bii. Cu
toate acestea, dac s-a configurat alinierea rezultatului la stnga (Figura 4), utilizatorul poate citi
numai registrul ADCH obinnd astfel o valoare mai uor de prelucrat dar care corespunde unei
precizii a convertorului de numai 8 bii.
Convertorul poate msura tensiunea aplicat pe oricare din cele opt canale reprezentate de pinii
ADC0...ADC7, dar nu simultan. De aceea, numai unul dintre acestea va fi activ la un moment dat,
selecia realizndu-se pe baza unor bii din registrul ADMUX. Trebuie avut n vedere c aceti bii pot
fi oricnd modificai dar, la nivelul hardware, selecia unui nou canal se face imediat numai dac nici
o conversie nu este n desfurare. Altfel, selecia se va realiza dup ce se termin conversia curent.
Regitrii utilizai pentru configurare sunt ADMUX, ADCSRA i SFIOR. O descriere general a
biilor registrului ADMUX este dat n tabelul de mai jos:
- - - - - - ADC9 ADC8
ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC0
Biii 5 (ADTS0), 6 (ADTS1) i 7 (ADTS2) din registrul SFIOR selecteaz evenimentul care
declaneaz o nou conversie n modul de funcionare automat (ADATE=1). Aceste evenimente sunt
de fapt semnale de ntrerupere i utilizarea lor va determina activarea flagului corespunztor. Acesta
trebuie s fie dezactivat dup cc s-a realizat o conversie pentru a permite o nou autodeclansare la
respectivul eveniment. Deoarece acest registru este utilizat i de alte module ale microcontrolerului,
utilizatorul va avea grij sa nu modifice dect valoarea biilor 5..7 ale cror combinaii posibile sunt
descrise n tabelul de mai jos:
ADTS2 ADTS1 ADTSO Eveniment de autodeclansare
Funcionare permanent: dup terminarea unei
0 0 0
conversii se ncepe imediat alta
Semnalul de ntrerupere generat de
0 0 1 comparatorul analogic
Semnalul de ntrerupere generat de
0 1 0
ntreruperea extern 0
1 Semnalul de ntrerupere generat cnd
0 1
Timer/CounterO atinge valoarea de prag
Semnalul de ntrerupere generat cnd
1 0 0
Timer/CounterO atinge valoarea maxim
Semnalul de ntrerupere generat cnd timerul pe
1 0 1
16 bii atinge valoarea de prag B
9
Semnalul de ntrerupere generat cnd timerul
1 1 0
pe 16 bii atinge valoarea maxim
Semnalul de ntrerupere generat de unitatea de
1 1 1
captur a timerului pe 16 bii
vom observa c aceasta este direct proporional cu temperatura mediului n care se afl jonciunea.
Pe aceast dependen se bazeaz folosirea unor structuri integrate cu tranzistori pentru msurarea
4. Proiectarea i implimentarea
Pentru a realiza aceast lucrare am folosit programul de simulare Proteus v7.4, cu ajutorul
cruia am creat placa de montaj i am asamblat schema. n componena schemei intr urmtorele
component: microcontrolerul ATmega16 seriei AVR, afior de patru cifre, un amplificator operaional,
un ntreruptor electronic i un circuit electric format din rezistene i capaciti.
n special vom folosi portul A care are ca funcie adugtoare Convertorul Analog Digital
(ADC). Semnal ce va fi prelucrat de ADC va fi transmis la porturile de ieire B i C conectate cu un
afior de 4 cifre, care va afia temperatura. La portul D, care este deasemenea de iesire, face
conexiunea cu circuitul electric ce este format din elementul nclzitor i de rcire. De asemenea
avem nevoie de un ntreruptor electronic, care permite de a conecta sau deconecta elementului de
nclzire de la sursa de tensiune i de un amplificator operaional folosit ca un bufer.
Programarea microcontrolerului a nceput cu alegerea bibliotecilor, a segmentului de cod i
definirea constantelor, iniializarea porturilor.
Am iniializat Taimerul i am setat biii corespunztori, am determinat prescalerul:
; Timer0_OVF, Prescaler = 8, OffSet = 100
10
ldi r16, 0x01
out TIMSK, r16
ldi r16, 0x03
out TCCR0, r16
ldi r16, 0x80
out TCNT0, r16
5. Rezultate experimentale
Aceasta este schema electric i rezultatul lucrrii:
11
6. Concluzii
12
n aceast proiect de curs am ncercat sa fac o recapitulare a materialului nvat pe parcursul
simestrului, n cadrul cursului Microprocesoare i Interfee. Ca microprocesor de baz am folosit
Atmega16 produs de firma Atmel, deprinznd tehnicile de lucru i funcionarea acestuia. Totui n
aceast lucrare am folosit preponderant porturile I/O, modulul Analog Digital Converter (ADC) i
modulul periferic Taimer. Scopul acestei lucrri a fost de a modela funcionarea unui termostat cu
ajutorul MCU, ADC a fcut conversia din semnalul analogic n cel digital, iar prin Taimer am fcut
posibil afiarea datelor la display. La final am cpatat o schema electric destul de volominoas, dar
care are implimentare corect i cred eu c ar fi utilizabil i n practic pentru diferite domenii.
7. Bibliografie
1) www.atmel.com;
2) www.avrfreaks.com;
3) www.avr.com;
4) D. Crstoiu Sisteme cu microprocesoare, Note de curs ;
5) M. Patrubany Totul despre microprocesorul Z80, Ed. Tehnic 1989;
6) epelea, Lupu Microprocesoare aplicaii;
Anex
.include"m16def.inc"
.dseg
tab: .byte 4
.cseg
.org 0
rjmp Reset
.org 0x12
rjmp Timer0_Ovf
.org ADCCaddr
rjmp ADC_isr
.org 0x28
Reset:
; SP <- Ramend
ldi r16, HIGH(RamEnd)
out sph, r16
ldi r16, LOW(RamEnd)
out spl, R16
; B, C : output,Value = 0x00
ldi r16, 0xFF
13
out DDRB, r16
out DDRC, r16
out DDRD, r16
; Initializam ADC
ldi r16, (1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|
|(1<<ADATE)
Main:
rjmp Main
reti
;-------------------------------------------------
Timer0_Ovf:
clr r16
out portB, r16
lsl r17
cpi r17, 0x00
brne L1
ldi r17, 0x01
L1:
cpi r17, 0b00000001
brne L2
L2:
cpi r17, 0b00000010
brne L3
L3:
cpi r17, 0b00000100
brne L4
L4:
cpi r17, 0b00001000
brne L5
L5:
reti
;-------------------------------------------------
TabInit:
ldi yh, High(tab)
ldi yl, Low(tab)
ldi r16, 0b00111111 ; r16 <- '0'
st y+, r16
ldi r16, 0b00111111 ; r16 <- '0'
st y+, r16
ldi r16, 0b00111111 ; r16 <- '0'
st y+, r16
ldi r16, 0b01100011 ; r16 <- '*'
st y+, r16
15
ret
;-------------------------------------------------
ADC_isr:
in r16, ADCH
in r19, ADCH
If_High:
cpi r16, 200
brlo End
cbi PortD, 0
rjmp End
If_lower:
sbi PortD, 0
End:
rcall Conversion_handler
reti
//-----------------------------------------------
Conversion_handler:
clr r20
Firs_Digit:
cpi r19, 100
brlo Store_First_Digit
inc r20
Loop1:
sbci r19, 100
cpi r19, 100
brlo Store_First_Digit
inc r20
rjmp Loop1
Store_First_Digit:
rcall Decoder_Function
std y+0, r21
clr r20
Second_Digit:
cpi r19, 10
brlo Store_Second_Digit
inc r20
16
Loop2:
sbci r19, 10
cpi r19, 10
brlo Store_Second_Digit
inc r20
rjmp Loop2
Store_Second_Digit:
rcall Decoder_Function
ori r21, 0b10000000 ; pentru desenarea punctului
std y+1, r21
clr r20
Third_Digit:
Store_Third_Digit:
mov r20, r19
rcall Decoder_Function
std y+2, r21
ret
//-----------------------------------------
Decoder_Function:
Zero:
cpi r20, 0
brne One
ldi r21, 0b00111111
One:
cpi r20, 1
brne Two
ldi r21, 0b00000110
Two:
cpi r20, 2
brne Three
ldi r21, 0b01011011
Three:
cpi r20, 3
brne Four
ldi r21, 0b01001111
Four:
cpi r20, 4
brne Five
ldi r21, 0b01100110
Five:
cpi r20, 5
brne Six
ldi r21, 0b01101101
Six:
cpi r20, 6
brne Seven
ldi r21, 0b01111101
Seven:
17
cpi r20, 7
brne Eight
ldi r21, 0b00100111
Eight:
cpi r20, 8
brne Nine
ldi r21, 0b01111111
Nine:
cpi r20, 9
brne End_of_Decoder
ldi r21, 0b01101111
End_of_Decoder:
ret
18