Sunteți pe pagina 1din 68

Arhitecturi de sisteme incorporate

Microcontrolere si sisteme integrate


Introducere in familia Microchip (ex ATMEL) AVR 8 biți:
arhitectură unitate centrală (CPU), registrele, instrucțiunile si
modurile de adresare, memoriile (de program si date),
sistemul de generare al ceasului, fuzibilele

1
Alf (Egil Bogen) and Vegard (Wollan)'s RISC processor

Vegard Wollan in Trondheim 2015..


Când nu știau ce ii așteaptă..
Familia de microcontrolere AVR 8
bits – Atmel/Microchip
• Familia de microcontrolere de 8 biţi denumită generic AVR 8 biti, a
fostei firme Atmel, este o familie apărută şi dezvoltată începând cu anul
1996, oarecum similară familiei PIC a firmei Microchip, cu performanțe
asemănătoare sau mai bune ca raport performanţă-preţ.
• A fost creată ca să concureze PIC-ul, fiind însă microcontrolere bazate
pe o arhitectură, cu o unitate centrală considerată tot de tip RISC, cu
cuvântul de date de 8 biți si cu cel de program de 16 biti.
• Pentru obținerea unui maxim de performanța și implementarea
paralelismului în execuție, AVR folosește o arhitectură Harvard - cu
memorii separate şi magistrale interne separate pentru program şi date,
iar instrucțiunile din memoria de program sunt executate cu două nivele
de pipeline de instructiuni.
– Astfel, în timp ce o instrucțiune este executată, instrucțiunea următoare este
decodată din memoria de program.
– Acest concept permite ca, în mod ideal, să fie executată o instrucțiune în
fiecare ciclu de ceas (perioadă a semnalului de ceas).
• Arhitectura AVR a fost optimizată pentru utilizarea ca limbaj de
programare a limbajului C, permițând compilatorului generarea de cod
foarte eficient atât ca dimensiune cât și ca viteză de execuție. 3
Începând cu anul 2016 Atmel a fost
cumpărată de Microchip așa că rămâne de
văzut ce viitor va avea familia AVR …

De notat însă că există si “clone” AVR 8 biți!


“Clonele” au același set de instrucțiuni, tip de
memorie si periferice ca originalele 89AT, Mega sau
Tiny.
Sunt/erau produse (2017) de firmele
LogicGreen Technologies (SUA) si respectiv NIIET 4
(Rusia).
Familia AVR 8 biţi
• La fel ca la familia PIC de 8 biti, dimensiunea cuvântului de memorie
program este mai mare decât cea a cuvântului de date, fiind întotdeauna de
16 biţi.
• Mai există (2019) trei sub familii mari, în ordinea crescătoare a complexității
resurselor, acestea fiind: ATtiny (Tiny AVR), ATMega (Mega AVR) şi
XMEGA.
• În fiecare din aceste sub familii există numeroase variante constructive, care
diferă între ele prin resursele de memorie şi perifericele disponibile on-chip.
• Începând cu anul 2016 in familia AVR au apărut (si vor mai apărea) variante
de Tiny, Mega si XMega care incorporează tehnologie Microchip, tehnologie
existentă si utilizată la microcontrolerele din familiile PIC de 8 biti
• Aceasta tehnologie se numește CIP- Core Independent Peripherals
(periferice independente de unitatea centrala), un termen utilizat de
Microchip, si are drept caracteristici principale:
– realizează in mod automat anumite sarcini ale perifericelor, fără
intervenția unității centrale (CPU)
– CIP degrevează unitatea centrală de un efort computaționale legat de
periferice, CPU limitându-se doar la supraveghere
– CIP include o mare diversitate de periferice (inclusiv unele care nu au
existat înainte de preluarea Atmel de Microchip)
5
CIP- Core Independent Peripherals

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!

- Registrele sunt împărțite, din punct de


vedere funcțional, în două sub seturi:
R0..R15 și R16..R31.

- Astfel există instrucțiuni care operează


