Sunteți pe pagina 1din 40

Familia de microcontrolere AVR

Capitolul 2 Familia de microcontrolere AVR (Atmel)


2.1 Descrierea general a arhitecturii AVR Familia de microcontrolere de 8 bii denumit generic AVR, a firmei Atmel, familie aprut i dezvoltat n ultimii ani, este oarecum similar familiei PIC a firmei Microchip, cu performane asemntoare sau mai bune ca raport performan-pre. Sunt microcontrolere bazate pe o arhitectur diferit de cea a PIC-ului, dar unitatea central este considerat tot de tip RISC, cu cuvntul de date de 8 bii ([34]). Pentru obinerea unui maxim de performan i implementarea paralelismului n execuie, AVR folosete o arhitectur Harvard - cu memorii separate i magistrale interne separate pentru program i date, iar instruciunile din memoria de program sunt executate cu dou nivele de pipeline. Astfel, n timp ce o instruciune este executat, instruciunea urmtoare este decodat din memoria de program. Acest concept permite ca, n mod ideal, s fie executat o instruciune n fiecare ciclu de ceas (perioad a semnalului de ceas). Mai mult sau mai puin evident, arhitectura AVR a fost optimizat pentru utilizarea ca limbaj de programare a limbajului C, permind compilatorului generarea de cod foarte eficient att ca dimensiune ct i ca vitez de execuie. La fel ca la familia PIC, dimensiunea cuvntului de memorie program este mai mare dect cea a cuvntului de date, fiind ntotdeauna de 16 bii. Exist trei sub familii mari, n ordinea cresctoare a complexitii resurselor, acestea fiind: ATtiny (Tiny AVR), AT90 (sau AVR-ul clasic, matur, nerecomandat pentru proiectele noi) i ATMega (Mega AVR). n fiecare din aceste sub familii exist numeroase variante constructive, care difer ntre ele prin resursele de memorie i perifericele disponibile on-chip ([28], [29], [50]). n familia AVR exist la ora actual i componente mai specializate ([6]) destinate unor aplicaii cum ar fi: industria automobilului (automotive AVR), control iluminat i control motoare (lighting AVR), controlul ncrcrii bateriilor rencrcabile (smart battery AVR) . De asemenea exist variante cu conectivitate CAN Controller Area Network (CAN AVR) sau cu controler pentru sistem de afiare LCD (LCD AVR). Un alt produs interesant al firmei Atmel este cel numit FPSLIC (Field Programmable System Level Integrated Circuits) care este o familie de circuite care nglobeaz un FPGA (o arie logic programabil) i un microcontroler AVR. Sunt disponibile sub forma seriilor AT94K i AT94S. Descrierea care urmeaz este axat pe familia cea mai bogat n resurse, i anume familia AVR Mega, reprezentat prin componente reprezentative precum ATMega 32, 64 sau 128, care difer practic prin dimensiunea memoriei locale de program de tip FLASH (de 32, 64 sau 128 KBytes) i prin unele resurse de tip periferice ([4], [5], [6], [28]). Sub familia AVR Tiny prezint anumite particulariti care vor fi menionate atunci cnd este cazul.
33

Microcontrolere. Aplicaii n mecatronic

Memoria de program este ntotdeauna o memorie de tip FLASH, reprogramabil n sistem (ISP), prin intermediul unei interfee 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). Varianta EEPROM are un mecanism de acces diferit, fiind accesat prin intermediul unor registre de adres i date aflate n spaiul I/O. Dimensiunile celor dou variante interne depind de varianta constructiv ([34]).

Figura 2.1

Schema bloc a unui microcontroler AVR

n figura 2.1 (dup [5]) este prezentat o schem bloc a unui microcontroler AVR cu doar cteva din resursele tipice de tip periferic: intrri/ieiri numerice (grupate n porturi-module), 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, protecia unor zone de memorie, etc,. se face prin
34

Familia de microcontrolere AVR

intermediul unor bii de control care sunt implementai ca fuzibile FLASH care se programeaz, n mod tipic, la fel i odat cu programarea memoriei de program. Arhitectura de calcul AVR este o arhitectur de calcul orientat pe registru i nu pe acumulator. Setul de registre al unitii centrale (CPU) conine 32 registre de uz general, de 8-bii, care pot fi accesate ntr-un singur ciclu de ceas. Aceasta permite unitii aritmetice i logice (ALU) s execute operaiile ntr-un singur ciclu de ceas. ntr-o funcionare caracteristic a ALU, cei doi operanzi sunt preluai din registre, operaia este executat, i rezultatul este memorat napoi ntrun registru totul realizat ntr-un singur ciclu de ceas. ase din cele 32 registre pot fi folosite, n perechi, ca trei registre indicator (pointer) de date de 16 bii, pentru adresarea indirect a memoriei de date, permind calcule de adres foarte eficiente. Unul dintre aceste trei registre indicator poate s fie folosit i ca adres de cutare pentru tabele (Table Look Up) din memoria FLASH de program. Aceste registre de 16 bii cu funcii suplimentare sunt denumite generic registrele X, Y, i Z. ALU realizeaz operaii aritmetice i logice ntre registre sau ntre o constant i un registru. Dup o operaie aritmetic, registrul de stare (SREG) al unitii centrale este actualizat pentru a reflecta corect rezultatul operaiei. Fluxul program poate fi modificat prin instruciuni de salt condiionat i necondiionat (de tip JMP) precum i de instruciunile de apel de subrutin (de tip CALL), toate capabile de a adresa direct ntreg spaiul de adrese al memoriei de program. Majoritatea instruciunilor AVR au un format pe 16 bii, care reprezint un cuvnt n memoria de program. Fiecare adres de memorie de program va conine o instruciune memorat pe 16 sau 32 bii (pe unul sau dou cuvinte). Arhitectura AVR implementat actualmente poate adresa pn la 64 Kcuvinte de memorie program, fiecare cuvnt avnd 16 bii. Pentru numrtorul program (PC) un increment reprezint un cuvnt (doi octei), el numrnd cuvinte nu octei ! Spaiul de memorie de program FLASH este mprit n dou pri numite convenional zona de bootloader i zona de aplicaie. Ambele zone au bii dedicai (de fapt fuzibile) de protecie pentru scriere i citire-scriere. Exist o instruciune special numit SPM (Store Program Memory) care permite scrierea n zona de memorie FLASH de aplicaie, dar aceasta trebuie s se gseasc i s se execute n zona de bootloader. n cazul rutinelor de tratare a ntreruperilor i al apelurilor de subrutin, adresa de ntoarcere din PC este memorat n stiv. n mod tipic (excepia este AVR Tiny) stiva este alocat n memoria SRAM local de date i n consecin dimensiunea stivei este limitat numai de dimensiunea total a SRAM i ntrebuinarea sa. Stiva este adresat prin intermediul indicatorului de stiva SP (Stack Pointer) i toate programele utilizator trebuie s iniializeze indicatorul de

35

Microcontrolere. Aplicaii n mecatronic

stiv SP nainte ca subprogramele sau ntreruperile s fie executate. Indicatorul de stiv SP este accesibil la citire sau scriere de ctre utilizator n spaiul I/O. Pentru accesarea datelor propriu-zise din memoria SRAM local exist cinci moduri diferite de adresare permise de arhitectura AVR. Spaiile de memorie adresabile de arhitectura AVR sunt toate liniare i regulate. Sistemul de ntreruperi este unul flexibil, vectorial, ale crui registre de control sunt n mapate n spaiul I/O. Exist un bit (falg) de activare global a ntreruperilor plasat n registrul de stare SREG. Vectorii de tratare sunt la adrese fixe n memoria de program. Astfel fiecare surs de ntrerupere are un vector separat de ntrerupere alocat ntr-un tabel de vectori de ntrerupere. ntreruperile au i o prioritate care este n conformitate cu poziia vectorului lor de ntrerupere n spaiul de memorie. Cu ct este mai joas este poziia (adresa) vectorului, cu att prioritatea este mai mare. Exist i un aa zis spaiu de memorie pentru intrri i ieiri (numit spaiul I/O), mapat tot n memoria de date, avnd dimensiunea de 64 de octei (bytes) destinat resurselor de tip periferice (registre de control, de stare, de date, etc.). Spaiul de memorie I/O poate s fie accesat direct folosind instruciunile dedicate IN i OUT cu adrese n gama $00 -$3F sau ca locaii oarecare de memorie din spaiul memoriei de date, n gama $20 - $5F (deasupra registrelor de uz general). OBSERVAII 1. Pentru valorile numerice exprimate n baza 16 (hexazecimal) va fi utilizat prefixarea cu $ (de exemplu $F0, $0A, $55) comun pentru majoritatea asambloarelor AVR sau cu cea cu 0x comun pentru compilatoarele C. Valorile fr prefix sunt implicit exprimate n baza 10. Mnemonicele utilizate n continuare sunt, n mod asemntor, cele recunoscute de majoritatea asambloarelor AVR (un exemplu tipic, este cel din IDE-ul AVR Studio al firmei Atmel). 2. n toate exemplele de cod care vor fi prezentate, sintaxa este cea a asamblorului din AVR Studio i cea a compilatorului AVR C Imagecraft sau IAR; se presupune de asemenea c fiierele de tip header (tip .h) specifice unei anumite variante au fost incluse nainte de asamblare sau compilare. 3. Setul complet de instruciuni este prezentat n Anexa 1. Unitatea aritmetic i logic (ALU) AVR funcioneaz n legtur direct cu toate cele 32 registre de uz general. ntr-un singur ciclu de ceas sunt executate operaiile aritmetice sau logice ntre registrele de uz general sau ntre un registru i o constant. Operaiile (de fapt instruciunile) n care este implicat i ALU sunt mprite n urmtoarele categorii principale: - aritmetice i logice - control al fluxului program - transfer de date
36

Familia de microcontrolere AVR

- operaii de prelucrare sau testare pe bit. Doar unele implementri ale arhitecturii (de exemplu ATMega) au n componena unitii centrale i o unitate de multiplicare puternic care poate realiza nmuliri ntregi cu sau fr semn i nmuliri fracionare cu sau fr semn (doar la aceste variante n setul de instruciuni exist instruciuni dedicate pentru aceste operaii). Nu exist instruciuni de mprire. Registrul de stare (SREG), la fel ca la orice microprocesor, conine informaii eseniale despre rezultatul celei mai recent executate instruciuni aritmetice sau logice. Aceast informaie poate fi folosit, de exemplu, pentru a modifica fluxul program (salturi condiionate). Registrul de stare este de fapt actualizat la toate operaiile ALU. Astfel n multe cazuri nu mai sunt necesare instruciuni de comparare dedicate rezultnd un cod mai rapid i mai compact. Registrul de stare nu este memorat (salvat) n mod automat cnd se intr ntr-o rutin de ntrerupe obinuit i nu este restaurat cnd se revine din ntrerupere. Aceste operaii, dac sunt necesare, trebuie s fie realizate de utilizator. Registrul de stare al AVRSREG este descris in figura 2.2., iar denumirea i semnificaia individual a biilor n cele ce urmeaz.

