Sunteți pe pagina 1din 9

MICROCONTROLERE AVR (ATMEL) PE 8 BITI

1. Caracteristici

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


Harvard. 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. Aceste microcontrolere sunt destinate aplicatiilor simple, cum ar fi: controlul
motoarelor, controlul fluxului de informatie pe portul USB, aplicatii din domeniul
automotive, controlul accesului de la distanta (Remote Access Control), s.a.. 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.
Pe baza nucleului AVR de 8 biti firma Atmel a dezvoltat cateva familii de
microcontrolere de uz general precum si microcontrolere cu functii specializate:
 Familia Tiny AVR care cuprinde microcontrolere destinate unor aplicatii
simple, cu 1÷8 kocteti memorie de program;
 Familia Mega AVR cu un set dezvoltat de instructiuni si cu 4÷256 kocteti
memorie de program;
 Familia Xmega AVR destinata unor aplicatii complexe. Procesoarele poseda
unitati DMA, module pentru criptare, etc., si folosesc un spatiu de memorie de program de
16÷384 kocteti;
 Microcontrolere AVR destinate unor aplicatii specifice. Microcontrolerele
cu functii specializate se impart in mai multe catagorii:
- Ligthing AVR - contin un procesor de semnal si este special conceput pentru
comanda motoarelor de curent continuu.
- LCD AVR - contin un controler pentru adresarea dispozitivelor de afisaj LCD
- CAN AVR - contin implementata hardware o interfata pentru magistrala CAN.
Printre cele mai utilizate microcontrolere de uz general putem exemplifica: ATmega 8,
ATmega 16, ATmega 128, ATmega 162, etc.

Familia de procesoare AVR pe 8 biti are urmatoarele caracteristici:


 Arhitectura RISC;
 32 de registre de lucru de 8 biti;
 Multiplicator hardware;
 Arhitectura Harvard a spatiului de memorie (memorie interna: 16 kocteti
memorie de program FLASH, 1 koctet memorie de date SRAM, 512 octeti memorie de date
EEPROM);
 Frecventa de lucru poate fi controlata prin software de la 0 la 16 MHz;
 Procesoarele sunt prevazute cu o gama larga de dispozitive I/O si de periferice
incorporate;
 Timer programabil cu circuit de prescalare;
 Surse de intrerupere interne si externe
 Timer watchdog (de urmarire) cu oscilator independent;
 Interfata JTAG (standardul IEEE 1149.1 Compliant);
 6 moduri de operare (SLEEP si POWER DOWN) pentru economisirea
energiei;
 Oscilator integrat RC;

1
 Procesoarele sunt disponibile in capsule variate, de la circuite cu 8 pini pana la
procesoare cu 68 de pini;
 Familia AVR beneficiaza de existenta unui set unitar de instrumente software