doar cu unul din seturi (SBCI, SUBI, CPI,
ANDI, ORI sau LDI) precum şi instrucțiuni
care folosesc un anumit registru implicit
De exemplu o instrucțiune LPM poate avea ca
destinație doar registrul R0.

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

• I – activare globală întreruperi, nu este chiar un indicator de stare!


• T – utilizat in operațiile de copiere bit (BLD, BST)
• H – Half Carry (transport intermediar), utilizat in aritmetica BCD (CBZ)
• S – Sign (semn), un SAU EXCLUSIV intre N si V
• V – oVerflow (depășire), indică depășirea in aritmetica binară
complement față de 2 Operațiile de transfer de date nu afectează
• N – Negative (Negativ) SREG !
• Z – Zero 17
• C – Carry (Transport sau Împrumut)
AVR: numărătorul program (PC- Program
Counter), salturi si apeluri
• Fluxul program (înlănțuirea secvențială a instrucțiunilor) poate fi
modificat prin utilizarea de instrucțiuni de salt condiţionat şi
necondiționat (de tip JuMP) precum şi de instrucțiunile de apel
de subrutină (de tip CALL), toate capabile de a adresa si accesa
direct întreg spaţiul de adrese al memoriei de program.
• Ambele modifică conținutul/valoarea numărătorului program (PC),
dar instrucțiunile de tip CALL, spre deosebire de cele de salt,
salvează si restaurează in/din stivă o adresă de întoarcere, in mod
automat
– Cu alte cuvinte, instrucțiunile de tip JuMP sunt unidirecționale iar cele de tip
CALL sunt bidirecționale, permițând întoarcerea in punctul de apelare a
subrutinei
• Majoritatea instrucțiunilor AVR au un format pe 16 biți, care
reprezintă un cuvânt în memoria de program.
• Fiecare adresă de memorie de program, adresata de PC, va conține
o instrucțiune memorată pe 16 sau 32 biți (pe unul sau două
cuvinte).
• Pentru numărătorul program (PC) un increment reprezintă un
cuvânt (doi octeți), el numărând cuvinte de 16 biți (2 octeți) nu
octeți !
• Numărul efectiv de biți ai numărătorului program (PC) depinde
de dimensiunea memoriei de program implementate pentru o
anumit varianta, vezi memoria de program
AVR: formatul instrucțiunilor (limbaj de
asamblare)
• O instrucțiune constă din:
• Codul operației (opcod, opcode) care definește
operația care se execută
– In limbajul de asamblare este identificată printr-o
mnemonică (care este, de regulă, un acronim sugestiv,
din păcate sugestiv doar in limba engleza…)
• Operanzii (operands), cei asupra cărora se execută
operația si cărora li se aplică modurile lor de
adresare (cele care determina unde si cum anume
sunt memorați):
– O instrucțiune AVR poate avea 0,1,2 sau 3 operanzi
– Operanzii pot fi adrese de memorie, constante, adrese de
registre (numere de registre)

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

• Scriere in port (output): out $16, r17;


– OBS Adresa hex 0x16 ($16 in limbajul de asamblare
AVR) este adresa asociata portului B 20
Setul de instrucţiuni (descriere
sintetica, summary..)
Indicatorii de condiție (din SREG)
afectați

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)

După iniţializarea SP După primul PUSH După al doilea PUSH

LDI R16, 0xDF


OUT SPL, R16

LDI R16, 0x33


LDI R17, 0x25
LDI R18, 0x0A

După POP După al treilea PUSH PUSH R16