Figura 2.2

Registrul de stare al AVR SREG

Bitul 7 I: Activare-dezactivare global a ntreruperilor Bitul I de activare global a ntreruperilor trebuie s fie setat (1) pentru ca ntreruperile s fie activate. Activarea individual a ntreruperilor este apoi realizat n registrele de control dedicate. Dac bitul I de activare global a ntreruperilor este dezactivat (0) atunci toate ntreruperile sunt dezactivate indiferent de starea cererilor de ntrerupere individual. Bitul I este resetat hard la apariia unei cereri de ntrerupere i este apoi setat la execuia instruciunii RETI pentru a activa ntreruperile. Bitul I poate fi setat cu instruciunea SEI i resetat cu instruciunea CLI. Bitul 6 T: Bit de copiere Instruciunile de tip ncarc bit BLD (Bit Load) i memoreaz bit BST (Bit Store) folosesc bitul T ca operand surs sau destinaie. Un bit al unui registru de uz general poate s fie copiat n T cu instruciunea BST i bitul T poate s fie copiat ntr-un bit al unui registru de uz general cu instruciunea BLD. Bitul 5 H: Half Carry Flag H indic un transport intermediar n operaiile aritmetice BCD, putnd fi folosit la corectarea rezultatului. Bitul 4 S: Bitul de semn Bitul S este calculat ntotdeauna ca un SAU EXCLUSIV ntre flag-ul N i flag-ul V. Bitul 3 V: oVerflow (depire)
37

Microcontrolere. Aplicaii n mecatronic

Bitul V indica o depire n aritmetica complement fa de doi. Bitul 2 N: Negative (rezultat negativ) Bitul N indic un rezultat negativ ntr-o operaie aritmetic sau logic. Bitul 1 Z: Zero (rezultat nul) Bitul Z indic un rezultat nul ntr-o operaie aritmetic sau logic. Bitul 0 C: Carry (transport) Bitul C indic un transport sau un mprumut ntr-o operaie aritmetic sau logic. 2.2 Registrele de uz general Setul de registre este optimizat pentru instruciunile RISC ale AVR. Pentru performan i flexibilitate, n cazul n care operanzii unei instruciuni sunt registrele, sunt posibile urmtoarele combinaii surs/destinaie (rezultat): - un operand surs pe 8 bii i un rezultat pe 8 bii. - doi operanzii surs pe 8 bii i un rezultat pe 8 bii. - doi operanzii surs pe 8 bii i un rezultat pe 16 bii. - un operand surs pe 16 bii i un rezultat pe 16 bii. Majoritatea instruciunilor opernd cu registrele de uz general au acces direct la acestea i majoritatea se execut ntr-un singur ciclu de ceas. Figura 2.3 prezint structura celor 32 de registre de uz general din CPU. Fiecare registru are asignat o adres n memoria de date, ele fiind direct mapate n primele 32 locaii din spaiul de memorie de date utilizator. Dei nu sunt, din punct de vedere fizic, direct implementate n memoria de tip SRAM, aceast organizare a memoriei ofer o flexibilitate deosebit n accesarea registrelor.

Figura 2.3

Registrele de uz general ale microcontrolerului AVR


38

Familia de microcontrolere AVR

Din pcate ele sunt mprite, din punct de vedere funcional, n dou sub seturi R0..R15 i R16..R31. Astfel exist instruciuni care opereaz doar cu unul din seturi (SBCI, SUBI, CPI, ANDI, ORI sau LDI) precum i instruciuni care folosesc un anumit registru implicit: ca exemplu LPM poate avea ca destinaie doar registrul R0. a. Registrele X, Y i Z Registrele din plaja R26.. R31 au cteva funcii suplimentare fa de utilizarea lor general. Aceste registre sunt n primul rnd i indicatoare de adres pe 16 bii utilizabile pentru adresarea indirect a spaiului memoriei de date. Aceste trei registre de adresare indirect sunt numite X, Y, i Z i sunt definite ca n figura 2.4.

Figura 2.4

Registrele X, Y i Z

n diferitele moduri de adresare posibile, aceste registre de adresare ndeplinesc i funcii ca incrementare automat sau decrementare automat. b. Indicatorul de stiv (SP) Stiva 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 vrful stivei. Stiva crete de la adresele de memorie mai nalte n jos, ctre adresele de memorie mai joase. Aceasta presupune c o comand de tip PUSH pentru stiv decrementeaz indicatorul de stiv (SP). Indicatorul de stiv indic zona de stiv din SRAM-ul de date unde se gsesc stivele subrutinelor i ntreruperilor. Acest spaiu de stiv din SRAM-ul de date trebuie s fie definit de ctre utilizator naintea realizrii oricrui apel de

39

Microcontrolere. Aplicaii n mecatronic

subprogram sau de ntrerupere, dei SP are i o valoare implicit dup reset. Indicatorul de stiv trebuie s indice mai sus de adresa $60 (deasupra spaiului I/O). Indicatorul de stiv este decrementat cu o unitate cnd datele sunt mpinse n stiv cu o instruciune de tip PUSH sau este decrementat cu dou uniti cnd adresa de ntoarcere este mpins n stiv de un apel de subprogram sau ntrerupere. Indicatorul de stiv este incrementat cu o unitate cnd datele sunt extrase din stiv cu o instruciune de tip POP i este incrementat cu dou uniti cnd 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 bii, SPH i SPL mapate n spaiul I/O. Numrul real de bii folosii depinde de implementarea memoriei SRAM locale. Este de observat faptul c zona de date n unele implementri ale arhitecturii AVR este att de mic (256 de octei sau mai mic) nct numai SPL este necesar. n acest caz, registrul SPH nu exist. Pentru o variant AVR la care numrtorul de program are mai puin de 16 bii, dac se citete valoarea numrtorului program (PC) din stiv, dup un apel de subrutin sau ntrerupere, biii neutilizai din SPH trebuie s fie mascai (vezi i figura 2.5).

Figura 2.5

Indicatorul de stiv al AVR - SP

Ca o particularitate, n cazul sub familiei AVR Tiny, la care tipic nu exist memorie SRAM ci numai registre, stiva este una hardware, cu numai 3 nivele, limitnd corespunztor numrul de imbricri de subrutine. 2.3 Execuia instruciunilor AVR Execuia unei instruciuni AVR tipice, cu un singur ciclu, va fi descris sumar n cele ce urmeaz. Unitatea central (CPU) are ca semnal de ceas cel notat clkCPU, cu perioada notat Ti (i=1,2,3,) care definete durata unui ciclu de ceas sistem, i care este generat direct de sursa de ceas selectat pentru circuit (prin intermediul biilor-fuzibilelor de configurare corespunztori). Nu este folosit nici o divizare de ceas intern ([34]). Figura 2.6 prezint execuia de instruciuni n paralel cu decodarea unor alte instruciuni, posibil datorit arhitecturii de tip Harvard. Acesta este conceptul de pipeline folosit pentru a obine o vitez de calcul pn la 1 MIPS per MHz,
40

Familia de microcontrolere AVR

normat funcie de frecvena oscilatorului de ceas. Dac frecvena de ceas a unitii centrale va fi, de exemplu, de 8MHz, viteza de calcul va fi i ea de 8MIPS (milioane de instruciuni n virgul fix per secund).

Figura 2.6 instruciuni.

Execuia instruciunilor paralel cu decodarea urmtoarelor

Figura 2.7 prezint execuia unei instruciuni care are ca operanzi registre. ntr-un singur ciclu de ceas este executat o operaie ALU folosind dou registre ca operanzi, iar rezultatul este memorat napoi n registrul de destinaie.

Figura 2.7

Operaie ALU cu registre ntr-un singur ciclu

2.4 Sistemul de ntreruperi AVR Arhitectura AVR permite tratarea cererilor de ntrerupere provenind de la mai multe surse diferite, acestea fiind tipic asociate unor periferice. Ca un exemplu, pentru ATMega64 exist 34 de surse poteniale de ntrerupere. Exist i posibilitatea ca un eveniment extern s declaneze o cerere de ntrerupere (ntreruperi externe). n mod convenional reset-ul (iniializarea) hardware poate fi descris ca o ntrerupere special, cea mai prioritar i, datorit faptului c ea nu poate fi dezactivat, numit i nemascabil. Schema utilizat este una vectorial, cu adrese (vectori) de tratare fixe, la fel ca la multe alte familii de microcontrolere. Pentru fiecare ntrerupere exist un
41

Microcontrolere. Aplicaii n mecatronic

vector separat, avnd dimensiunea fix de 4 octei (2 cuvinte), la fel ca i pentru reset, n zona de nceput a memoriei de program. Toate ntreruperile (mai puin reset-ul) au asignat un bit de activare individual care trebuie s fie 1 logic, mpreun cu bitul I de activare global al ntreruperilor n registrul de stare, pentru a se putea utiliza ntreruperea respectiv. Funcie de valoarea curent a PC-ului, ntreruperile mai pot fi n mod automat dezactivate atunci cnd biii (fuzibilele) Boot Lock BLB02 sau BLB12 sunt programai. Aceasta caracteristic mbuntete protecia software-ului. Cele mai joase adrese n spaiul de memorie de program, n zona de aplicaie, sunt implicit definite ca vectorii de reset i ntrerupere. Aceast list definete i nivelele de prioritate ale diferitelor ntreruperi. Adresa cea mai de jos are nivelul de prioritate cel mai nalt. Astfel reset-ul are cea mai mare prioritate, urmat de INT0 cererea de ntrerupere extern 0, .a.m.d. Dei vectorii de ntrerupere sunt la adrese fixe, ei pot s fie mutai de la nceputul zonei de aplicaie la nceputul zonei de Bootloader setnd bitul IVSEL n registrul de control general al ntreruperilor GICR (General Interrupt Control Register). Vectorul de reset poate fi, de asemenea, mutat la nceputul zonei de Bootloader programnd fuzibilul BOOTRST. Cnd o ntrerupere este recunoscut i tratat, bitul I din SREG este ters i toate ntreruperile sunt dezactivate. Utilizatorul poate s scrie bitul I n 1 logic pentru a activa ntreruperile. Toate ntreruperile active pot atunci s ntrerup rutina de tratare a ntreruperii curente. Bitul I este n mod automat setat cnd are loc execuia unei instruciuni de revenire din rutina de tratare a ntreruperii (RETI). Exist n esen dou tipuri de ntreruperi. Primul tip este declanat de un eveniment care seteaz un bit (un flag) asociat unei anume ntreruperi. La tratarea ntreruperii n numrtorul program PC se aduce automat vectorul corespunztor pentru a se putea executa rutina de tratare a ntreruperii, iar bitul corespondent ntreruperii este setat. Aceti bii asociai ntreruperilor pot s fie teri de utilizator scriind un 1 logic n poziia bitului respectiv. Dac apare o cerere de ntrerupere n timp ce bitul corespondent ntreruperii este ters, bitul va fi setat i memorat pn cnd ntreruperea este activat sau bitul este ters prin soft. Similar, dac una sau mai multe cereri de ntrerupere apar n timp ce bitul I este ters, bitul corespondent ntreruperii va fi setat i memorat pn cnd bitul I este setat din nou, i atunci cererile vor fi executate n ordinea prioritii. Al doilea tip de ntrerupere se va declana doar att timp ct condiia de ntrerupere este activ. Aceste ntreruperi nu necesit bii asociai cererii de ntrerupere. Dac dispare condiia de ntrerupere nainte ca ntreruperea s fie activat, ntreruperea nu vei fi recunoscut i nici tratat. La ntoarcerea (cu RETI) dintr-o rutin de tratare a unei ntreruperi n programul principal se vor executa una sau mai multe instruciuni nainte ca orice cerere de ntrerupere s poat fi recunoscut i tratat.

