Sunteți pe pagina 1din 19

Microcontrolerele AVR pe 8 biti (Atmel) au la baza un nucleu RISC cu

arhitectura Harvard. Aceste microcontrolere sunt destinate aplicatiilor simple:


controlul motoarelor, controlul fluxului de informatie pe portul USB, aplicatii din
domeniul automotive, controlul accesului de la distanta (Remote Access Control),
s.a.. Pe baza acestui nucleu firma Atmel a dezvoltat mai multe familii de
microcontrolere, cu diferite structuri de memorie si de interfete I/O, destinate
diferitelor clase de aplicatii.

Familia de procesoare AVR pe 8 biti are urmatoarele caracteristici:

- Arhitectura RISC
- 32 registre d elucru de 8 biti
- Miltiplicator hardware
- Arhitectura Hardvard a spaiului (memorie intern: 16 koctei program
flash, 1 koctet data SRAM, 512 octei data EPROM)
- Frecvena de lucru poate fi controlat prin software de la 0 la 16 MHz
- Procesoarele sunt prevzute cu o gam larg de dispositive I/O i de
periferice incorporate
- Timer programabil cu circuit de prescalare
- Surse de ntrerupere interne i externe
- Timer de urmrire (watchdog) cu oscillator independent
- Interfaa JTAG (standrdul IEE1149.1 Compliant)
- 6 moduri de operare Sleep i Power Down pentru economisirea energiei
- Oscilator integrat RC
- Densitate mare acodului i compatibilitate integral a codului ntre membrii
familiei
- Procesoarele sunt disponibile n capsule variate, de la circuite cu 8 pini la
procesoare cu 68 de pini
- Familia AVR beneficiaz de existena unui set unitar de instrumente
software pentru dezvoltarea aplicaiilor.

Microcontrolerele din familia AVR folosesc o arhitectura RISC care permite


executia celor mai multe instructiuni intr-un singur ciclu de tact, ceea ce duce la
imbunatatirea performantei de 10 ori fata de procesoarele conventionale (de
exemplu, Intel 8051) care opereaza la aceasi frecventa.

Specific arhitecturii Harvard, procesoarele folosesc spatii de memorie si


magistrale de acces separate pentru coduri si pentru date. Toate procesoarele au
memorie de program de tip flash integrata. Memoria de program poate fi
programata in site (fara scoaterea din sistem) ceea ce permite efectuarea rapida
de upgrade-uri in programe. Programarea se poate face in doua moduri: serial si
paralel. Procesoarele au memorie de date integrata de tip RAM pentru variabile si
memorie de tip EEPROM pentru stocarea constantelor. Numarul mare de registre
interne (32 de registre de 8 biti), specific procesoarelor RISC, permite stocarea
variabilelor in interiorul procesorului, reducind astfel timpul de acces. In acest fel
creste viteza de executie a programelor. Prezenta unor blocuri interne ca: porturi,
timere, unitati de comunicatie USART, TWI si SPI, module PWM (Pulse Width
Modulation), convertoare A/D, comparator analogic, rezistoare pull-up, oscilator
intern, etc., permite utilizarea acestor microcontrolere intr-o gama larga de
aplicatii. Instructiunile acestei familii de microcontrolere au fost proiectate pentru a
reduce dimensiunea unui program scris in limbaj C sau in limbaj de asamblare.
Posibilitatea programarii memoriei FLASH si a memoriei EEPROM, face ca
aceste microcontrolere sa aiba o larga utilizare datorata costului mic de dezvoltare
a unei aplicatii prin reducerea timpului de proiectare. O alta calitate remarcabila a
acestor microcontrolere este consumul redus de energie.

Domeniul tensiunilor de alimentare este cuprins intre 1.8 si 5V. Procesoarele