PUSH R17
POP R19
PUSH R18
Execuția instrucțiunilor AVR 8 biți
• Execuția unei instrucțiuni AVR 8 biti tipice, cu un singur ciclu mașină,
va fi descrisă sumar în cele ce urmează.
– Exista si instrucțiuni, nu multe, care se executa in 2 sau cu 4 cicluri
mașină sau instrucțiuni care durează un număr variabil de cicluri
• Unitatea centrală (CPU) are ca semnal de ceas cel notat clkCPU, cu
perioadele notate Ti (i=1,2,3,…) care definesc durata unui ciclu
(perioada) de ceas sistem, ceas sistem care este generat direct de
sursa de ceas selectată pentru microcontroler (prin intermediul biților -
fuzibilelor de configurare corespunzători).
– Nu este folosită nici o divizare de ceas internă (deși ea este posibilă al
unele variante).
• Este utilizat conceptul de pipeline de instrucțiuni care presupune
suprapunerea decodificării instrucțiunii curente cu execuția următoarei,
principiu care poate fi utilizat numai la o arhitectura Harvard
• S-a dorit să se obțină o viteză de calcul de până la 1 MIPS ( Millions
Instructions Per Second - milioane de instrucțiuni în virgulă fixă per
secundă) per MHz (normată funcție de frecvența oscilatorului de ceas).
– Dacă frecvența de ceas a unității centrale va fi, de exemplu, de 8MHz,
viteza de calcul va fi și ea de 8 MIPS, s.a.m.d.

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.

Rezultatul final este că in 4 perioade al ceasului sistem clkCPU: T1..T4


se pot executa 4 instrucțiuni având durata de 1 ciclu mașină, adică un ciclu mașină
care este egal cu perioada ceasului sistem.

•Pentru durata in cicluri a instructiunilor, vezi descrierea completa a


setului de instructiuni la
http://ww1.microchip.com/downloads/en/devicedoc/atmel-0856-avr-
instruction-set-manual.pdf 27
Ilustrare operaţie ALU cu registrele, într-un singur
ciclu masina

Î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

In practică interesează mai puțin viteza de execuție exprimată in MIPS, însă


interesează durata/timpul de execuție al unei instrucțiuni, ca valoare absolută.
Exemplu
Dacă un microcontroler AVR 8 biti are configurată fosc=clkCPU=8MHz, in cât timp
se va executa instrucțiunea de un singur ciclu ADD R1, R2 (sau instrucțiunea NOP
care este una similară ca număr de cicluri) ?
Durata de execuție a unei instrucțiuni de 1 ciclu va fi de 125 nsec
clkCPU=8MHz -> Ti=1/(8*10e6) sec = 1*10e-6 /8 sec= 1usec /8 =125nsec 28
AVR 8 biți - arhitectura, evoluția
istorică a unității centrale
• In descrierea Atmel (AN-0856, 2014) a setului de instrucțiuni sunt
referite 5 variante de arhitecturi: AVR, AVRe, AVRxm, AVRxt si
AVRrc:
– AVR: AT90 Setul original de instrucțiuni din 1995 (AT90 nu mai exista!).
– AVRe: megaAVR; instrucțiuni adăugate la setul de instrucțiuni:
Multiply(xMULxx), Move Word (MOVW) si Load Program Memory (LPM)
îmbunătățită. Nu exista diferențe de temporizare la execuție
– AVRe: tinyAVR; fără instrucțiuni Multiply (xMULxx), temporizare identică
la execuție cu megaAVR.
– AVRxm: XMEGA; temporizarea la execuție in mod semnificativ diferită
fată de AVRe; adăugate instrucțiunile de criptare DES si instrucțiunea
Read Modify Write (RMW)
– AVRxt: AVR 2016 si in continuare. Varianta este bazată pe AVRe si
AVRxm dar mai apropiată de AVRe cu o temporizare îmbunătățită a
execuției
– AVRrc: tinyAVR , variantă limitată de unitate centrală (Reduced Core
AVR CPU) dezvoltată pentru variantele Tiny cu număr foarte mic de pini
(6 pini). Are numai 16 registre (R31-R16) si un set limitat de instrucțiuni.
Nota Temporizare execuție se referă la durata de execuție a unor
instrucțiuni, care eventual a devenit mai mică.
29
AVR 8 biți - arhitectura, evoluția
istorică a unității centrale -2
• După 2016 noile variante produse de Microchip si care
eventual înglobează si CIP sunt organizate in serii (series),
actualmente numerotate de la 0 la 2.
• Seriile respective, actualmente trei pentru Tiny si doar una
pentru Mega, sunt exemplificate mai jos, împreună cu câteva
variante constructive aflate in producție:
– Seria 0: ATtiny807, ATtiny1607, ATtiny204, ATtiny404
ATmega4808, ATmega3208
– Seria 1: ATtiny214, ATtiny417, ATtiny817, ATtiny1617,
ATtiny3217
– Seria 2: ATtiny1624
• Toate sunt identificate arhitectural nu după categoriile de
arhitecturi din setul de instrucțiuni Atmel (de exemplu AVRxt) ci
după o caracteristică (o opțiune) a compilatorului GCC WinAVR
si anume avrxmega3, opțiune care transmite compilatorului
despre ce arhitectura specifica a setului de instrucțiuni (ASI)
AVR 8 biti este vorba
30
Memoria microcontrolerelor AVR 8 biti
• Arhitectura AVR are în esență două spatii principale de memorie:
– o memorie de program (FLASH) şi
– o memorie de date (SRAM si EEPROM).
– memoria de date de tip EEPROM destinată pentru memorarea de date nevolatile, are un mecanism de
acces total diferit, si de fapt ea nu este mapată direct in spațiul de memorie AVR
• Potențialul actual de adresare al arhitecturii AVR, ca memorie de program FLASH
implementată este (față de un maxim de 32MB/16Mcuvinte):
– tinyAVR 0.5–16 kB
– MegaAVR 4-512kB
– XMEGA 16-384kB
• Potențialul actual de adresare al arhitecturii AVR, ca memorie de date SRAM
implementată este (față de un maxim de 64kB): :
– tinyAVR 0.03-1kB
– MegaAVR 0.5–16 kB
– XMEGA 2-32kB

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) !