42

Familia de microcontrolere AVR

Registrul de stare SREG nu este n mod automat memorat (salvat) cnd se intr n rutina de tratare a unei ntreruperi i nici nu este restaurat cnd se revine din rutin. Aceast operaie trebuie s fie realizat de utilizator. Cnd se folosete instruciunea CLI pentru a dezactiva ntreruperile, ntreruperile vor fi imediat dezactivate. Nici o ntrerupere nu va fi executat dup execuia instruciunii CLI, chiar dac se ea apare simultan cu instruciunea CLI. Urmtoarele exemple (n limbaj de asamblare i apoi n limbaj C, dup [7]) arat cum acest lucru poate s fie utilizat pentru a evita apariia ntreruperilor n timpul unei secvene critice de scriere n memoria de date de tip EEPROM (o astfel de secven nu trebuie ntrerupt pentru a se garanta respectarea temporizrii stricte a ciclului de scriere n EEPROM).
in r16, SREG ; memoreaz valoarea SREG cli ; dezactiveaz ntreruperile sbi EECR, EEMWE ; ncepe scrierea EEPROM sbi EECR, EEWE out SREG, r16 ;restaureaz valoarea SREG (bitul I) // char cSREG; cSREG = SREG; /* memoreaz valoarea SREG */ /* dezactiveaz ntreruperile */ _CLI(); EECR |= (1<<EEMWE); /* ncepe scrierea EEPROM */ EECR |= (1<<EEWE); SREG = cSREG; /* restaureaz valoarea SREG (bitul I */

Cnd se folosete instruciunea SEI pentru a activa ntreruperile, instruciunea ce urmeaz instruciunii SEI va fi executat naintea de tratarea oricrei cereri de ntrerupere, aa cum se arat n exemplul urmtor, n care unitatea central este adus n modul sleep (un mod de consum redus) urmnd apoi s fie scoas din acest mod (trezit) de orice cerere de ntrerupere.
sei sleep _SEI (); _SLEEP (); ; ; activeaz ntreruperile intr n modul sleep (adormire) /* activeaz ntreruperile */ /* intr n modul sleep (adormire) */

Timpul de rspuns la o cerere de ntrerupere (latena ntreruperii) pentru toate ntreruperile active este de minim patru cicluri de ceas. Dup patru cicluri de ceas rutina de tratare a ntreruperii curente va fi executat. n timpul celor patru cicluri de ceas, valoarea PC-ului corespunztoare instruciunii urmtoare (doi octei) este memorat n stiv. Tratarea ntreruperii presupune un salt la rutina de tratare a ntreruperii i efectuarea acestui salt dureaz trei cicluri de ceas. Dac mai
43

Microcontrolere. Aplicaii n mecatronic

apare o cerere de ntrerupere n timpul execuiei unor instruciuni care dureaz mai mult de un ciclu, aceast instruciune va fi finalizat nainte ca ntreruperea s poat fi tratat. Dac apare o cerere de ntrerupere n timp ce unitatea central este n modul sleep, timpul de rspuns la cererea de ntrerupere este mrit cu patru cicluri de ceas. La aceasta se va aduga i timpul de repornire (de trezire) din modul sleep. Timpul de revenire din rutina de tratare a unei ntreruperi este de patru cicluri de ceas. n timpul acestor patru cicluri ceas, PC-ul (cei doi octei) este extras din stiv, indicatorul de stiv este incrementat cu dou uniti i bitul I din SREG este setat. OBSERVAIE Modul sleep identific generic un mod de lucru al microcontrolerelor AVR caracterizat printr-un consum redus de la sursa de alimentare. n realitate, lund ca exemplu subfamilia Mega AVR, exist 6 moduri diferite n care microcontrolerul poate intra la ntlnirea instruciunii sleep, funcie de starea programat pentru biii Sleep Mode (SM2, SM1 i SM0) din registrul MCVCR: idle, ADC noise reduction, power down, power save, stand-by i extended stand-by. 2.5 Memoria microcontrolerelor AVR Arhitectura AVR are n esen dou spaii principale de memorie o memorie de program i o memorie de date. Potenialul de adresare al arhitecturii AVR este de 8MBytes pentru fiecare din cele dou tipuri de memorie. n plus, la majoritatea variantelor mai exist o memorie de tip EEPROM destinat pentru memorarea de date nevolatile, dar cu un mecanism de acces total diferit. a. Memoria de Program Orice microcontroler AVR are 2N Koctei (Bytes) de memorie intern de program de tip FLASH, programabil n sistem. Deoarece toate instruciunile AVR sunt memorate pe 16 sau 32 de bii, memoria FLASH are o organizare de tip NKcuvinte x 16 bii. Astfel pentru un ATMega32 N=16, avnd 32Koctei de memorie organizat n 16 Kcuvinte x 16 bii. Spaiul de memorie de program FLASH este mprit principial n dou zone, zona de bootloader i zona de aplicaie. Cele dou seciuni difer i prin nivelele de protecie oferite. n figura 2.8 este prezentat organizarea memoriei de program pentru N=4 (8Koctei de memorie organizat n 4 Kcuvinte x 16 bii). Dimensiunea celor dou zone poate fi controlat prin intermediul fuzibilului BOOTSZ, eventual ntreaga memorie fiind alocat ca zon de aplicaie dac nu este nevoie de bootloader. Memoria FLASH AVR are garantat un numr minim de cel puin 10000 de cicluri de tergere i scriere. Numrul de bii ai numrtorului de program-PC depinde de dimeniunea memoriei implementate pentru o anumit variant. Astfel

44

Familia de microcontrolere AVR

pentru ATMega64 numrtorul program este unul pe 15 bii, el adresnd 32K cuvinte de memorie de program.

Figura 2.8

Memoria de program AVR

Tabelele de constante pot fi memorate n ntreg spaiul de adrese al memoriei de program, existnd modaliti eficiente (instruciuni) de citire a acestora, cum ar fi instruciunea LPM (Load Program Memory). b. Memoria de date Principial memoria de date poate fi intern i extern. Spaiul de adresare maxim posibil (de fapt actualmente implementat) pentru ambele tipuri este de 64Koctei (Bytes). Utilizarea memoriei externe - XMEM, atunci cnd este posibil, nu este o opiune foarte fericit, prezentnd cel puin dou dezavantaje majore: este necesar un numr destul de mare de interconexiuni externe pentru implementarea magistralelor externe de adrese i date precum i faptul c un ciclu de acces la memoria extern dureaz mai mult dect unul la memoria intern. n figura 2.9. este prezentat organizarea memoriei SRAM pentru varianta ATMega32. Cele 2144 locaii inferioare ale memoriei de date sunt dedicate registrelor de uz general, memoriei I/O i memoriei interne de date SRAM. Primele 96 locaii sunt destinate registrelor de uz general i memoriei I/O, iar urmtoarele 2048 locaii sunt memoria intern de date SRAM.

45

Microcontrolere. Aplicaii n mecatronic

Figura 8.9

Harta memoriei interne de date (ATMega 32)

Exist cinci moduri posibile de adresare pentru memoria de date i ele sunt: - adresare direct - adresare indirect cu deplasare - adresare indirect - adresare indirect cu pre-decrementare - adresare indirect cu post-incrementare Adresarea direct poate fi utilizat pentru tot spaiul memoriei de date. Modul de adresare indirect cu deplasare permite adresarea a maxim 63 de locaii ncepnd de la adresa de baz din registrele Y sau Z. Registrele R26..R31 se utilizeaz ca pointeri pentru adresarea indirect. Cnd se folosete adresarea de tip registru indirect cu pre-decrementare automat i post-incrementare, registrele de adres X, Y, i Z sunt decrementate sau incrementate corespunztor. Cele 32 de registre de uz general, cele 64 de registre (locaii) din spaiul I/O i cele n locaii din SRAM-ul intern de date sunt accesibile n toate aceste moduri de adresare. n particular, familia AVR Mega poate utiliza memorie de date extern (i cu posibilitatea introducerii de stri de Wait), iar multe microcontrolere din familia AVR Tiny nu au deloc memorie intern de date (de tip SRAM).

46

Familia de microcontrolere AVR

Timpul de acces la memoria intern de date este ilustrat n figura 2.10 unde accesul la memoria intern SRAM este executat n dou cicluri de ceas ale unitii centrale. Sunt ilustrate ambele tipuri de acces: citire (Read) i scriere (Write) n SRAM-ul intern, validate de semnalele interne RD i WR (active n 1).

Figura 2.10

Ciclurile de acces la datele SRAM (intern)

c. Memoria EEPROM Majoritatea variantelor familiei AVR au i o memorie EEPROM local destinat memorrii nevolatile a datelor. De exemplu Atmega32 are 1024 octei de memorie de date EEPROM. Aceast memorie este organizat ca un spaiu de date separat printr-un mecanism special de acces, n care octei singulari pot s fie citii i/sau scrii. Memoria EEPROM AVR are garantat un numr minim de 100 000 de cicluri tergere i scriere. Accesul este realizat prin intermediul registrelor EEPROM din spaiul I/O. Deoarece operaia de scriere are o durat destul de mare (de ordinul milisecundelor) exist o modalitate automat de sincronizare care permite utilizatorului s detecteze cnd s-a finalizat operaia de scriere a unui octet i poate fi scris octetul urmtor. Pentru a mpiedica posibilitatea unor scrieri accidentale n EEPROM, trebuie s fie urmat o procedur de scriere specific. Anumite precauii trebuie s fie luate dac avem un cod utilizator ce conine instruciuni care scriu n EEPROM, precauii legate de timpul de stabilizare a tensiunii sursei de alimentare la valoarea nominal. n sursele de alimentare puteric filtrate, este probabil ca tensiunea de alimentare Vcc s se ridice mai ncet la pornire. Aceasta va face ca dispozitivul s funcioneze, un anumit interval de timp, la o tensiune mai sczut fa de cea specificat pentru frecvena de ceas