folosesc 6 moduri diferite de functionare cu consum redus ceea ce asigura
reducerea consumului cind microcontrolerul nu este activ. La frecventa de tact de 1
MHz si la o tensiune de alimentare de 3 V procesorul activ consuma 1,1 mA, iar in
regim Power-down consumul se reduce la <1A. Posibilitatea de control software
al frecventei tactului garanteaza o viteza maxima de executie atunci cand este
nevoie, iar in restul timpului microcontrolerul poate trece in stand-by unde
consumul de energie este minim. Utilizarea acestor microcontrolere poate reduce
semnificativ timpul de dezvoltare a unei aplicatii datorita prezentei unui bloc de
depanare in timp real, circuitul aflandu-se chiar pe placa ce reprezinta aplicatia. Pe
baza nucleului AVR de 8 biti firma Atmel a dezvoltat citeva familii de
microcontrolere de uz general precum si microcontrolere cu functii specializate:

- Familia Tiny AVR care cuprinde microcontrolere destinate unor aplicaii


simple, cu 1-8 kocteti memorie de program
- Familia Mega AVR cu un set dezvltat de instruciuni i cu 4-256 koctei
memorie de program
- Familia Xmega AVR destinaia unor aplicaii complexe. Procesoarele
posed uniti DMA, module pentru criptare, etc., i folosesc un spaiu de
memorie de program de 16-384koctei
- Microcontrolere AVR destinate unor aplicaii specific. Microcontrorelere cu
funcii specializate se impart n mai multe categorii:
Ligthing AVR coniun un processor de semnal i este special
conceput pentru comanda motoarelor de curent continuu.
LCD AVR conin un controller pentru adresarea dispozitivelor de
afisaj LCD.
CAN AVR conin implementat hardware o interfa pentru
magistrala CAN.

Printre cele mai utilizate microcontrollere de uz general putem exemplifica:


ATmega 8, ATmega 16, ATmega 128, ATmega 162, etc.

Cele mai importante caracteristici ale unu microcontroler sunt :


- Structura intern procesorului.

Aici ne intereseaz arhitectura intern, n marea majortate RISC(Reduce


Instruction Set Computing) ,deoarece procesoarele cu o arhitectur de acest fel
ofer o vitez ridicat de calcul si un numr redus de instruciuni. Totui ,
programnd microcontrolerul in C instruciunile sunt mascate fa de programator,
singurul lucru care ne intereseaz fiind pe ci biti este procesorul deoarece toi
regitrii interni cu care vom lucra vor avea lungimea aceasta.De ce sunt att de
importani regitrii?Deoarece prin ei putem seta o serie de caracteristici ale chip-
ului, lucru pe care l vei vedea n exemplele ce vor urma.

-Memoria microcontrolerului.

n general microcontrolerele au dou tipuri de memorie, una nevolatil n care este


pstrat programul i una volatil n care sunt pstrate datele temporare.Memoria
nevolatil poate permite doar o dat scrierea (ROM- Read Only Memory) sau de
tip FLASH , ea putnd fii rescris de ctre utilizator de cteva zeci sau chiar sute
de mii de ori.Deobicei memoria ROM se folosete atunci cnd microcontrolerul
face parte din produse de serie, iar cea de tip FLASH se folosete atunci cnd se
creaz un prototip sau un numr redus de aplicaii asemntoare.
-Funciile oferite.Cnd vorbim de funcii ne referim la sistemele periferice ale
procesorului intern.Acestea pot fi: sistemul de ntreruperi,sistemul de
timere,sistemu de comunicare serial,sistemul de conversie analog digital,sistemul
PWM i multe altele.Majoritatea acestor sisteme vor fi prezentate separat pe
parcursul tutorialului.

-Frecvena la care lucreaz unitatea central.

Este important n marea majoritate a aplicaiilor, deoarece o frecven potrivit


poate face ca aplicaia s lucreze n timp real.De exemplu un microcontroler care
are rolul de a msura distana i viteza unei maini fa de un obstacol i care mai
are rolul i de a frna maina pentru a preveni o ciocnire,poate frna dup ce
accidentul s-a produs dac frecvea este sczut, lucru complet nedorit.Frecvena
unui microcontroler,precum i frecvena calculatoarelor de uz general reprezint
numrul de instruciuni executate ntr-o secund.Ea poate ajunge la nivelul zecilor
sau sutelor de megaheri, frecven suficient de mare pentru rularea programelor n
timp real.Sursa de frecven a unui microcontroler poate fi extern sau intern,
acest lucru fiind setat de ctre programator dup plac.

-Numrul de pini i tensiunea de alimentare.

Numrul de pini poate fi un criteriu decisiv n alegerea microcontrolerului


