Sunteți pe pagina 1din 20

MICROCONTROLERE AVR ATMEL PE 8 BITI

1. Caracteristici

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 de registre de lucru de 8 biti
 Multiplicator hardware
 Arhitectura Harvard a spatiului (memorie interna: 16 kocteti program flash, 1
koctet data SRAM, 512 octeti data 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 de urmarire (watchdog) cu oscilator independent
 Interfata JTAG (standardul IEEE 1149.1 Compliant)
 6 moduri de operare SLEEP si POWER DOWN pentru economisirea energiei
 Oscilator integrat RC
 Densitate mare a codului si compatibilitate integrala a codului intre membrii
familiei
 Procesoarele sunt disponibile in capsule variate, de la circuite cu 8 pini 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.

1
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 <1μA.
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 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 spectifice. 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 microcontrollere de uz general putem exemplifica: ATmega 8,
ATmega 16, ATmega 128, ATmega 162, etc.

2
2. Arhitectura AVR

Vom considera ca exemplu microcontrolerul de 8 biti ATmega 16, r e a l i z a t i n


t e h n o l o g i e 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/temporizatoare de 8 biti
- un numărător/temporizator 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 separat
- 32 de linii I/O organizate în patru porturi (PA, PB, PC, PD).

Structura internă generală a m i crocon trolerului este prezentată în Fi g. 2 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 pană 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 i n t e r n a p o a t e f i reprogaramată printr-o interfată serială SPI,
de catre un programator de memorie nonvolatilă conventional, sau de către un program

3
de p o r n i r e r e z i d e n t ( o n - chip) ce ruleaza pe n u c l e u l 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 Descrierea pinilor

VCC – Sursa de alimentare


GND – Masa

Portul A (PA7÷PA0)
Portul A este un port bidirectional de 8 biti programabil. Liniile portului A sunt
folosite si ca intrări analogice pentru convertorul A/D. Liniile portului pot fi conectate
optional la VCC prin rezistente de agatare (pull-up resistor), selectate pentru fiecare linie.
Buffer-ele de ieşire ale portului A au caracteristici de amplificare.

Portul B (PB7÷PB0)
Portul B este un port I/O de 8 biti bidirectional prevazut cu rezistente de agatare
interne (optional). Buffer-ele de ieşire ale portului B au caracteristici de amplificare. Portul B
indeplineşte de asemenea functii speciale ale microcontrolerului ATmega 16.

Portul C (PC7÷PC0)
Portul C este un port I/O de 8 biti bidirectional cu prevazut cu rezistente de agatare
interne (optional). Buffer-ele de ieşire ale portului C au caracteristici de amplificare. Daca
interfata JTAG (de depanare) este activată, rezistentele pinilor PC5(TDI), PC3(TMS) si
PC2(TCK) vor fi activate, chiar daca are loc o resetare. Port-ul C indeplineşte de asemenea
functii ale interfetei JTAG şi alte functii speciale ale ATmega 16.

Port D (PD7…PD0)

4
Portul D este un port I/O de 8 biti bidirectional prevazut cu rezistente de agatare
interne (optional). Buffer-ele de i e s i r e ale p ortului D au caracteristici de amplificare.
Portul D indeplineşte de asemenea functii speciale ale ATmega 16.

Reset
Un nivel scăzut la acest pin mai mare ca durată decat o valoare prestabilită, va
p r o v o c a initializarea procesorului.

XTAL 1 si XTAL 2. Intrarea si respectiv ieşirea amplificatorului inversor al


oscilatorului generatorului de tact.

AVCC este pinul de alimentare pentru p ortul A si p e n t r u c onvertorul A/D.


Trebuie conectat extern la Vcc chiar dacă ADC nu este folosit. Daca ADC este folosit,
trebuie conectat la Vcc printr-un filtru trece-jos.

AREF este pinul de intrare pentru referinta analogica a convertorului A/D

2.2 Unitatea centrala de procesare


Arhitectura nucleului AVR este prezentata in Fig. 2. 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.

Fig. 2 Schema bloc a nucleului CPU-AVR

5
2.3 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.4 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 Fig. 4. Fiecare registru are si o adresa in spatiul memoriei de date permitind o
adresare uniforma. Doar registrele R16÷R31 pot stoca operanzi imediati.

Fig. 4 Registrii CPU-AVR

Majoritate 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 a accesarea unor tabele din memoria flash. Cele trei registre folosite
pentru adresarea indirect, notate X, Y, Z, sunt prezentati in Fig. 5.

Fig.5 Registrele X, Y, Z

6
Majoritatea instrutiunilor 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 cu ajutorul căreia se scrie în
memoria flash de 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 întreruperi cu atât acea întrerupere are prioritate mai mare. Prioritatea mai
mare 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 .

2.4 Registrul de stare (SREG)


Registrul de stare contine informatii despre ultima operatie aritmetica efectuată de
ALU. Sta r e a 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.

7
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
operatiilor logice sau aritmetice.

2.5 Stiva
Microcontrolerele AVR folosesc o stiva software organizata in memoria SRAM de
date. Stiva este folosită în principal pentru stocarea temporară a datelor, pentru stocarea
variabilelor locale, si pentru stocarea adreselor de revenire din intreruperi sau la apelul
subrutinelor. Accesarea stivei se efectueaza cu ajutorul registrului contor de stiva SP (Stack
Pointer) care este actualizat de procesor la fiecare accesare a stivei. Stiva opereaza pe
principiul LI-FO (Last Input – First Output) si evolueaza prin decrementarea adreselor. La
incarcarea unei date in stiva SP este decrementat, iar la citire este incrementat, astfel ca SP
indica intotdeauna prima locatie libera din virful stivei. Dimensiunea stivei este limitata de
dimensiunea memoriei SRAM instalate. Deoarece procesorul nu seteaza automat la pornire
adresa de inceput a stivei (care este adresa cea mai mare a zonei de memorie alocata stivei)
acest lucru trebuie efectuat de utilizator prin program. Pentru transferul de date in stiva
procesorul foloseste instructiunea PUSH, iar pentru transferul din stiva instructiunea POP.
Indicatorul de stivă (SP ) este decrementat cu 1 când se introduc date în stivă c u
instructiunea PUSH, şi decrementat cu 2 când sunt salvate in stiva adresele de revenire
la apelarea subrutinelor cu instructiunile CALL sau GOTO sau la acceptarea unei
intreruperi. Indicatorul de stivă este incrementat cu 1 când datele sunt c i t i t e din stivă cu
instructiunea POP, şi incrementat c u 2 când sunt c i t i t e din stivă adrese la executia unei
instructiuni de revenire dintr-o subrutina (RET) sau dintr-o intrerupere (RETI).
Indicatorul de stivă este implementat cu două registre de 8 biti adresate in spatiul de
adrese al dispozitivelor I/O (registrele SPH si SPL). Numărul de biti folositi depinde de
structura implementării. Spatiul de adrese, la unele implamentări ale arhitecturii AVR,
este mic incât este folosit doar registrul SPL (SP Low). În acest caz registrul SPH
(SP High) nu mai este utilizat.

8
Fig.5 Indicatorul de stivă

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 Fig. 6.

Fig.6 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 Fig. 7 e s t e p r e z e n t a t m o d u l d e f o l o s i r e a r e g i s t r e l o r . Î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 .

9
Fig.7 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 Fig. 7.

Fig. 7 Executia instructiunilor care acceseaza memoria SRAM

4. Tratarea întreruperilor şi initializarea

Nucleul AVR foloseste mai multe tipuri de întreruperi. Intreruperile sunt vectorizate;
vectorii de intrerupere si cel corespunzator initializarii procesorului reprezinta adrese ale unor
locatii din memoria de program. Intreruperile pot fi activate/dezactivate global (cu ajutorul
bitului I din registrul de stare) sau individual. Sursele de intrerupere si vectorii corespunzatori
sunt prezentati in tabelul urmator:

No. vector Program Source Interrupt definition


address
1 $000 Reset External pin, Power-on Reset, Brown-out
Reset, Watchdog Reset, JTAG AVR Reset
2 $002 EXT_INT0 External IRQ0
3 $004 EXT_INT1 External IRQ1
4 $006 TIM2_COMP Timer2 compare match
5 $008 TIM2_OVF Timer2 overflow
6 $00A TIM1_CAPT Timer1 capture event
7 $00C TIM1_COMPA Timer1 compare match A
8 $00E TIM1_COMPB Timer1 compare match B
9 $010 TIM1_OVF Timer 1 overflow
10 $012 TIM0_OVF Timer 0 overflow
11 $014 SPI_STC SPI transfer complete
12 $016 UART_RXC UART RX complete
13 $018 UART_DRE UART UDR empty
14 $01A UART_TXC UART TX complete
15 $01C ADC ADC conversion complete
16 $01E EE_RDY EEPROM ready

10
17 $020 ANA_COMP Analog comparator
18 $022 TWI Two-wire serial interface
19 $024 INT2 External IRQ2
20 $026 TIM0_COMP Timer0 compare match
21 $028 SPM_RDY Store program memory ready

Pentru vectorii de intrerupere sunt rezervate adresele inferioare din memoria de


program. Prioritatea diferitelor surse este data de pozitia vectorului in harta de memorie.
Cu cât sursa de intrerupere are vectorul mai mic cu atât prioritatea ei este mai mare. RESET-
ul are cea mai mare prioritate. Vectorii de întrerupere pot fi mutati la începutul sectiunii Boot
Flash prin setarea bitului IVSEL din registrul global de control al întreruperilor (GICR).
Vectorul de RESET poate fi deasemenea mutat la începutul aceleiaşi sectiuni prin
programarea sectiunii BOOTRST.
Când apare o întrerupere bitul I din registrul de stare este resetat şi toate
întreruperile sunt invalidate. In cadrul subrutinei de tratare utilizatorul poate r e a c t i v a
s i s t e m u l d e i n t r e r u p e r i . Daca sistemul de intreruperi este activat subrutina de
tratare poate fi la rindul ei intrerupta de o sursa de intrerupere cu prioritate mai mare. Bitul I
este automat setat când este executata instructiunea RETI.
Intreruperile externe pot fi controlate individual cu ajutorul registrului GIMSK
(adresa 3B in spatiul I/O). Fiecare bit din acest registru corespunde unei intreruperi. Bitul 7
controleaza INT1, iar bitul 6 controleaza INT0. Setarea bitului corespunzator activeaza
intreruperea. Registrul GIMSK poate fi citit/scris cu instructiunile IN/OUT. Starea
intreruperilor este indicata de registrul GIFR (adresa 3A in spatiul I/O). Daca o intrerupere
externa a fost activata este setat bitul corespunzator din GIFR.
AVR are o structura complexa a sistemului de intreruperi. Aproape toate
dispozitivele periferice au fost dotate cu capacitati de intrerupere motiv pentru care
programul principal nu trebuie sa verifice periodic starea acestor dispozitive.
Secventa de actiuni care se deruleaza cand apare o intrerupere este urmatoarea:

1. Dispozitivul periferic emite o cerere de intrerupere care intrerupe procesorul


2. Executia instructiunii curente este finalizata
3. Adresa urmatoarei instructiuni din programul curent este memorata in stiva
4. Este incarcata in PC adresa subrutinei de tratare asociata
5. Procesorul executa subrutina de tratare
6. Subrutina se incheie cu instructiunea RETI (RETurn from Interrupt)
7. Procesorul reia executia programului intrerupt de la adresa memorata in stiva.

Un factor important de luat in seama cand sunt folosite intreruperile este cat de repede
poate raspunde un procesor la o intrerupere. Aceasta depinde de arhitectura procesorului.
Pentru controlerele AVR, raspunsul la intreruperi se face in minim 4 cicli de tact. In timpul
celor 4 cicli, este salvat in stiva PC ( 2 bytes), iar SP este decrementat cu 2.
Transferul executiei la rutina de intrerupere necesita doi cicli. Daca o intrerupere
apare in timpul unei instructiuni multiciclu, aceasta instructiune este finalizata inainte de a fi
servita intreruperea. Revenirea dintr-o subrutina de tratare dureaza alti 4 cicli. In timpul
acestor 4 cicli, este restaurata starea PC salvata in stiva (2 bytes), iar SP este incrementat cu
2. In acelasi timp este setat bitul I din SREG.

11
5. Organizarea memoriei

ATmega 16 AVR are doua spatii de memorie principala, spatiul pentru memoria de
date si pentru memoria de program. In plus, ATmega16 are si o memorie nevolatila
EEPROM pentru memorarea datelor. Toate cele trei tipuri de memorie sunt adresate liniar.
Organizarea spatiului de memorie este aratata in Fig. 8.

5.1 Memoria pentru programe


ATmega 16 contine o memorie flash pentru programe, reprogramabila (In-system
On-chip) de 16 Ko. Deoarece toate instructiunile nucleului AVR sunt de 16 sau 32 biti,
memoria flash este organizatape cuvinte (16 biti) in formatul 8Kx16. Pentru securitatea
software-ului , spatiul pentru memoria de programe flash este impartit in doua sectiuni:
sectiunea de program boot si sectiunea pentru programe de aplicatie.
Memoria flash suporta cel putin 10000 de cicluri de scriere/stergere. Contorul de
program (PC) al microcontrolerului ATmega 16 are o lungime de 13 biti, ceea ce permite
adresarea unui spaiu de memorie de 213 = 8 klocatii.

Fig. 8 Organizarea memoriei

5.2 Memoria pentru date


Memoria de date SDRAM este organizata pe octeti. Primele 96 de adrese din spatiul
memoriei SDRAM sunt rezervate fisierului de registre, iar urmatoarele 1024 de locatii sunt
dedicate datelor interne SDRAM. Din fisierul de register fac parte cele 32 de registre de uz
general, iar restul de 64 de adrese sunt rezervate registrelor associate dispozitivelor I/O.
Modul de organizare a fisierului de register este aratat in Fig. 9.
Memoria SRAM are o capacitate intre 128 bytes si 4 kbytes in functie de tipul
particular al microcontrolerului. SRAM-ul este accesat cu instructiuni de acces atat direct cat
si indirect, folosind registrul pointer. SRAM-ul este folosit de asemnea si pentru constituirea

12
stivei. Accesul la memoria SRAM se faca in doua perioade de tact, asa cum este aratat in Fig.
7.
La microcontrolerele AVR avansate este posibila conectarea unui SRAM extern.
Aceasta este ilustrata in figura 3.32. Pentru a permite accesul SRAM extern la PORTA si
PORTC, bitul 7 SRE din registrul MCUCR este setat la 1. Timpul standar de acces la
memoria SRAM externa este de obicei trei cicli, dar poate fi crescut la 4 cicli prin activarea
bitul 6 SRW din registrul MCUCR. Figura 3.33 ilustreaza accesul normal in 3 cicli, iar figura
3.34 ilustreaza accesul prelungit prin introducerea aditionala a unei stari de asteptare.

Fig. 9 Fisierul de registre

La microcontrolerele AVR avansate este posibil covectarea unui SRAM extern.


Aceasta este ilustrata in Fig. 10. Pentru a permite accesul SRAM extern la PORTA si
PORTC, bitul 7 SRE din registrul MCUCR este setat la 1. Timpul standard de acces la
memoria SRAM externa este de obicei trei cicli, dar poate fi crescut la 4 cicli prin activarea
bitul 6 (SRW – External Acces Wait State Bit) din registrul de control MCUCR (MCU
general control register).

13
Fig. 10 Extensia memoriei SRAM

Toate microcontrolerele AVR poseda o arie de memorie EEPROM (Electrically


Erasable Programmable Read-Only Memory) interna folosita pentru stocarea constantelor.
ATmega 16 contine 512 octeti de memorie de date EEPROM. Aceasta este organizata ca un
spatiu separat de date, in care pot fi cititi si scrisi biti individuali. EEPROM-ul are o durata de
viata de cel putin 10.000 de cicluri scriere/stergere. Scrierea/citirea in EEPROM se face cu
ajutorul registrilor de acces la EEPROM: EEAR - EEPROM Address Register, EEDR -
EEPROM Data Register si EECR - EEPROM Control Register.
Scrierea in EEPROM decurge diferit fata de o memorie SRAM. Timpul de acces
pentru o operatie de scriere este de 2,5÷4 ms in functie de valoarea tensiunii de alimentare.
Bitul de control EEWE din EECR arata utilizatorului cind s-a incheiat operatia anterioara de
scriere, si poate fi facuta o noua scriere. Cand se citeste o data din EEPROM, CPU este oprit
timp de patru perioade de ceas inainte ca urmatoarea comanda sa fie executata. Cand se scrie
EEPROM, CPU este oprit timp de doua perioade de ceas inainte ca urmatoarea comanda sa
fie executata.

Registrele de adresa EEPROM – EEARH si EEARL:

Bitii 9 – 15 sunt biti rezervati in Atmega 16 si vor lua intotdeauna valoarea 0.


Bitii 0 - 8 sunt biti de adresare (total 9 biti, deci se adreseaza 0.5 KB)
Registrele de adresa, EEARH si EEARL, specifica adresa datelor din EEPROM
pentru cele 512 locatii ale spatiului EEPROM. Locatiile de memorie se adreseaza liniar de la
0 la 511. Pentru operatia de scriere in EEPROM, registrul EEDR contine date care trebuie

14
scrise la adresa data de registrul EEAR. Pentru operatia de citire a EEPROM, EEDR contine
datele citite din EEPROM de la adresa data de EEAR.

Registrul de date EEPROM – EEDR:

Registrul de control EEPROM – EECR:

Bitii 7..4 - acesti biti sunt biti rezervati la ATmega 16 si au valoarea zero.
Bit 3 - EERIE: Activarea EEPROM Ready Interrupt
Bit 2 – EEMWE : EEPROM Master Write Enable (activarea functiei principale de
scriere EEPROM)
Bitul 1 – EEWE : EEPROM Write Enable (activarea scrierii EEPROM). EEPROM
nu poate fi programat in timp ce CPU scrie memoria flash. Software-ul trebuie sa verifice
daca programarea memoriei flash este completa inainte de a initia o noua scriere a EEPROM.
Bit 0 – EERE : Activarea citirii EEPROM

Cand se seteaza adresa corecta a registrului EEAR, bitul EERE trebuie sa fie scris
pe unu logic ca sa declanseze citirea EEPROM. Accesul la citirea EEPROM se face cu o
comanda si datele cerute sunt disponibile imediat. Cand EEPROM este citit, CPU este oprit
timp de patru cicluri inainte ca urmatoarea comanda sa fie executata.

5.3 Spatiul de adrese I/O


Toate dispozitivele I/O de la ATmega 16 si perifericele au adrese plasate in spatiul
registrilor I/O. Locatiile I/O sunt accesate cu instructiunile IN si OUT, transferand date intre
cei 32 de registrii de lucru si spatiul I/O. Registrele I/O au adresele $00 - $1F si sunt direct
accesabile folosind comenzile SBI si CBI. La aceste registre valoarea bitilor individuali
poate fi verificata utilizand instructiunile SBIS si SBIC.
Cand se utilizeaza instructiunile specifice IN si OUT trebuie folosite adresele I/O
din zona $00 - $3F. Cand se adreseaza/acceseaza registrele I/O ca spatiu de date cu
instructiunile LD si ST, trebuie adaugat la aceste adrese constanta $20, care indica un salt
peste zona registrelor de uz general.

6. Sistemul I/O

Microcontrolerele AVR poseda un sistem diversificat de dispositive I/O adecvate


aplicatiilor de comanda, control, reglare, achizitii de date, comunicatie, s.a.

15
6.1 Porturile de intrare/iesire
ATmega16 dispune de 32 de linii de I/O grupate în patru porturi de 8 biti. Porturile
sunt denumite cu literele A, B, C si D. Fiecare pin al unui port poate fi setat individual ca
intrare sau iesire fără să afecteze ceilalti pini. In plus, anumiti pini se pot utiliza pentru functii
speciale ale microcontrolerului. In Fig. 11 este prezentată structura generală a unui pin. Toti
cei 32 de pini au fiecare câte o rezistentă de agatare („pull-up”) care poate fi activată sau
dezactivată.
Operatiile cu porturile se fac prin intermediul unui set de 3 registre alocate fiecărui
port: PORTx, PINx si DDRx; unde x poate fi A, B, C sau D. Aceste registre fac parte din
categoria registrelor de intrare/iesire si pot fi accesate cu instructiunile CBI, SBI, IN si OUT.
Registrele DDRx stabilesc dacă un pin este intrare sau iesire. Astfel, un bit cu
valoarea „1” în registrul DDRx face ca pinul corespunzător să fie considerat iesire; altfel
pinul va fi intrare. Registrii PORTx sunt utilizati pentru a scrie o valoare în portul
corespunzător, iar registrii PINx se folosesc pentru a citi valoarea prezentă pe liniile unui
port. Activarea sau dezactivarea rezistentelor „pull-up” este comandata de bitul PUD din
registrul SFIOR si de valorile registrilor PORTx si DDRx asa cum se poate observa în tabelul
următor.

Toate porturile AVR au functia “Citeste – Modifica – Scrie” atunci cand sunt folosite
ca porturi I/O digitale generale. Asta inseamna ca directia unui pin poate fi schimbata fara a
schimba in mod intentionat directia oricarui alt pin cu comenzile SBI si CBI. Aceeasi regula
se aplica cand se schimba valoarea drive-ului (daca este configurat ca iesire) sau a
activarii/dezactivarii rezistorilor (daca sunt configurati ca intrari). Fiecare buffer de intrare
are caracteristici similare de comanda, in ceea ce priveste capacitatea sursei cat si
sincronizarea. Etajul de comanda al pinului este suficient de puternic pentru a comanda direct
un display LED. Atunci cind un pin este setat ca iesire rezistenta “pull-up” este dezactivata,
iar cind este folosit ca intrare rezistenta este activata.
Toti pinii I/O au rezistori pull-up care pot fi selectati individual. Toti pinii I/O au
diode de protectie atat la Vcc cat si la impamantare asa cum este indicat in figura de mai jos :

16
Fig. 11 Structura unei linii pentru un bit al portului I/O

Fig. 12 Schema echivalenta a unui pin

In limbaj de asamblare toti registrii si referintele de bit sunt scrise in forma generala.
Un “x” mic reprezinta litera care denumeste portul si un “n” mic reprezinta numarul bitului.
De exemplu, PORTB3 indica bitul numarul 3 al portului B, prezentat general ca PORTxn.
Majoritatea pinilor au functii alternative legate de functionarea dispozitivelor
periferice. De remarcat faptul ca activarea functiilor alternative ale unor pini nu afecteaza
utilizarea altor pini ca port I/O general digital. Un exemplu de folosire a porturilor I/O este
dat in Fig. 13.

17
Fig. 13 Folosirea porturilor I/O

6.2 Unitatile timer/numarator


ATmega 16 poseda doua unitati timer/numerator de 8 biti si o unitate
timer/numerator de 16 biti. Principalele caracteristici ale acestor module sunt:

- Posibilitatea de alegere a frecventei de tact de la intrarea temporizatoarelor (circuit


de prescalare)
- Posibilitatea de citire/scriere a starii numaratoarelor
- Generarea de forme de unda prin folosirea unui registru de comparare
- Generare de unde PWM cu posibilitatea de reglare a frecventei
- Generarea de cereri de intrerupere la interval regulate
- Declansare la un eveniment extern (captura a intrarii)
Unitatile timer/numarator fac posibila cronometrarea precisa a executiei
programului (managementul evenimentelor), generarea de forme de unda, masurarea
intervalelor de timp.
Structura unui temporizator de 8 biti este data in Fig. 14. Functionarea circuitului
este controlata cu ajutorul registrului TCCRn care permite alegerea frecventei de tact,
controlul modului de generare a undelor, selectia modului de folosire a rezultatului unitatii de
comparare. Formele de unda generate sunt disponibile la pinii porturilor I/O.

18
Fig. 14 Structura unui modul timer/numerator de 8 biti

6.3 Modulul USART


Modulul UART (Universal Asinchronous Receiver Transmiter) efectueaza
receptia/transmisia datelor de la/catre un dispozitiv periferic cu acces serie. Principalele
caracteristici sunt:
- Functionare full-duplex completa atit in modul sincron cit si in mod asincron
- Poseda generator de rata de baud propriu de rezolutie mare
- Formate de date seriale diverse
- Detecteaza automat erorile de transmisie
- Executa comunicatii de tip multiprocesor
Modulul executa conversia serie/paralel a datelor la receptie, respective conversia
paralel/serie la transmisie. Transmiterea datelor este initializata prin scrierea datelor care
trebuie transmise in registrul UDR (UART Data Register). Datele sunt transferate de la UDR
la registrul Transmit Shift cand:
1. Un nou character este scris in UDR si caracterul precedent a fost déjà
transferat. Registrul de deplasare este incarcat imediat.
2. Un nou character este scris in UDR inainte ca un character precedent sa fi fost
transferat complet. Registul de deplasare este incarcat dupa ce prima operatie a fost finalizata.

6.4 Interfata SPI


Interfata de comunicatie SPI (Serial Periferal Interface) asigura trasferul rapid sincron
de date intre microcontroler si dispozitive periferice sau cu alte microcontrolere AVR.

6.5 Interfata TWI


Interfata TWI (Two Wire Interface) implementeaza un protocol de comunicatie pe
doua fire permitind interconectarea a pina la 128 de dispozitive diferite. Interfata foloseste
doua linii bidirectionale, una pentru tact (SCL) si una pentru date (SDA) ca in Fig. 15. Toate
dispozitivele conectate la acest bus au propria adresa.

19
Fig. 15 Interfata TWI

6.6 Convertorul A/D


Atmega 16 contine un convertor A/D cu aproximatii succesive, cu 8 canale si cu
rezolutia de 10 biti. Convertorul este prevazut la intrare cu circuit de esantionare si
memorare. Viteza de conversie este cuprinsa intre 13 si 260 de μs.
6.7 Comparatorul analogic
Compara doua marimi analogice si genereaza o cerere de intrerupere cind acestae sunt
egale.
6.8 Timerul de urmarire
Timerul de urmarire (Watchdog) este un timer controlat care este folosit pentru a
activa un dispozitiv in caz ca software-ul este blocat intr-o bucla infinita sau in caz ca
executia programului este defectuoasa. Timer-ul Watchdog are o iesire care poate reseta
controlerul.
Watchdog-ul este alimentat de la un oscilator RC on-chip separat.

7. Modurile de operare cu consum redus

Mictrocontrolerul AVR poseda 6 moduri de functionare cu consum redus care pot fi


comandate prin intermediul registrului MCUCR (MCU Control Register). Pentru aceasta
seteaza bitul SE (Sleep Enable) si bitii SM2, SM1 si SM0 (Sleep Mode) dupa care se executa
instructiunea SLEEP. Regimurile de consum redus disponibile sunt:
 Idle Mode – CPU este oprit dar interfetele USART, SPI, TWI, CAD,
comparatorul analogic, timerele si sistemul de intreruperi continua sa functioneze. O cerere
de intrerupere readuce procesorul in stare de functionare.
 ADC Noise Reduction Mode – CPU este oprit insa continua sa functioneze
CAD, intreruperile externe, interfata TWI, timerul 2 si timerul de urmarire continua sa
functioneze. Acest regim permite CAD sa functioneze cu o rezolutie mai mare. O cerere de
intrerupere readuce procesorul in stare de functionare.
 Power-down Mode - Oscilatorul extern este blocat insa ramin active
intreruperile externe, interfata TWI si timerul de urmarire.
 Power-save Mode - este similar cu modul Power-down cu diferenta ca si
timerul 2 continua sa functioneze.
 Standby Mode – Este identic cu modul Power-down cu deosebirea ca
oscilatorul continua sa functioneze.
 Extended Standby Mode – Este disponibil atunci cind este folosit un oscilator cu
cuart, iar in rest este identic cu modul Power-down.

20

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