47

Microcontrolere. Aplicaii n mecatronic

folosit. Acest interval de timp trebuie evitat, ntr-un fel sau altul, la scrierea n EEPROM pentru a se garanta corectitudinea operiei de scriere. Mai trebuie menionat c atunci cnd EEPROM-ul este citit, unitatea central este oprit pentru patru cicluri de ceas nainte de execuia urmtoarei instruciuni. Cnd EEPROM-ul este scris, unitatea central este oprit pentru dou cicluri de ceas naintea de execuia urmtoarei instruciuni. 2.6 Sistemul de generare a ceasului Sistemul de generare a ceasului este unul complex i flexibil, care genereaz i distribuie i alte semnale de ceas pentru diversele sub sisteme AVR. Nu toate semnalele de ceas 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 sleep sau bii de configurare individual ([4], [5], [6]). 2.6.1 Semnalele de ceas AVR Semnalele de ceas menionate 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 bii de comand din registrele de control. Ceasul CPU clk CPU este dirijat ctre prile 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 execuia calculelor i operaiilor specifice de ctre CPU. Ceasul I/O clk I/O este folosit de majoritatea modulelor I/O, precum modulele de temporizare-numrare, SPI sau USART. El este i folosit de modulul de ntreruperi externe, dar ntreruperile externe sunt detectate cu o logic asincron, permind acestor ntreruperi s fie detectate chiar dac ceasul I/O este oprit. De asemenea, recunoaterea adresei de ctre modulul TWI (Two Wire Interface = I2C) este realizat tot asincron cnd clk I/O este oprit, fcnd posibil recepia adresei TWI n toate modurile de tip sleep. Ceasul FLASH clk FLASH controleaz funcionarea interfeei cu memoria FLASH, fiind de obicei activ simultan cu ceasul CPU. Ceasul modulului de temporizare asincron clk ASY permite modulului de temporizare-numrare asincron s fie controlat de un ceas provenind de la un cristal extern de joas frecven, de 32768 KHz. Este astfel posibil utilizarea acestuia ca un ceas de timp real (RTC) chiar i cnd dispozitivul este n modul sleep. Ceasul convertorului analognumeric (ADC) Clk ADC este cel pe baza cruia este periodizat conversia analog-numeric. Este posibil ca pe durata efecturii unei conversii s oprim ceasurile CPU i I/O pentru a reduce nivelul zgomotului numeric, cu efecte pozitive asupra preciziei msurrii.
48

Familia de microcontrolere AVR

2.6.2 Sursele 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. Opiunea este realizat cu ajutorul unor fuzibile (bii de configurare FLASH) dedicate CKSEL (ClocK SELect), ale cror combinaii primare sunt prezentate n tabelul 2.1 ([5]). 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. Tabelul 2.1. Selectarea sursei de ceas Tip ceas Rezonator extern, cuar sau ceramic Cristal extern de joas frecven Oscilator extern RC Oscilator intern RC (calibrat) Ceas extern CKSEL3..0 1111 1010 1001 1000 0101 0100 0001 0000

n configurarea sursei de ceas i a oscilatorului de ceas trebuie luat n considerare i faptul c fiecare configuraie de oscilator are i un anumit timp de pornire, din momentul conectrii alimentrii i pn la stabilizarea semnalului de ceas generat, ca frecven i amplitudine. Numai dup aceast stabilizare unitatea central poate fi iniializat corect sau instruciunile pot fi executate corect. Acesta este motivul pentru care exist o corelaie ntre evoluia tensiunii de alimentare la conectare, logica de iniializare (reset) i configurarea sistemului de ceas. Aceast corelare poate fi controlat, n anumite limite, cu ajutorul fuzibilelor numite SUT (SUT Start Up Time, timpul de pornire). Sursa de ceas implicit este cea cu care funcioneaz un microcontroler AVR neprogramat (aa cum provine de la fabricant). Valoarea implicit a fuzibilelor critice din acest punct de vedere este CKSEL = 0001 i SUT = 10. Astfel sursa de ceas implicit este oscilatorul intern RC, cu frecvena de 1 MHz i cu timpul de pornire (SUT Start Up Time) cel mai lung. Aceast setare garanteaz faptul c toi utilizatorii vor putea s aleag sursa de ceas dorit utiliznd o programare serial (ISP) sau paralel (cu ajutorul unui programator dedicat). a. Oscilatorul cu cristal Conexiunile externe XTAL1 i XTAL2 (Figura 2.19) reprezint intrarea i respectiv ieirea unui amplificator inversor care st la baza realizrii unui oscilator a crui frecven de oscilaie este stabilizat cu un rezonator extern. Se poate folosi fie un cristal de cuar, fie un rezonator ceramic, mai ieftin. Fuzibilul CKOPT selecteaz ntre dou moduri de lucru diferite ale amplificatorului generator de oscilaii. Cnd bitul (fuzibilul) CKOPT este programat, amplitudinea ieirii
49

Microcontrolere. Aplicaii n mecatronic

oscilatorului XTAL2 va fi maxim. Acest mod este potrivit pentru funcionarea ntr-un mediu zgomotos din punct de vedere electromagnetic sau cnd ieirea de la XTAL2 mai este utilizat (printr-un buffer) ca o surs de ceas secundar. Acest mod are domeniul de frecven posibil cel mai larg. Cnd CKOPT este neprogramat, amplitudinea ieirii oscilatorului va fi mai mic, reducnd i consumul de energie. n acest mod i limita superioar a domeniului de frecven este mai mic.

Figura 2.19

Conectarea oscilatorului cu cristal de cuar

Tipic frecvena maxim de oscilaie este 8 MHz cu CKOPT neprogramat i 16 MHz cu CKOPT programat. Cele dou capacitoare externe C1 i C2 trebuie s fie egale, att pentru cuar ct i pentru rezonatoare ceramice. Valoarea optim a capacitorilor depinde de tipul folosit de cristal sau de rezonator, de capacitile parazite i de nivelul de zgomot electromagnetic al mediului. Valori aproximative pentru capacitori sunt date n tabelul 2.2. Din punct de vedere al frecvenei rezonatorului cu cuar extern, oscilatorul poate funciona n trei moduri diferite, fiecare optimizat pentru un domeniu specific de frecvene. Acest mod de funcionare este selectat cu fuzibilele CKSEL3..1 dup cum se arat n tabelul 2.2 ([4]). Tabel 2.2. Modurile de funcionare ale oscilatorului cu cristal de cuar Domeniul de frecvene Domeniu recomandat CKOPT CKSEL3..0 (MHz) pentru C1 i C2 1 101 0.4 0.9 1 110 0.9 3.0 12 22 pF 1 111 3.0 8.0 12 22 pF 0 101,110,111 1.0 12 22 pF b. Oscilatorul cu cristal de joas frecven Pentru a se putea folosi ca surs de ceas un cristal ieftin de joas frecven, de 32768 KHz, trebuie s fie aleas configuraia oscilator cu cristal de joas frecven, prin setarea fuzibilelor CKSEL la valoarea 1001. Programnd i fuzibilul CKOPT, utilizatorul poate s activeze nite capacitori interni conectai
50

Familia de microcontrolere AVR

ntre XTAL1 i XTAL2 i mas, capacitori cu o valoare nominal de 36 pF, n felul acesta eliminnd necesitatea utilizrii de capacitori externi. Cnd este selectat acest tip de oscilator, timpul de pornire (start-up) este determinat de starea fuzibilelor SUT conform tabelului 2.3 ([5]). Tabelul 2.3. Timpii de pornire pentru oscilatorul cu cristal de joas frecven ntrziere Timpul de suplimentar Utilizare recomandat SUT1..0 pornire din Reset 00 1K CK 4.1 ms Tensiune rapid cresctoare 01 1K CK 65 ms Tensiune lent cresctoare 10 32K CK 65 ms Frecven stabil la pornire 11 Rezervat c. Oscilatorul extern RC Exist multe aplicaii pentru care precizia frecvenei oscilatorului de ceas nu este foarte important, caz n care se poate utiliza un oscilator configurat cu un grup RC extern, ca n figura 2.20. Frecvena este estimat cu o relaie de forma f = 1/(3RC), unde C trebuie s fie de cel puin 22 pF. Programnd fuzibilul CKOPT, utilizatorul poate s activeze un capacitor intern de cca. 36 pF conectat ntre XTAL1 i mas, n felul acesta eliminndu-se necesitatea capacitorului extern.

Figura 2.20

Configuraia extern RC

Aceast configuraie de oscilator poate funciona n patru moduri diferite, fiecare optimizat pentru un domeniu de frecvene specific Modul de funcionare este selectat cu fuzibilele CKSEL3..1 conform tabelului 2.4 ([4]) :

51

Microcontrolere. Aplicaii n mecatronic

Tabel 2.4. Modurile de funcionare ale oscilatorului extern RC CKSEL3..0 Domeniul de frecvene (MHz) 0101 0.9 0110 0.9 3.0 0111 3.0 8.0 1000 8.0 12.0 Cnd este selectat acest mod de lucru, timpi de pornire sunt determinai cu fuzibilele SUT conform tabelului 2.5 ([4]). Tabel 2.5. Timpii de pornire pentru oscilatorul extern RC Timpul de ntrziere suplimentar Utilizare recomandat SUT1..0 pornire de la Reset 00 18 CK Circuitul BOD activ 01 18 CK 4.1 ms Tensiune rapid cresctoare 10 18 CK 65 ms Tensiune lent cresctoare Tensiune rapid cresctoare 11 6 CK 65 ms sau circuitul BOD activ d. Oscilatorul RC intern (calibrat) Oscilatorul RC intern calibrat poate genera frecvene 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 25C. De exemplu, la frecvena de 1.0 MHz, aceast calibrare asigur deviaii de frecven de maxim 1% fa de frecvena nominal. Frecvena este selectat programnd fuzibilele CKSEL ca n tabelul 2.6 ([5]). Fuzibilul CKOPT trebuie s fie ntotdeauna neprogramat, atunci cnd se folosete aceast opiune pentru ceas. Pe durata iniializrii (reset-ului), este ncrcat automat un octet de calibrare n registrul numit OSCCAL. Calibrarea se face de ctre productor doar pentru frecvenele de 1.0, 2.0, 4.0, sau 8.0 MHz i nu se garanteaz alte valori intermediare. Tabel 2.6. Modurile de funcionare a oscilatorului intern RC CKSEL3..0 Domeniul de frecvene (MHz) 0001 1.0 0010 2.0 0011 4.0 0100 8.0