deoarece unele aplicaii pot necesita un numar mare sau mic de dispozitive externe
conectate, cum ar fi butoanele , LED-uri sau multe alte componente.Tensiunea de
alimentare poate fi important atunci cnd vorbim de aplicaii cu surs de
alimentare mobil,unde tensiunea de alimentare ar fi bine s fie ct mai mic.De
asemenea aici ne mai intereseaz i puterea consumat i care sunt modurile
economice de funcionare ale chip-ului.

Structura unui program scris pentru un microcontroler este puin diferit de structura programelor
scrise pentru un calculator de uz general.Primele linii dintr-un program vor reprezenta bibliotecile pe
care le utilizm n cadrul aplicaiei.Urmtoarea seciune va fi reprezentat de declararea variabilelor
globale i de declararea/definirea funciilor program.Apoi urmeaz funcia main, funcia principal din
program, cea care este prima executat la rularea programului.n aceast funcie mai nti se
declar variabilele locale, dac este nevoie ,apoi se fac setrile diferitelor funcii ale
microcontrolerului.n ultima parte a funciei main se va crea o bucl infinit lucru care n mod normal
nu ar fi dorit n programele scrise pentru calculatoarele personale.n aceast bucl are loc ntreaga
parte de prelucrare a datelor, restul fiind partea de setare.Atenie mare, funciile microcontrolerului
nu nsemn acela lucru cu funciile programului.De exempu pentru chipul ATMega8 programul ar
trebui s urmeze modelul:

//partea de includere a bibliotecilor utilizate


#include mega8.h
//declararea/definirea functiilor si variabilelor globale
void main(void)
{
//declarea variabilelor locale
//realizarea setarilor microcotrolerului prin registrii de setare
while(1)
{
//partea de prelucrare a datelor
}
}

Cnd microcontrolerul este pornit mai nti se va realiza setrile funciilor chip-ului prin regitrii de
setare apoi el va cicla codul din bucla while pn cnd apare un eveniment neateptat cum ar fi
oprirea sursei de alimentare sau apariia unei ntreruperi.
Avatajul folosirii wizardului din CodeVision AVR este c el genereaz cod pentru structura de mai
sus ,setrile micorcontrolerului putnd fi fcute vizual.De asemenea wizardul ofer i explicaii
referitoare la setrile pe care le-a realizat.

ncrcarea programului n microcontroler


Copierea programului n memoria flash a microcontrolerului se face cu ajutorul programului
PonyProg , program pe care putei s l descrcai de la seciunea Download.nainte de a deschide
programul i de a alimenta placa se vor face conexiunile ntre pinii microcontrolerului i pinii
programatorului dup schema urmtoare:

Pinii microcontrolerului la care va trebui s legai


pinii programatorului i vei putea gsi n schema de mai jos:

Dup cum vedem pinul PC6 trebuie legat la


RESET,PB5 la SCK,PB4 la MISO,PB3 la MOSI,+5V la tensiunea de alimentare iar GND la mas.

Dup ce ai fcut toate conexiunile urmeaz s conectm placa la portul serial.Acest lucru se face
printr-un cablu de legtur serial.Portul COM1 l gsii n spatele calculatorului el artnd cam aa:

Acum cnd toate conexiunile sunt fcute putei


alimenta placa i porni programul PonyProg.

Dup ce ai deschis programul va trebui s l


configurai pentru a putea face legtura serial cu placa.Pentru configurare megei n meniu la
Setup>Interface Setup.Aici selectai modul Serial i COM1(sau COM2 , depinde pe care dorii s l
folosii).
Acum c setrile sunt fcute urmeaz s copiem
programul nostru in memoria microcontrolerului.Mai nti va trebui s ncrcm codul n PonyProg
apsnd File>Open Program Flash File selectnd extensia *.hex i aleagnd fiierul din directorul
Exe corespunztor.Aici am folosit numele directorului Exe deoarece am presupus c programul a
fost compilat cu Code Vision AVR , el genernd codul ntr-un astfel de director.

Urmtorul pas este selectarea chip-ului pe care


vom ncrca programul.Aceast setare se face din bara plasat sub meniu.

n prima caset selectai AVR micro iar n a doua