pentru dezvoltarea aplicatiilor.

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” (adica 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.
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.8V 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 <1 .
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.

2. Arhitectura AVR

Vom considera ca exemplu microcontrolerul de 8 biti ATmega 16, realizat in


tehnologie CMOS, bazat pe arhitectura RISC AVR imbunatatita.
Procesorul dispune de un set de 131 instructiuni şi 32 de registre de uz general, Cele
32 de registre sunt direct adresabile de unitatea aritmetica si logica (ALU). O instructiune
poate accesa doua registre independente.
Caracteristicile principale ale procesorului ATmega 16 sunt:

 16 Kb de memorie Flash reinscriptibilă pentru stocarea programelor


 1 Kb de memorie RAM pentru date
 512 bytes de memorie EEPROM pentru constante
 dispozitive periferice si porturi I/O:
- două numărătoare/timere de 8 biti;

2
- un numărător/timer de 16 biti;
- un convertor analog/digital de 10 biti, cu 8 intrări;
- 4 canale PWM;
- un comparator analogic;
- timer de urmarire (watchdog) cu oscilator propriu;
- contine 3 interfete pentru comunicatie (USART pentru comunicatie serială
(port serial), interfata seriala TWI, interfata seriala SPI);
- ceas de timp real cu oscilator separate;
- 32 de linii I/O organizate în patru porturi (PA, PB, PC, PD).

Structura internă generală a microcontrolerului este prezentată în figura 1. Se poate


observa că există o magistrală generală de date la care sunt conectate mai multe module:
- unitatea aritmetică şi logică (ALU);
- registrele generale;
- memoria RAM şi memoria EEPROM;
- porturile I/O de uz general şi celelalte blocuri de intrare/ieşire. Aceste module sunt
controlate de un set special de registre din spatiul I/O, fiecare modul având asociat un număr
de registre specifice.
Memoria FLASH de program împreună cu întreg blocul de extragere a
instructiunilor, decodare şi executie comunică printr-o magistrală proprie, separată de
magistrala de date. Acest tip de organizare este specifica arhitecturii Harvard şi permite
controlerului să execute instructiunile foarte rapid.
In modul POWER-DOWN procesorul salveaza continutul registrelor, dar blocheaza
oscilatorul, dezactivând toate celelalte functii al chip-ului pana la urmatoarea intrerupere
externa sau la activarea intrarii de initializare hardware (Reset).
In modul POWER-SAVE, timer-ul asincron continua sa functioneze, permitind
utilizatorului sa mentina o baza de timp, in timp ce restul dispozitivului este oprit.
In modul STANDBY, oscilatorul functionează în timp ce restul despozitivului este
oprit. Acest lucru permite un start foarte rapid combinat cu un consum redus de energie.
In modul STANDBY EXTINS (Extended Stanby Mode), atat oscilatorul principal
cat şi timer-ul asincron continuă să functioneze.
Memoria FLASH interna poate fi reprogramată printr-o interfată serială SPI, de
catre un programator de memorie nonvolatilă conventional, sau de către un program de
pornire rezident (on-chip) ce ruleaza pe nucleul AVR. Acest program poate folosi orice
interfata pentru a incarca programul de aplicatie in memoria flash.
Combinând un nucleu CPU-RISC de 8 biti cu o memorie flash intr-un singur chip,
ATmega 16 este un microcontroler puternic ce ofera o solutie extrem de flexibilă şi cu un
cost redus. In plus ATmega 16 AVR este sustinut de o serie completa de instrumente de
programare şi de dezvoltare a sistemului, care include: compilatoare C, macroasambloare,
programe de depanare si simulare, etc.

2.1 Unitatea centrala de prelucrare (CPU)


Arhitectura nucleului AVR este prezentata in figura 1. Functia principală a
nucleului CPU-AVR este aceea de a asigura executia corectă a programului. Pentru aceasta,
nucleul este capabil să acceseze memoriile, sa execute calcule, sa controleze perifericele şi sa
prelucreze întreruperile.

3
Figura 1 - Schema bloc a nucleului CPU-AVR

2.2 Unitatea Aritmetica si Logica (ALU)

Unitatea aritmetica si logica executa operatiile de prelucrarea a datelor. ALU-AVR


lucrează direct cu cele 32 de registre. Operatiile pe care le executa unitatea ALU sunt
împartite în trei categorii: aritmetice, logice şi operatii pe bit.
Unele implementări ale arhitecturii AVR pot efectua şi multiplicări de operanzi cu
sau fară semn.

2.3 Registrele de uz general

Fisierul de registre este optimizat pentru setul de instructiuni al arhitecturii AVR


RISC. Procesoarele AVR folosesc un set de 32 de registre de uz general de 8 biti (notate
R0÷R31) care pot fi accesate intr-un singur ciclu de tact. Structura setului de registre este
prezentata in figura 2. Fiecare registru are si o adresa in spatiul memoriei de date permitind
o adresare uniforma. Doar registrele R16÷R31 pot stoca operanzi imediati.

4
Figura 2 - Registrii CPU-AVR

Majoritatea instructiunilor care folosesc fisierul de registre au acces direct la


toate registrele şi marea lor majoritate sunt instructiuni executabile intr-un singur ciclu de
tact. Şase din cele 32 de registre (R26÷R31) pot fi folosite ca trei registre de 16 biti pentru
stocarea unor pointeri folositi la adresarea indirecta a datelor. Unul dintre acesti pointeri
poate fi folosit pentru accesarea unor tabele din memoria flash. Cele trei registre folosite
pentru adresarea indirecta, notate X, Y, Z, sunt prezentati in figura 3.

Figura 3 - Registrele X, Y, Z

Majoritatea instructiunilor AVR sunt formate dintr-un cuvant d e 16 biti.


Spatiul memoriei FLASH de program este împartit în două sectiuni, sectiunea
BOOT şi sectiune de aplicare a programelor. Sectiunea BOOT are biti speciali pentru
protectia la scriere şi citire/scriere. Instructiunea SPM (Store Program Memory) cu ajutorul
căreia se scrie în memoria FLASH ce aplicatii trebuie sa fie în sectiunea BOOT.
Informatiile din SRAM pot fi accesate cu uşurinta prin cele cinci moduri diferite de
adresare suportate de arhitectura AVR.
Modulele întreruperilor au registrele de control în spatiul I/O şi în Status Register
se afla bitul de întreupere globală. Toate întreruperile au prioritate în functie de locul în
tabelul de vectori de întrerupere ai întreruperilor lor. Cu cat este mai jos situat în tabel,
vectorul de întrerupere cu atât acea întrerupere are prioritate mai mare. Prioritatea mai mare

5
o are întreruperea cu vectorul cel mai slab plasat in tabel.
Spatiul de memorie I/O contine 64 de adrese pentru functiuni periferice ale CPU
ca: controlul registrelor, indicatorul SPI, sau alte functii de I/O. Memoria I/O poate fi
accesată direct sau indirect .

Registrul de stare (SREG)


Registrul de stare contine informatii despre ultima operatie aritmetica efectuată de
ALU. Starea registrului este actualizată după fiecare executie a unei operatii aritmetice, aşa
cum se specifică în Setul de Instructiuni. Continutul registrului de stare poate fi
salvat/restaurat prin program, de exemplu, la accesarea unei subrutine.
Structura registrului de stare al nucleului AVR si semnificatia indicatorilor folositi
este urmatoarea:

Bitul 7 (I - Global Interrupt Enable)


Este bitul de validare globala a intreruperilor. Controlul individual al întreruperilor
se face cu un registru separat. Bitul I este dezactivat dupa acceptarea unei întreruperi şi este
activat de executia instructiunii RETI (RETurn from Interrupt) pentru a permite acceptarea
unei noi cereri. Bitul I poate fi setat/resetat cu ajutorul instructiunilor SEI şi CLI.
Bitul 6 (T - Bit Copy Storage)
Instructiunile la nivel de bit pentru copiere BLD (Bit LoaD- incărcare bit) şi
memorare BST (Bit STore – stocare bit) folosesc bitul T ca sursă sau destinatie pentru bitul
actionat. Un bit dintr-un registru poate fi copiat în T cu ajutorul instructiunii BST, şi un bit
din T poate fi copiat în registru cu ajutorul instructiunii BLD.
Bitul 5 (H - Half Carry Flag)
Acesta indică transportul la jumatate în cazul unor operatii aritmetice. Valoarea
acestui bit este folosita în aritmetica BCD pentru corectia zecimala a rezultatului.
Bitul 4 (S - Sign Bit)
Acest bit este rezultatul operatiei logice SAU Exclusiv intre indicatorul negativ N si
bitul de depasite V.
Bitul 3 (V - Two’s Complement Overflow Flag)
Bitul indicator de depasire a scalei.
Bitul 2 (N - Negative Flag)
Indicatorul negativ semnalizeaza un rezultat negativ în urma unei operatii aritmetice
sau logice
Bitul 1 (Z - Zero Flag)
Indicatorul de zero este setat atunci cand rezultatul unei operatii logice sau aritmetice
este nul.
Bitul 0 (C - Carry Flag)
Indicatorul de transport semnalizeaza existenta unui transport în urma unei operatii
logice sau aritmetice.

6
3. Executia instructiunilor

Pentru obtinerea unei performate bune CPU-AVR combina avantajul arhitecturii


Harvard a spatiului de memorie si accesul rapid la registre cu executia pipeline. Procesorul
foloseste un pipeline cu doua etaje, unul pentru extragerea instructiunilor si altul pentru
executie. In timp ce o instructiune este executata o noua instructiune este extrasa din memorie.
In felul acesta procesorul furnizeaza un rezultat la fiecare tact, chiar daca o instructiune
dureaza mai mult de un tact. Aceasta secventiere este prezentata in figura 4.

Figura 4 - Functionarea pipeline

In acest mod performanta nucleului se apropie de 1 MIPS/MHz şi ofera cele mai


bune rezultate din punct de vedere a raportului functiuni/cost, functiuni/timp şi
functiuni/unitate.
In figura 5 este prezentat modul de folosire a registrelor. Într-un singur ciclu de tact
ALU foloseşte 2 registre pentru a executa o operatie, iar rezultatul este stocat înapoi în
registrul de destinatie .

Figura 5 - Operatii cu registre executate de ALU într-un singur ciclu de tact

Instructiunile care acceseaza memoria necesita doi cicli de tact pentru o operatie
dupa cum se vede din figura 6.

7
Figura 6 - Executia instructiunilor care acceseaza memoria SRAM

4. Setul de instrucţiuni

Nucleul AVR posedă un set de 131 de instrucţiuni codate cu 16 sau cu 32 de biţi.


Instrucţiunile sunt executate în 1÷4 perioade de tact. Pentru adresarea datelor, instrucţiunile
folosesc următoarele moduri de adresare: adesare implicită, adresare imediată, adresare
directă la registru, adresare directă la memorie, adresare indirectă prin registru, adresare
indirectă prin registru cu deplasament, adresare indirectă prin registru cu post-incrementare
sau pre-decrementare, adresare pe bit.
Microcontrolerul AVR poate executa următoarele tipuri de instrucţiuni:

a. Instrucţiuni de transfer
Aceste instrucţiuni pot lucra direct cu oricare dintre cele 32 de registre.
Sursa/destinaţia poate fi un registru, o memorie sau un operand imediat. Operanzii pot fi
octeţi sau cuvinte.
Exemple:
MOV Rd,Rr Rr→Rd
LDI Rd,k k→Rd k- operand imediat
LD Rd,X (X)→Rd
LD Rd,X+ (X)→Rd, X+1→X
LD Rd,-Y Y-1→Y, (Y)→Rd
LDD Rd,Y+q (Y+q)→Rd q- deplasament
LDS Rd,k (k)→Rd (k)- adresă directă
LPM (Z)→R0 încarcă data din PM
SPM R1:R0→(Z) stochează data în PM
IN Rd,P (P)→Rd citeşte data port P
OUT P,Rr Rr→(P) scrie data port P
PUSH Rr Rr→stiva
POP Rd stiva→Rd

8
b. Instrucţiuni aritmetice şi logice
Aceste instrucţiuni execută operaţii aritmetice şi logice elementare cu operanzi de tip
bit, octet sau cuvânt. Procesorul execută operaţii de înmulţire cu multiplicatorul hardware
intern cu operanzi întregi sau fracţionari, fără sau cu semn.
Exemple:
ADD Rd,Rr Rd+Rr→Rd
ADC Rd,Rr Rd+Rr+C→Rd
SUBI Rd,k Rd-k→Rd k- constantă
SBIW Rdl,k Rdh:Rdl-k→Rdh:Rdl
AND Rd,Rr Rd˄Rr→Rd „˄” - ŞI logic
ORI Rd,k Rd˄k→Rd „˄” - SAU logic
EOR Rd,Rr Rd*Rr→Rd „*” - SAU exclusiv
SBR Rd,k Rd˄k→Rd setează bit
CBR Rd,k Rd*($FF-k) resetează bit
MUL Rd,Rr Rd x Rr→R1:R0 înmulţire fără semn

c. Instrucţiuni de salt
Execută salturi de tip condiţionat sau necondiţionat, la adrese absolute sau relative,
apeluri/reveniri din subrutine.
Exemple:
JMP k k→PC k- adresa de salt
RJMP k PC+k+1→PC salt relativ la PC
CPSE Rd,Rr if(Rd=Rr) PC+2or3→PC
SBRC Rr,b if(Rr(b)=0) PC+2or3→PC b- bit în Rr
BRCC k if(C=0) PC+k+1→PC C- carry flag
BRIE k if(I=1) PC+k+1→PC I- interrupt flag

d. Instrucţiuni pentru operaţii pe bit


Execută operaţii de setare/resetare/testare la nivel de bit, precum şi operaţii de rotire
sau deplasare a datelor din regiştri.
Exemple:
SBI P,b setează bit b din registrul I/O (P)
CBI P,b resetează bit b din registrul I/O (P)
SEC 1→C C- carry flag
CLC 0→C
BST Rr,b Rr(b)→T scrie în T bit b
BLD Rd,d T→Rd(b) încarcă bit b din Rd