52

Familia de microcontrolere AVR

e. Ceasul extern Exist i posibilitatea utilizrii unei surse de ceas externe, caz n care se utilizeaz conexiunea XTAL1 cum se arat n figura 2.21. Pentru a folosi un semnalul ceas extern fuzibilele CKSEL trebuie s fie setate la valoarea 0000. Cnd se utilizeaz o surs extern de ceas, trebuie s se evite schimbrile brute n frecvena ceasului pentru a se garanta funcionarea stabil a microcontrolerului. O variaie a frecvenei de mai mult de 2% de la un ciclu la altul poate duce la o comportare imprevizibil. Eventual, microcontrolerul trebuie inut n starea de reset pe durata unor asemenea schimbri de frecven a ceasului.

Figura 2.210

Utilizarea unei surse de ceas extern

f. Oscilatorul de joas frecven pentru temporizatorul/numrtor asincron Exist variante de microcontrolere AVR la care sunt disponibile i conexiunile externe notate TOSC1 i TOSC2 (de regul ca funcii alternative ale pinilor respectivi). Acestea corespund unui oscilator suplimentar care poate furniza semnal de ceas pentru modulul de temporizare/numrare asincron, cristalul fiind conectat direct nefiind necesari capacitori externi. Oscilatorul este optimizat pentru utilizarea unui cristal de joas frecven de 32768 KHz. Nu este recomandat utilizarea unei surse de ceas externe pe TOSC1 ([9]). OBSERVAIE IMPORTANT Flexibilitatea configurrii prin fuzibile a acestui sistem de ceas ascunde i capcane. Astfel este posibil ca, dintr-un motiv sau altul, pentru o anumit configuraie hardware extern, programarea fuzibilelor s se fac greit de ctre utilizator. De exemplu, hardware-ul extern existent este un grup RC asociat configuraiei specifice de oscilator, dar programarea tipului este fcut pentru configuraia oscilator cu cristal extern. Programarea respectiv va fi i ultima care se poate face prin intermediul interfeei seriale ISP, deoarece dup programare oscilatorul nu va mai funciona, iar microcontrolerul nu mai are semnal de ceas. Soluia este utilizarea unui programator extern paralel pentru microcontroler sau a unei improvizaii pentru hardware-ul extern (dac se cunoate ce anume s-a programat greit!).
53

Microcontrolere. Aplicaii n mecatronic

2.7 Iniializarea AVR (resetarea) Dup o iniializare hardware (un reset), la fel ca la orice microprocesor, i cel puin o parte din resurse au o stare iniial precizat, astfel toate registrele I/O sunt setate la anumite valori iniiale (implicite), i prima instruciune executat este cea din vectorul de reset (de la adresa respectiv). Dac nu este vorba de un reset generat de conectarea tensiunii de alimentare, coninutul memoriei SRAM de date rmne nemodificat. Instruciunea memorat n vectorul de reset este de obicei o instruciune de salt absolut (JMP) la prima instruciune din programul propriu-zis. Dac programul nu activeaz i nu utilizeaz ntreruperile, vectorii de ntrerupere nu vor fi folosii, i codul programului poate scris i la aceste adrese. Acest lucru este, de asemenea, posibil i n cazul n care vectorul de reset este n zona de aplicaie n timp ce vectorii de ntrerupere sunt n zona de bootloader sau invers. Dup ce sursa extern care a generat semnalul de reset devine inactiv, intr n aciune un numrtor care va genera o ntrziere (time-out) cu scopul mririi perioadei ct reset-ul, intern de data aceasta (internal reset), este activ. Aceasta va permite, de exemplu, tensiunii de alimentare s ajung la o valoare nominal stabil nainte de se executa instruciuni. Timpul de ntrziere este definit de utilizator prin fuzibilele CKSEL. Tipic, pentru un microcontroler ATMega exist cinci surse de reset, care pot fi descrise astfel ([4], [9]): - Reset la conectarea tensiunii de alimentare: cnd tensiunea de alimentare este sub o anumit valoare de prag (notat VPOT). - Reset generat extern: cnd un nivel de 0 este prezent pe pinul RESET pentru o perioad mai mare dect durata minim. - Reset generat prin ceasul de gard (watchdog): cnd ceasul de gard este activat i perioada de gard expir. - Reset generat la scderea temporar a tensiunii de alimentare (Brown-out): cnd detectorul Brown-out este activat i tensiunea de alimentare VCC este sub pragul de brown-out (notat VBOT). - Reset generat prin interfaa JTAG: cnd registrul de reset al interfeei JTAG este adus n 1. a. Reset-ul la conectarea tensiunii de alimentare (POR) Un impuls de reset va fi generat la conectarea tensiunii de alimentare de un circuit specializat (POR - Power On Reset) atunci cnd VCC va atinge nivelul de de prag VPOT att n sens cresctor ct i descresctor. Circuitul POR garanteaz c microcontrolerul va fi resetat corect la conectarea alimentrii (Power-on). Atingerea tensiunii de prag n sens cresctor declaneaz numrtorul de ntrziere care va stabili durata de prelungire a resetului intern (tTOUT), dup dispariia condiiei. Reset-ul intern este activat fr nici o ntrziere atunci cnd VCC coboar sub nivelul de detectare.

54

Familia de microcontrolere AVR

Aceast variant de reset este valorificat n practic prin conectarea pinului RESET direct la tensiunea de alimentare Vcc: VPOT=VRST (figura 2.22).

Figura 11

Conectarea alimentrii cu pinul RESET legat la VCC

b. Reset-ul generat extern Un reset extern este generat practic de un nivel 0 pe pinul RESET, care dureaz mai mult dect o lime de impuls minim, chiar dac ceasul CPU este oprit. Cnd semnalul aplicat pe RESET atinge tensiunea de prag (VRST) pe frontul cresctor, pinul va fi considerat n 1, condiia a disprut i numrtorul de ntrziere va genera perioada suplimentar de reset intern tOUT.

Figura 2.23

Reset extern dup conectarea alimentrii

n figurile 2.23 i 2.24 sunt prezentate cele dou situaii relevante pentru activarea intrrii RESET: imediat dup Power-up i oricnd n timpul funcionrii.

55

Microcontrolere. Aplicaii n mecatronic

Figura 2.24

Reset extern n timpul funcionrii

c. Reset-ul generat la scderea temporar a tensiunii de alimentare (Brownout) Unele microcontrolere AVR printre care i familia ATMega au un circuit de detecie numit BOD- Brown Out Detection, pentru a monitoriza nivelul VCC n timpul funcionrii, comparnd-ul cu un nivel fix de declanare. Nivelul de declanare pentru BOD poate fi selectat cu fuzibilul BODLEVEL la valoarea 2.7V (BODLEVEL neprogramat), sau la valoarea 4.0V (BODLEVEL programat), funcie de valoarea utilizat pentru tensiunea de alimentare. Nivelul de declanare are asociat i un histerezis VHYST pentru a garanta o detecie sigur i a discerne ntre evoluia cresctoare (V+ ) i cea descresctoare(V- ): VBOT+ = VBOT + VHYST /2 VBOT- = VBOT - VHYST /2.

Figura 2.25

Reset datorat Brown-out n timpul funcionrii

Circuitul BOD poate fi activat sau dezactivat prin intermediul fuzibilului numit BODEN. Cnd BOD este activat (fuzibilul BODEN programat) i VCC scade la o valoare sub nivelul de declanare (VBOT - n figura 2.25), reset-ul intern este
56

Familia de microcontrolere AVR

activat imediat. Cnd VCC crete deasupra nivelului de declanare (VBOT+ n figura 2.25) numrtorul de ntrziere va genera perioada suplimentar de reset intern tOUT. Circuitul BOD va detecta o scdere a VCC numai dac tensiunea se menine sub nivelul de declanare mai mult dect un interval minim tBOD. d. Reset prin ceasul de gard (Watchdog Reset) Atunci cnd ceasul de gard genereaz o depire (ca urmare a ne rencrcrii lui n timp util), el va genera i un impuls scurt de reset cu durata de un ciclu de ceas (1CK), iar pe frontul cztor al acestuia va fi declanat numrtorul de ntrziere care la rndul lui va genera perioada suplimentar de reset intern tOUT.

Figura 2.26

Reset prin Watchdog n timpul funcionrii

2.8 Intrrile i ieirile numerice (porturile I/O) Toate microcontrolerele AVR au un numr oarecare de intrri-ieiri numerice de uz general, grupate din punct de vedere funcional n porturi I/O. Ele permit realizarea de cicluri de acces de tip Read-Modify-Write (citete modific-scrie). Cu alte cuvinte aceasta nseamn c direcia unui pin al portului poate fi schimbat fr a schimba i direcia oricrui alt pin din acelai port, cu ajutorul unor instruciuni de tip SBI i CBI. La fel stau lucrurile cnd se dorete modificarea tipului de ieire: cu dren n gol sau normal cu rezisten de sarcin, prin activarea sau dezactivarea rezistoarelor de sarcin (Rpu= x10KOhmi). Buffer-ele de ieire au capacitatea de a absorbi un curent IOL de pn la 20mA (la Vcc=5V) putnd comanda astfel direct un LED. Capacitatea de a absorbi curent depinde ns de tensiunea de alimentare, de exemplu la Vcc= 2.7V curentul maxim absorbit scade la 10mA ([4], [6], [28], [29]). Toi pinii de port au rezistoare de sarcin individuale, cu o rezisten care nu depinde de tensiunea de alimentare. De asemenea toi pinii au diode de protecie
57

Microcontrolere. Aplicaii n mecatronic

att ctre VCC ct i ctre mas dup cum se observ n figura 2.27 ([4]). Cpin (xpF).este capacitatea parazit asociat pinului

Figura 2.27

Schema electric echivalent a unui pin I/O