Atmega8.nainte de ncrcare mergei n meniu la Command > Erase pentru a terge toate datele
din memoria microcontrolerului.
Operaia de ncrcare propriuzis pe chip se face tot din meiniu prin alegerea Command >Write All.

Porturile unui microcontroler sunt cele mai folosite dispozitive de schimb de


date cu exteriorul.Avantajul cel mare este c ele sunt paralele, putndu-se astfel
relaiza schimbul a mai multor bii de date simultan.n viziunea programatorului
porturile nu sunt altceva dect niste regitrii prin care se pot scrie i citi
date.Lungimea unui port este influenat de numrul de bii pe care procesorul i
poate executa la un moment dat.n cazul nostru, microcontrolerul ATMega8 este pe
8 bii deci i dimensiunea regitrilor va fi tot de 8 bii.De obicei unui port sunt
asociai 2 regitrii, unul care seteaz direcia pinilor iar altul care realizeaz
schimbul de date ntre unitatea central a microcontrolerului i exterior.
Microcontrolerului ATMega8 are asociat unui port 3 regitrii,DDR care seteaz
direcia pinilor,PORT care seteaz datele de ieire ale portului la nivel de pin i
PIN care memoreaz intrrile microcontrolerului la nivel de pin.Numrul porturilor
este tot 3 i sunt numite B,C i D.

http://invataelectronica.blogspot.md/2011/08/convertorul-analog-digitalad.html
Dac ne uitm pe schema general avem urmtoarea configuraie:

Pinii PB0-PB7 corespund portului B,PC0-P6 portului C iar PD0-PD7 portului


D.Observm c portul C are doar 7 intrri.Ei bine ultimul bit din regitrii asociai
portului nu este flosit.Pentru a v face o imagine mai bun asupra legturii dintre
pinii microcontrolerului i regitri asociai portului urmrii figura de mai jos:

Observm c pinului 0 i corespunde locaiei 0 a portului, pinului 1 locaiei 1 i


tot aa. n cazul de fa pinii sunt notai cu P, pentru portul B avem PB , pentru
portul C avem PC iar pentru portul D avem PD.
Pentru a exemplifica modul de configurare i de utilizare a porturilor din ATMega8
voi crea un exempu simplu n care vom avea setai primii 4 pini ai portului B ca
pini de intrare iar primii 4 pini ai portului C ca pini de ieire.La pinii de intrare vor
fi legate 4 butoane iar la pinii de ieire ai portului C vom lega 4 LED-uri.La
apsarea butoanelor vom dori ca led-urile corespunztoare butoanelor apsate s se
aprind.

Schema electric n Proteus a aplicaiei este urmtoarea:

Programul din memoria microcontrolerului nu va face alceva dect s preia


informaia de la portul B i s o transmit la portul C.
Pentru scrierea programului n CodeVision AVR procedai exat cum v-am artat
mai nainte la prezentarea general a programului ns la seciunea de setare
mergei la Ports>Port C i setai primii 4 bii de direcie ca n figura de mai jos apoi
dai din meniul File, Generate ,Save and exit:

Dup cum am mai spus, direcia pinilor se seteaz cu ajutorul registrului


DDR(Data Direction Register).Dac vei urmri n seciunea de setare a
programului la nceputul funciei main vei observa c DDRB =0x00,adic toi
pinii sunt setai ca intrare, iar DDRC = 0x0F, adic doar primii 4 pini sunt setai ca
ieiri, restul fiind setai ca intrri.Reprezentarea valorii 0x0F este o reprezentare n
hexazecimal i este echivalent cu 0b00001111 n binar i cu 15 n zecimal.
n bucla while,bucla de ciclare infinit, vom avea o singur linie care va transfera
datele de la intrarea portului B la ieirea portului C adic vom transfera coninutul
registrului PINB n registrul PORTC:PORTC = PINB;

Programul este gata putnd fi deja compilat.Pentru ncrcarea programului n


schema din Proteus dai dublu click pe micorocontroler.Ca rezultat vei deschide o
fereastr cu titlul Edit Component.Mergei la cmpul Program File i adugai
fiierul program.Acest fiier se gsete n locia n care ai salvat anterior proiectul
din Code Vision AVR, n directorul Exe.Dac compilarea codului a decurs normal
ar trebui s avei ca rezultat un fiier cu extensia *.hex.