• OBSERVAȚIE Memoria nevolatila (NVM), de program si date, precum si harta


de memorie aferentă, a suferit unele evoluții importante la noua familie XMEGA
si la variantele Microchip, prin introducerea unui așa zis controler de memorie
nevolatila NVMCTRL, cu un set de registre dedicat. Vezi prezentarea aferentă
si mai ales foile de catalog/manualele XMEGA sau MegaAVR seria 0!
Despre fuzibilele(fuses) AVR
• In memoria de program FLASH a oricărui microcontroler AVR de 8 biți există o
zonă specială, de cel putin 3 octeți: octet inferior (low byte), octet superior (high
byte), octet extins (extended or lock byte) ai căror biți au o funcționalitate
specială servind la o configurare nevolatilă a unor resurse (periferice, memorie)

• 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”)

Interfața utilizator este explicită si lizibilă (fără acces la foaia de catalog)


Fuzibile sistem ceas ATtiny2313: Ponyprog, un
programator ISP (http://www.lancos.com/prog.html) pentru hobbyiști

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)

Fuzibilele CKSEL (4 biţi) si


SUT (2 biţi) sunt grupate

Interfața utilizator a simulatorului Proteus VSM nu cuprinde de fapt toate


41
fuzibilele (BODLEVEL si EESAVE lipsesc) !
Memoria de date- memoria externă
• AVR 8 biți permite eventual doar utilizarea unei memorii de
date externe nu si a uneia de program
• Principial memoria de date poate fi internă și externă.
– Spațiul de adresare maxim posibil (de fapt actualmente
implementat) pentru ambele tipuri este de 128KOcteţi (Bytes).
• Utilizarea unei memorii externe de date (numită generic
XMEM) atunci când este posibilă (de fapt ea este posibilă
numai la variante de încapsulare cu cel puțin 40 de pini), nu
este o opțiune foarte fericită, prezentând două dezavantaje
majore:
– este necesar un număr mare de interconexiuni externe/pini
pentru implementarea magistralelor externe de adrese și date, care
nu mai pot fi utilizate pentru intrări/iesiri de uz general
• Pentru adresarea memoriei externe, magistrala externă de date
(D0..D7, 8 biţi) este multiplexată in timp cu octetul inferior (A0..A7) al
magistralei de adrese (A0..A15, 16 biti), fiind necesar si un circuit de tip
latch transparent de 8 biți (gen 74HC373 sau 74HC573) pentru
demultiplexarea octetului inferior de adresa (A0..A7);
• conexiunile externe “pierdute” vor fi in număr de 18: AD0..AD7
(adrese/date multiplexate) si A8..A15, plus un semnal de scriere /WE si
unul de citire /RD
– un ciclu de acces la memoria externă durează mai mult decât
unul la memoria internă. 42
Memoria de date SRAM- organizare
În figura alăturată este prezentată
organizarea memoriei SRAM
pentru varianta ATMega32.
• Cele 2144 locaţii inferioare
ale memoriei de date sunt
dedicate registrelor de uz
general, registrelor I/O şi
memoriei interne de date
SRAM.
• Primele 96 locaţii sunt
destinate registrelor de uz
general şi memoriei I/O, iar
următoarele 2048 locaţii sunt
memoria internă de date
SRAM.