Referitor la notaiile utilizate n continuare (Atmel): cu x s-a notat litera care identific portul de 8 bii (x= A, B, C, ), i cu n numrul bitului din port (n=0..7). La modul general avem PORTxn, iar n particular bitul 6 din portul A va fi notat cu PORTA6. Pentru fiecare din porturile existente sunt alocate trei locaii de memorie n spaiul I/O: registrul de date notat PORTx, registrul pentru direcia datelor notat DDRx (Data Direction Register), i pinii (de intrare= ai portului notat PINx. Locaia corespunztoare pinilor de intrare ai portului PINx poate fi numai citit, n timp ce registrul de date PORTx i registrul pentru direcia datelor DDRx pot fi scrise i citite. n plus, bitul de dezactivare a rezistoarelor de sarcin PUD (Pull Up Disable) din registrul SFIOR dezactiveaz, cnd este setat, rezistena de sarcin pentru toi pinii din toate porturile. Majoritatea acestor pini de port au i funcii alternative relevante pentru perifericele microcontrolerului, existnd un mecanism de multiplexare adecvat. Activarea i utilizarea funciilor alternative pe unii dintre pinii portului nu influeneaz folosirea celorlali pini din port ca intrri/ieiri de uz general. a. Porturile I/O ca intrri/ieiri de uz general. Prima operaie care trebuie realizat de utilizatorul intrrilor i ieirilor numerice ale unui microcontroler AVR este cea de configurare a pinilor. Din punct de vedere al programatorului fiecare pin al portului se compune din trei

58

Familia de microcontrolere AVR

bii: DDxn, PORTxn, i PINxn. Biii DDxn sunt accesai la adresa I/O DDRx, biii PORTxn la adresa I/O PORTx i biii PINxn la adresa I/O PINx. Bitul DDxn n registrul DDRx selecteaz direcia acestui pin. Dac DDxn este 1 logic, Pxn este configurat ca pin de ieire. Dac DDxn este 0 logic, Pxn este configurat ca pin de intrare. Dac PORTxn este 1 logic cnd pinul a fost configurat ca pin de intrare, rezistorul de sarcin este activat i va trage n 1 intrarea neconectat. Pentru a dezactiva acest rezistor, PORTxn trebuie s fie 0 logic sau pinul trebuie s fie configurat ca ieire. Atta timp ct reset-ul este activ pinii portului sunt ntr-o stare similar High-Z (tri-state), chiar dac ceasul I/O nu este activ. Dac PORTxn este 1 logic cnd pinul este configurat ca ieire, pinul portului va fi i el n 1. Dac PORTxn este 0 cnd pinul este configurat ca ieire, pinul portului va fi i el n 0 . Cnd se trece de la o stare ca intrare High-Z ({DDxn, PORTxn} = 0b00) la o ieire n 1 ({DDxn, PORTxn} = 0b11), apare o stare intermediar, fie cu rezistoarele de sarcin activate ({DDxn, PORTxn} = 0b01) fie cu ieirea in 0 ({DDxn, PORTxn} = 0b10). n mod normal, starea cu rezistoarele de sarcin activate este complet acceptabil, deoarece o intrare de impedan nalt nu va observa diferena ntre un pin in starea 1 i prezena rezistoarelor de sarcin. Dac este ns cazul ieirii 0, bitul PUD din registrul SFIOR poate fi setat pentru a dezactiva toate rezistoarele de sarcin . Cnd se trece de la o stare cu intrarea cu rezistoare de sarcin la o ieire n 0 apare aceeai problem. Utilizatorul trebuie s foloseasc starea tri-state ({DDxn, PORTxn} = 0b00) sau ieire high ({DDxn, PORTxn = 0b11) ca un pas intermediar. Tabelul 2.6 ([4], [5], [9]) prezint sintetic valorile de bit eseniale pentru configurarea pinului. Tabelul 2.6. Configurarea pinilor porturilor PUD (din I/O DDxn PORTxn SFIOR) 0 0 X Intrare 0 0 1 1 1 1 0 1 0 1 X X Intrare Intrare Ieire Ieire

Sarcin Nu Da Nu Nu Nu

Comentarii Tri-state (High-Z) Pxn va debita curent (surs) Tri-state (High-Z) Ieire 0 Ieire 1

Urmtorul exemplul de cod (n asamblare i apoi n C, dup [9]) arat cum se pot programa pentru portul B: n 1 pinii 0 i 1 ca ieiri , n 0 pinii 2 i 3 tot ca ieiri i cum se definesc pinii de la 4 la 7 ca intrri, cu rezistene de sarcin doar pentru pinii 6 i 7. Valorile setate i rezultate pentru pini sunt citite napoi, dar o instruciune NOP este inserat pentru a face posibil citirea corect a valorilor recent asignate pinilor.
59

Microcontrolere. Aplicaii n mecatronic

;Definirea rezistenelor i setarea ieirii in 1. ;Definirea direciei pentru pinii portului ldi R16,(1 << PB7)|( 1 <<PB6)|(1 << PB1)|(1 << PB0) ldi R17,(1 << DDB3)|( 1 <<DDB2)|(1 < <DDB1)|(1 << DDB0) out PORTB, R16 out DDRB, R17 nop ; Inserarea unei instruciuni NOP ; Citirea pinilor portului in R16, PINB unsigned char i; /* Definirea rezistenelor de sarcina i setarea ieirii in 1. */ /* Definirea direciei pentru pinii portului */ PORTB =(1 << PB7)|(1 << PB6)|(1 << PB1)|(1 << PB0); DDRB = (1 << DDB3)|(1 << DDB2)|(1 << DDB1)|(1 << DDB0); /* Inserarea unei instruciuni NOP */ _nop(); /* Citirea pinilor portului */ i = PINB;

... OBSERVAII 1. Pentru codul n asamblare sunt utilizate dou registre temporare R16 i R17 pentru a minimiza timpul de cnd rezistenele de sarcin sunt activate pe pinii 0, 1, 6, i 7 i pn cnd direcia biilor este corect setat, definind biii 2 i 3 ca 0 i redefinind biii 0 i 1 ca ieiri n 1. 2. Operatorul << este cel de deplasare (shift) stnga, iar | este un SAU logic. b. Pinii I/O neconectai Dac unii dintre pinii de intrare/ieire rmn neutilizai, este bine s se garanteze c aceti pini au o stare definit i nu rmn flotani.. Metoda cea mai simpl pentru a garanta o stare definit (1) pentru un pin neutilizat, este definirea lui ca intrare i activarea rezistenelor de sarcin. Trebuie inut cont c n cazul unei reiniializri rezistenele de sarcin vor fi dezactivate Dac un consum sczut de energie este important n timpul (re)iniializrii, este recomandat s se foloseasc rezistoare externe de sarcin ctre VCC (1) sau rezistoare externe ctre mas (0). Nu este recomandat conectarea pinilor neutilizai direct la VCC sau la mas, deoarece aceasta poate duce la apariia unor cureni excesivi dac pinul este configurat din greeal ca ieire.

60

Familia de microcontrolere AVR

2.9 Convertorul analogic-numeric Anumite microcontrolere AVR, n toate sub familiile (Tiny, AT90 i Mega), au printre resursele de tip periferic i un sistem de conversie analognumeric, cu mai multe canale de intrare. Sistemul include de regul: un multiplexor analogic, un circuit Sample/Hold, un convertor analog-numeric cu aproximri succesive i o referin de tensiune. Descrierea care urmeaz este bazat pe ([4], [5], [9] i [11]) i axat pe sistemul de conversie analog-numeric existent la familia ATMega (de exemplu ATMega 16). Din punct de vedere al utilizatorului exist, odat, 8 intrri analogice asimetrice (notate ADC7..ADC0) care de fapt sunt cele 8 canale de intrare ale unui multiplexor analogic. Cele 8 intrri analogice sunt de fapt funcii alternative ale pinilor portului A (PORTA). Tensiunile de intrare, n acest mod asimetric, sunt raportate fa de borna de mas GND, care definete potenialul de 0V. Exist ns i posibilitatea ca aceste canale de intrare s fie folosite i ntrun mod diferenial. Sunt posibile pn la 16 combinaii toate descriind diferite moduri de intrare diferenial. O combinaie tipic este cea n care borna inversoare (V-) de intrare este ADC1, oricare din celelalte 7 canale putnd fi utilizate ca born de intrare neinversoare (V+). Dou dintre intrrile- perechile difereniale (ADC1/ADC0 i ADC3/ ADC2) pot utiliza un amplificator de ctig programabil, cu paii de amplificare de 0 dB (x1), 20dB (x10), sau 46 dB (x200). Utilizarea acestui ctig (GAIN) programabil reduce rezoluia. Dac este selectat ctigul de x1 sau x10, rezoluia rezultat va fi de 8 bii, iar dac este selectat ctigul de x200, rezoluia rezultat va fi de 7 bii. Datorit tehnicii de conversie utilizat (aproximri succesive) sistemul conine i un circuit eantionare i memorare (Sample Hold - S/H). conectat ntre ieirea multiplexorului analogic i intrarea convertorului, care asigur meninerea constant a tensiunii de intrare a CANului pe toat durata conversiei. Convertorul analog-numeric este unul avnd rezoluia de 10 bii utiliznd metoda aproximrilor succesive. Sunt astfel necesari 2 octei pentru memorarea rezultatului conversiei. Exist o conexiune extern separat, AVCC pentru alimentarea acestui sistem. AVCC nu trebuie s difere cu mai mult dect 0.3V fa de VCC (alimentarea numeric). Exist i o surs de referin intern de 2.56V precum i un pin dedicat VREF pentru conectarea unei referine externe. Caracterizarea preciziei acestui sistem de conversie (erori, offset, ctig, etc.) este detailat n foile de catalog Atmel relevante, cum ar fi [4] sau [9]. Sistemul este configurat i controlat prin intermediul unor registre mapate n spaiul I/O. Exist o serie de bii de comand i control a cror semnificaie particular va fi detailat dac este cazul. Registrele sunt:

61

Microcontrolere. Aplicaii n mecatronic

ADMUX - prin intermediul lui se stabilete canalul de intrare al multiplexorului, modul de intrare (asimetric sau diferenial), ctigul programabil i se selecteaz referina care va fi utilizat ADCSRA este registrul de control i stare al convertorului analog numeric i este o colecie de bii de control i stare a SFIOR n acest registru exist un cmp de 3 bii prin care se selecteaz cine va declana operaia de conversie Rezultatele conversiei sunt disponibile n registrele ADCL i ADCH. Implicit, valoarea pe 10 bii este aliniat la dreapta, dar se poate alinia i la stnga setnd bitul ADLAR n ADMUX. Dac rezultatul este aliniat la stnga i o precizie de 8 bii suficient, atunci se poate citi doar ADCH. Altcumva, trebuie citit mai nti ADCL, urmat obligatoriu de ADCH, pentru a garanta apartenena la aceeai conversie a coninutului registrelor de date. Odat ce ADCL este citit, actualizarea registrelor de date este blocat pn la citirea lui ADCH. Aceasta nseamn c dac ADCL a fost citit, i o conversie s-a ncheiat nainte ca ADCH s fie citit, registrele nu sunt actualizate i rezultatul conversiei este pierdut. Sistemul de conversie analog-numeric este integrat cu sistemul de ntreruperi AVR, tipic finalizarea unei conversii declannd o cerere de ntrerupere. Sistemul de conversie analog-numeric este activat, n ansamblu, prin setarea bitului ADEN din ADCSRA. Sistemul are un consum nesemnificativ atunci cnd ADEN este ters, lucru de care trebuie inut seama cnd se intr n unul din modurile sleep (ADEN trebuie s fie ters). 2.9.1 Declanarea unei operaii de conversie O conversie singular este declanat manualscriind un 1 logic n bitul de start al conversiei ADSC din registrul ADCSRA. Acest bit se va menine n 1 logic att timp ct conversia este n curs de desfurare i va fi ters hard cnd conversia este complet. Dac un alt canal de intrare este selectat n timpul conversiei, se va atepta finalizarea conversiei curente nainte de a se schimba canalul. Starea bitului ADSC poate s fie folosit pentru a determina dac o conversie este n curs de desfurare. El va fi citit n 1 pe durata unei conversii, indiferent de modul de declanare a conversiei. Alternativ, o conversie poate fi declanat n mod automat n mai multe moduri (folosind mai multe surse poteniale de declanare). Declanarea automat este activat setnd bitul ADATE n ADCSRA. Sursa dup care se va face declanarea este selectat prin cmpul de bii ADTS din registrul SFIOR. La apariia unui front cresctor al semnalului ales de declanare, divizorul de frecven (prescaler) care genereaz semnalul de ceas pentru convertor va fi resetat i conversia este pornit. Aceasta reprezint o metod de a realiza o conversie repetat, la intervale fixe de timp sau, cu alte cuvinte, de a periodiza conversia. Dac un nou front cresctor apare n timpul conversiei, el va fi ignorat.
62

Familia de microcontrolere AVR

Bitul ADIF din registrul ADCSRA este setat n momentul finalizrii conversiei i al actualizrii registrelor de date. Dei el este destinat generrii unei cereri de ntrerupere (IF Interrupt Flag) el va fi setat chiar dac respectiva ntrerupere este dezactivat sau bitul global de ntrerupere I din SREG este ters. O conversie poate astfel s fie declanat fr s produc i o ntrerupere.

Figura 12

Logica de auto-declanare a convertorului analog-numeric

Modificarea strii bitului ADIF poate fi folosit ca surs de declanare, determinnd convertorul s porneasc o nou conversie, de ndat ce conversia n curs de desfurare a luat sfrit. Astfel convertorul funcioneaz n modul numit Free Running (achiziie liber), eantionnd i actualiznd n mod constant registrele de date, cu o vitez dictat practic de timpul de conversie i de cel de preluare a datelor. Prima conversie trebuie s fie declanat scriind un 1 logic n bitul ADSC din ADCSRA. n acest mod se vor face conversii succesive indiferent dac bitul ADIF este sau nu ters de utilizator. Chiar dac auto-declanarea este activat, conversiile singulare pot fi declanate prin setarea bitului ADSC. 2.9.2 Controlul vitezei de conversie Sursa de ceas pentru convertorul analog-numeric este un divizor programabil de frecven (prescaler) de 7 bii, avnd ca semnal de ceas ceasul unitii centrale CK=fCPU. Factorul de divizare (2, 4, 8, 8, 16, 32, 64 i 128) este programat de utilizator prin intermediul cmpului de bii ADPS din registrul ADCSRA (figura 2.29). Durata unei operaii de conversie va depinde astfel de factorul de divizare programat precum i de frecvena oscilatorului de ceas sistem. Divizorul de frecven va ncepe s funcioneze din momentul activrii sistemului CAN, prin setarea bitului ADEN din ADCSRA. .

63

Microcontrolere. Aplicaii n mecatronic

Figura 2.29

Divizorul de frecven al CAN ului

Convertorul analog-numeric utilizat asigur rezoluia maxim adevrat de 10 bii pentru frecvene ale ceasului CAN ntre 50 KHz i 200 KHz. Dac este necesar o frecven de eantionare mai mare, cu o rezoluie adevrat mai mic de 10 bii, frecvena ceasului poate fi i mai mare de 200 KHz. Atunci cnd se lanseaz o conversie singular, setnd bitul ADSC n ADCSRA, conversia va ncepe pe urmtorul front cresctor al ceasului CAN. O conversie obinuit dureaz 13 cicluri de ceas CAN. Prima conversie dup activarea CAN-ului (cnd este setat ADEN n ADCSRA) dureaz ns 25 cicluri de ceas CAN, cicluri necesare i pentru iniializarea circuitului analogic. Eantionarea i memorarea propriu-zis dureaz 1.5 cicluri de ceas CAN dup pornirea unei conversii, dar dureaz 13.5 cicluri CAN dup pornirea primei conversii. Cnd este folosit auto-declanarea, divizorul de frecven va fi i resetat n momentul declanrii. Aceasta asigur o ntrziere fix din momentul declanrii pn la pornirea conversiei. n acest mod, eantionarea i memorarea dureaz 2 cicluri de ceas CAN, dup frontul cresctor declanator. Trei cicluri suplimentare de ceas CPU sunt folosite pentru logica de sincronizare. Cnd se folosete modul de intrare diferenial mpreun cu auto-declanarea de la o alt surs dect finalizarea conversiei curente, fiecare conversie va necesita 25 cicluri de ceas CAN. Aceasta datorit faptului c, dup fiecare conversie, CAN-ul trebuie s fie dezactivat i apoi reactivat. O evaluare a timpului de conversie este dat n tabelul 2.7.

64

Familia de microcontrolere AVR

Tabelul 2.7. Timpul de conversie al CAN ului AVR Eantionare i urmrire Timpul de Condiia (Cicluri de la nceputul conversie conversiei) (Cicluri) Prima conversie 14.5 25 Conversii normale, asimetrice 1.5 13 Conversii auto-declanate 2 13.5 Conversii normale, difereniale 1.5/2.5 13/14 2.9.3 Modul de intrare diferenial Exist anumite aspecte ale conversiei analog numerice care trebuie s fie luate n consideraie atunci cnd se folosesc canalele de intrare n mod diferenial (conversii difereniale). Conversiile difereniale sunt sincronizate cu un ceas intern CKADC2 egal cu jumtate din ceasul CAN. Aceast sincronizare se face n mod automat astfel nct eantionarea i memorarea s aib loc ntr-o faz specific a lui CKADC2. O conversie iniiat de utilizator (toate conversiile singulare i prima conversie n modul Free Running) atunci cnd CKADC2 este 0 va dura aceeai perioad de timp ca i o conversie asimetric (13 cicluri de ceas CAN). O conversie iniiat de utilizator cnd CKADC2 este 1 va dura 14 cicluri de ceas CAN datorit mecanismului de sincronizare. n modul Free Running, o nou conversie este iniiat ndat ce conversia anterioar este complet, i deoarece CKADC2 este 1 logic n acest moment, toat conversiile pornite automat n modul Free Running (mai puin prima) vor dura 14 cicluri de ceas CAN. Etajul de amplificare programabil care poate fi utilizat n modul diferenial este optimizat pentru o lrgime de band de 4 KHz, pentru amplificrile posibile. Frecvenele mai mari pot fi afectate de o amplificare neliniar. Este recomandat o filtrare trece-jos extern, dac semnalul de intrare conine componente de frecven mai mare dect lrgimea de band. Nu exist ns nici o legtur ntre frecvena de ceas CAN i lrgimea de band, putndu-se realiza i folosi rate de eantionare mult mai mari dect cele care ar rezulta din corelarea cu lrgimea de band. Dac este utilizat modul de intrare diferenial i conversiile sunt pornite n mod automat, convertorul trebuie s fie oprit ntre conversii. Cnd este folosit auto-declanarea, divizorul de frecven este resetat nainte de pornirea conversiei. Astfel, deoarece ctigul este dependent de un ceas CAN stabil pe perioada anterioar conversiei, aceast conversie nu va fi valid. Dezactivnd i apoi reactivnd CANul ntre conversii (scriind n ADEN din ADCSRA 0 i apoi 1) se vor executa doar conversii extinse al cror rezultat va fi ntotdeauna valid.

65

Microcontrolere. Aplicaii n mecatronic

2.9.4 Comutarea canalelor de intrare sau a referinei Pentru comutarea (selectarea) canalului de intrare sau a referinei se utilizeaz cmpurile de bii MUXn i REFS din registrul ADMUX, care sunt de fapt memorate ntr-un registru temporar. Aceasta garanteaz c selectarea referinei sau a canalului se vor face numai n momente de timp sigure n timpul conversiei. Selectarea referinei i canalului se poate face oricnd o conversie nu este pornit. Odat conversia pornit, selectarea referinei i canalului este blocat pentru a se garanta un timp de eantionare suficient. Este recomandat s nu se ncerce selectarea unui nou canal sau a unei noi referine imediat dup ce bitul ADSC este setat, ateptndu-se finalizarea conversiei. Dac este folosit auto-declanarea, momentul exact al declanrii nu este determinat. Este necesar o atenie special la actualizarea registrului ADMUX, pentru a controla i a ti ce conversie va fi afectat de noile configurri. Dac att bitul ADATE ct i bitul ADEN sunt n 1, setarea bitului ADIF poate avea loc n orice moment. Dac registrul ADMUX este actualizat n aceast perioad, utilizatorul nu va putea discerne dac conversia urmtoare este bazat pe vechea sau pe noua configurare. ADMUX poate fi actualizat ntr-un mod sigur astfel: - cnd bitul ADATE sau bitul ADEN este ters. - n timpul conversiei, dup minim un ciclu de ceas CAN de la momentul declanrii. - dup terminarea unei conversii, naintea de tergerea bitului ADIF folosit ca surs de declanare. La actualizarea lui ADMUX n aceste condiii, noile configurri vor afecta urmtoarea conversie. Comutarea canalelor n modul de intrare diferenial pune i ea nite probleme mai deosebite. Din momentul comutrii canalelor (al actualizrii lui ADMUX) dureaz aproximativ 125 s pn ce ctigul programat se va stabiliza la noua valoare. Astfel conversiile ar trebui s fie pornite cel puin dup 125 s de la realizarea noii selecii sau rezultatele conversiei pe aceast perioad nu trebuie luate n considerare. Acelai timp de stabilizare este necesar i pentru prima conversie diferenial realizat dup comutarea referinei CAN (dup actualizarea cmpului REFS1:0 din ADMUX). Cnd se trece de la un mod de intrare asimetric la un mod diferenial, rezultatul primei conversii este, n general de precizie sczut datorit timpului de stabilizare necesar pentru circuitul de anulare a offset-ului. Practic, valoarea rezultat nu trebuie luat n considerare. n concluzie exist cteva recomandri care trebuie urmate pentru a ne asigura ca selecia canalului de intrare s-a fcut corect. n modul conversie singular (Single Conversion), ntotdeauna se selecteaz canalul nainte de a porni conversia. Selectarea canalului poate fi
66

Familia de microcontrolere AVR

modificat dup un ciclu de ceas CAN, din momentul setrii bitului ADSC. Oricum, metoda cea mai simpl este s se atepte terminarea conversiei pentru a comuta canalul. n modul achiziie liber (Free Running), ntotdeauna se selecteaz canalul nainte de a porni prima conversie. La fel ca la modul anterior selectarea canalului poate fi schimbat dup un ciclu de ceas CAN, din momentul setrii lui ADSC i cel mai simplu este s se atepte terminarea conversiei pentru a comuta canalul. Deoarece conversia urmtoare a pornit deja n mod automat, urmtorul rezultat reflect selecia anterioar a canalului. Doar urmtoarele conversii vor reflecta selectarea noului canal de intrare. 2.9.5 Tensiunea de referin Tensiunea de referin VREF este cea care practic stabilete domeniul de conversie pentru CAN. Dac tensiunea de intrare (n modul mod asimetric) depete VREF, n urma conversiei vor rezulta coduri apropiate de valoarea 0x3FF. Tensiunea de referin VREF poate fi selectat fie ca provenind de la pinul AVCC (alimentarea analogic), fie de la pinul extern dedicat AREF, fie de la o surs de referin intern de 2.56V,. Referin intern de 2.56V este oferit de o surs de referin cu band interzis band gap (VBG) printr-un amplificator intern de separare. Indiferent de selecia referinei, pinul AREF este direct conectat la intrare de referin a CAN, i tensiunea de referin poate fi filtrat (decuplat) conectnd un capacitor ntre pinul AREF i mas. VREF poate, de asemenea, s fie msurat pe pinul AREF, dar trebuie inut cont de faptul c ea este o surs cu impedan intern mare acceptnd practic numai o ncrcare capacitiv. Dac utilizatorul folosete o surs de referin extern conectat la AREF, atunci nu se mai pot utiliza celelalte opiuni pentru tensiunea de referin, sursa extern scurtcircuitnd variantele interne. Dac ns nu se utilizeaz o surs de referin extern, utilizatorul poate oricnd s comute ntre AVCC i referina intern. Atenie, prima conversie realizat dup comutarea referinei poate s dea un rezultat incorect! 2.9.6 Schema electric echivalent pentru o intrare analogic Schema electric echivalent pentru o intrare analogic (intrare asimetric) este prezentat n figura 2.30 ([9]). O surs de tensiune aplicat la intrarea ADCn este implicit ncrcat cu capacitatea i rezistena acelui pin, indiferent dac acel canal este selectat sau nu ca intrare pentru CAN. Cnd canalul este selectat, sursa mai trebuie s comande i capacitorul circuitului S/H printr-o rezisten serie (rezistena combinat din calea de intrare). Circuitul de intrare al CANului este optimizat pentru semnalele analogice generate de surse de tensiune cu o impedan de ieire mai mic de 10 K n
67

Microcontrolere. Aplicaii n mecatronic

sensul c, dac este folosit o astfel de surs, contribuia impedanei sursei la timpul necesar pentru eantionare va fi neglijabil. n practic cuvintele cheie sunt: surse cu o impedan ct mai mic i semnale cu o variaie lent, n aceast situaie ne mai trebuind s evalum n nici un fel contribuia circuitului de eantionarememorare (S/H). Dac este utilizat varianta de intrare diferenial, schema electric echivalent de intrare este oarecum diferit, condiiile impuse impedanei sursei de intrare fiind mai relaxate ( < 100 K ). Principial, n spectrul semnalului de intrare nu trebuie s apar componente cu frecvena mai mare dect frecvena Nyquist (fADC/2) pentru orice tip de canal, pentru a evita apariia unor conversii cu rezultate imprevizibile. Eventualele componente de nalt frecven trebuie eliminate de utilizator printr-o filtrare trece-jos corespunztoare, nainte de aplicarea semnalelor la intrrile CAN.

Figura 2.30

Schema electric echivalent pentru o intrare analogic

2.9.7 Tehnici de reducere a zgomotului analogic La fel ca la orice sistem de mod mixt, componentele numerice interne i/sau externe genereaz un zgomot de comutaie care poate influena consistent precizia msurrilor analogice ([4], [5] i [10]). Dac precizia de conversie este critic, nivelul de zgomot poate fi redus aplicnd una sau mai multe din urmtoarele tehnici: - Cile de semnal analogic trebuie s fie ct mai scurte, iar circuitele de semnal analogic plasate ct departe de circuitele numerice care comut rapid. - Pinul de alimentare analogic AVCC ar trebui s fie conectat la tensiunea de alimentare numeric VCC printr-un filtru LC ca n figura 2.31. - Folosirea funciei de reducere a zgomotului numeric (ADC Noise Reduction) specific convertorului CAN AVR - n cazul n care exist pini din portul de intrri analogice care sunt folosii ca ieiri numerice, este esenial ca acetia s nu comute pe durata unei conversii.

68

Familia de microcontrolere AVR

Figura 2.31

Separarea pinilor de alimentare AVCC VCC ([9])

2.9.8 Caracteristica static de transfer i rezultatul conversiei Dup finalizarea unei operaii de conversie (bitul ADIF este 1), rezultatul conversiei poate fi gsit n registrele pentru rezultat/date ale CANului: ADCL i ADCH. Pentru o conversie unipolar (asimetric), rezultatul va fi evaluat cu o relaie de forma 2.1

ADC =

VIN 1024 VREF

(2.1)

- unde VIN este tensiunea pe pinul de intrare selectat i VREF tensiunea de referin selectat. Valorile extreme (n hex) sunt: 0x000, masa analogic i 0x3FF, tensiunea de referin selectat. Pentru o conversie diferenial, rezultatul va fi de forma 2.2

ADC =

(VPOS VNEG ) GAIN 512


VREF

(2.2)

- unde VPOS este tensiunea pe pinul de intrare pozitiv (intrarea neinversoare), VNEG pinul de intrare negativ (intrarea neinversoare), GAIN factorul de ctig selectat, i VREF tensiunea de referin selectat. Rezultatul este exprimat n cod complement fa de doi, avnd valori de la 0x200 (-512) pn la 0x1FF (+511). Dac utilizatorul vrea s execute doar o verificare rapid de polaritate, este suficient citirea doar a MSB-ului (bitul ADC9 din ADCH) care n
69

Microcontrolere. Aplicaii n mecatronic

acest caz este bitul de semn. Figura 2.32 prezint caracteristica static de transfer a convertorului utilizat n modul cu intrare diferenial.

Figura 2.32

Caracteristica statica de transfer pentru modul diferenial([9])

n tabelul 2.8 ([4]) sunt prezentate codurile de ieire rezultate dac este selectat perechea de intrare diferenial (ADCn ADCm), cu un ctig GAIN i o tensiune de referin VREF. Un exemplu de calcul ([9]) bazat pe aceast caracteristic este prezentat n continuare: - Registrul ADMUX = 0xED (ADC3 - ADC2, ctig x10, referin intern 2.56V, rezultat aliniat la stnga) - Tensiunea pe ADC3 este de 300 mV, iar tensiunea pe ADC2 de 500 mV. ADCR = 512 * 10 * (300 - 500) / 2560 = - 400 = 0x270 Astfel vom avea ADCL = 0x00 i ADCH = 0x9C. Scriind un 0 n bitul ADLAR rezultatul se aliniaz la dreapta cu: ADCL = 0x70, ADCH = 0x02.

70

Familia de microcontrolere AVR

Tabelul 2.8 VADCn

Caracteristica static de transfer n mod diferenial Codul citit 0x1FF 0x1FF 0x1FE 0x001 0x000 0x3FF 0x201 0x200 Valoarea zecimal corespunztoare 511 511 510 1 0 -1 -511 -512

VADCm + VREF/GAIN VADCm + 0.999 VREF/GAIN VADCm + 0.998 VREF/GAIN VADCm + 0.001 VREF/GAIN VADCm VADCm 0.001 VREF/GAIN VADCm 0.999VREF/GAIN VADCm VREF/GAIN 2.10 Alte periferice AVR

Trebuie menionat c, pe lng perifericele menionate i descrise mai mult sau mai puin n detaliu, mai exist (tipic la ATMega): a. Un sistem puternic de temporizare numrare sincron care are n componen: - un temporizator-numrator de 8 bii (Timer-Counter 0): divizor de frecven (prescaler) de 10 bii, permite generare de forme de und PWM cu rezoluia de 8 bii, ntr-o variant rapid sau una cu faz corect ([13]) - unul sau dou temporizatoare-numratoare de 16 bii (Timer-Counter 1 i eventual Timer -Counter 2): generare PWM 16 bii, un sistem flexibil de captare, 10 surse de ntrerupere asociate evenimentelor generate ([13]) b. Resurse suplimentare de comunicaie cum ar fi: - O interfa SPI (Serial Peripheral Interface): permite transferul sincron de informaie, half duplex, pe numai 3 fire (date, ceas, mas), cu posibilitatea de programare a 7 rate de transfer - Unul sau dou sisteme USART ([14]) avnd drept caracteristici principale: prezena unui generator propriu de rata baud cu o rezoluie mare, funcionare full duplex, moduri de lucru asincrone i sincrone, filtru numeric de zgomot pe intrare, suport paritate, detecie condiii de Overrun (suprascriere), Framming (ncadrare) - O interfa TWI (Two Wire Interface) identic din punct de vedere funcional cu o interfa I2C (Philips). c. O interfa pentru un sistem de afiare de tip LCD (segmente) disponibil la microcontrolere cum ar fi ATMega169.

71

Microcontrolere. Aplicaii n mecatronic

2.11 AVR Tiny Dei prezentarea a fost axat pe o sub familie evoluat cum este AVR Mega, trebuie menionat c utilizarea unor microcontrolere precum ATtiny reprezint o alternativ foarte avantajoas de control fa de utilizarea unei logici discrete, n ciuda resurselor aparent limitate ([3], [28]). Foarte multe aplicaii din domeniul mecatronicii ([1]) au fost posibile tocmai datorit existenei acestei categorii de microcontrolere AVR i a familiilor similare PIC Microchip ! Astfel vom prezenta ca exemplu un microcontroler ATtiny15, disponibil ntr-o capsul cu numai 8 pini (figura 2.33). El are doar 512 octei de memorie FLASH, programabil ISP, nu are memorie SRAM i are doar o stiv hardware cu 3 nivele. Pentru adresarea indirect se poate utiliza doar registrul Z (R30, R31). Are 64 octei EEPROM i viteza de calcul la frecvena de 8MHz este de 8MIPS. Ca resurse de tip periferic se pot meniona: 5 pini I-O de uz general, dou temporizatoare-numratoare de 8 bii, un sistem de conversie analog-numeric cu 4 intrri analogice, un comparator analogic, un sistem de ntreruperi cu 8 surse de ntrerupere. Este evident c datorit numrului foarte redus de conexiuni externe (nu trebuie uitat c din cei 8 pini, 2 sunt pentru alimentare, rmnnd doar 6 pini!) resursele respective sunt disponibile ca funcii alternative ale pinilor.

Figura 2.33

AVR Tiny

72

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