Dac totul a decurs bine pn aici putei simula aplicaia fr nici o problem.La
apsarea butoanelor ar trebui s se aprind LED-urile corespunztoare.Fizic
aplicaia o putei vedea aici:

Urmtoarea aplicaie este ceva mai complex, ea avnd rolul simulrii unei
instalaii luminoase pentru pomii de crciun la care vom avea posibilitatea alegerii
unui program de funcionare prin apsarea unor butoane.De data asta vom folosi
tot portul B ca port de intrare la care vom lega la primii 4 pini, 4 butoane cu care
vom alege modul de funcionare iar ca port de ieire vom folosi portul D la pinii
cruia vom lega 8 LED-uri.Dac se apas primul buton, adic bitul 0 al registrului
PINB este 1 logic, vom avea modul 1 de funcionare,dac se apas butonul 2, adic
bitul 1 al registrului PINB este 1 logic,vom avea modul 2 de funcionare i tot aa
pn la butonul 4.Dac nu este apsat nici un buton se vor activa pe rnd toate cele
4 moduri.Dac se apas dou sau mai multe butoane nu se va ntmpla
nimic.Programul i schema electric le putei downloada de la seciunea
Download-Porturi-Aplicaie 2

Schema elecrtric a aplicaiei n Proteus va fi urmtoarea:

Pentru scrierea codului setai de data aceasta toi pinii portului D ca fiind pini de
ieire.
Pentru o lizibilitate mai buna a codului am ales s am cte o funcie pentru fiecare
mod de funcionare,funcii care sunt plasate naintea funciei main.Pentru modul 1
codul este urmtorulul:
void mod1(void)
{
PORTD = 0b00000001;
while(PORTD)
{
delay_ms(100);
PORTD = PORTD<<1;
}
}

La nceput iniializm PORTD-ul cu valoarea 0b00000001 deoarece dorim ca


primul led s fie aprins.Pentru ca al doilea LED s se aprind i s se sting primul
trebuie s mutm 1-ul de pe prima poziie pe poziia a doua.Acest lucru se face
prin codul PORTD = PORTD<<1 care reprezint iftare bitului 1.Dup execuia
primului ciclu while noua valoare a PODRTD-ului va fi 0b00000010.Pentru a v
face o idee cum funcioneaz funcia urmrii codul de mai jos:
Iniializare :PORTD = 0b00000001
Ciclu 1:PORTD = 0b00000010
Ciclu 2:PORTD = 0b00000100
Ciclu 3:PORTD = 0b00001000
Ciclu 4:PORTD = 0b00010000
Ciclu 5:PORTD = 0b00100000
Ciclu 6:PORTD = 0b01000000
Ciclu 7:PORTD = 0b10000000
Ciclu 8:PORTD = 0b00000000
Deoarece la ciclul 8 valoarea PORTD va fi 0 se va iei din ciclu while i totodat i
din funcia mod1.

Observm c aici apare o funcie pe care nu am avut ocazia s o folosesc mai


nainte i anume delay_ms.Aceasta are rolul de a ntrzia programul cu n
milisecunde, n cazul nostru 100 de milisecunde.Pentru a folosi aceast funcie
trebuie s includei librria delay.h.Probabil c v ntrebai de ce este nevoie de aa
ceva.Ei bine dac nu am avea un timp ntre schimbrile portului am vedea toate
LED-urile aprinse datorit vitezei mari de comutare.

Pentru modul 2 de funcionare codul este asemntor ns operaia de iftare se


face de la stnga la dreapta.

void mod2(void)
{
PORTD = 0b10000000;
while(PORTD)
{
delay_ms(100);
PORTD = PORTD>>1;
}
}

n modul 3 vom aprinde mai nti led-urile din mijloc (pinii 3 i 4), apoi vom
stinge led-urile din mijloc aprinznd led-urile urmtoare( pinii 2 i 5) i tot aa
pn la aprinderea led-urilor 1 i 8(pinii 0 i 7).

