Documente Academic
Documente Profesional
Documente Cultură
Caracteristici generale
Microcontrolerul AVR are la baz un procesor RISC cu o arhitectur Harvard (adic unitatea
central de procesare are memorie de program i memorie de date separate). Pe baza acestui nucleu
RISC firma Atmel a dezvoltat mai multe familii de microcontrolere, cu diferite structuri de memorie i
de interfee I/O, destinate diferitelor clase de aplicaii.
Aceste microcontrolere sunt destinate aplicaiilor simple cum ar fi: controlul motoarelor,
controlul fluxului de informaie pe portul USB, controlul accesului de la distan (Remote Access
Control), .a..
Microcontrolerele din familia AVR prezint o organizare de tip RISC din punctul de vedere al
execuiei unei instruciuni pe ciclu main. Prezena unor blocuri interne precum: oscilator intern,
timere, unitate UART (Universal Asynchronous Receiver/Transmitter), interfa SPI (Serial Peripheral
Interface), rezistoare pull-up, PWM (Pulse Width Modulation), convertoare analog-digitale,
comparatoare analogice determin utilizarea acestor microcontrolere ntr-o gam foarte larg de
aplicaii.
1
Specific arhitecturii Harvard, microcontrolerele AVR folosesc spaii de memorie i magistrale de
acces separate pentru coduri i pentru date. Memoria de program care este de tip FLASH integrat,
poate fi programat fr scoaterea din sistem, ceea ce permie efectuarea rapid de upgrade-uri n
programe.
Instruciunile acestei familii de microcontrolere au fost proiectate pentru a reduce dimensiunea
unui program scris n limbaj C sau n limbaj de asamblare. Posibilitatea programrii memoriei FLASH
i a memoriei EEPROM, determin ca aceste microcontrolere s aib o larg utilizare datorat costului
mic de dezvoltare a unei aplicaii (au timpul de proiectare scurt).
Aceste microcontrolere au consum redus de energie. Domeniul tensiunilor de alimentare este
cuprins ntre 1,8V i 5V. Prezint 6 moduri diferite de operare cu consum redus de energie, ceea ce ne
asigur c aceste microcontrolere nu vor consuma energie dect atunci cnd este nevoie.
Controlul software al frecvenei de tact garanteaz o vitez maxim de execuie atunci cnd este
nevoie, iar n restul timpului microcontrolerul poate trece n modul STANDBY, unde consumul de
energie este minim. Utilizarea acestor microcontrolere poate reduce semnificativ timpul de dezvoltare a
unei aplicaii datorit prezenei unui bloc de depanare n timp real, circuitul aflndu-se chiar pe plac.
Printre cele mai utilizate microcontrolere de uz general putem aminti: ATMEGA 8, ATMEGA
16, ATMEGA 128, ATMEGA 162, etc..
Microcontrolerele din familia AVR pot fi att microcontrolere de uz general, ct i
microcontrolere cu funcii specializate, mprindu-se n urmtoarele categorii:
1. Familia TINY AVR cuprinde microcontrolere destinate unor aplicaii simple, cu 1 8 KB
memorie de program.
2. Familia MEGA AVR cu un set dezvoltat de instryciuni i cu 4 256 KB memorie de
program.
3. Familia XMEGA AVR destinat unor aplicaii complexe. Acestea au uniti DMA
(Direct Access Memory), module pentru criptare, .a. i folosesc un spaiu de memorie de
program de 16 384 KB.
4. Microcontrolere AVR destinate unor aplicaii specifice, care se mpart n mai multe
categorii:
4.1. LIGTHING AVR: microcontrolere ce conin un procesor de semnal, fiind special
conceput pentru controlul motoarelor de curent continuu.
4.2. LCD AVR: microcontrolere ce conin un controler pentru adresarea dispozitivelor LCD
4.3. CAN AVR: microcontrolere ce conin o interfa CAN implementat hardware.
Microcontrolerele din familia AVR de 8 bii au un set de 131 instruciuni i 32 de registre de uz general.
Cele 32 de registre sunt direct adresabile de unitatea aritmetic i logic (UAL), permind accesarea a
dou registre independente ntr-o singur instruciune. Astfel se obine o eficien sporit n execuie,
fiind de pn la zece ori mai rapide dect microcontrolerele convenionale de tip CISC.
Microcontrolerul ATMEGA 16
2
- un cronometru cu oscilator intern;
- ofer 32 de linii I/O organizate n patru porturi (PA, PB, PC, PD) cu 8 bii fiecare;
- are o magistral general de date la care sunt conectate mai multe module i anume: unitatea
aritmetic i logic (UAL), registrele generale, memoria RAM i memoria EEPROM, liniile de
intrare (adic porturile) i celelalte blocuri de intrare/ieire. Aceste ultime module sunt controlate de
un set special de registre, fiecare modul avnd asociat un numr de registre specifice.
- memoria FLASH de program mpreun cu ntreg blocul de extragere a instruciunilor, de decodare
i de execuie comunic printr-o magistral proprie, separat de magistrala de date menionat mai
sus. Acest tip de organizare este conform principiilor unei arhitecturi Harvard i permite
microcontrolerului s execute instruciunile foarte rapid.
n modul POWER DOWN se salveaz coninutul registrelor, dar se blocheaz oscilatorul,
dezactivndu-se toate celelalte funcii ale chip-ului pn la urmtoarea ntrerupere extern sau la
urmtorul RESET hardware. n modul POWER SAVE, timer-ul asincron continu s mearg n timp ce
restul dispozitivelor sunt oprite. n modul STANDBY, oscilatorul funcioneaz, n timp ce restul
despozitivului este oprit. Acest lucru permite un start foarte rapid combinat cu un consum redus de
energie, iar n modul STANDBY EXTINS (Extended Standby Mode), att oscilatorul principal ct i
timer-ul asincron continu s funcioneze.
ATMEGA 16 AVR este susinut de o serie complet de instrumente de program i de
dezvoltare a sistemului, care include: compilatoare C, macroasambloare, programe de debbug/simulare,
.a..
3
Port C (PC7PC0)
Portul C este un port I/O de 8 bii bidirecional cu rezistori interni (opionali), poate ndeplini i functii
ale interfeei JTAG (de depanare), ct i alte funcii speciale ale microcontrolerului ATMEGA 16.
Buffer-ele de ieire ale portului C au caracteristici de amplificare. Dac interfaa JTAG (de depanare)
este activat, rezistorii pinilor PC5(TDI), PC3(TMS) i PC2(TCK) vor fi activai, chiar dac are loc o
resetare.
Port D (PD7PD0)
Portul D este un port I/O de 8 bii bidirecional cu rezistori interni conectai opional la sursa de curent
Vcc (selectai pentru fiecare bit), dar poate ndeplini i functii speciale ale microcontrolerului
ATMEGA 16. Buffer-ele de ieire ale p ortului D au caracteristici de amplificare.
RESET - Un nivel sczut la acest pin mai mare ca durat dect o valoare prestabilit, va genera o
iniializare.
XTAL 1 - reprezint intrare pentru amplificatorul inversor al oscilatorului.
XTAL 2 - reprezint ieire pentru amplificatorul inversor al oscilatorului.
AVCC - este pinul de alimentare pentru portul A i convertorul A/D. Trebuie conectat extern la Vcc,
chiar dac convertorul analog-digital nu este folosit. Dac convertorul analog-digital este folosit, ar
trebui conectat la sursa de curent Vcc printr-un filtru trece-jos.
Funcia principal a nucleului unitii centrale de prelucrare (UCP) este aceea de a asigura
execuia corect a programului. Din acest motiv, nucleul UCP este capabil s acceseze memoriile, s
execute calcule, s controleze perifericele i s prelucreze ntreruperile.
4
Pentru a maximiza performana, AVR folosete o arhitectur Harvard cu memorii i magistrale
separate pentru program i date. Instruciunile din memoria programului sunt executate ntr-un singur
nivel n timp ce o instruciune este executat i urmtoarea este adus de la memoria de program. Acest
concept permite executarea instruciunilor la fiecare ciclu de ceas. Memoria de program este o memorie
de tip FLASH reprogramabil.
Registrele la AVR sunt n numr de 328 bii fiecare, scopul acestor microcontrolere fiind acela
de a accesa registrele ntr-un singur ciclu de ceas. Acest singur timp de acces se datoreaz unitii
aritmetice i logice (UAL=Unitatea Aritmetic i Logic). ntr-o unitate aritmetic i logic operaia are
loc astfel: operanzii sunt scoi din registru, se efectueaz operaia i rezultatul este introdus n regitri,
toate acestea fiind executate ntr-un singur ciclu de ceas. ase din cele 32 de registre pot fi folosite ca
trei registre de 16 bii cu acces indirect la informaii, permind astfel calcularea eficient a adresei. Una
dintre aceste adrese poate fi folosit pentru a cuta tabele n memoria de program.
Unitatea aritmetic i logic efectueaz (suport) operaii aritmetice i logice ntre registre sau
ntre o constant i un registru. Dup efectuarea unei operaii aritmetice registrul afieaz rezultatul
operaiei.
Programul furnizeaz salturi condiionate, necondiionate i apelri de instruciuni capabile s
acceseze tot spaiul de adres. Majoritatea instruciunilor AVR sunt formate dintr-un cuvnt de16 bii.
Spaiul memoriei de program (FLASH) este mprit n dou seciuni, seciunea BOOT i
seciunea de aplicare a programelor. Seciunea BOOT are bii speciali pentru protecia la scriere i
citire/scriere. De exemplu i nstruciunea SPM cu ajutorul creia se scrie n memoria FLASH
aplicaii trebuie s fie n seciunea BOOT.
n timpul ntreruperilor sau a apelrii subrutinelor, adresa de ntoarcere este coninut n stiv.
Stiva este efectiv alocat n informaiile generale SRAM i n consecin mrimea ei este limitat doar
de mrimea total a SRAM i de uzura ei. Toi utilizatorii de program trebuie s iniializeze
indicatorul de stiv SP (Stack Pointer) nainte ca subrutina sau ntreruperea s fie executat. SP se poate
citi/scrie n spaiul de I/O. Informaiile din SRAM pot fi accesate cu uurin prin cele cinci moduri
diferite de adresare suportate de arhitectura AVR.
Spaiile de memorie n arhitectura AVR sunt liniare i normale.
Modulele ntreruperilor au registrele de control n spaiul I/O i n Registrul STATUS se afl
bitul de ntreupere global. Toate ntreruperile au prioritate n funcie de locul ocupat n tabelul de
vectori de ntrerupere. Cu ct este mai jos situat n tabel vectorul de ntrerupere cu att acea ntrerupere
are prioritate mai mare. Prioritatea mai mare o are ntreruperea cu vectorul cel mai slab plasat n tabel.
Spaiul de memorie I/O conine 64 de adrese pentru funciuni periferice ale UCP precum:
controlul registrelor, indicatorul SPI sau alte funcii de I/O. Memoria I/O poate fi accesat direct sau
indirect.
5
Figura 6 - Instruciuni paralele de execuie
Figura 7 ne arat timpul de lucru cu registrele. ntr-un singur ciclu de ceas o operaie a UAL
folosete 2 registre pentru a executa calculul respectiv, iar rezultatul este stocat napoi n registrul de
destinaie.
ntreruperile sunt un mecanism de control al fluxului care este implementat n aproape toate
microcontrolerele. n sistemele cu procesor care interacioneaz cu alte componente, multe lucruri se
ntmpl asincron, de exemplu, utilizatorul poate apsa un buton pentru face o aciune, n timp ce pe
portul serial urmeaz s soseasc un octet. Ar fi imposibil pentru procesor s poat urmri toate
evenimentele doar prin interogarea acestor dispozitive. De aceea, ar fi mai bine dac aceste dispozitive
i-ar putea anuna sosirea unei date. Asta este ceea ce face mecanismul de ntreruperi. Dispozitivele
periferice pot ntrerupe execuia programului principal, i procesorul se oprete din execuia
programului pentru a examina sursa ntreruperii i pentru a executa task-urile necesare. Dup ce aceste
task-uri au fost finalizate, execuia programului ntrerupt este reluat. ntreruperile sunt implementate ca
subrutine de program.
MC AVR are o structur de ntreruperi bogat. Aproape toate dispozitivele periferice au fost
dotate cu capaciti de ntrerupere, de aceea programul principal nu trebuie s verifice periodic aceste
dispozitive.
O secven de evenimente care se deruleaz cnd apare o ntrerupere este urmtoarea:
1. Dispozitivul periferic ntrerupe procesorul
2. Executia instruciunii curente este finalizat
3. Adresa urmtoarei instruciuni este memorat n stiv (stiva poate fi hardware sau
software)
4. Adresa ISR (Interrupt Subroutine) este ncrcat n program.
5. Procesorul execut ISR-ul.
6. Terminarea execuiei ISR este indicat de instruciunea RETI (Return from Interrupt)
7. Procesorul reia execuia programului normal de la valoarea memorat n stiv.
Deoarece ntreruperile pot apare n orice moment, starea procesorului trebuie salvat pentru ca
execuia normal a programului s poat fi reluat dup ce ISR este finalizat. Starea n care este
procesorul se afl n registrul SREG. Instruciunea ISR trebuie s salveze registrul SREG nainte de a
executa orice alt operaie i, nainte de a returna controlul ctre programul principal, SREG trebuie
restaurat. Aceast operaie poate fi fcut n dou moduri:
1. SREG este copiat ntr-un alt registru, de exemplu R1, care nu poate fi folosit pentru orice
alta operaie, i nainte ca ISR s execute instruciunea RETI, R1 este copiat napoi n SREG.
2. SREG este salvat n stiv (folosind instruciunea PUSH SREG) i nainte de execuia
instruciunii RETI, SREG este copiat napoi din stiv (folosind instruciunea POP SREG).
Aceast metod este posibil doar pentru procesoarele care au stiv software.
Microcontrolerul AT90S1200, de exemplu, nu poate folosi aceasta metoda pentru salvarea
SREG.
6
n mod normal, dup ce a intervenit o ntrerupere i a fost executat prin adresa corespunztoare
ISR, ntreruperile globale sunt dezactivate automat (echivalent cu execuia instruciunii CLI); oricum,
este posibil s se activeze ntreruperile n timp ce un ISR este executat, executnd instruciunea SEI n
ISR. Dac o alt ntrerupere apare n timp ce un ISR este deja n execuie, atunci aceasta este acceptat
prin ntreruperea primului ISR.
Prioritatea ntreruperilor este stabilit de ordinea n care sunt memorate n tabelul de ntreruperi.
Vectorul de ntreruperi de la o adres joas din memorie are prioritate mare. Prioritatea ntreruperilor
este folosit pentru a decide care ntrerupere este servit prima, dac mai multe ntreruperi sunt active n
acelai moment de timp.
Un factor important de luat n seam cnd sunt folosite ntreruperile este ct de repede poate
rspunde un procesor la o ntrerupere. Aceasta depinde de arhitectura procesorului. Pentru
microcontrolerele AVR, rspunsul la ntreruperi se face n minim 4 cicli dup ce flag-ul de ntreruperi a
fost setat, iar rutina pentru ntreruperi excutat. n timpul celor 4 cicli, Program Counter (este pe 2
octei) este introdus n stiv, i Stack Pointer este decrementat cu 2.
MC AVR furnizeaz mai multe tipuri de ntreruperi. Aceste ntreruperi i vectorul de resetare au
cte un vector de program fiecare aflat n spaiul memoriei de program. Tuturor ntreruperilor le sunt
alocate individual bii care trebuie scrii logic o dat cu bitul GIE (Global Interrupt Enable) n registrul
de stare cu scopul de a permite ntreruperea. n funcie de starea n care se afl PC (Program Counter),
ntreruperile pot fi invalidate, atunci cnd Boot Loader-ul este programat. Aceast tehnic
mbunattete securitatea.
Cele mai joase adrese din memoria de program sunt definite ca vectori de resetare i ntrerupere.
n funcie de list se determin i nivelurile de prioritate ale diferitelor ntreruperi. Cu ct ntreruperea
are nivelul mai jos, cu att prioritatea este mai mare. RESET are cea mai mare prioritate, iar dup
aceasta este INT0 - cererea de ntrerupere extern 0. Vectorii de ntrerupere pot fi mutai la nceputul
seciunii Boot Flash prin setarea bitului IV SEL din registrul global de control al ntreruperilor (GICR).
Vectorul de RESET poate fi, de asemenea, mutat la nceputul aceleiai seciuni prin programarea
seciunii BOOTRST.
Cnd apare o ntrerupere, bitul GIE (bitul I de ntrerupere) este ters i toate ntreruperile sunt
invalidate. Utilizatorul de software poate scrie 1 logic n bitul I pentru a permite executarea
ntreruperilor. Toate ntreruperile permise pot, la rndul lor, ntrerupe ntreruperile de rutin. Bitul I este
automat corectat cnd instruciunea RETI este executat.
Practic sunt dou tipuri de ntreruperi:
1. Primul tip este declanat de evenimentele care seteaz indicatorul de ntrerupere. Pentru
aceste ntreruperi PC este trimis la vectorii de ntrerupere n scopul executrii ntreruperilor de
rutin i hardware-ul terge indicatorul de ntrerupere corespunztor. Indicatorul de ntrerupere poate
fi ters i prin scrierea cu 1 logic. Dac se ntmpl o ntrerupere n timpul n care bitul care permite
ntreruperea este ters, atunci indicatorul de ntrerupere va fi setat s rein ntreruperea pn cnd
aceasta va putea fi permis sau indicatorul este ters de software. n caz similar se procedeaz atunci
cnd este vorba de tergerea indicatorului GIE.
2. Cel de-al doilea tip de ntreruperi este dat atta timp ct condiia de ntrerupere este
prezent. Aceste ntreruperi nu au neaprat indicator de ntrerupere. Dac condiia de ntrerupere
dispare nainte ca ntreruperea s fie permis, ntreruperea nu va mai fi executat. Cnd AVR iese dintr-
o ntrerupere se ntoarce la programul principal i mai execut o dat instruciunile nainte de a interveni
alt ntrerupere. Starea registrului nu este automat stocat cnd apare o ntrerupere de rutin, nici cnd
revine din ntreruperea de rutin. Acesta trebuie susinut de software.
Saltul execuiei programului la rutina de ntrerupere consum doi cicli. Dac o ntrerupere apare
n timpul unei instruciuni multiciclu, aceast instruciune este finalizat nainte de a fi servit
ntreruperea. ntoarcerea de la o rutin de ntrziere dureaz ali 4 cicli. n timpul acestor 4 cicli,
Program Counter (cuvnt - 16 bii) este scos din stiv, Stack Pointer este incrementat cu 2, i bitul I din
registrul SREG este setat. Cnd microcontrolerele AVR ies dintr-o ntrerupere, ntotdeauna se vor
ntoarce la execuia programului principal i va executa cel puin o nou instruciune nainte de a fi
acceptat o nou ntrerupere.
7
De exemplu:
1. Cnd se folosete instruciunea CLI (Clear Interrupt) pentru invalidarea ntreruperilor,
ntreruperea va fi invalidat imediat. Nici o ntrerupere nu va mai fi executat dup
acionarea instruciunii CLI, chiar dac se ntmpl simultan cu instruciunea CLI.
2. Cnd se folosete instruciunea SEI (Set Interrupt) pentru a permite ntreruperi,
instruciunea SEI este rulat naintea oricrei instruciuni aflate n ateptare.
Cea mai mare performant a UAL a MC AVR este aceea c lucreaz direct cu cele 32 de
registre. n timpul unui singur ciclu de ceas se efectueaz operaii aritmetice ntre registre sau ntre
registre i o constant, acestea fiind executate imediat. Operaiile pe care le execut UAL sunt
mprite n trei mari categorii: aritmetice, logice i operaii pe bit. Unele implementri ale arhitecturii
pot efectua i multiplicri cu sau far semn i/sau n regim de fracie. Mai multe detalii se gsesc n
subcapitolul Setul de Instruciuni.
Registrele de uz general
Fiierul de registre este optimizat pentru setul de instruciuni al arhitecturii AVR RISC. MC
AVR folosesc un set de 32 de registre de uz general de 8 bii fiecare (notate R0 R31) care pot fi
accesate ntr-un singur ciclu de tact. Structura setului de registre de uz general este prezentat n figura
9. Aa cum se vede i n figura 9, fiecrui registru i se atribuie i o adres de memorie,
localizndu-l direct n cele 32 de locaii, adic fiecare registru are o adres n spaiul memoriei de date
permind astfel o adresare uniform.
Observaie: Doar registrele R16 R31 pot stoca operanzi imediai.
Majoritatea instruciunilor care folosesc fiierul de registre au acces direct la toate registrele i
marea lor majoritate sunt instruciuni care se execut ntr-un singur ciclu de tact. ase din cele 32 de
registre (R26 R31) pot fi folosite ca trei registre de 16 bii pentru stocarea unor pointeri folosii la
adresarea indirect a datelor. Cele trei registre pentru adresarea indirect sunt denumite registrele X,Y,Z.
Registrele X, Y, Z
Registrele R26 R31 au cteva funciuni adugate pe lng cele generale. Aceste registe au 16
bii i se folosesc pentru accesarea indirect a datelor. Cele trei registre pentru adresarea indirect sunt
regitrele X, Y, Z care sunt descrise n figura 10 de mai jos.
8
Figura 10 Registrele X, Y, Z
Registrele generale 26, 27, 28, 29, 30 i 31 pot fi utilizate cu denumiri specifice i anume:
R26 registrul X octet inferior; R27 registrul X octet superior;
R28 registrul Y octet inferior; R29 registrul Y octet superior;
R30 registrul Z octet inferior; R31 registrul Z octet superior;
Registrul de stare conine informaii despre ultima operaie aritmetic efectuat. Aceast
informaie poate fi folosit pentru a reveni (a alterna) de la program la executarea unei alte operaii mai
prioritar. Situaia registrului este actualizat dup fiecare execuie a unei operaii aritmetice. Aceasta
poate duce n multe cazuri la nefolosirea concret a fiecrei instruciuni n parte, ci a unui cod mai
compact de instruciuni care efectueaz mai rapid operaia.
Valorile din registrul de stare nu sunt automat stocate cnd apare o ntrerupere de rutin i mai apoi
restaurate cnd se ntoarc la program. Acest lucru trebuie manipulat de program.
Registrul de stare (Status Register) la MC AVR este definit ca mai jos:
unde:
Bitul 7-I (Global Interrupt Enable - GIE) (ntreruperi Globale Permise) trebuie s fie setat pentru
ca ntreruperile s fie permise. Controlul ntreruperilor individuale se face dintr-un registru separat. Dac
GIE este ters niciuna dintre ntreruperile individuale nu sunt permise independent. Bitul I este ters de
hard dup ce s-a ivit o ntrerupere i este corectat de insttructiunea RETI (return from interrupt) pentru
a permite accesul unei subsecvente la ntreruperi. Bitul I poate deasemenea sa fie fixat i ters de
aplicatie cu ajutorul instructiunilor SEI i CLI aa cum sunt descrise n Setul de Instructiuni
Bitul 6-T (Bit Copy Storage BCS) (bitul copiere-depozitare stocare) Instructiunile la nivel de bit
pentru copiere BLD (Bit LoaD-bit de incrcare) i memorare BST (Bit Store-bit de stocare) folosesc
bitul T ca surs sau destinatie pentru bitul actionat. Un bit dintr-un registru poate fi copiat n T cu
ajutorul instructiunilor BST, i un bit din T poate fi copiat n registru cu ajutorul instructiuni BLD.
Bitul 5-H (Half Carry Flag HCF) (Indicator de transport la jumatate) Acesta indic transportul
la jumatate n cazul unor operatii aritmetice. Jumatate de transport este folosit n aritmetica BCD
(binary-coded decimal). Pentru informatii detaliate a se vedea Setul de Instructiumi.
Bitul 4-S - Sign Bit (bitul de semn) Acest bit este un sau exclusiv ntre flag-ul indicator de negativ N
si bitul de depire V.
Bitul 3-V Twos Complement Overflow Flag Bitul indicator de depasire memorie
Bitul 2-N Negative Flag (indicatorul negativ) Indicatorul negativ indic un rezultat negativ n
cadrul operatiilor aritmetice sau logice
9
Bitul 1 Z Zero Flag (indicator de zero) Indicator de zero este setat atuci cand rezultatul unei
operatii logice sau aritmetice este nul.
Bitul 0- Carry Flag (indicatorul de transport) Indicatorul de transport indic transport n cadrul
operaiilor logice sau aritmetice.
Stiva
Stiva este folosit n principal pentu nmagazinarea temporar a datelor, dar i pentru
nmagazinarea variabilelor locale i pentru redarea adreselor dup efectuarea ntreruperilor sau a
subrutinelor. Informaia care este pus n stiv este pus ntotdeauna deasupra celorlalte deja existente.
Stiva este implementat pentru a trece de la locaii de memorie superioare la locaii de memorie
inferioare.
Indicatorul de stiv (SP) indic spatiul de date din memoria SRAM a stivei unde sunt localizate
ntreruperile i subrutinele. Acest spaiu trebuie definit de program nainte de a se executa vreo
subrutin sau ntrerupere. Indicatorul de stiv (SP) este decrementat cu 1 cnd se introduc alte date n
stiv cu ajutorul instruciunii PUSH, i decrementat cu 2 cnd adresele de revenire la program sunt
introduse n stiv cu subrutinele sau cu instruiunile CALL sau GOTO. Indicatorul de stiv este
incrementat cu 1 cnd datele sunt terse din stiv cu instruciunea POP, i incrementat cu 2 cnd datele
sunt scoase din stiv i se revine din subrutin cu instruciunea RET sau din ntrerupere cu instruciunea
RETI.
Indicatorul de stiv la MC AVR este implementat ca fiind format din dou registre de 8 bii.
Numrul de bii folosii depinde de necesitatea implementrii. Spaiul de adrese la unele implementri
ale arhitecturii AVR sunt aa de mici nct nu este necesar dect SPL-ul (SP Low). n acest caz registrul
SPH (SP High) nu mai este utilizat.
10
Memoria de date SRAM
Figura 12 arat cum este organizat memoria SRAM la MC AVR - ATmega 16.
Memoria de date SRAM este organizat pe octei. Primele 96 de locaii sunt rezervate fiierului
de registre, iar urmtoarele 1024 de locaii sunt dedicate memoriei SRAM interne. Din fiierul de
registre fac parte cele 32 registre de uz general, iar restul de 64 de locaii sunt rezervate registrelor
asociate dispozitivelor de I/O.
Memoria SRAM are o capacitate cuprins ntre 128B i 4KB n funcie de tipul particular al
microcontrolerului. Este accesat cu instruciuni de acces att direct, ct i indirect, folosind un registru
pointer. Este folosit, de asemenea, i pentru constituirea stivei. Accesul la memoria SRAM se face n
dou perioade de tact.
Observaie: La microcontrolerele AVR performante este posibil conectarea unei memorii SRAM
externe.
Biii 9 15 sunt bii rezervai n cazul MC ATmega 16 i vor lua ntotdeauna valoarea 0.
11
Biii 0 8 sunt bii de adresare (total 9 bii, deci se adreseaz 0.5 KB)
Registrele de adres de mai sus, EEARH i EEARL specific adresa datelor din EEPROM
pentru cele 512 locaii ale spaiului EEPROM. Locaiile de memorie se adreseaz liniar de la 0 la 511.
Pentru operaia de scriere a EEPROM, registrul EEDR conine date care s fie scrise n EEPROM la
adresa dat de registrul EEAR. Pentru operaia de citire a EEPROM, EEDR conine date citite de pe
EEPROM la adresa dat de EEAR.
Toate I/O de la ATmega 16 i perifericele sunt plasate n spaiul registrelor I/O. Locaiile I/O
sunt accesate de ctre comenzile IN i OUT, transfernd datele dintre cele 32 de registre de lucru i
spaiul I/O. Registrele I/O cuprinse ntre valorile adreselor $00 $1F sunt direct accesabile folosind
comenzile SBI i CBI. La aceste registre valoarea biilor unici poate fi verificat utiliznd comenzile
SBIS i SBIC.
Cnd se utilizeaz instruciunile specifice IN i OUT, trebuie folosite adresele I/O din zona
$00 $3F. Cnd se adreseaz/acceseaz registrele I/O ca spaiu de date cu instruciunile LD i ST,
trebuie adugat, la aceste adrese, valoarea $20, adic un salt peste zona registrelor de uz general.
ATmega16 dispune de 32 de linii de I/O grupate n patru 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 urmtoare 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.
12
Observaie: n scopul realizrii performanei i flexibilitii cerute, porturile de I/O sunt implementate n
fiierul de registre.
Operaiile cu porturile se fac prin intermediul unui set de 3 registre alocate fiecrui port: PORTx,
PINx i DDRx; unde x poate fi A, B, C sau D. Aceste registre fac parte din categoria registrelor de
intrare/ieire i pot fi accesate cu instruciunile care pot lucra direct cu ele: CBI, SBI, IN i OUT.
Registrele DDRx stabilesc dac un pin este intrare sau ieire. Astfel, un bit cu valoarea 1 n
registrul DDRx face ca pinul corespunztor s fie considerat ieire; altfel pinul va fi intrare. Registrele
PORTx sunt utilizate pentru a scrie o valoare n portul corespunztor, iar registrele PINx se folosesc
pentru a citi valoarea prezent pe pinii unui port. Activarea sau dezactivarea rezistenelor pull-up este
determinat de bitul PUD din registrul SFIOR i de valorile registrelor PORTx i DDRx, aa cum se
poate observa n tabelul urmtor.
Toate porturile AVR au funcia Citete Modific Scrie atunci cnd sunt folosite ca porturi
I/O digitale generale. Asta nseamn c direcia unui pin poate fi schimbat fr a schimba n mod
intenionat direcia oricrui alt pin cu comenzile SBI i CBI. Aceeai regul se aplic cnd se schimb
valoarea drive-ului (dac este configurat ca ieire) sau a activrii/dezactivrii rezistorilor (dac sunt
configurai ca intrare). Fiecare buffer de intrare are caracteristici similare de drive att cu capacitatea
sursei ct i cu sincronizarea. Driver-ul pinului este ndeajuns de puternic ca s activeze displayul LED
direct. Toi pinii au rezistori care pot fi selectai individual cu o surs suplimentar de tensiune cu
rezisten invariabil. Toi pinii I/O au diode de protecie att la tensiunea de alimentare n curent
continuu (Vcc), ct i la mpmntare, aa cum este indicat n figura de mai jos :
13
Toate registrele i referinele de bit din aceast seciune sunt scrise n form general. Un x mic
reprezint litera care denumete portul i un n mic reprezint numrul bitului. Cnd se utilizeaz
registrul sau biii ntr-un program, trebuie s fie folosit forma exact. Adic, PORTB3 pentru bitul
numrul 3 n Portul B, prezentat general ca PORTxn. Trei locaii de adrese de memorie I/O sunt alocate
pentru fiecare port:
- una pentru fiecare registru de date - PORTx,
- registrul direciei datelor DDRx,
- port de intrare PINx.
Locaia pinilor de intrare este read-only, n timp ce registrul de date i DDR sunt read-write. n
plus, bitul PUD (dezactivare pull-up) din SFIOR dezactiveaz funcia pull-up pentru toi pinii din toate
porturile cnd este setat.
Majoritatea pinilor au funcii alternative pentru caracteristicile periferice ale dispozitivului.
Observaie: activarea funciilor alternative ale unor pini nu afecteaz utilizarea altor pini ca port de I/O
general digital.
2. Unitile timer/numrtor
ATMEGA 16 are dou uniti timer/numrtor de 8 bii i o unitate timer/numrtor de 16 bii.
Principalele caracteristici ale acestor module sunt:
- Posibilitatea de alegere a frecvenei de tact de la intrarea timerelor (circuit de prescalare);
- Posibilitatea de citire/scriere a strii numrtoarelor;
- Generarea de forme de und prin folosirea unui registru de comparare;
- Generarea de unde PWM cu posibilitatea de reglare a frecvenei;
- Generarea de cereri de ntrerupere la intervale regulate;
- Posibilitatea declanrii la un eveniment extern (captur a intrrii).
Principalele caracteristici ale unitii timer/numrtor de 16 bii sunt:
- PWM de 16 bii;
- Dou uniti independente de comparare a ieirilor;
- Unitate de captur a intrrii;
- Un atenuator de zgomot pe intrare;
- tergerea cronometrului la potrivirea comparrii (autorencrcare);
- Puls de corectare a fazelor cu modulator (PWM);
- Perioada PWM variabil;
- Generator de frecven;
- Numrtor extern de evenimente;
- Patru surse de ntrerupere independente.
Unitile timer/numrtor fac posibil cronometrarea precis a execuiei programului
(managementul evenimentelor), generarea de forme de und i msurarea intervalelor de timp.
14
4. Interfaa SPI (Serial Peripheral Interface)
Interfaa de comunicaie SPI asigur transferul rapid sincron de date ntre microcontroler i
dispozitive periferice sau microcontroler i alte microcontrolere AVR.
15
SETUL DE INSTRUCIUNI al MC AVR
MC AVR au un set de 131 instruciuni codate cu 16 sau cu 32 bii. Pentru accesarea datelor
instruciunile folosesc mai multe moduri de adresare. Diferitele instruciuni ale MC AVR pot fi
mprite n aproximativ 10 moduri de adresare diferite. Fiecare instruciune are un cod care indic
procesorului ce s fac. Cealalt parte a instruciunii este operandul, cu care lucreaz codul.
Instruciunile registru direct simplu pot lucra cu oricare dintre cele 32 de registre de uz
general. Acestea citesc coninutul unui registru, lucreaz cu coninutul acestuia i apoi stocheaz
rezultatul operaiei napoi n registru.
Formatul acestor instruciuni este: Registre Destinaie
Exemple de astfel de instruciuni pot fi cele de mai jos, unde RD poate fi orice registru,
considerat ca fiind att surs, ct i destinaie n cadrul instruciunii.
n instructiunile registru direct dublu sunt implicate dou registre. Cele dou registre sunt
denumite registrul surs - RS i registru destinaie - RD. Instruciunea citete cele dou registre i
lucreaz cu coninutul lor, stocnd informaia n registrul destinaie.
Exemple de instruciuni:
ADD RD, RS
SUB RD, RS
AND RD, RS
MOV RD RS
OR RD, RS
2. Instruciunile I/O directe sunt folosite pentru a accesa spaiul de intrare-ieire. Registrele I/O
pot fi accesate doar utiliznd aceste instruciuni:
IN RD PORTADDRESS;
OUT PORTADDRESS RS;
unde RD i RS pot fi oricare dintre cele 32 de registre de uz general, iar registrele I/O pot fi oricare din
registrele din gama cuprins ntre 00 i 3F (un total de 64 de registre I/O).
3. Instruciuni de lucru direct cu datele - au mrimea de 2 cuvinte (32 bii). Un cuvnd este
ocupat de adresa spaiului de memorie. Aadar un maxim de date de memorie de 64 KB poate fi accesat
folosind unul dintre aceste tipuri de instruciuni.
Exemple de instruciuni:
16
LDS RD, K ; citete o dat din memoria SRAM de la adresa K
STS K, RS ; memoreaz direct valoarea din RS la adresa K n memoria SRAM
Exemple de instruciuni:
LD Rd, X ; ncarc n registrul Rd valoarea de la adresa indicat de pointerul X
LD Rd, X+ ; ncarc n registrul Rd valoarea de la adresa indicat de pointerul (X+1)
ST X, Rs ; memoreaz n registrul Rs valoarea de la adresa indicat de pointerul X
ST X+ ,Rs ; memoreaz n registrul Rs valoarea de la adresa indicat de pointerul (X+1)
Exemplu: OR R1 , R2
MUL Rd, Rs. nmulire fr semn ntre Rd i Rs. Rezultatul este memorat n R1:R0
17
R1:R0 = Rd x Rs
Flag-urile afectate: : Z, C
Cicli de ceas: 2
Exemplu: MUL R2 , R1
6. Instruciuni de salt
Exemplu:
RJMP OK;
NOT_OK: ADD R1 , R5;
OK : INB R1;
Exemplu:
LDI R30, ADD_LOW
LDI R30, ADD_HIGH;
IJMP;
Exemplu:
JMP go_far;
:
:
go_far;
Exemplu:
LDI R30 FARSUB_LOW;
LDI R31 FARSUB_HIGH;
ICALL;
18
Cicli de ceas: 4/5
Exemplu:
:
:
POP SREG;
RET;
Exemplu:
:
:
POP SREG;
RETI;
LD Rd, X; ncarc indirect. Rd = memoria de date (X), unde X este registrul pointer pereche R26;
Flag-urile afectate: Niciunul
Cicli de ceas: 2
19
Exemplu: LD R2, X;
LD Rd, X+; ncarc indirect. Rd = memoria de date (X), unde X =X + 1 este registrul pointer pereche
R26:R27 ;
Flag-urile afectate: Niciunul
Cicli de ceas: 2
LD Rd, -X; ncarc indirect. Rd = memoria de date (X), unde X =X - 1 este registrul pointer pereche
R26:R27 ;
Fag-urile afectate: Niciunul
Cicli de ceas: 2
LD Rd, Y; ncarc indirect. Rd = memoria de date (Y), unde Y este registrul pointer pereche R28:R29 ;
Flag-urile afectate: Niciunul
Cicli de ceas: 2
Exemplu: LD R1, Y;
LD Rd, Y+; ncarc indirect. Rd = memoria de date (Y), unde Y =Y + 1 este registrul pointer pereche
R28:R29 ;
Flag-urile afectate: Niciunul
Cicli de ceas: 2
LD Rd, -Y; ncarc indirect. Rd = memoria de date (Y), unde Y =Y - 1 este registrul pointer pereche
R28:R29 ;
Fag-urile afectate: Niciunul
Cicli de ceas: 2
8. Instruciuni pe bii
20
Exemplu: ROL R13;
21