În particular, familia AVR Mega poate utiliza memorie de


date externă (şi cu posibilitatea introducerii de stări de Wait),
iar unele microcontrolere din familia AVR Tiny nu aveau
deloc memorie internă de date (de tip SRAM). 43
Exemplu ATMEGA32, registre si SRAM (vedere AVR
Simulator IDE Oshonsoft, http://www.oshonsoft.com/avr.html )

Aici incepe SRAM-ul 44


Exemplu ATMEGA32, registre si SRAM (AVR Studio 4
Simulator/Debugger)

Aici începe SRAM-ul

Indicatorul de stiva

45
Exemplu ATMEGA32, registre si SRAM,
conexiuni externe (pin-out)

Indicatorul de stiva Aici se termina SRAM-ul Pentru o capsula DIL40 46


Exemplu ATMEGA32, registre si SRAM
(AVR Studio 4 Simulator/Debugger)

Aici se termina SRAM-ul

47
Exemplu ATTiny2313, registre si SRAM, pin-out

Capsula DIL20 48
Exemplu ATTiny2313, registre si SRAM
(AVR Studio 4 Simulator/Debugger)

Cycle Counter (numărător de cicluri mașină) si Stop Watch


(cronometru) sunt 2 resurse virtuale ale simulatorului
(nu există fizic); ele permit, pe baza cunoașterii
frecvenței oscilatorului de ceas (Frequency), măsurarea49unor
timpi/durate de execuție
Exemplu ATTiny13, registre si SRAM, pin-out

Capsula este DIL8 ! 50


Exemplu ATTiny13, 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

unsigned char EEPROM_read(unsigned int uiAddress)


{
/* Asteptam finalizarea unei eventule operatii anterioare de scriere */
while(EECR & (1<<EEWE))
;
/* Stabilim adresa de unde vrem sa citim */
EEAR = uiAddress;
/* Declansam operatia de citire scriind un “1” in EERE */
EECR |= (1<<EERE);
/* Returneaza data din registrul de date */
return EEDR;
}
AVR 8 biti: sistemul de generare si distribuţie a
ceasului (clock generation system)
• Sistemul de generare a ceasului este descris ca fiind
unul complex şi flexibil, care generează și distribuie
și alte semnale de ceas pentru diversele sub sisteme
AVR.
– Descrierea de mai sus (complex si flexibil) este adevărată de
fapt doar pentru familia XMEGA
– Exista puține variante specializate de AVR care au modalități
de multiplicare a frecventei (cu bucle PLL digital sau
similare), si aceasta nu pentru unitatea centrala ci doar
pentru periferice (de exemplu pentru generarea PWM)
• Nu toate semnalele de ceas interne aferente
diverselor sub-sisteme / module trebuie să fie active la
un moment dat!
• În ideea reducerii consumului de energie, semnalele
de ceas pentru modulele inactive pot fi oprite folosind
diferitele moduri de control a puterii consumate
(moduri “sleep”) sau prin biți de configurare individuală
59
AVR 8 biți - Sistemul de generare si distribuție a
ceasului

60
Semnalele de ceas AVR 8 biți : interne si/sau externe

• Semnalele de ceas menționate în continuare, tipice pentru un ATMega, pot fi


controlate, în sensul opririi şi pornirii, implicit (prin intrarea într-un anumit mod
sleep) sau explicit cu ajutorul unor biți de comandă din registrele de control.

• 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

• Ceasul FLASH– clk FLASH controlează funcţionarea


interfeţei cu memoria FLASH, fiind de obicei activ
simultan cu ceasul CPU.
• Ceasul modulului de temporizare asincronă – clk
ASY permite modulului de temporizare-numărare
asincronă să fie controlat de un ceas provenind de la un
cristal extern de joasă frecvenţă, de 32.768 KHz.
– Este astfel posibilă utilizarea acestuia ca un ceas de timp real
(RTC) chiar şi când dispozitivul este în modul sleep.
• Ceasul convertorului analog–numeric (ADC) – Clk
ADC este cel pe baza căruia este periodizată conversia
analog-numerică (daca exista un astfel de convertor).
– Este posibil ca pe durata efectuării unei conversii să oprim
ceasurile CPU şi I/O pentru a reduce nivelul zgomotului numeric,
cu efecte pozitive asupra preciziei măsurării.
62
AVR 8 biți: sursele de semnal de ceas
• În mod tipic sistemul de ceas al microcontrolerelor AVR permite
alegerea tipului sursei de ceas de bază sau cu alte cuvinte a tipului
de oscilator care va fi utilizat pentru generarea ceasului.
• Opțiunea este realizată cu ajutorul unor fuzibile (biţi de configurare
FLASH) dedicate CKSEL (ClocK SELect)
• Programarea acestor fuzibile se face de regulă odată cu programarea
codului în memoria FLASH.
• Ceasul provenind de la sursa selectată este de fapt intrarea
sistemului de ceas AVR.
• Tipuri posibile de generatoare/configurații de ceas:
1. Oscilator stabilizat cu ajutorul unui rezonator extern, de tip cristal de
cuarţ sau piezoceramic
2. Oscilator stabilizat cu ajutorul unui cristal extern de joasă frecvență
(cristal ceas 32.768kHz)
3. Oscilator stabilizat cu ajutorul unui grup RC (rezistenta, capacitor) extern
4. Oscilator stabilizat cu ajutorul unui grup RC intern (pre-calibrat, prin
intermediul registrului intern OSCCAL)
5. Sursa externa de semnal de ceas

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

Sursa de ceas externa

Oscilatorul RC intern (calibrat)


Oscilatorul RC intern calibrat poate genera frecvenţe
de ceas fixate la 1.0, 2.0, 4.0, sau 8.0 MHz.
Aceste valori nominale sunt calibrate la tensiunea de
alimentare de 5V şi temperatura de 25°C.
De exemplu, la frecvența de 1.0 MHz, această
calibrare asigură deviații de frecvenţă de maxim ±1%
faţă de frecvența nominală.

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

Aici (in acest moment) se conectează


tensiunea de alimentare
Scara timp: 4msec/div
66
Sursele de semnal de ceas – sursa
implicită
• Sursa de ceas implicită este cea cu care funcționează
un microcontroler AVR “neprogramat” (așa cum provine
de la fabricant).
• Valoarea implicită a fuzibilelor critice din acest punct de
vedere este CKSEL = “0001” şi SUT = “10”.
• Sursa de ceas implicită pentru orice variantă AVR este
oscilatorul intern RC, cu frecvența de 1 MHz şi cu
timpul de pornire (SUT – Start Up Time) cel mai lung.
– Această setare garantează faptul că toţi utilizatorii vor putea să
aleagă sursa de ceas dorită utilizând o programare serială (ISP)
sau paralelă high voltage (cu ajutorul unui programator dedicat).

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

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