void mod3(void)
{
PORTD = 0b00011000;
delay_ms(100);
PORTD = 0b00100100;
delay_ms(100);
PORTD = 0b01000010;
delay_ms(100);
PORTD = 0b10000001;
delay_ms(100);
}

Modul 4 se va comporta exact invers modului 3,aprinznd ledurile din exterior spre
interior.

void mod4(void)
{
PORTD = 0b10000001;
delay_ms(100);
PORTD = 0b01000010;
delay_ms(100);
PORTD = 0b00100100;
delay_ms(100);
PORTD = 0b00011000;
delay_ms(100);
}

n bucla de ciclare infinit vom face o selecie a acestor 4 moduri n funcie de


butoanele pe care le-am apsat.

while(1)
{
switch(PINB)
{
//se apasa primul buton si se seteaza modul 1 de functionare
case 0b00000001:
mod1();
break;
//se apasa al doilea buton si se seteaza modul 2 de functionare
case 0b00000010:
mod2();
break;
//se apasa al treilea buton si se seteaza modul 3 de functionare
case 0b00000100:
mod3();
break;
//se apasa al patrulea buton si se seteaza modul 4 de functionare
case 0b00001000:
mod4();
break;
//daca nu s-a apasat nici un buton se vor parcurge toate cele 4 moduri
case 0b00000000:
mod1();
mod2();
mod3();
mod4();
//daca s-a apasat mai multe butoane nici un mod va fi activ
default:
PORTD = 0x00;
}
};

Pentru a vedea ce butoane au fost apsate trebuie s verificm pinii portului


B.Aceast verificare se face prin swhitch care verific valorile registrului
PINB.Dac s-a apsat butonul 1 vom avea valoarea 0b00000001 i se execut
funcia mod1,dac s-a apsat butonul 2 vom avea valoarea 0b00000010 i se
execut funcia mod2, i tot aa pn la butonul 4.Dac nu s-a apsat nici un
buton ,adic PINB = 0b00000000 atunci se vor executa pe rnd cele 4 funcii,iar
dac avem alt combinaie a registrului PINB valoarea lui PORTD va fi 0.
Testrile n funcionarea dispozitivului au fost efectuate n diverse spaii i ncperi din
jurul casei, cum ar fi ncperi de uscare a hainelor splate, baie, buctrie unde s-a verificat
comportamentul att la temperaturi pozitive ct i negative. Ca rezultat, dispozitivul a artat o
stabilitate bun n funcionare i o sensibilitate n limitile stabelite de caracteristicile
traductorului multifucional Aosong AM2302.
n procesul de testare, ca dispozitiv pentru mrirea temperaturii a fost utilizat un re ou
electric cu puterea de consum 1kW, iar pentru reglarea umidit ii a fost utilizat un ventilator cu
puterea de consum 300 W, care au artat o funcionare corect i stabil pe ntreaga perioad de
testare.
ntruct ca elemente de execuie n dispozitivul proiectat sunt utilizate releie, ce au att
contacte normal nchise ct i normal deschise, i sunt independente unul fa de altul, permite
posibiliti de utilizare a dispozitivului i n alte scopuri, inclusiv i alte regimuri de func ionare.
Un exemplu ar fi utilizarea ca element de rcire a ncperilor, dac este conectat la un sistem
frigorific de rcire. O alt posibilitate de reglare a umiditii prin utilizarea unei construc ii
improvizate constituit dintr-un motor ce posed numr redus ale toraiilor n funcionare, pe
axsa cruia este montat un disc ce are pe ambele suprafete lipit material din pinz. Motorul se
fixeaz astfel nct la rotirea disculului poziionat perpendicular ntr-un rezervor mic de ap, el va
spori procesul de vaporizare adic mrirea umiditii n spaiul propus.
n rezultat putem afirma cu siguran c un asemenea dispozitiv cu uurin -i v gsi
ntrebuinarea, att n condiii casnice, ct i n procesele tehnologice contemporare, aducnd doar
impact economic pozitiv i o satisfacere a confortului personal. Experiena pozitiv obinut la
proiectarea dispozitivului dat este o mativaie n plus pentru ncercarea de alte noi proiecte.
https://www.descurcareste.ro/tehnologie/reglator-de-temperatura-si-umiditate-274
http://www.multilab.ro/umidometre/umidometru_aer.html

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