Documente Academic
Documente Profesional
Documente Cultură
1
Alf (Egil Bogen) and Vegard (Wollan)'s RISC processor
Toate categoriile de CIP disponibile pentru microcontrolerele AVR si PIC de 8 biti sunt
prezentate in figura de mai jos, categoriile fiind grupate/colorate similar
6
Familia AVR 8 biti
• Diversele variante Mega, Tiny sau XMega diferă practic prin
dimensiunea memoriei locale de program de tip FLASH, de
date de tip SRAM si EEPROM si prin caracteristicile și
varietatea resurselor de tip periferice.
• Descrierea care urmează este axată pe familia cea mai
bogată în variante si resurse, şi anume familia AVR Mega, iar
sub familia AVR Tiny prezintă eventual anumite particularități
care vor fi menționate atunci când este cazul
• Datorita faptului ca noile variante AVR Mega si Tiny produse
după preluarea de către Microchip au caracteristici noi sau
unele similare familiei XMega, in prezentare vom pune
accentul pe ce vom numi AVR clasic
– Acolo unde este cazul se vor discuta sumar si aceste caracteristici
specifice (in special in prezentarea pentru AVR XMEGA)
7
Familia AVR 8 biti - 2
• Ultima familie AVR de 8 biți (apărută din perioada Atmel!) a fost
familia AVR XMEGA :
– putere de calcul crescută (32 MIPS la 32 MHz),
– dimensiuni maxime mai mari ale memoriei de program (FLASH de pana la
256 KOcteți) si date (SRAM de pană la 8KOcteti),
– consum foarte redus (bazat pe tehnologia picoPower),
– o gamă foarte largă de periferice (inclusiv DMA),
– un sub-sistem zis revoluționar de control si corelare a perifericelor (Event
System)
• Actualmente (2019) numărul de variante produse s-a redus drastic si
in acest moment coexistă variante clasice de AVR Mega si Tiny cu
variante Mega si Tiny “modernizate” (seriile zise 0, 1 si 2), care
incorporează sistemul CIP si/sau alte caracteristici noi sau provenind
de la XMega (Event System, mod Sleep Walking, etc.), de exemplu:
– ATMega 48 varianta clasica si ATMega 4809 varianta modernizata
– ATTiny 88 varianta clasica si ATTiny 809 varianta modernizata
• Din punct de vedere didactic, variantele modernizate sunt mai greu
accesibile, fiind mai complexe, mai ales datorita numărului foarte
mare de registre periferice, in comparație cu variantele clasice,
aceasta fiind si o explicație pentru accentul pus pe acestea din urmă
8
AVR 8 biti, încapsulare, alimentare
- Variante diverse de încapsulare pin-through sau SMT: PLCC,
TQFP, SSOP, UQFN, BGA, etc.
- Variantele Pin-Through (DIL, DIP) sunt din
ce in ce mai rar întâlnite!
- Numărul de pini ( si vom vedea ca si numărul de porturi de I/O)
depinde de varianta de încapsulare: de la 6 sau 8 pini la 100 !
-Tensiuni de alimentare (Vcc) in gama 1.5…6V; există însă
variante care pot fi alimentate începând de la 0.7- 0.8V
(utilizează un așa zis Boost Converter pentru creșterea interna
a tensiunii la 3V)!
- Gama a temperaturilor de lucru: -40 ..+85 oC sau -40..+125 oC
9
Schema bloc AVR 8 biti (Mega si Tiny)
Schema bloc prezentată
este cea clasică, din foile de catalog
Atmel (in plus, nu acoperă si
varianta XMEGA)
Memoria de program este
întotdeauna o memorie de tip FLASH,
reprogramabilă în sistem (ISP), prin
intermediul unei interfețe seriale dedicate
(similară SPI) sau a uneia JTAG standard (la
toate variantele mai noi).
Memoria de date este
implementată odată ca memorie volatilă
SRAM (RAM static) internă, ca memorie
de date externă (de un tip ales de utilizator)
precum şi ca memorie internă EEPROM
(nevolatilă).
Memoria EEPROM are un
mecanism de acces diferit, fiind accesată
prin intermediul unor registre de adresă şi
date aflate în spațiul I/O.
Dimensiunile celor două tipuri interne
de memorie depind de varianta constructivă 10
Schema bloc AVR 8 biți (Mega si Tiny) -2
• În figura este prezentată o schemă
bloc a unui microcontroler AVR cu
doar câteva din resursele tipice
de tip periferic:
– intrări/ieşiri numerice (grupate în
porturi-module)- I/O
– un port serial de tip SPI,
– un comparator analogic,
– ceasul de gardă (watchdog), etc.
• Configurarea unora din resursele
tipice cum ar fi sistemul de ceas,
sistemul de generare a reset-ului,
protecţia unor zone de memorie,
etc,. se face prin intermediul unor
biţi de control nevolatili care sunt
implementaţi ca fuzibile (fuses)
FLASH care se programează, în
mod tipic, la fel şi odată cu
programarea memoriei de program.
11
Schema bloc AVR 8 biti: Mega si Tiny - seria 0
• În foile de catalog ale noilor
variante produse de
Microchip apare o altă formă
a schemei bloc, nu doar mai
decorativă, dar care pune in
evidentă noua arhitectură de
periferice, împreună cu noile
tipuri de periferice
disponibile:
– Interfața universala de
programare si depanare (UPDI-
Universal Program Debug
Interface)
– Controlerul de reset
(RSTCTRL)
– Matricea de comutare a
magistralelor interne (Bus
Matrix)
– EventSystem
– Convertor numeric analogic
(DAC)
– Ceas de timp real (RTC)
– Blocul de logica configurabila
(CCL) 12
– etc..
AVR 8 biți: arhitectura, registrele
unității centrale
• Arhitectura de calcul AVR este o arhitectură de
calcul orientată pe registru şi nu pe acumulator.
• Registrele pot fi, la modul general, clasificate ca fiind:
– de uz general (folosite de ex. pentru memorarea rezultatelor
intermediare, si nu numai)
– dedicate, de uz special (PC - numărător program, SP -
indicator de stiva, SREG - registru de stare, registre utilizate
pentru periferice, intrari/iesiri etc. )
• Setul de registre al unităţii centrale (AVR CPU) conţine
32 registre de uz general (dar si exista variante Tiny cu
16 registre!), de 8-biţi, care pot fi accesate de CPU într-
un singur ciclu (perioadă) de ceas.
– Aceasta permite unităţii aritmetice şi logice (ALU) să execute
operaţiile într-un singur ciclu de ceas.
– Într-o funcţionare caracteristică a ALU, cei doi operanzi sunt
preluaţi din registre, operaţia este executată, şi rezultatul este
memorat înapoi într-un registru – totul realizat într-un singur ciclu
13
de ceas.
AVR 8 biți: arhitectură, registre,
pointeri
• Tipic, șase din cele 32 registre pot fi folosite,
în perechi, ca trei registre indicator (pointer) de
date de 16 biţi, pentru adresarea indirectă a
memoriei de date, permițând calcule de adresă
foarte eficiente.
– Unul dintre aceste trei registre indicator poate să fie
folosit şi ca adresă de căutare pentru tabele ( pentru
instructiuni de tip Table Look Up) din memoria FLASH
de program.
– Aceste registre de 16 biți cu funcții suplimentare sunt
denumite generic registrele X, Y, şi Z.
AVR 8 biți: Registrele de uz
general
• Setul de 32 de registre a fost optimizat pentru instrucțiunile RISC ale
AVR.
• Pentru performanță şi flexibilitate, în cazul în care operanzii unei
instrucțiuni sunt registrele, sunt posibile următoarele combinații (in
limbaj de asamblare) sursă/destinaţie (rezultat):
– un operand sursă pe 8 biţi şi un rezultat pe 8 biţi.
– doi operanzi sursă pe 8 biţi şi un rezultat pe 8 biţi.
– doi operanzi sursă pe 8 biţi şi un rezultat pe 16 biţi.
– un operand sursă pe 16 biţi şi un rezultat pe 16 biţi.
• Majoritatea instrucțiunilor operând cu registrele de uz general au
acces direct la acestea și majoritatea se execută într-un singur ciclu
de ceas.
• Nota Exista si variante de AVR Tiny care au un set redus de
instrucțiuni, prin raportare la toate celelalte variante
• Fiecare registru are asignată o adresă în memoria de date
(SRAM), ele fiind direct mapate în primele 32 locații din spațiul de
memorie de date utilizator.
– Ele sunt direct implementate în memoria de tip SRAM, această
organizare a memoriei oferă o flexibilitate deosebită în accesarea
registrelor
15
Registrele de uz general
- NU toate registrele de uz general sunt
“egale” intre ele!
- Exista si variante Tiny care au doar 16
registre: R16..R31!
16
AVR: ALU si registrul de stare SREG
(Status Register)
• Unitatea aritmetică si logică (ALU) realizează operații aritmetice şi
logice între registre sau între o constantă şi un registru.
• După o operație aritmetică sau logică, registrul de stare
(SREG) al unității centrale este actualizat pentru a reflecta corect
rezultatul operației executate de ALU.
• SREG este de fapt un set de biți, care pot fi citiți si scriși, numiți
indicatori de stare
19
Exemple f. simple de instrucţiuni
Operand destinaţie
Mnemonica
Operand sursa
• Adunare: ADD r2, r1 Este de fapt o
adresa de destinatie
• Scădere: sub R13, R12
• Salt (ramificare, branching): breq 6
• Încărcare din memorie (load): LDI r30, $F0
• Memorare in memorie (store): ST X, R2
• Citire din port (input): IN R25, $16; Adrese
http://ww1.microchip.com/downloads/en/de
vicedoc/atmel-0856-avr-instruction-set- Durata de execuție in perioade ale
manual.pdf semnalului de ceas (cicluri masina)
Registrele X, Y şi Z
• Registrele din plaja R26.. R31 au câteva funcţii suplimentare faţă de
utilizarea lor generală.
•Aceste trei registre de adresare indirectă sunt numite X, Y, şi Z şi sunt
definite ca în figura.
• Aceste registre sunt în primul rând şi indicatoare (pointeri) de
adresă pe 16 biţi utilizabile pentru adresarea indirectă a spaţiului
memoriei de date (X si Y) si program (Z).
•Ele sunt identificate si prin doua registre de 8 biti, unul inferior (L-
Low) si unul superior (H- High); de ex. R26 = XL, R31 = ZH, etc.
• În diferitele moduri de adresare posibile, aceste registre de adresare
îndeplinesc şi funcţii ca incrementare automată sau decrementare
automată.
22
Indicatorul de stivă (SP – Stack Pointer)
• Stiva (stack) este folosită pentru memorarea temporară a datelor, pentru
memorarea temporară a variabilelor locale şi pentru memorarea adreselor de
întoarcere după tratarea întreruperilor şi apelurilor de subrutină.
• Registrul indicator de stivă SP (Stack Pointer) indică întotdeauna vârful
stivei si el adresează octeți, nu cuvinte, deoarece el adresează memoria de
date SRAM
– Pentru AVR 8 biți stiva creste de la adresele de memorie mai înalte în jos, către
adresele de memorie mai joase.
– Aceasta presupune că o comandă (instrucțiune) de tip PUSH (salvează in stivă)
decrementează indicatorul de stivă (SP), iar una de tip POP (restaurează din stiva)
îl incrementează
• Indicatorul de stivă indică o zona de stivă din SRAM-ul de date unde se
găsesc stivele subrutinelor şi întreruperilor.
• Acest spațiu de stivă din SRAM-ul de date trebuie să fie definit de către
utilizator înaintea realizării oricărui apel de subprogram sau de întrerupere,
deşi SP are şi o valoare implicită după reset (0x7).
– Indicatorul de stivă trebuie să indice mai sus de adresa $60 (deasupra spaţiului
I/O).
• Ca o particularitate, în cazul unor membrii ai sub familiei AVR Tiny, la care
tipic nu exista memorie SRAM ci numai registre, stiva este una hardware,
cu un număr mic de nivele de memorare (3 sau 5), limitând corespunzător
numărul de imbricări de subrutine
23
Indicatorul de stivă (SP)
• Indicatorul de stivă este decrementat cu o unitate când datele sunt împinse în stivă cu
o instrucţiune de tip PUSH sau este decrementat cu două unități când adresa de întoarcere
este împinsă în stivă de un apel de subprogram sau întrerupere.
• Indicatorul de stivă este incrementat cu o unitate când datele sunt extrase din stivă cu
o instrucțiune de tip POP şi este incrementat cu două unități când datele sunt extrase din
stivă la întoarcerea dintr-un subprogram cu RET sau întoarcerea din întrerupere cu RETI.
• Indicatorul de stivă al AVR este implementat ca două registre de 8 biți, SPH şi SPL mapate
în spațiul I/O al SRAM.
• Numărul real de biți folosiți depinde de implementarea memoriei SRAM locale (de cat de
mare este memoria SRAM pentru varianta respectiva).
• Este de observat faptul că zona de date în unele implementări ale arhitecturii AVR ea este
atât de mică (256 de octeți sau mai mică) încât numai SPL este suficient (in acest caz
registrul SPH nu există!)
• Pentru o variantă AVR la care numărătorul de program are mai puțin de 16 biți, dacă se
citeşte valoarea numărătorului program (PC) din stivă, după un apel de subrutină sau
întrerupere, biţii neutilizați din SPH trebuie să fie mascați (vezi şi figura).
24
Utilizare stivă, exemplu pentru ATTiny 2313 (care
datorita dimensiunii mic a RAM-ului intern are
doar SPL)
26
Pipeline- execuția unei instrucțiuni in paralel cu
decodificarea următoarelor instrucțiuni.
In figura următoare se prezintă execuția de instrucțiuni, în paralel cu
decodificarea unei alte instrucțiuni, posibilă datorită arhitecturii CPU
de tip Harvard.
Într-un singur ciclu de ceas este executată o operație ALU folosind două registre
ca operanzi, iar rezultatul este memorat înapoi în registrul de destinație; de
exemplu instructiunea ADD R1, R2
31
Harta memoriei unui sistem de
calcul AVR 8 biti
In figura alăturată avem harta de memorie a unui uC AVR de 8 biți (un
ATMEGA8515) unde lucrurile sunt complicate si de implementările fizice
diferite ale memoriilor de program si mai ales date: FLASH, registre si
SRAM (RAM static) si respectiv EEPROM
32
Memoria de program- FLASH
• Orice microcontroler AVR 8 biti are 2N KOcteţi (Bytes) de memorie
internă de program de tip FLASH (NOR), programabilă în sistem
(ISP).
• Deoarece toate instrucțiunile AVR sunt memorate pe 16 sau 32 de
biţi (1 sau 2 cuvinte), memoria FLASH are intotdeauna o organizare
de tip NKcuvinte x 16 biţi.
• Astfel pentru un ATMega32 avem N=16, adica 32Kocteţi de
memorie organizată în 16 Kcuvinte x 16 biţi.
• Spațiul de memorie de program FLASH este împărţit principial în
două zone (pentru ATMega si XMEGA), zona de Bootloader şi
zona de aplicație.
– Pentru un ATtiny, si in general pentru variante cu putina memorie
FLASH, nu exista o zona de Bootloader
• Cele două secțiuni/zone diferă şi prin nivelele de protecţie la
ștergere oferite/disponibile.
• Memoria FLASH AVR are garantat un număr minim de cel puţin
10 000 de cicluri de ștergere şi scriere.
33
Memoria de program- FLASH
• Numărătorul de program PC al unui AVR 8 biți numără cuvinte (de 2
octeți), numărul lui de biți implementat efectiv depinzând de dimensiunea
memoriei FLASH implementată pentru o anumită variantă
• Dacă avem, de exemplu, un ATMEGA16, cu 16kB de FLASH, dar de fapt cu 8
kcuvinte, el va trebui să adreseze 8 kcuvinte si are efectiv 13 biti (213=8192)
• Pentru un ATiny13, cu 1kB de FLASH, dar de fapt cu 512 cuvinte, el va trebui
să adreseze 512 cuvinte si are efectiv 9 biți (29=512)
• Actualmente (2013) circuitele ATMEGA2560/2561 (utilizate si de Arduino
2560..) sunt cele care au implementată memoria FLASH cea mai mare de
256kB/128kcuvinte, deci PC-ul are 17 biți (217=131072)
• S-a spus anterior că registrul Z este utilizat pentru adresarea indirectă a
memoriei de program
– Aceasta este necesară pentru instrucțiunile care citesc si scriu din memoria de
program (tip LPM si SPM) precum si pentru instrucțiunile de salt/apel subrutina
(IJMP/ICALL)
• Dar Z are doar 16 biți, fiind posibilă adresarea a maxim 64 de kcuvinte
• Pentru variantele de AVR (MEGA si XMEGA) care au mai mult de 64kcuvinte,
există niște registre suplimentare 8 biți (implementare maximă) numite RAMPZ
(Extended Z-pointer Register) si EIND (Extended Indirect Register) care se
concatenează cu registrul Z, obținându-se un registru extins de 24 de biți, si
deci un domeniu de adresare maxim de 16Mcuvinte pentru memoria de
program !
Memoria de program: exemple (ATMega)
• În figura este prezentată o organizare a memoriei
FLASH de program pentru N=4 (8 Kocteţi de
memorie organizată în 4 Kcuvinte x 16 biţi,
0x000..0xFFF).
• Memoria de program este împărțită in 2 zone:
– Aplicație
– Boot(loader)
• Dimensiunea celor două zone poate fi controlată prin
intermediul fuzibilului BOOTSZ, si eventual întreaga
memorie fiind alocată ca zonă de aplicație dacă nu
este nevoie de un Bootloader
• Numărul de biți ai numărătorului de program - PC
depinde de dimensiunea memoriei implementate
pentru o anumită variantă.
– Astfel pentru un ATMega64 numărătorul program este
unul pe 15 biţi, el adresând 32K cuvinte de memorie de
program.
– Dar pentru un ATTiny2313 numărătorul program este
unul pe 10 biţi, el adresând doar 1K cuvânt de memorie
de program.
• Tabelele de constante pot fi memorate în întreg
spațiul de adrese al memoriei de program, existând
modalități eficiente (instrucțiuni) de citire a acestora, 35
cum ar fi instrucțiunea LPM (Load Program Memory).
Memoria de program: Bootloader
• Conceptul de Bootloader (vezi introducere) poate fi materializat cu relativă
ușurință datorită existenței unei instrucțiuni care permite si scrierea in memoria
FLASH, in cazul acesta instrucțiunea SPM (Self Programming Memory)
• Instrucțiunea SPM are o funcționalitate complexă deoarece ea permite
scrierea într-o anumită zonă a memoriei de program, in același timp cu
citirea din alta zonă, citire necesară pentru a se putea executa programul!
• Numai astfel este posibilă programarea memoriei de program de către
unitatea centrală a microcontrolerului(CPU), in timp ce CPU execută cod
preluat din aceiași memorie!
• Toate operațiile cu instrucțiunea SPM se realizează prin intermediul registrului
SPMCR (sau SPMCSR) care conține un ansamblu de biți de comandă si/sau
stare
• La fel ca la orice memorie de tip NOR FLASH ștergerea/ scrierea se face
pagină cu pagină si nu octet cu octet
• Pentru a putea fi scrisă, o pagină trebuie mai înainte ștearsă
– Scrierea se face cu ajutorul unei memorii RAM intermediare (transparentă pentru utilizator) numita
buffer de pagină
• Durata operațiilor de ștergere si scriere a unei pagini este mult mai mare
decât durata unei operații de citire (de aceea există biți de stare prin
intermediul cărora se poate afla când s-a finalizat operația) !
• Acești biți sunt denumiți generic fuzibile (fuses), denumirea fiind o reminiscență
istorică din timpurile primelor circuite PROM; singurul lucru pe care îl au in comun
cele 2 tehnologii (FLASH si cea utilizată la vechiul PROM) este faptul ca biții
respectivi sunt nevolatili, isi păstrează starea dacă tensiunea de alimentare
dispare
– Fuzibilele nu sunt altceva decât niște locații speciale de memorie nevolatila
FLASH, accesibile (programabile) la nivel de bit, cu niște proceduri speciale
• Biții respectivi au si niște valori implicite pentru un microcontroler AVR care nu a
fost programat niciodată (așa cum este livrat din fabrică), aceasta însemnând că
există si o configurare implicită a resurselor, configurare care in mod tipic este
foarte puțin probabil să fie cea dorită de utilizator si cea necesară pentru aplicație
• Aceasta înseamnă că fuzibilele (tipic doar o parte a lor) vor trebui sa fie
programate înainte de rularea codului aplicației, cu ajutorul aceluiași
programator hardware extern cu care se programează memoria de program
FLASH si/sau cea de date EEPROM
• Fuzibilele nu pot fi programate dinamic (starea lor nu poate fi modificată),
prin program, ci numai static cu ajutorul un programator extern!
• OBSERVAȚIE Sistemul de fuzibile a suferit unele evoluții importante la noua
familie XMEGA si la variantele Microchip, vezi prezentarea aferentă si mai ales
foile de catalog/manualele XMEGA sau MegaAVR seria 0!
Fuzibilele AVR – valoare si
funcționalitate
• Întotdeauna trebuie citită foaia de catalog a microcontrolerului respectiv si
înțeleasă bine valoarea si funcționalitatea biților respectivi (vezi si observația
de la sursele de ceas)
• Fuzibilele de la ATTiny sunt diferite de cele de la ATMega, si mai mult, pot
diferi de la o variantă de AVR Tiny sau Mega la alta
• Funcție de varianta de AVR ele au legătură si cu configurarea:
– sistemului de generare al ceasului,
– sistemului de generare a reset-ului (valoare brownout, pin extern),
– alegerea interfeței de programare (ISP sau JTAG sau alta),
– memoriei de program Flash (protecție, zona bootloader),
– memoriei de date EEPROM (ștergerea ei),
– ceasului de gardă (activare watchdog)
OBS O locație de memorie (un octet) cu proprietăți similare este utilizată la (auto)calibrarea
oscilatorului de ceas in varianta cu grup RC intern – calibration value
• Programarea acestor fuzibile poate fi una mai ușoară, vizuală prin
intermediul unei interfețe grafice pentru un programator (universal)
sau mai complicată utilizând valorile efective ale locațiilor respective
(caz AVRDUDE)
• Un “calculator” pentru fuzibilele multor variante de AVR găsiți aici:
http://www.engbedded.com/fusecalc/
• Vom reveni cu informații sintetice despre ce înseamnă “programarea” unui
microcontroler AVR 8 biți
Fuzibile sistem ceas ATtiny2313: un programator
universal paralel (“HV- High-Voltage”)
Este esenţial sa intelegeti ca “bifat” înseamnă bit programat adică in “0”, iar
“nebifat” înseamnă bit neprogramat adică in “1”
Atenţie, CKDIV8 programat înseamnă ca ceasul sistem va fi divizat cu 8!
Deci totul va merge de 8 ori mai încet!
Interfața utilizator nu este explicită si nici lizibilă (fără acces la foaia de catalog)
40
Fuzibile sistem ceas ATtiny2313: simulatorul
Proteus VSM (ISIS-7)
Indicatorul de stiva
45
Exemplu ATMEGA32, registre si SRAM,
conexiuni externe (pin-out)
47
Exemplu ATTiny2313, registre si SRAM, pin-out
Capsula DIL20 48
Exemplu ATTiny2313, registre si SRAM
(AVR Studio 4 Simulator/Debugger)
51
Exemplu ATMega328, registre si
SRAM (Atmel Studio 7 Simulator/Debugger)
52
Memoria de date, timpii de acces
• Timpul de acces la memoria internă de date este ilustrat în figura de mai
jos unde accesul la memoria internă SRAM este executat în două cicluri de
ceas ale unității centrale.
• Sunt ilustrate ambele tipuri de acces: citire (Read) şi scriere (Write) în
SRAM-ul intern, validate de semnalele interne RD şi WR (intern ele sunt
active în „1”)
• Instrucțiunile care accesează memoria interna de date durează, in mod
tipic, cel puțin 2 cicluri mașină
53
Memoria de date: modurile de adresare
• Există cinci moduri posibile de adresare pentru memoria de date şi ele sunt:
1. adresare directă (ex. LDS R16, k; k= o adresa in SRAM)
2. adresare indirectă cu deplasare (ex. STD Y+q, R22; q – deplasament de 6 biți)
3. adresare indirectă (ex. LD r15,X)
4. adresare indirectă cu pre-decrementare (ex. LD r15, -X)
5. adresare indirectă cu post-incrementare (ex. ST X+, R15)
• Adresarea directă poate fi utilizată pentru tot spațiul memoriei de date.
• Modul de adresare indirect cu deplasare permite adresarea a maxim 63 de
locații începând de la adresa de bază din registrele Y sau Z.
– Registrele R26..R31 se utilizează ca pointeri pentru adresarea indirectă.
• Când se folosește adresarea de tip registru indirect cu pre-decrementare
automată şi post-incrementare, registrele de adresă X, Y, şi Z sunt
decrementate sau incrementate corespunzător.
• Cele 32 de registre de uz general, cele 64 de registre (locații) din spaţiul I/O şi
cele n locaţii din SRAM-ul intern de date sunt accesibile în toate aceste moduri
de adresare.
54
O memorie internă de date particulară: memoria
EEPROM
• Majoritatea variantelor familiei AVR au şi o memorie de tip EEPROM locală
destinată memorării nevolatile a datelor.
– Atmega32 are 1024 octeţi de memorie de date EEPROM, ATTiny2313 doar 128
octeti
• Această memorie este organizată ca un spațiu de date separat printr-un
mecanism special de acces, în care octeţi singulari pot să fie citiţi şi/sau
scriși.
• Memoria EEPROM AVR are garantat un număr minim de 100 000 de
cicluri ştergere şi scriere.
• Accesul este realizat prin intermediul registrelor EEPROM din spaţiul
I/O: nu se citește si scrie ca o memorie de tip SRAM, utilizarea ei este
mai complicata!
– Deoarece operația de scriere are o durată destul de mare (de ordinul
milisecundelor) există o modalitate automată de sincronizare care permite
utilizatorului să detecteze când s-a finalizat operația de scriere a unui octet și
poate fi scris octetul următor.
– Pentru a împiedica posibilitatea unor scrieri accidentale în EEPROM, trebuie să
fie urmată o procedură de scriere specifică.
– Mai trebuie menționat că atunci când EEPROM-ul este citit, unitatea centrală
este oprită pentru patru cicluri de ceas înainte de execuția următoarei
instrucțiuni.
– Când EEPROM-ul este scris, unitatea centrală este oprită pentru două cicluri de
ceas înaintea de execuția următoarei instrucțiuni
55
Memoria EEPROM si registrele aferente
(interfața programator)
56
EEPROM_write, un exemplu de funcție care
scrie un octet in memoria internă EEPROM
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
/* Asteapta terminarea operatiei de scriere anterioare */
while(EECR & (1<<EEWE))
;
/* Stabilim adresa unde vrem sa scriem si data de scris in registrele
corespunzatoare*/
EEAR = uiAddress;
EEDR = ucData;
/* Scriem un “1” in bitul EEMWE */
EECR |= (1<<EEMWE);
/* Declansam operatia de scriere scriind un “1” in bitul EEWE */
EECR |= (1<<EEWE);
}
EEPROM_read, un exemplu de funcție care
citește un octet din memoria internă EEPROM
60
Semnalele de ceas AVR 8 biți : interne si/sau externe
• Ceasul CPU – clk CPU este dirijat către părțile sistemului legate de unitatea
centrală (CPU).
– Exemple de asemenea module sunt registrele de uz general, registrul de stare şi
memoria de date pentru indicatorul de stivă.
– Prin oprirea acestui ceas nu mai este posibilă execuția calculelor şi operațiilor
specifice de către CPU.
• Ceasul I/O – clk I/O este folosit de majoritatea modulelor I/O, precum modulele
de temporizare-numărare, SPI sau USART.
– El este folosit şi de modulul de întreruperi externe, dar întreruperile externe sunt
detectate cu o logică asincronă, permițând acestor întreruperi să fie detectate chiar
dacă ceasul I/O este oprit.
– De asemenea, recunoașterea adresei de către modulul TWI (Two Wire Interface =
I2C) este realizată tot asincron când clk I/O este oprit, făcând posibilă recepția adresei
TWI în toate modurile de tip sleep.
61
Semnalele de ceas AVR 8 biți : interne si/sau
externe
63
AVR 8 biți: sursele de semnal de ceas, ilustrate
Oscilatorul cu cristal de cuarţ (sau rez. ceramic) Oscilatorul RC extern
Cristal 32.768kHz
64
Sursele de semnal de ceas – timpul de pornire
(SUT – Start Up Time )
• În configurarea sursei de ceas şi a oscilatorului de ceas trebuie luat
în considerare şi faptul că fiecare configurație de oscilator are și un
anumit timp de pornire, din momentul conectării alimentării (de
fapt al ajungerii tensiunii de alimentare la o valoare cvasi-
nominala) și până la stabilizarea semnalului de ceas generat,
ca frecvență și amplitudine
• Numai după această stabilizare unitatea centrală poate fi inițializată
(resetata) corect sau instrucțiunile pot fi executate corect începând
de la adresa 0.
• Acesta este motivul pentru care există o corelație între evoluția
tensiunii de alimentare la conectare, logica de inițializare (reset) și
configurarea sistemului de ceas.
• Această corelare poate fi controlată, în anumite limite, cu ajutorul
fuzibilelor numite SUT (SUT – Start Up Time, care
definesc/stabilesc un timp de pornire).
• SUT este exprimat in perioade ale oscilatorului de ceas si trebuie
corelat cu tipul de oscilator ales (trebuie neapărat consultată si foaia
de catalog)
65
Evoluția tipică a ieșirii unui oscilator (stabilizat cu un
rezonator extern cuarț) la conectarea tensiunii de
alimentare
Oscilatie stabilizata
Iesire oscilator
Vcc
67
Sursele de semnal de ceas – fuzibilele aferente
OBSERVAŢIE IMPORTANTĂ
• Flexibilitatea configurării prin fuzibile a acestui sistem de ceas ascunde şi
capcane.
• Astfel este posibil ca, dintr-un motiv sau altul, pentru o anumită configurație
hardware externă, programarea fuzibilelor să se facă greșit de către utilizator.
• De exemplu, hardware-ul extern existent este un grup RC asociat configurației
specifice de oscilator, dar “programarea” tipului este făcută pentru configurația
oscilator cu cristal extern.
• Programarea respectivă va fi şi ultima care se poate face prin intermediul
interfeței seriale ISP, deoarece după programare oscilatorul nu va mai
funcționa, iar microcontrolerul nu mai are semnalul de ceas intern necesar
pentru funcționarea programării ISP!
• Soluția de rezolvare a problemei intr-un astfel de caz este:
– utilizarea unui programator extern paralel – HV- High Voltage (daca microcontrolerul poate
fi scos din sistem!) pentru reprogramare sau
– a unei improvizații pentru hardware-ul extern (dacă se cunoaște ce anume s-a programat
greșit!): un grup RC extern, un cristal de cuarț cu 2 capacitori, un ceas extern ..
68