Sunteți pe pagina 1din 235

Laborator 1 - Echipamente de laborator

1 Introducere n echipamentele de laborator


1.1 OBIECTIVE
Lucrarea prezint a echipamentele utilizate n cadrul laboratorului: Sursa de tensiune programabil HAMEG HM8040 -3; Sursa de tensiune programabil HAMEG HM7042 -5; Generatorul de funcii programabil HAMEG HM 8030-6; Multimetru digital programabil HAMEG HM8012; Frecvenmetru/Periodmetru numeric 1.6GHz HAMEG HM8021-4; Osciloscop TEKTRONIX TDS 2024/TDS 3054.

1.2

SURSA DE TENSIUNE PROGRAMABIL HAMEG HM8040-3

Sursa de tensiune stabilizat genereaz la ieire o tensiune constant, independent de eventualele fluctuaii ale: tensiunii de alimentare, sarcinii sau temperaturii. Sursa de tensiune se va folosi pentru alimentarea circuitelor studiate n cadrul laboratorului. Caracteristicile sursei HM8040-3 sunt: Doua surse de tensiune de ieire reglabil ntre 0 i 20V/0.5A i o surs fixa 5V/1A; Rezoluie afiat 0.1V/1mA; Posibilitate de conectare n paralel sau serie; Buton pentru activarea/dezactivarea simultan a tuturor canalelor; Limitare ajustabil pentru curent i siguran electronic.

Panoul frontal al sursei HM8040-3 este prezentat n Figura 1.1.

Laborator 1 - Echipamente de laborator

Figura 1.1 Panoul frontal HM8040-3

(1) & (7) - V/mA/Siguran electronic Butoanele (1) (afiaj stnga) i (7) (afiaj dreapta) sunt butoane cu ajutorul crora se poate selecta afiarea tensiunii sau curentului i pentru activarea siguranei electronice individual pentru fiecare parte. Curentul este indicat cu o rezoluie de 1mA, iar tensiunea este afiat cu o rezoluie de 0.1V. Schimbarea ntre afiarea curentului i tensiunii se face printr-o apsare scurt a butonului ce are ca efect schimbarea indicatorilor (3) i (5), iar pentru o apsare lung activeaz sigurana electronic, semnalat prin aprinderea indicatorului F din indicatorii (3) i ( 5). (2) & (6) Afiaj tensiune/curent Cele dou afiaje cu 3 digii, 7 segmente ofer afiarea selectabil a tensiunii de ieire sau a curentului de ieire. Afiajul din stnga indic tensiunea sau curentul pentru terminalele de ie ire din partea stng (9), iar afiajul din partea dreapt indic parametrii pentru terminalele de ieire din partea dreapt (13). (3) & (5) - LED V/mA - LED - uri pentru mrimea afiat; F - LED ce semnaleaz activarea siguranei electronice; Imax - LED ce semnaleaz depirea limitei impuse pentru curent. Dac sigurana electronic este activat, ieirea sursei de tensiune se va nchide cnd se detecteaz depirea limitei de curent. (4) Activare/dezactivare ieire surs Comanda ieirii DC activeaz simultan toate cele 3 ieiri DC (buton apsat la HM8040-3). Afiajele de tensiune vor indica tensiunea de ieire, chiar i atunci cnd LED-ul pentru ieire indic faptul c ieirea este deconectat. (8) & (12) - Ajustare tensiune 2

Laborator 1 - Echipamente de laborator Butoanele rotative pentru ajustarea tensiunii sunt folosite pentru varierea tensiunii n domeniul 0-20V. Butonul rotativ (8) din stnga seteaz sursa din stnga, iar butonul rotativ (12) din dreapta seteaz sursa din dreapta. (9) & (13) - Ieire 0-20V Terminalele de ieire pentru sursele 0-20V constau din dou mufe banan mam la care se pot conecta fire sau mufe banan tat. Circuitul electronic asigur protecia mpotriva scurtcircuitului. (10) & (14) Ajustare limit curent Butoanele rotative pentru ajustarea limitrii de curent pentru ie irea din partea stng (10) i ieirea din partea dreapt (14). Domeniul de reglare este ntre 0 -0.5A. (11) - Ieire 5V Terminalele de ieire pentru sursa de tensiune de +5V constau din dou mufe banan mam de 4mm la care se pot conecta fire sau mufe banan tat. Circuitul electronic asigur protecie mpotriva scurtcircuitului. Un orificiu de acces (aflat deasupra, ntre cele dou terminale de 5V) permite un reglaj fin ntre 4.5V - 5.5V.

1.3 SURSA DE TENSIUNE PROGRAMABIL HAMEG HM7042-5


Hameg HM7042-5 este o surs de tensiune tripl, programabil. Caracteristici: Trei surse de tensiune de ieire independente programabile: 2x0-32V, 2A; 1x2.7-5.5V, 5A; Rezoluie afiat: 10 mV/1 mA pe canalul 1+3; 10 mV/10 mA pe canalul 2 ; Posibilitate de conectare n paralel(pana la 9A) sau serie(pana la 69.5V); Buton pentru activarea/dezactivarea simultan a tuturor canalelor; Limitare ajustabil pentru curent i siguran electronic. Panoul frontal al sursei HM7042-5 este prezentat n Figura 1.2.

Laborator 1 - Echipamente de laborator

Figura 1.2 Panoul frontal HM7042-5

(1) & (5) & (9) - Afiaj tensiune Cele trei afiaje cu 4 digii, 7 segmente ofer afiarea selectabil a tensiunii de ieire. (2) & (6) & (10) - LED LED = indicator limit de curent (se aprind cnd limita de curent este atins). (3) & (7) & (11) - Afiaj curent Cele trei afiaje cu 4 digii, 7 segmente ofer afiarea selectabil a curentului de ieire. (4) - Siguran Electronic Acest buton va activa sigurana electronic, starea fiind indicat de LED-ul adiacent. (8) Activare/dezactivare ieire Activeaz/dezactiveaz simultan toate cele trei ieiri DC, starea fiind indicat de LED-ul adiacent. (12) & (19) - Ajustarea tensiunii Butoanele rotative pentru ajustarea grosier/fin a tensiunii sunt folosite pentru varierea tensiunii n domeniul 0-32V. (13) & (20) - 0 32V / 2A Ieiri, conectori de 4 mm. (14) & (17) & (21) - Limit curent Butoanele rotative pentru ajustarea limitrii de curent pentru ieirea din partea stng (14), ieirea central (17) i ieirea din partea dreapt (21). n cazul in care Limit curent a fost selectat, LED-urile (2) i (10) se vor aprinde, iar tensiunea va scdea la zero. (15) - Ajustare tensiune Butoanele rotative pentru ajustarea tensiunii sunt folosite pentru varierea tensiunii n domeniul 0-5.5V. 4

Laborator 1 - Echipamente de laborator (16) - 0 5.5V / 5A Ieiri, conectori de 4 mm. (18) - ON/OFF Buton pentru deschiderea/nchiderea sursei de tensiune. Limitarea curentului Dup pornire, sursa de alimentare nu va avea ultimele setri fcute nainte de deconectarea ei, butoanele pentru reglaj putnd fi modificate cu sursa deconectat. Pentru protejarea componentelor alimentate de la surs, este obligatorie activarea siguranei electronice. Utiliznd butoanele 14,17,21 curentul maxim I max poate fi setat pentru fiecare din cele 3 canale. Limitarea curentului pe un canal nu va influena pe celelalte. n caz de atingere a limitei curentului,se aprinde LED-ul corespunztor canalului utilizat ( (2),(6) sau (10) ). Sigurana electronic nainte de selectarea acestui mod, limitele curentului trebuie s fie stabilite folosind butoanele 14,17,21. Dup setarea Imax, se apas butonul 4 (ELECTRONIC FUSE), LED-ul [ON] se va aprinde indicnd faptul c HM7042-5 este n modul Siguran Electronic. n acest mod, toate ieirile vor fi dezactivate imediat dac pe un canal se ajunge la I max.

1.4

GENERATORUL DE FUNCII PROGRAMABIL HAMEG HM8030-6

Generatorul de funcii este un aparat electronic ce furnizeaz semnale variabile de diferite forme (sinus, dreptunghi, triunghi, impuls, etc.), permi nd modificarea dup dorin a unor parametri: amplitudine, frecven, factor de umplere, form. Generatorul se folosete la aplicarea de semnale variabile n circuitele electronice, care se studiaz experimental. Panoul frontal al generatorului HM8030-6 este prezentat n Figura 1.3.

Figura 1.3 Panoul frontal HM8030-6 5

Laborator 1 - Echipamente de laborator Generatorul de funcii HM8030-6 conine: partea de reglare a frecvenei semnalului generat (FREQUENCY), cu dou tipuri de reglaje: n trepte (butoanele 50mHz i 10MHz (4) ce micoreaz, respectiv, mresc ordinul msurtorii) i un reglaj fin (un poteniometru (3)); partea de reglare a amplitudinii semnalului generat (AMPLITUDE), cu dou tipuri de reglaje: brut (se modific valoarea atenurii introdus de aparat dou butoane de atenuare -20dB fiecare (11) ) i un reglaj fin (un poteniometru (12)). De asemenea, se poate regla componenta continu a semnalului generat (OFFSET (8)) prin apsarea butonului ON/OFF (9) i acionarea poteniometrului (8); un buton pentru selectarea formei semnalului de ieire (FUNCTION (6)) indicat de LEDurile (5); dou ieiri de semnal: una pentru semnalul dorit de utilizator ( 10), avnd forma de und i valorile reglate pentru frecven i amplitudine (de ex. un semnal sinusoidal cu frecvena 20Hz i amplitudinea 4V) i o ieire pentru semnal de sincronizare TTL ( 7).

1.5

MULTIMETRU DIGITAL PROGRAMABIL HAMEG HM8012

Un multimetru este un instrument de msurare electronic care combin mai multe funcii de msurare ntr-o singur unitate. Un multimetru include caracteristici de baz, cum ar fi : capacitatea de a msura tensiunea, curentul i rezistena. Multimetrele digitale (DMM, DVOM) afieaz valoarea msurat n cifre. Caracteristici ale HAMEG HM8012: Display 4 digii 50000 uniti; 42 domenii de msurare; Selectare domeniu automat sau manual; ntre 3 i 6 msurtori pe secund; Precizie de 0.05%; Rezoluii: 10V, 10nA, 10m, 0,01 dBm i 0,1.

Figura 1.4 Panou frontal HM8012 6

Laborator 1 - Echipamente de laborator

(1) - Afiaj Afiajul digital indic valoarea de msurare cu o rezoluie de 4 cifre, unde cea mai mare cifr folosit este "5". Acesta va afia, de asemenea, diverse mesaje de avertizare. Valoarea de msurare va fi afiat cu puncte zecimale i polaritate. (2) Martor continuitate (3) - Activare/dezactivare martor pentru continuitate Activeaz/dezactiveaz semnalul acustic pentru funcia de continuitate. (4) & (5) & (7) & (9) - Conectori de 4mm 4 conector pentru msurarea a maximum 10 A n conjuncie cu intrarea COM (7); 5 - conector pentru msurarea a maximum 500 mA n conjuncie cu intrarea COM (7); 7 conector comun pentru toate msurtorile ce are potenial apropriat cu masa (0V) cantitii msurate. 9 conector pentru msurarea voltajelor, rezistenelor, temperaturilor i jonciunilor de diode n conjuncie cu intrarea COM (7). (6) HOLD (LED) LED ce indic faptul c valoarea indicat de afiaj este blocat. Aceast funcie este activat de butonul (10). (8) OFFSET (LED) LED ce indic faptul c afiajul arat o msurtoare relativ. Valoarea indicat reprezint diferena ntre valoarea de la intrare i cea prezent la activarea modului OFFSET. Activarea acestei funcii se face prin apsarea butonului (10). (11) & (12) - Domeniu Butoane pentru schimbarea domeniului de msurare. (15) - Auto-Range Buton pentru activarea/dezactivarea funciei de auto-range. (16) - Unitatea de msurare Aceast zon afieaz unitatea de msur pentru funcia de msurare selectat. (17) - AC/DC Selectare pentru msurare n DC sau AC. (18) & (19) - Funcie msurare Selectarea funciei de msurare.

Laborator 1 - Echipamente de laborator

1.6

FRECVENMETRU NUMERIC 1.6 GHZ HAMEG HM8021-4

Cu ajutorul acestui frecvenmetru, se pot msura frecvene de pn la 1.6 GHz. Caracteristici: Domeniu de pn la 1.6GHz; Senzitivitate 20 mV; Funcii de msurare; Trei perioade de eantionare; Auto-trigger.

Panoul frontal al multimetrului HM8012 este prezentat n Figura 1.5.

Figura 1.5 Panou frontal HM 8021-4

(1) - OF (LED) LED-ul este aprins cnd apare o depire (overflow). Aceasta depinde de perioada de eantionare. (2) - GT (GATE OPEN, LED) Indicatorul GT este aprins atunci cnd intrarea este deschis pentru msurtori. (3) - Gate Time Selecteaz perioada de eantionare (0.1s, 1s, 10s). (4) - Hold Pe afiaj rmne ultima valoare msurat pn la apsarea butonului RESET. 8

Laborator 1 - Echipamente de laborator

(5) - Function Martorii LED indic funcia de msurare selectat cu ajutorul butoanelor. (6) - Offset La apsarea butonului, valoarea afiat de display devine noua valoare de referin. (7) - Reset Buton RESET. Resetul este activ atta timp ct butonul este apsat. (8) - Input C Gama de frecvene: 100 MHz - 1,6 GHz. Impedana de intrare: 50. (9) - DC Selectarea semnalului de intrare. (10) - 1:20 Selecteaz atenuarea semnalului de intrare. Semnalul de intrare este atenuat cu 26 dB. (11) - Auto Declaneaz semnalul de intrare. (12) - Input A Sensibilitate semnal de intrare: 20mV - 80 MHz i 60mV - 150MHz. (13) - Trigger Level Poteniometru de ajustare a trigger-ului. LED-ul martor clipete atunci cnd trigger-ul este corect. (14) - Afiaj 8 digii (15) - Hz (LED): unitatea de msur a frecvenei; Sec(LED): unitatea de msur a timpului.

1.7

OSCILOSCOP TEKTRONIX TDS 2024/TDS 3054

Osciloscopul este un aparat electronic de msur care servete la observarea i msurarea unui semnal de tensiune electric cu variaie (frecven) constant, sau a mai multor semnale simultane de tensiune ce evolueaz discret, folosind pentru asta n mod uzual un cmp grafic vizualizator (ecran), unde axa 'X' (abscisa) este axa timpului, iar axa 'Y' (ordonata) este axa reprezentrii amplitudinilor semnalelor de msurat (observat). Imaginile obinute pe ecran se numesc oscilograme. Osciloscopul se utilizeaz pentru:

Laborator 1 - Echipamente de laborator

vizualizarea variaiei n timp a tensiunilor electrice, precum i msurarea parametrilor acestora: valoare vrf la vrf, amplitudine, valoarea componentei continue, perioada (frecvena); vizualizarea relaiei dintre dou tensiuni variabile n timp, putnd determina raportul frecvenelor tensiunilor i defazajul dintre ele; trasarea curbelor caracteristice ale unor dispozitive sau materiale (caracteristici statice ale unor dispozitive sau circuite electronice, ciclu de histerezis al materialelor feromagnetice, etc.).

n laborator se folosesc osciloscoapele TEKTRONIX TDS 2024 i TEKTRONIX TDS 3054. Dei au denumiri diferite, principiul de funcionare este identic. Panoul frontal al osciloscopului TDS 2024 este prezentat n Figura 1.6.

Figura 1.6 Panou frontal Tektronix TDS 2024 Osciloscopul TEKTRONIX TDS 2024 permite vizualizarea alternativ sau concomitent a patru semnale de tensiune, avnd patru canale p entru aplicarea acestora (CH 1,CH 2,CH 3 i CH 4). Fiecare canal are: born de intrare semnal; un poteniometru de modificare a scrii de reprezentare pe vertical (VOLTS/DIV.); cte un poteniometru pentru poziionarea axelor X (X-POS) i Y (Y-POS). 10

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11

2 Introducere n AVR Studio 4.19 i IAR Embedded Workbench (5.51 6.11). Realizarea unui proiect
2.1 INTRODUCERE N AVR STUDIO 4.19

AVR Studio 4 este un mediu de dezvoltare gratuit ce permite realizarea de programe, ncrcarea i depanarea lor pe microcontrolerele produse de ctre Atmel. La pornirea programului apare o list din cadrul creia se poate alege microcontrolerul cu care se lucreaz, dup care, dac este conectat corespunztor la PC, are loc ncrcarea propriu zis a proiectului.

Figura 2.1 Pagina Start AVR Studio 4

2.2

AVR JTAG ICE

AVR JTAG ICE este un emulator puternic pentru toate microcontroler-ele AVR de 8 bii cu interfa JTAG IEEE 1149.1, cu suport de emulare inclus n cip (on -chip debugging). Practic, aceast facilitate este disponibil pe noile ATmega (ATmega128, ATmega8, ATmega16, etc.). JTAG ICE i depanatorul software AVR Studio ofer utilizatorului control asupra resurselor interne ale microcontroler-ului, ajutnd la reducerea timpului de dezvoltare i fcnd depanarea mai uoar. JTAG ICE realizeaz emularea microcontroler-ului n timp real, n timp ce se ruleaz aplicaia n sistemul int. JTAG ICE ofer posibilitatea de emulare la o jumtate de cost n comparaie cu emulatoarele tradiionale.

11

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11

Caracteristici: Interfa software cu AVR Studio 3.52 sau versiuni mai noi; Emuleaz toate funciile n cip, att digitale ct i analogice; Se poate insera Breakpoint chiar cnd se modific programul, fr a fi necesar recompilarea; Interfa spre PC: RS-232; Suport pentru Breakpoint pe program i pe date; Depanare pe cod surs sau pe cod C; Programare n sistem prin interfaa JTAG; Este alimentat direct de pe placa de baz sau printr -o surs extern de 9-15Vcc.

JTAG ICE permite accesul ctre toate caracteristicile puternice oferite de microcontroler-ul AVR. Toate resursele AVR pot fi monitorizate: memoria Flash, memoria EEPROM, memoria SRAM, setul de regitri, numrtoarele, bii de siguran, bii de blocare i toate modulele I/O. JTAG ICE ofer de asemenea suport de depanare extensiv pentru condiii de ntrerupere, inclusiv ntrerupere n timp ce se modific programul (break on change) fr a fi necesar recompilarea, condiii de ntrerupere ale memoriei program de unic adres sau frecven de adres i condiii de ntrerupere ale memoriei de date de unic adres sau frecven de adres. JTAG ICE susine urmtoarele microcontrolere AVR: Atmega323; Atmega16; Atmega32 (disponibil n Q2 2002); Atmega162 (disponibil n Q1 2001).

JTAG ICE va fi actualizat automat prin versiuni viitoare ale AVR Studio pentru a susine viitoarele dispozitive cu suport JTAG pe msur ce acestea vor fi scoase pe pia. Interfaa JTAG este integrat n AVR Studio. Toate fazele dezvoltrii AVR pot fi fcute n acest mediu de dezvoltare integrat.

12

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11

2.3

INFORMAII GENERALE DESPRE ATMEGA16

ATmega16 este un microcontroler CMOS de 8 bii realizat de firma Atmel, cu un consum de curent mic, bazat pe arhitectura RISC AVR mbuntit. Dispune de un set de 131 instruciuni i 32 de registre de uz general. Cele 32 de registre sunt direct adresabile de Unitatea Logic Aritmetic (ALU) permind accesarea a dou registre independente ntr-o singur instruciune. Se obine astfel o eficien sporit n execuie (de pn la zece ori mai rapide dect microcontroler-ele convenionale CISC). Caracteristicile acestuia sunt: 16KB de memorie Flash reinscriptibil pentru stocarea programelor ; 1KB de memorie RAM; 512B de memorie EEPROM; dou numrtoare/temporizatoare de 8 bii; un numrtor/temporizator de 16 bii; conine un convertor analog-digital de 10 bii, cu intrri multiple; conine un comparator analogic; conine un modul USART pentru comunicaie serial (port serial); dispune de un cronometru cu oscilator intern; ofer 32 de linii I/O organizate n patru porturi (PA, PB, PC, PD).

Structura intern general a controller-ului este prezentat n Figura 2.2. Se poate observa c exist o magistral general de date la care sunt conectate mai multe module: unitatea aritmetic i logic (ALU); registrele generale; memoria RAM i memoria EEPROM; liniile de intrare (porturile linii I/O ) i celelalte blocuri de intrare/ieire. Aceste ultime module sunt controlate de un set special de registre, fiecare modul avnd asociat un numr de registre specifice. Memoria Flash de program mpreun cu ntreg blocul de extragere a instruc iunilor, decodare i execuie, comunic printr-o magistral proprie, separat de magistrala de date menionat mai sus. Acest tip de organizare este conform principiilor unei arhitecturi Harvard i permite controler-ului s execute instruciunile foarte rapid. Modul POWER-DOWN salveaz coninutul registrelor, dar blocheaz oscilatorul, dezactivnd toate celelalte funcii ale chip-ului pana la urmtoarea ntrerupere extern sau reset hardware. In modul POWER-SAVE, timer-ul asincron continu s mearg, permind utilizatorului s menin o baz de timp, n timp ce restul dispozitivului este oprit. n modul STANDBY , oscilatorul funcioneaz n timp ce restul dispozitivului este oprit. Acest lucru permite un start foarte rapid combinat cu un consum redus de energie. n modul STANDBY EXTINS (Extended Standby Mode), att oscilatorul principal ct i timer-ul asincron continu s funcioneze. Memoria Flash (On-chip) permite s fie reprogramat printr-o interfa serial SPI , de ctre un programator de memorie nevolatil convenional, sau de ctre un program de boot On-chip ce ruleaz pe baza AVR. Programul de boot poate folosi orice interfa s ncarce programul aplicaie n memoria Flash de aplicaie. Combinnd un CPU RISC de 8 bii cu un Flash In-system auto-programabil pe un chip monolitic, ATmega 16 este un microcontroler 13

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11 puternic ce ofer o soluie extrem de flexibil i cu un cost redus n comparaie cu multe altele de pe pia. ATmega16 AVR este susinut de o serie complet de instrumente de program i de dezvoltare a sistemului, care include: compilatoare C, macroasambloare, programe depanare/simulare etc. Diagrama bloc :
PA0 PA7
VCC

PC0 PC7

PORTA Buffers/Drivers
GND

PORTC Buffers/Drivers

PORTA Interfa Digital

PORTC Interfa Digital

AVCC

Mux i ADC
AREF

Interfa ADC

TWI

Program Counter Program Flash Registru Instruciun i Decodor Instruciun i Linii de control AVR CPU

Pointer Stiv

Timer-e/ Counters Oscilator Intern Watchdog Timer


MCU Control & Timing

Oscilator

SRAM

Regitri de uz general X Y Z

Oscilator

RESET

ALU Registru de stare

Unitate ntreruperi

Oscilator intern calibrat

EEPROM

Logica de programare

SPI

USART

+ -

Interfa comparator

PORTA Buffers/Drivers

PORTC Buffers/Drivers

PORTA Interfa Digital

PORTC Interfa Digital

PB0 PB7

PD0 PD7

Figura 2.2 Diagrama bloc ATmega16 14

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11

2.4
2.4.1

INTRODUCERE N IAR EMBEDDED WORKBENCH 5.51


PERSPECTIV ASUPRA LIMBAJULUI IAR

Figura 2.3 Pagina de start Exist dou limbaje de programare de nivel nalt disponibile cu compilatorul AVRIAR C/C++ : 1. C, cel mai rspndit limbaj de nivel nalt de programare folosit n industria de sisteme ncorporate. Folosind compilatorul AVRIAR se pot construi aplicaii de sine stttoare ce urmeaz standardul ISO 9899:1990. Acest standard este cunoscut ca ANSI C. 2. C++, un limbaj modern orientat obiect, cu o librrie ce dispune de toate caracteristicile necesare pentru o programare modular. Sistemele IAR suport dou nivele ale limbajului C++: - Embedded C++ (EC++) este un subset al standardului de programare C++ destinat programrii sistemelor ncorporate. Este definit de un consoriu industrial, Embedded C++ Technical Comitee. - IAR Extended EC++, cu caracteristici suplimentare cum ar fi suportul total pentru abloane, suportul pentru spaiile de nume, operatorii de cast, precum i Standard Template Library (STL). 15

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11 Fiecare din cele dou limbaje de programare suportate pot fi folosite fie ntr-un mod strict, fie n unul relaxat, fie n unul relaxat cu extensiile IAR activate. Modul strict ader la standard, pe cnd modul relaxat permite anumite deviaii de la acest standard. Este de asemenea posibil ca anumite pri ale aplicaiei s fie implementate n limbaj de asamblare. Construirea de aplicaii ansamblu O aplicaie tipic este construit din fiiere surs i librrii. Fiierele surs pot fi scrise n C, C++ sau limbaj de asamblare i pot fi compilate n fiiere obiect de ctre compilatorul AVRIAR sau AVRIAR assembler. O librrie este o colecie de fiiere obiect. Un exemplu de librrie tipic este librria compilatorului ce conine mediul de rulare i librria standard C/C++. Librriile pot fi de asemenea construite folosind IAR XAR Library Builder, IAR XLIB Librarian sau s fie oferite de furnizori externi. Link-editor-ul IAR XLINK este folosit pentru a construi aplicaia final. XLINK folosete, n mod normal, un fiier de comand pentru link-editare. Compilarea: n interfaa linei de comand, linia urmtoare compileaz fiierul surs myfile.c n fiierul obiect myfile.r90, folosind setrile implicite. Iccavr myfile.c n plus se pot specifica cteva opiuni critice. Linkeditarea: Linkeditorul IAR XLINK este folosit pentru a construi aplicaia final. n mod normal , XLINK necesit urmtoarele informaii la intrare: Fiiere obiect i librriile necesare; Librria standard ce conine mediul de rulare i funciile standard ale limbajului; Eticheta de start a programului; Un fiier de comand a linkeditorului ce descrie schema memoriei sistemului int; Informaii despre formatul de la ieire; n linia de comand, linia urmtoare poate fi folosit pentru pornirea XLINK : xlink myfile.r90 myfile2.r90 -s __program_start -f lnkm128s.xcl cl3s-ec.r90 -o aout.a90 -FIntel-extended n acest exemplu , myfile.r90 i myfile2.r90 reprezint fiiere obiect, nkm128s.xcl este fiierul de comand al linkeditorului, iar cl3s-ec.r90 este librria de rulare. Opiunea s specific locaia din care aplicaia pornete. Opiunea o specific numele fiierului de ieire iar opiunea F poate fi folosit pentru a specifica formatul fiierului de ieire. (Formatul fiierului de ieire implicit este Motorola.) Link-editorul IAR XLINK produce ieirea conform specificaiilor alese. Formatul de la ieire se alege conform scopului dorit. Se poate dori ncrcarea ieirii la un depanator, ceea ce nseamn c este nevoie la ieire de informaii ale depanatorului. Ca alternativ, se poate ncerca ieirea la un flash loader, caz n care este nevoie de o ieire fr informaii ale depanatorului cum ar fi Intel-hex sau Motorola S-records.

16

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11

Program surs
Textul este preluat sub forma unor secvene de caractere crora li se atribuie coduri lexicale

Analiza lexical Analiza sintatic Analiza semantic


Informaii despre nume

ir de atomi ->Structuri sintactice(instruciuni,expresii)

Arbore sintactic; compatibilitate tipuri de date Recunoatere+emitere mesaje

Gestionare T.S.

Tratarea erorilor
Similar limbajului de asamblare,doar c nu se specific registrele utilizate Faz opional; Timp de execuie/ spaiu de memorie

Generare cod intermediar Optimizare cod

Generare cod final

Program obiect
Figura 2.4 Etapele realizrii unei aplicaii o o o o o

Setrile de baz pentru configurarea proiectului Setrile de baz disponibile pentru microcontroler-ul AVR sunt : Configuraia procesorului; Modelul de memorie; Reprezentarea numrului double cu virgul mobil; Optimizri pentru vitez i dimensiune ; Mediul de rulare.

a. Configurarea procesorului: Pentru un cod optim generat de compilator, setrile trebuie realizate pentru microcontroler-ul folosit. Exist dou opiuni ale procesorului care pot fi folosite pentru configurarea suportului procesorului: --cpu=derivative i vn. 17

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11 Ambele opiuni seteaz comportamentul implicit dar opiunea --cpu este mai precis deoarece conine mai multe informaii despre target, dect mult mai generala opiune v. Urmtorul tabel arat maparea opiunilor procesor i ce microcontroler AVR suport: Variant procesor --cpu=1200 --cpu=2313 --cpu=2323 --cpu=2333 --cpu=2343 --cpu=4414 --cpu=4433 --cpu=4434 --cpu=8515 --cpu=8534 --cpu=8535 --cpu=at43usb320a --cpu=at43usb325 --cpu=at43usb326 --cpu=at43usb351m --cpu=at43usb353m --cpu=at43usb355 --cpu=at94k --cpu=at86rf401 --cpu=can128 --cpu=m8 --cpu=m16 --cpu=m32 --cpu=m48 --cpu=m64 --cpu=m88 --cpu=m103 --cpu=m128 --cpu=m161 --cpu=m162 --cpu=m163 --cpu=m165 --cpu=m168 Opiune generic -v0 -v0 -v0 -v0 -v0 -v1 -v0 -v1 -v1 -v1 -v1 -v3 -v3 -v3 -v3 -v3 -v3 -v3 -v0 -v3 -v1 -v3 -v3 -v1 -v3 -v1 -v3 -v3 -v3 -v3 -v3 -v3 -v3 Derivate AVR suportate AT90S1200 AT90S2313 AT90S2323 AT90S2333 AT90S2343 AT90S4414 AT90S4433 AT90S4434 AT90S8515 AT90S8534 AT90S8535 AT43USB320A AT43USB325 AT43USB326 AT43USB351m AT43USB353m AT43USB355 FpSLic AT86RF401 AT90CAN128 ATmega8 ATmega16 ATmega32 ATmega48 ATmega64 ATmega88 ATmega103 ATmega128 ATmega161 ATmega162 ATmega163 ATmega165 ATmega168 18

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11

--cpu=m169 --cpu=m2560 --cpu=m2561 --cpu=m323 --cpu=m325 --cpu=m3250 --cpu=m329 --cpu=m3290 --cpu=m406 --cpu=m645 --cpu=m6450 --cpu=m649 --cpu=m6490 --cpu=m8515 --cpu=m8535 --cpu=tiny10 --cpu=tiny11 --cpu=tiny12 --cpu=tiny13 --cpu=tiny15 --cpu=tiny25 --cpu=tiny26 --cpu=tiny28 --cpu=tiny45 --cpu=tiny85 --cpu=tiny2313

-v3 -v5 -v5 -v3 -v3 -v3 -v3 -v3 -v3 -v3 -v3 -v3 -v3 -v1 -v1 -v0 -v0 -v0 -v0 -v0 -v0 -v0 -v0 -v1 -v1 -v0

ATmega169 ATmega2560 ATmega2561 ATmega323 ATmega325 ATmega3250 ATmega329 ATmega3290 ATmega406 ATmega645 ATmega6450 ATmega649 ATmega6490 ATmega8515 ATmega8535 ATtiny10 ATtiny11 ATtiny12 ATtiny13 ATtiny15 ATtiny25 ATtiny26 ATtiny28 ATtiny45 ATtiny85 ATtiny2313

Tabel 2.1 Maparea opiunilor procesorului

19

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11 Urmtorul tabel rezum caracteristicile memoriei pentru fiecare opiune v: Opiune generic procesor -v0 -v1 -v2 -v3 -v4 -v5 -v6 Modele memorie Tiny Tiny, Small Tiny Tiny, Small Small, Large Tiny, Small Small, Large Atribut __nearfunc __nearfunc __nearfunc __nearfunc __nearfunc __farfunc* __farfunc* Data max. 256 octei 64 octei 256 octei 64 koctei 16 Mo 64 koctei 16 Mo Dim. maxim a modulului i/sau a programului 8 koctei 8 koctei 128 koctei 128 koctei 128 koctei 8 Mo 8 Mo

Tabel 2.2 Rezumat al configurrii procesorului Note:

v6, este posibil, pentru funcii individuale, s treac peste atributul __farfunc i s foloseasc n schimb atributul __nearfunc. Opiunea v nu reflect volumul de date folosit, ci volumul maxim de date adresabil.
* Cnd este folosit opiunea v5 sau Asta nseamn c, de exemplu, dac folosii un microcontroler cu 16 Mo de date adresabili i nu folosii mai mult de 256 o sau 64 Ko de date, trebuie s folosii ori opiunea pentru 16Mo date.

v4

ori

v6

b. Modelul de memorie: Una dintre caracteristicile microcontroler-ului AVR este c exist un compromis privind modul de accesare a memoriei variind ntre acces puin costisitor, limitat la zone mici de memorie i metode de acces costisitor prin care este accesat orice locaie de memorie. n compilatorul C/C++ AVRIAR putei seta o metod implicit de acces la memorie selectnd un anumit model de memorie. Exist trei modele de me morie : Tiny, Small i Large. Alegerea opiunii de procesor determin ce modele de memorie sunt disponibile. Dac nu se specific opiunea pentru modelul de memorie, modelul Tiny va fi cel selectat n mod implicit pentru toate opiunile procesorului cu excepie n cazul v4 i v6, unde se va folosi modelul Small. Programul poate folosi doar un singur model de memorie i acelai model trebuie folosit n toate modulele utilizatorului i n toate modulele librrie. Urmtorul tabel rezum caracteristicile fiecrui model de memorie: Modelul de memorie Tiny Small Large Opiunea generic procesor -v0, -v1, -v2, -v3, -v5 -v1, -v3, -v4, -v5, -v6 -v4, -v6 Atribut de memorie implicit __tiny __near __far Pointer implicit __tiny __near __far Dimensiunea maxim a stivei 256 o 64 ko 16 Mo

Tabel 2.3 Rezumatul modulelor de memorie

20

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11 Dimensiunea tipului double n virgul mobil Valorile n virgul mobil sunt reprezentate prin numere pe 32, respectiv 64 bii n formatul standardului IEEE754. Prin activarea op iunii compilatorului --64bit_doubles, putei alege dac datele declarate ca fiind double s fie prezentate pe 64 de bii. Tipul de dat float este mereu reprezentat pe 32 de bii. Optimizri pentru vitez i dimensiune Compilatorul C/C++ AVRIAR este un compilator state -of-the-art cu un optimizator care efectueaz, pe lng alte operaii, eliminarea codului mort, propagare constant i reducerea preciziei. n acelai timp efectueaz optimizri de bucl. De cele mai multe ori optimizrile vor face aplicaia i mai rapid i o vor i aduce la dimensiuni mai mici. Cu toate acestea, cnd nu este cazul, compilatorul utilizeaz inta de optimizare selectat pentru decidere asupra optimizrii pe care o va efectua. Nivelul i inta de optimizare pot fi specificate pentru ntreaga aplicaie, pentru fiecare fiier n parte i pentru anumite funcii. n plus, anumite optimizri individuale pot fi dezactivate, cum ar fi plasarea n linie a funciilor. Mediul de rulare Pentru crearea mediului de rulare necesar va trebui s alegei o librrie de rulare i s setai opiunile de librrie. Ai putea de asemenea sa dorii s trecei peste modulele de librrii folosind versiunile personalizate proprii de librrii.

c.

d.

e.

Exist dou seturi de librrii de rulare puse la dispoziie: IAR DLIB Library, care suport ISO/ANSI C i C++. Aceast librrie suport de asemenea numere n virgul mobil n format IEEE 754 i poate fi configurat pentru a include diferite nivele de suport pentru locale, descriptori de fiier, caractere multibyte, etc. IAR CLIB Library, este o librrie din categoria uoar, care nu este compilat n totalitate cu ISO/ANSI C. De asemenea nu ofer suport deplin pentru numere n virgul mobil n format IEEE 754 sau suport pentru Embedded C++(aceast librrie este folosit implicit). Librria de rulare pe care o alegei poate fi una dintre librrie pre-built, sau o librrie pe care ai customizat-o sau ai construit-o. IAR Embedded Workbench IDE ofer template-uri pentru librriile de proiect pentru ambele librrii, care le putei folosi pentru construirea propriilor tipuri de librrii. Acest lucru v ofer control deplin asupra mediului de rulare. Dac proiectul conine doar cod surs n assembler nu este nevoie alegerea unei librrii de rulare. Pentru alegerea unei librrii, se alege Project>Options i se d click pe tab-ul Library Configuration din categoria General Options. Se alege tipul de librrie adecvat din meniul drop-down.

Alegere unei librrii din linia de comand: 21

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11

Linia de comand -I\avr\inc I\avr\inc\{clib|dlib} libraryfile.r90 --dlib_config C:\...\configfile.h

Descriere Specific calea pentru includere Specific calea pentru fiiere librrie specifice. Utilizai clib/ dlib depinznd de ce librrie folosii. Specific fiierul obiect. Specific fiierul de configurare pentru librrie (doar pentru biblioteca DLIB).

Tabel 2.4 Opiuni ale liniei de comand pentru specificarea bibliotecii i a fiierelor dependente Tabelul arat de asemenea cum fiierul obiect corespunde opiunilor dependente de proiect.

2.4.2

SUPORT SPECIAL PENTRU SISTEME EMBEDDED

Aceasta seciune descrie pe scurt extensiile oferite de compilatorul de C/C++ AVR IAR pentru a suporta caracteristicile microcontroler-ului AVR. Directivele pragma controleaz comportamentul compilatorului, de exemplu modul n care se aloc memorie, dac permite cuvinte cheie extinse sau dac emite mesaje de eroare. Directivele pragma sunt tot timpul activate n compilatorul AVR IAR. Ele se potrivesc cu ISO/ANSI C i sunt foarte folositoare n momentul n care se dorete asigurarea portabilitii. Urmtorul tabel arat directivele pragma ale compilatorului : #pragma ablon_de_baz #pragma bitfields #pragma constseg #pragma data_alignment #pragma dataseg #pragma diag_default #pragma diag_error #pragma diag_remark #pragma diag_suppress #pragma diag_warning #pragma include_alias #pragma inline #pragma language #pragma location #pragma message Face o funcie ablon pe deplin contient de memorie Controleaz ordinea cmpului de bii Plaseaz variabile constante ntr-un cmp numit Selecteaz modul de aliniere a datelor n memorie Plaseaz variabile ntr-un segment numit Modific nivelul de severitate al mesajelor de diagnosticare Modific nivelul de severitate al mesajelor de diagnosticare Modific nivelul de severitate al mesajelor de diagnosticare Suprim mesajele de diagnosticare Modific nivelul de severitate al mesajelor de diagnosticare Specific un alias pentru un fiier inclus Face o funcie inline Controleaz extensiile de limbaj IAR Specific adresa absolut a unei variabile Afieaz un mesaj 22

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11

#pragma object_attribute #pragma optimize #pragma pack #pragma required #pragma rtmodel #pragma segment #pragma type_attribute #pragma vector

Schimb definiia unei variabile sau a unei funcii Specific tipul i nivelul de optimizare Specific alinierea membrilor unei structuri sau a unei uniuni Asigur faptul c un simbol care este folosit de un alt simbol este prezent n ieire legat. Adaug un atribut model de execuie modulului Declar un nume de segment pentru a fi utilizat de ctre funciile intrinseci Modific declaraia i definiia unei variabile sau a unei funcii Specific vectorul unei funcii de ntrerupere

Tabel 2.5 Rezumatul directivelor pragma Cu simbolurile predefinite ale preprocesorului, se poate inspecta mediul din timpul compilrii, de exemplu timpul de compilare, varianta de procesor i modelul de memorie folosit. Rezumatul simbolurilor predefinite: Identificri Acceseaz alinierea unui obiect Identific numele fiierului s fie compilat. Dac fiierul este un fiier antet, numele de fiier care include fiierul header este identificat. Identific varianta procesorului n uz Identific varianta procesorului n uz Stabilete dac se execut n compilator modul C + + Determin data de compilare Corespunde procesorul specificat cu opiunea compilatorului cpu Stabilete dac se execut n compilator modul C + + Identific numele fiierului fiind compilat Se extinde intr-un string cu numele funciei i contextul Se extinde intr-un string cu numele funciei i contextul Determin dac exist un EEPROM disponibil Identific platforma compilatorului IAR Identific compilatorul AVR IAR C / C + + Determin numrul liniei sursei de curent Identific modelul de memorie n uz Determin dac afirmaiile trebuie s fie incluse sau nu n cererea construit Poate fi utilizat n preprocesor, definete i are efect echivalent 23

Simbolul predefinit __ALIGNOF__() __BASE_FILE__

__CORE__ __CPU__ __cplusplus __DATE__ __derivative__ __embedded_cplusplus __FILE__ __func__ __FUNCTION__ __HAS_EEPROM__ __IAR_SYSTEMS_ICC__ __ICCAVR__ __LINE__ __MEMORY_MODEL__ NDEBUG _Pragma()

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11

__PRETTY_FUNCTION__ __STDC__ __STDC_VERSION__ __TID__ __TIME__ __VER__ __VERSION_1_CALLS__

cu directiva Pragma Se extinde ntr-un string cu numele func iei, inclusiv tipuri de parametru i de tip ntoarcere, ca context Identific ISO / standardului ANSI C Identific versiunea standardului ISO / ANSI standardului C n uz Identific procesor int al IAR compilator n uz Determin timpul de compilare Identific procesor int al IAR compilator n uz Identific convenia de apelare n uz

Tabel 2.6 Rezumatul simbolurilor predefinite Fiiere header pentru I/O Unitile periferice standard sunt definite n fiierele header specifice dispozitivului cu extensia .h . Pachetul produsului pune la dispoziie fiiere I/O pentru toate dispozitivele disponibile la timpul respectiv la punerea pe pia a produsului. Fiierele se gsesc n directorul avr/inc. Dac este nevoie de fiiere header I/O adiionale, ele pot fi foarte uor create folosind unul dintre cele puse la dispoziie ca template-uri. Accesarea regitrilor speciali de funcii Fiiere header specifice pentru mai multe derivate AVR sunt incluse n compilatorul AVR IAR C/C++ de la lansare. Fiierele header se numesc ioderivative.h i definesc regitrii de funcii specifici procesorului (special function registers - SFRs). n IAR Embedded Workbench, activarea definiiilor pe bit se face selectnd opiunea General Options>System>Enable bit definitions n I/O include files. SFR-urile cu cmpuri de bii sunt declarai n fiierele header. Urmtorul exemplu este din iom128.h: __io union { unsigned char PORTE; /* The sfrb as 1 byte */ struct { unsigned char PORTE_Bit0:1, PORTE_Bit1:1, PORTE_Bit2:1, PORTE_Bit3:1, PORTE_Bit4:1, PORTE_Bit5:1, PORTE_Bit6:1, PORTE_Bit7:1; }; } @ 0x1F; Prin includerea fiierului potrivit la cod, este posibil accesarea fie a ntregului registru, fie a oricrui bit individual (sau cmp de bit) din cod C dup cum urmeaz: /* whole register access */ 24

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11 PORTE = 0x12; /* Bitfield accesses */ PORTE.PORTE_Bit0 = 1

2.5
2.5.1

REALIZAREA UNUI PROIECT (PENTRU ATMEGA16)


CREAREA UNUI PROIECT N IAR EMBEDDED WORKBENCH 5.51

Se vor utiliza urmtoarele medii de dezvoltare: IAR Embedded Workbench 5.51 editare cod surs i compilare execuie i debug AVR Studio 4.19 se deschide mediul IAR 5.51 menu=Project Create New Project option=Empty Project button=OK

Figura 2.5 se indic locaia i numele proiectului (ntr-un director nou)

1. 2.

Adugarea fiierelor surs menu=File menu=New menu=File menu=File menu=Save menu=Project menu=Add files Deschiderea unui proiect existent n IAR menu=File menu=Open menu=Workspace...

25

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11

Figura 2.6 se indic fiierul spaiului de lucru (cu extensia .eww) din directorul corespunztor proiectului 3. Configurarea proiectului n IAR 5.51 menu=Project menu=Options... n fereastra ce se va deschide vor fi alese urmtoarele opiuni: General Options Target Processor Configuration = -cpu16, Atmega16

Figura 2.7 General Options System Enable bit definitions in I/O -Include files = enabled

26

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11

Figura 2.8 Linker Output Output Format = ubrof 8 (forced)

Figura 2.9 C/C++ Compiler Optimizations = None

27

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11

Figura 2.10 C/C++ Compiler List Output list file = enabled (pentru a obine fiierul lst)

Figura 2.11 Linker List Generate linker listing = enabled, Segment Map = enabled, Module map = enabled (pentru a vedea fiierul map) 28

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11

Figura 2.12 nainte de a compila proiectul, se va defini spaiul de lucru astfel: 2.5.2 menu=Project menu=Make se va indica locaia fiierului cu informaii despre spaiul de lucru. CREAREA PROIECTULUI N AVR 4.19

De fapt proiectul specific mediului AVR se va construi peste proiectul creat mai devreme n IAR, urmnd paii: se deschide mediul AVR menu=File menu=Open File... Open As=Auto se va indica fiierul cu extensia .dbg din directorul /Debug/Exe al proiectului creat cu IAR button=Open va aprea un mesaj n care ni se va spune c mediul AVR i va construi fiierul de proiect (cu extensia .aps)

29

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11

Figura 2.13

button=Save va aprea o fereastr n care se va cere s se aleag platforma pe care va rula codul executabil

Figura 2.14 Debug platform=JTAG ICE, Device=ATmega16 button=Finish Not: codul surs vizibil n AVR poate fi doar citit. 1. Deschiderea proiectului n AVR menu=File menu=Open se va indica fiierul aplicaiei (cu extensia .aps) din directorul proiectului. 30

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11

2.

nfruntarea greutilor de ordin tehnic n cazul n care adaptorul USB to Serial nu este recunoscut de c tre sistemul de operare, se va cuta un driver din clasa ftdi 232 (http://www.ftdichip.com/Drivers/VCP.htm) n general: dac o component nu este recunoscut, se deconecteaz de la portul de comunicaie sau de la sursa de alimentare dac este cazul, i se reconecteaz, urmrindu-se comportamentul acesteia

3. Execuia programului menu=Debug menu=Start Debugging menu=Debug menu=Run (sau alt opiune) Este notabil faptul c se pot crea breakpoint-uri n program. Astfel putem verifica, de exemplu: dac o secven de cod se execut sau nu (o rutin de ntrerupere) valoarea regitrilor i coninutul memoriei la un moment dat 4. Vizualizarea coninutului memoriei Pentru a urmri valoarea unei variabile n program se va aduga numele variabilei n fereastra Watch: n fiierul surs se selecteaz variabila click-dreapta option=Add variable <nume variabil> to Watch. n continuare valoarea poate fi citit oprind programul din execuie (folosind un breakpoint, de exemplu)

Figura 2.15 Se poate studia coninutul memoriei de la o adres oarecare: menu=View menu=Memory n fereastra deschis se va putea selecta tipul de memorie (Data, Program, etc) i adresa locaiei de memorie

31

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11

Figura 2.16

5.

Programarea folosind AVR Studio 4: Tools-Program AVR Connect Se alege numele portului corespunztor USB (a se vedea Execuia programului) sau dac nu se tie se alege Auto -> Connect

Figura 2.17 n fila Main > Device and Signature Bytes ->Se alege Atmega16 din lista de modele AVR

32

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11

Figur 2.18

Pentru a testa conexiunea la Atmega16 : Main -> Read Signature. Astfel se trimite o comand la Atmega16 care cere semntura dispozitivului. Dac totul e conectat corect va apare: Signature matches selected device(Semntura se potrivete cu dispozitivul ales)

Figura 2.19 Pentru a programa dispozitivul int: fila Program Seciunea Flash- n Input HEX File se pune fiierul hex generat la construirea proiectului(fiierul se afl n default\<numele_proiectului.hex>). Se apas butonul Program din seciunea Flash.

33

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11

Figur 2.20

6.

Caracteristici avansate ale AVR Studio 4: Apsnd fila Fuses(sigurane) se citesc automat setrile de siguran ale dispozitivului AVR int. Dac dispozitivul nu e conectat atunci se va afia un mesaj de eroare. Siguranele v permit s configurai mai multe aspecte persistente, fundamentale ale dispozitivului AVR. Pentru a afla mai multe despre siguranele i ceea ce fac ele, vezi fia tehnic pentru Atmega16.

Figura 2.21 34

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11

Apsnd fila LockBits se citesc automat biii de blocare a dispozitivului AVR. Dac dispozitivul nu e conectat atunci se va afia un mesaj de eroare. Aceti bii permit securizarea dispozitivului prevenind citirea sau scrierea ulterioar de pe flash. Biii de blocare pot fi resetai la o stare neblocant prin tergerea chip-ului(fila Main butonul Erase Device). Biii de blocare sunt importani atunci cnd se dorete cedarea produsului altor persoane fr a le da acces la program sau dac se dorete mpiedicarea rescrierii accidentale a chip-ului programat.

Figura 2.22 2.5.3 CREAREA UNUI PROIECT N IAR 6.11 se deschide mediul IAR 6.11 menu=Project menu=Create New Project option=C main buton=OK

35

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11

Figura 2.23 1. se indic locaia i numele proiectului (ntr-un director nou) Adugarea fiierelor surs menu=File menu=New menu=File menu=File menu=Save menu=Project menu=Add files

2. Configurarea proiectului n IAR 6.11 menu=Project menu=Options... n fereastra ce se va deschide vor fi alese urmtoarele opiuni: General Options Target Processor Configuration = Atmega16

36

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11

Figura 2.24 General Options System Enable bit definitions in I/O -Include files = enabled

Figura 2.25 Linker Output Output Format = ubrof 8 (forced) 37

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11

Figura 2.26

C/C++ Compiler Optimizations = None

Figura 2.27 C/C++ Compiler List Output list file = enabled (pentru a obine fiierul lst) 38

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11

Figura 2.28 Linker List Generate linker listing = enabled, Segment Map = enabled, Module map = enabled (pentru a vedea fiierul map)

Figura 2.29 39

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11

DebuggerSetupDriverJTAGICE

Figura 2.30 JTAGICEJTAGICE1bifat Default communicationSe alege COM-ul corespunztor USB serial port ((aici COM 4)a se vedea 4.2.4) JTag PortFrequency in Hz: 100 KHz

40

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11

Figura 2.31 Se va defini spaiul de lucru astfel: menu=File menu=Save workspace se va indica locaia fiierului cu informaii despre spaiul de lucru 3. Execuia programului Pentru a vedea care e COM-ul corespunztor portului serial USB: Control Panel - System-Hardware-Device manager-Ports

Figura 2.32 41

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11

Pentru a executa programul: Project->Download and Debug

Figura 2.33 Este notabil faptul c se pot crea breakpoint-uri n program. Astfel putem verifica, de exemplu: dac o secven de cod se execut sau nu (o rutin de ntrerupere) valoarea regitrilor i coninutul memoriei la un moment dat 4. Vizualizarea coninutului memoriei

Figura 2.34 42

Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11

Pentru a urmri valoarea unei variabile n program se va aduga numele variabilei n fereastra Watch: Meniu=View ->Watch

Figura 2.35 Se poate studia coninutul memoriei de la o adres oarecare: menu=View menu=Memory n fereastra deschis se va putea selecta tipul de memorie (Data, Program, etc.) i adresa locaiei de memorie

Figura 2.36

43

Laborator 3 - Aprinderea unui LED folosind delay_cycles(). Funcii intrinseci

3 Aprinderea unui LED folosind delay_cycles(). Funcii intrinseci.


3.1
3.1.1

CUM FUNCIONEAZ UN LED


CE ESTE UN LED?

Un LED (eng. Light-Emitting Diode) este o diod semiconductoare ce emite lumin la polarizarea direct a jonciunii p-n. Efectul este o form de electroluminescen.

Figura 3.1 Schema simplificat a unui LED Un LED este o surs de lumin mic, de cele mai multe ori nsoit de un circuit electric ce permite modularea formei radiaiei luminoase. Deseori, acestea sunt utilizate ca indicatori n cadrul dispozitivelor electronice, dar din ce n ce mai mult au nceput s fie utilizate n aplicaii de putere ca surse de iluminare. Culoarea luminii emise depinde de compozi ia i de starea materialului semiconductor folosit, i poate fi n spectrul infrarou, vizibil sau ultraviolet. Pe lng iluminare, LED-urile sunt folosite din ce n ce mai des ntr-o serie mare de dispozitive electronice.

44

Laborator 3 - Aprinderea unui LED folosind delay_cycles(). Funcii intrinseci

3.1.2

ANOD, CATOD, TENSIUNI DE ALIMENTARE. REZISTENA DE LIMITARE A CURENTULUI

Anod Catod R

DC

Figura 3.2 Schema simplificat a conexiunii nainte de conectarea unui led n cadrul unui circuit electronic, trebuie s avem n vedere unele din caracteristicile electrice i optice ale acestora: Curentul maxim (mA): Pentru a evita deteriorarea LED-ului trebuie ntotdeauna s limitam curentul maxim prin LED, de regul cu ajutorul unei rezistene; pentru marea majoritate a LED-urilor aceast valoare este de 20 mA. Tensiunea de alimentare (V): Tensiunea necesar la borne pentru obinerea curentului maxim admis; de remarcat c aceast valoare este o caracteristica proprie fiecrui LED, de aceea n catalog vom gsi un interval de valori sau o valoare tipic. Lungimea de und: Lungimea de und arat culoarea exact a LED-ului (de exemplu, 660 nm este rou iar 625 nm este rou - portocaliu). LED-urile albe sunt caracterizate prin temperatura de culoare (de exemplu 5500K - alb rece , 3300K - alb cald).

La realizarea i celui mai simplu circuit cu LED -uri, se va ine cont de montarea unei rezistene de limitare a curentului pentru fiecare LED (grup de LED-uri legate n serie). Valoarea acesteia se va stabili n felul urmtor: R = ( U - Ub )/ I, unde: U este tensiunea de alimentare a circuitului; Ub este tensiunea la bornele LED-ului (uzual: 2V pentru LED rou, galben, verde i 3,5V pentru albastru i alb). n cazul mai multor LED-uri montate n serie, aceasta se multiplic cu numrul de LED-uri; I este curentul maxim prin LED ( uzual 20 mA). 45

Laborator 3 - Aprinderea unui LED folosind delay_cycles(). Funcii intrinseci De exemplu, dac led-ul HLMP1790 de la Farnell, de culoare verde, avnd urmtorii parametrii: lungimea de und (565nm), curentul continuu maxim admis (20mA), tensiunea la bornele led-ului (2V), se alimenteaz la sursa de curent continuu de 5V, atunci rezistena de limitare a curentului va fi: UR = 5V - 2V=3V R = UR / I=3V / 0.02mA = 150 Pentru legarea n paralel se va ine cont de urmtoarea schem de montaj:

Greit:

Corect:

Figura 3.3 Conectarea in paralel

3.2
3.2.1

CONFIGURAIA PINILOR DIN ATMEGA16


PORTURILE DIN ATMEGA16 (PORTA, PORTB, PORTC, PORTD)

ATmega16 este un microcontroler bazat pe arhitectura RISC AVR mbuntit, ce lucreaz pe 8 bii i are 40 de pini de ieire. Dintre acetia, 32 sunt pini de I/O (Input/Output) grupai n 4 porturi (PORTA, PORTB, PORTC, PORTD). Fiecare din cele 4 porturi au asociate cte 3 registre pe 8 bii ce conin configurrile fiecrui pin n parte(DDRx, PINx, PORTx). 46

Laborator 3 - Aprinderea unui LED folosind delay_cycles(). Funcii intrinseci

TQFP/QFN/MLF PDIP (XCK) PB0 PB1 PB2 PB3 (SS) PB4 (MOSI) PB5 SPI (MISO) PB6 (SCK) PB7 RESET VCC GND XTAL2 XTAL1 (RXD) PD0 USART (TXD) PD1 PD2 PD3 PD4 PD5 PD6 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 AREF GND AVCC PC7 PC6 PC5 PC4 PC3 PC2 PC1 (SDA) PC0 (SCL) PD7
PB4 (SS) PB3 (AIN1/OC0) PB2 (AIN0/INT2) PB1 (T1) PB0 (XCK/T0) GND VCC PA0 (ADC0) PA1 (ADC1) PA2 (ADC2) PA3 (ADC3)

44 (MOSI) PB5 (MISO) PB6 (SCK) PB7 RESET VCC GND XTAL2 XTAL1 (RXD) PD0 (TXD) PD1 (INT0) PD2 TWI 1 2 3 4 5 6 7 8 9 10 11 12

43

42

41

40

39

38

37

36

34 35 33 32 31 30 29 28 27 26 25 24 23 PA4 (ADC4) PA5 (ADC5) PA6 (ADC6) PA7 (ADC7) AREF GND AVCC PC7 (TOSC2) PC6 (TOSC1) PC5 (TDI) PC4 (TDO)

13

14

15

16

17

18

19

20

21

22

Figura 3.4 Descrierea pinilor Microcontroler-ul dispune de un set de 131 instruciuni i 32 de regitri de uz general (cei menionai mai sus). Cele 32 de registre sunt direct adresabile de Unitatea Logic Aritmetic (ALU), permind accesarea a dou registre independente ntr-o singur instruciune. Se obine astfel o eficien sporit n execuie (de pn la zece ori mai rapide dect microcontrolerele convenionale CISC). DESCRIEREA PE SCURT A PINILOR I UTILIZAREA LOR FRECVENT

3.2.2

VCC - Alimentarea digital GND Masa 0V PortA (PA7...PA0) - Portul A servete ca intrare analogic pentru ADC (Analog to Digital Converter). Atunci cnd ADC nu este folosit, portul A poate fi folosit i ca port I/O bidirecional pe 8 bii. Pinii de port pot fi conectai opional la VCC prin rezistori interni (selectai pentru fiecare bit). Buffer-ele de ieire ale Portului A au caracteristici de amplificare. PortB (PB7...PB0) - Portul B este un port I/O bidirecional pe 8 bii cu rezisten de pull-up intern. Buffer-ele de ieire ale portului B au caracteristici de amplificare. Portul B ndeplinete de asemenea funcii speciale ale microcontroler-ului ATmega16. PortC (PC7...PC0) - Portul C este un port I/O bidirecional pe 8 bii cu rezisten de pull-up intern. Portul C este folosit de asemenea i pentru unele funcii ale interfeei JTAG. Dac interfaa JTAG (de depanare, debug) este activat, rezistorii pinilor PC5(TDI), PC3(TMS) i PC2(TCK) vor fi activai, chiar dac are loc o resetare.

(INT1) PD3 (OC1B) PD4 (OC1A) PD5 (ICP1) PD6 (OC2) PD7 VCC GND (SCL) PC0 (SDA) PC1 (TCK) PC2 (TMS) PC3

47

Laborator 3 - Aprinderea unui LED folosind delay_cycles(). Funcii intrinseci PortD (PD7...PD0) - Portul D este un port I/O bidirecional pe 8 bii cu rezisten de pull-up intern. Buffer-ele de output ale Port-ului D au caracteristici de amplificare. Port-ul D ndeplinete de asemenea funcii speciale ale ATmega 16. RESET - Pinul de reset. Un nivel de 0V la acest pin mai mare ca durat dect o valoare prestabilit, va genera o resetare a controllerului dup restabilirea nivelului la VCC. XTAL1 - intrare pentru oscilator i pentru circuitul intern de clock XTAL2 - ieire din oscilator AVCC - AVCC este pinul de alimentare pentru portul A i pentru ADC. Trebuie conectat extern la VCC, chiar dac ADC -ul nu este folosit. Dac ADC-ul este folosit, trebuie conectat la VCC printr-un Filtru Trece Jos AREF - AREF este pinul de referin analog pentru ADC PORTURILE DE INTRARE/IEIRE

3.2.3

Atunci cnd sunt folosite ca porturi generale digitale I/O, toate porturile au funcionalitate de citire-modificare-scriere (true Read-Modify-Write). Aceasta nseamn c, direcia unui port poate fi schimbat fr schimbarea neintenionat a direciei oricrui alt pin prin instruciunile SBI i CBI. Toi pinii porturilor au rezisten de pull-up individual, selectabil, cu rezerve de putere. Toi pinii I/O au diod de protecie att pentru Vcc ct i pentru mas, aa cum se poate vedea n figura urmtoare:

Rpu Pin

Cpin

Figura 3.5 Schema echivalent a pinilor de I/O

Porturile sunt de I/O bidirecionale cu rezistene interne de pull-up opionale. 48

Laborator 3 - Aprinderea unui LED folosind delay_cycles(). Funcii intrinseci

3.2.4

CONFIGURAREA PINILOR

Trei locaii de memorie (cte 3 registre pe 8 bii) sunt alocate pentru fiecare port n parte: pentru Registrul de date (Data Register) PORTx, Registrul de direcie a datelor (Data Direction Register) DDRx i Registrul de intrare ( Port Input Pins) PINx. Locaia registrului PINx poate fi doar citit nu i scris, n timp ce DDRx i PORTx pot fi att scrise ct i citite. Pentru a dezactiva rezistena de pull-up trebuie setat (1 logic) bitul PUD (Pull-up Disable) din registrul SFIOR. Notaia generic pentru aceti regitrii este DDxn, PORTxn, i PINxn, unde xn se refer la denumirea pinului respectiv (x reprezint numrul literei portului (A, B, C, D) i n reprezint numrul bit-ului (1-8) ). La utilizarea regitrilor i biilor ntrun program, trebuie precizat forma exact, de exemplu PORTB3 pentru bitul nr. 3 din portul PORTB. Biii DDxn se gsesc la adresa registrului DDRx, biii PORTxn se gsesc la adresa registrului PORTx, iar biii PINxn se gsesc la adresa registrului PINx. DDRx (Data Direction Register) seteaz direcia pinilor, i anume dac acetia sunt de intrare sau de ieire. Scrierea valorii de 0 pe un bit din DDRx face ca pinul corespunztor din portul x s fie pin de intrare, iar scrierea valorii de 1 l seteaz ca pin de ieire. Implicit toi pinii sunt pini de intrare. De exemplu: - pentru a seta toi pinii portului A pini de intrare vom scrie: DDRA = 0x00; - pentru a seta toi pinii portului A pini de ieire vom scrie: DDRA = 0xFF; - pentru a seta pinii 0, 4, 5 si 7 a portului B ca pini de ieire vom scrie: DDRB = 0xB1; PORTx este folosit n dou scopuri: pentru a asigna valori pinilor de ieire (low sau high) i pentru a activa i dezactiva rezistenta de pull-up pentru pinii de intrare. Dac PORTxn este scris ca 1 logic atunci cnd pinul este configurat ca pin de intrare, rezistena de pull-up este activat. Pentru a dezactiva rezistena de pull-up , PORTxn trebuie resetat (pus pe 0 logic), sau pinul trebuie s fie configurat ca pin de ieire. Pinii porturilor au valoarea HiZ atunci cnd este activat o condiie de reset, chiar dac nu este nici un clock activ. Dac PORTxn este scris ca 1 logic, atunci cnd pinul este configurat ca pin de ieire, pinul portului este trecut in 1 logic. Dac PORTxn este scris ca 0 logic atunci cnd pinul este configurat ca pin de ieire pinul portului este trecut n 0 logic. Rolul acestui registru este astfel n legtur cu registrul DDRx. De exemplu: - pentru a seta pinii 0, 4, 5 si 7 a portului B ca pini de ieire cu valori de 1 logic se va scrie: DDRB = 0xB1; //se seteaz pinii ca ieiri PORTB = 0xB1; //se seteaz pinii cu valori de 1 logic - pentru a seta pinii 0 i 2 a portului A ca pini de ieire cu valori de 1 logic se va scrie: DDRA = 0x03; // se seteaz pinii ca ieiri PORTA = 0x03; // se seteaz pinii cu valori de 1 logic PINx este folosit pentru a citi valorile pinilor de intrare. Astfel dup ce se seteaz pinii portului x ca pini de intrare, se pot afla valorile intrrilor citind registrul PINx. De exemplu: - pentru a citi valorile pinilor de la portul C se poate scrie: 49

Laborator 3 - Aprinderea unui LED folosind delay_cycles(). Funcii intrinseci DDRC = 0x00; // se seteaz pinii portului C ca pini de intrare x = PINC; //se copiaz valorile de intrare ale pinilor portului C n variabila x Urmtorul tabel arat starea unui pin pentru diferite combinaii de configurare:

DDxn 0 0

PORTxn 0 1

PUD (n SFIOR) x 0

I/O Input Input

Pull-up Nu Da

Descriere Tri-state (Hi-Z) Va trece curent prin pin doar dac n exterior avem 0 logic. Tri-state (Hi-Z) Ieirea va fi 0 logic Ieirea va fi 1 logic

0 1 1

1 0 1

1 x x

Input Output Output

Nu Nu Nu

Figura 3.6 Combinaii de configurare

3.2.5

CITIREA VALORILOR PINILOR

Independent de setrile bitului DDxn, portul pinului poate fi citit prin PINxn Register bit. Din figura se arat c PINxn Register bit, mpreun cu circuitul latch ce l precede, constituie un sincronizator. Acesta introduce o ntrziere dac pinul fizic i schimb valoarea aproape de maximul ceasului intern. Figura urmtoare prezint o diagram de timp a sincronizrii atunci cnd se citete o solicitare extern a valorii unui pin. Maximul i minimul propagrii unei ntrzieri sunt indicate de t pd,max i tpd,min.

50

Laborator 3 - Aprinderea unui LED folosind delay_cycles(). Funcii intrinseci

SYSTEM CLK INSTRUCTIONS XXX XXX in r17, PIN x

SYNC LATCH

PIN xn 0x00 r17 tpd,max tpd,min 0xFF

Figura 3.7 Sincronizarea n momentul citirii unei valori externe Se consider perioada ceasului ncepnd de la prima front negativ al clock-ului sistemului. Latch-ul este nchis atunci cnd clock-ul este la un nivel sczut i funcioneaz normal la un nivel ridicat aa cum se indic n partea haurat a regiunii SYNC LATCH a semnalului. Valoarea semnalului este schimbat atunci cnd mecanismul clock-ul funcioneaz la un nivel sczut. Fiecare succesiune pozitiv a clock-ului se contorizeaz n registrul PINxn. Cele dou sgei tpd,max i tpd,min indic o singur tranziie a semnalului asupra pinului ce va fi ntrziat ntre i 1 din perioada timpului impus. La citirea valorii pinului trebuie executat instruciunea nop aa cum se arat n figura de mai jos. Instruciunea out seteaz SYNC LATCH pe partea pozitiv a ceasului. n acest caz, ntrzierea tpd ce trece prin sincronizator este de o perioad.

SYSTEM CLK r16 INSTRUCTIONS out PORTx,r16 0xFF nop in r17,PINx

SYNC LATCH PIN xn 0x00 r17 tpd 0xFF

Figura 3.8 Sincronizarea software 51

Laborator 3 - Aprinderea unui LED folosind delay_cycles(). Funcii intrinseci

Urmtorul exemplu de cod prezint modul de setare pentru pinii 0 i 1 pe high, pinii 2 i 3 pe low din portul B; de asemenea definete pinii portului de la 4 la 7 ca intrare cu pull-ups asociate pinilor 6 i 7 ai portului. Valorile pinilor rezultate sunt citite din nou, ns pentru pstrarea valorilor precedente este necesar instruciunea nop. unsigned char i; /*...*/ PORTB = (1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0); DDRB = (1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0); i = PINB; /*...*/ Observaie: n programare sunt folosite dou registre temporare pentru minimizarea duratei de timp la setrile pinilor 0,1,6 si 7 cu pull -up i definirea biilor 2 i 3 la nivel sczut precum i redefinirea biilor 0 i 1 ca driver la nivel nalt. FUNCII ALTERNATIVE ALE PORTURILOR

3.2.6

Majoritatea pinilor porturilor au i alte funcii n afar de faptul c sunt digitali de I/O. Semnalele de control ale pinilor pot fi suprascrise de ctre alte funcii, ns semnalele de suprascriere pot s nu fie prezente la toi pinii porturilor. Tabelul urmtor conine funciile semnalelor de suprascriere. Aceste semnale sunt generate intern in modulele ce conin funciile alternative. Numele semnalului PUOE Numele ntreg Pull-up Override Enable Descriere Dac acest semnal este setat, pull-up enable este controlat de ctre semnalul PUOV. Dac acest semnal este resetat pull-up-ul este activ atunci cnd {DDxn, PORTxn, PUD}=0b010 Dac PUOE este setat, pull-up-ul este activ/inactiv atunci cnd PUOV este setat/resetat, indiferent de valorile biilor DDxn, PORTxn si PUD Dac aceste semnal este setat, Output Driver Enable este controlat de ctre semnalul DDOV. Dac acest semnal este resetat Output Driver Enable este controlat de ctre bitul DDxn Dac DDOE este setat Output Driver este activ/inactiv atunci cnd DDOV este setat/resetat, indiferent de setrile bitului DDxn Dac acest semnal setat i Output Driver este activ, valoarea portului este controlat de ctre semnalul PVOV. Dac PVOE este resetat i Output Driver este activ, valoarea portului este controlat de ctre bitul PORTxn 52

PUOV

Pull-up Override Value

DDOE

Data Direction Override Enable

DDOV

Data Direction Override Value Port Value Enable Override

PVOE

Laborator 3 - Aprinderea unui LED folosind delay_cycles(). Funcii intrinseci

PVOV DIEOE

Port Value Override Value Digital Input Override Enable Enable

DIEOV

Digital Input Override Value

Enable

DI AIO

Digital Inputs Analog Input/Output

Dac PVOE este setat, valoare portului este dat de PVOV, indiferent de setrile bitului PORTxn Dac acest bit este setat, Digital Input Enable este controlat de ctre semnalul DIEOV. Dac acest semnal este resetat, Digital Input Enable este determinat de starea MCU (mod normal, mod sleep) Dac DIEOE este setat, Digital input este activ/inactiv atunci cnd DIEOV este setat/resetat, indiferent de starea MCU Aceasta este intrarea digitala a funciilor alternative Aceasta este intrarea/ieirea analog a funciilor alternative. Semnalul poate fi folosit bidirecional

Figura 3.9 Descrierea generic a semnalelor de suprascriere pentru alte funcii ale porturilor 3.2.6.1 Funcii alternative ale portului A Portul A mai are si funcia de intrare analogic pentru ADC, aa cum se poate vedea n Figura 3.. Dac unii pini ai Portului A sunt configurai ca ieire, este esenial ca acest lucru s nu se schimbe atunci cnd are loc o conversie. Acest fapt ar duce la o conversie eronat.

53

Laborator 3 - Aprinderea unui LED folosind delay_cycles(). Funcii intrinseci

Pinul Portului PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0

Alt Funcie ADC7 ( canalul 7 de intrare ADC) ADC6 ( canalul 6 de intrare ADC) ADC5 ( canalul 5 de intrare ADC) ADC4 ( canalul 4 de intrare ADC) ADC3 ( canalul 3 de intrare ADC) ADC2 ( canalul 2 de intrare ADC) ADC1 ( canalul 1 de intrare ADC) ADC0 ( canalul 0 de intrare ADC) Figura 3.10 Alte funcii ale Portului A

Figura 3. face legtura ntre aceste funcii ale Portului A i semnalele de suprascriere din Figura 3.. Numele semnalului PUOE PUOV DDOE DDOV PVOE PVOV DIEOE DIEOV DI AIO PA7/ ADC7 0 0 0 0 0 0 0 0 Intrare ADC7 PA6/ ADC6 0 0 0 0 0 0 0 0 Intrare ADC6 PA5/ ADC5 0 0 0 0 0 0 0 0 Intrare ADC5 PA4/ ADC4 0 0 0 0 0 0 0 0 Intrare ADC4 PA3/ ADC3 0 0 0 0 0 0 0 0 Intrare ADC3 PA2/ ADC2 0 0 0 0 0 0 0 0 Intrare ADC2 PA1/ ADC1 0 0 0 0 0 0 0 0 Intrare ADC1 PA0/ ADC0 0 0 0 0 0 0 0 0 Intrare ADC0

Figura 3.11 Semnale de suprascriere pentru Portul A

54

Laborator 3 - Aprinderea unui LED folosind delay_cycles(). Funcii intrinseci

3.2.6.2 Funcii alternative ale portului B Funciile pe care le mai are Portul B, n afar de cea de General Digital I/O se pot vedea n Figura 3.. Pinul Portului PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0 Alt funcie SCK ( SPI Bus Serial Clock) MISO ( SPI Bus Master Input/Slave Output ) MOSI ( SPI Bus Master Output/Slave Input )

SS ( SPI Slave Select Input ) AIN1 (Analog Comparator Negativ Input ) OC0 ( Timer/Counter0 Output Compare Match Output ) AIN0 ( Analog Comparator Pozitiv Input ) INT2 ( External Interrupt 2 Input ) T1 ( Timer/Counter1 External Counter Input ) T0 ( Timer/Counter0 External Counter Input ) XCK ( USART External Clock Input/Output )
Figura 3.12 Alte funcii ale Portului B

Figura 3. i Figura 3. fac legtura ntre aceste funcii ale Portului B i semnalele de suprascriere din Figura 3.. SPI MSTR INPUT i SPI SLAVE OUTPUT constituie semnalul MISO, n timp ce MOSI este mprit n SPI MSTR OUTPUT i SPI SLAVE INPUT. Numele semnalului PUOE PUOV DDOE DDOV PVOE PVOV DIEOE DIEOV DI AIO PB7/SCK SPE MSTR PB7 PUD SPE MSTR 0 SPEMSTR SCK OUTPUT 0 0 SCK INPUT PB6/MISO SPEMSTR PB6 PUD SPEMSTR 0 SPE MSTR SPI SLAVE OUTPUT 0 0 SPI MSTR INPUT PB5/MOSI SPE MSTR PB5 PUD SPE MSTR 0 SPEMSTR SPI MSTR OUTPUT 0 0 SPI SLAVE INPUT PB4/ SS SPE MSTR PB4 PUD SPE MSTR 0 0 0 0 0 SPI SS -

Figura 3.13 Semnale de suprascriere pentru Portul B 55

Laborator 3 - Aprinderea unui LED folosind delay_cycles(). Funcii intrinseci

Numele Semnalului PUOE PUOV DDOE DDOV PVOE PVOV DIEOE DIEOV DI AIO

PB3/OC0/AIN1 0 0 0 0 OC0 ENABLE OC0 0 0 AIN1 INPUT

PB2/INT2/AIN0 0 0 0 0 0 0 INT2 ENABLE 1 INT2 INPUT AIN0 INPUT

PB1/T1 0 0 0 0 0 0 0 0 T1 INPUT -

PB0/T0/XCK 0 0 0 0 UMSEL XCK OUTPUT 0 0 XCK INPUT / T0 INPUT -

Figura 3.14 Semnale de suprascriere pentru Portul B 3.2.6.3 Funcii alternative ale portului C Funciile pe care le mai are Portul C, n afar de cea de General Digital I/O se pot vedea n Figura 3.. Dac interfaa JTAG este activat, rezistena de pull-up pe pinii PC5 (TDI), PC3 (TMS) i PC2 (TCK) va fi activat , chiar dac va avea loc un reset. Pinul Portului PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0 Alt Funcie TOSC2 ( Timer Oscillator Pin 2 ) TOSC1 ( Timer Oscillator Pin 1 ) TDI ( JTAG Test Data In ) TDO ( JTAG Test Data Out ) TMS ( JTAG test Mode Select ) TCK ( JTAG Test Clock ) SDA ( Two-wire Serial Bus Data Input / Output Line ) SCL ( Two-wire Serial Bus Clock Line ) Figura 3.15 Alte funcii ale Portului C Figura 3. i Figura 3.2 fac legtura ntre aceste funcii ale Portului C i semnalele de suprascriere din Figura 3..

56

Laborator 3 - Aprinderea unui LED folosind delay_cycles(). Funcii intrinseci

Numele Semnalului PUOE PUOV DDOE DDOV PVOE PVOV DIEOE DIEOV DI AIO

PC7/TOSC2 AS2 0 AS2 0 0 0 AS2 0 T/C2 OSC OUTPUT

PC6/TOSC1 AS2 0 AS2 0 0 0 v T/C2 OSC INPUT

PC5/TDI JTAGEN 1 JTAGEN 0 0 0 JTAGEN 0 TDI

PC4/TDO JTAGEN 0 JTAGEN SHIFT_IR + SHIFT_DR JTAGEN TDO JTAGEN 0 -

Figura 3.16 Semnalele de suprascriere pentru Portul C

Numele Semnalului PUOE PUOV DDOE DDOV PVOE PVOV DIEOE DIEOV DI AIO

PC3/TMS JTAGEN 1 JTAGEN 0 0 0 JTAGEN 0 TMS

PC2/TCK JTAGEN 1 JTAGEN 0 0 0 JTAGEN 0 TCK

PC1/SDA TWEN PC1 PUD TWEN DA_OUT TWEN 0 0 0 SDA INPUT

PC0/SCL TWEN PC0 PUD TWEN SCL_OUT TWEN 0 0 0 SCL INPUT

Figura 3.2 Semnalele de suprascriere pentru Portul C 3.2.6.4 Funcii alternative ale portului D Funciile pe care le mai are Portul D, n afar de cea de General Digital I/O se pot vedea n Figura 3..

57

Laborator 3 - Aprinderea unui LED folosind delay_cycles(). Funcii intrinseci

Pinul Portului PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0

Alt funcie OC2 ( Timer/Counter2 Output Compare Match Output ) ICP ( Timer/Counter1 Input Capture Pin ) OC1A ( Timer/Counter1 Output Compare A Match Output ) OC1B ( Timer/Counter1 Output Compare B Match Output ) INT1 (External Interrupt 1 Input ) INT0 ( External Interrupt 0 Input ) TXD ( USART Output Pin ) RXD ( USART Input Pin ) Figura 3.18 Alte funcii ale Portului D

Figura 3. i Figura 3.3 fac legtura ntre aceste funcii ale Portului D i semnalele de suprascriere din Figura 3..

Numele Semnalului PUOE PUOV DDOE DDOV PVOE PVOV DIEOE DIEOV DI AIO

PD7/OC2 0 0 0 0 OC2 ENABLE OC2 0 0 -

PD6/ICP 0 0 0 0 0 0 0 0 ICP INPUT -

PD5/OC1A 0 0 0 0 OC1A ENABLE OC1A 0 0 -

PD4/OC1B 0 0 0 0 OC1B ENABLE OC1B 0 0 -

Figura 3.19 Semnalele de suprascriere pentru Portul D

58

Laborator 3 - Aprinderea unui LED folosind delay_cycles(). Funcii intrinseci

Numele Semnalului PUOE PUOV DDOE DDOV PVOE PVOV Numele Semnalului DIEOE DIEOV DI AIO

PD3/INT1 0 0 0 0 0 0 PD3/INT1 INT1 ENABLE 1 INT1 INPUT -

PD2/INT0 0 0 0 0 0 0 PD2/INT0 INT0 ENABLE 1 INT0 INPUT -

PD1/TXD TXEN 0 TXEN 1 TXEN TXD PD1/TXD 0 0 -

PD0/RXD RXEN PD0 PUD RXEN 0 0 0 PD0/RXD 0 0 RXD -

Figura 3.3 Semnalele de suprascriere pentru Portul D

3.3
3.3.1

REZISTENA DE PULL-UP
BITUL PUD DIN SFIOR (SPECIAL FUNCTION I/O REGISTER)
Bit

2
PUD
R/W 0

1
PSR2
R/W 0

0
PSR10
R/W 0

ADTS2 ADTS1 ADTS0 ADHSM ACME Read/Write Valoare iniial


R/W 0 R/W 0 R/W 0 R/W 0 R/W 0

SFIOR

Figura 3.4 Registrul SFIOR Cnd acest bit este setat 1, porturile I/O sunt dezactivate chiar dac registrele PORTxn i DDxn sunt configurate pentru a le activa ({DDxn, PORTxn} = 0b01). Vezi configurarea pinilor pentru mai multe detalii despre aceste caracteristici.

59

Laborator 3 - Aprinderea unui LED folosind delay_cycles(). Funcii intrinseci

3.4

PINII NECONECTAI

Dac unii pini rmn neconectai, este recomandat s se asigure faptul c aceti pini au valori definite. Cel mai simplu mod de a se asigura acest lucru este prin activarea rezistenei de pull-up interne. n acest caz, rezistena va fi dezactivat n momentul reset-ului. Dac este important un consum redus de curent n momentul reset-ului, este recomandat folosirea unui pull-up sau pull-down extern. Conectarea pinilor nefolosii direct la VCC sau la mas nu se recomand, deoarece va produce cureni inutili dac pinul este setat ca pin de ieire.

3.5

FUNCII INTRINSECI

Funciile intrinseci ofer acces direct la operaiunile de procesor de nivel sczut i pot fi foarte utile, de exemplu, n rutinele critice de timp. Funciile intrinseci sunt compilate n cod inline, fie ca exist o singur instruciune sau o secven scurt de instruciuni. Urmtorul tabel rezum funciile intrinseci: Funcii Intrinseci __delay_cycles __disable_interrupt __enable_interrupt __extended_load_program_memory __fractional_multiply_signed __fractional_multiply_signed_ with_unsigned __fractional_multiply_unsigned __indirect_jump_to __insert_opcode __load_program_memory __multiply_signed __multiply_signed_with_unsigned __multiply_unsigned __no_operation __sleep __swap_nibbles __watchdog_reset

Descriere Inserii de un timp de ntrziere Dezactiveaz ntreruperile Activeaz ntreruperile Returneaz un octet din codul memoriei Genereaz o instruciune FMULS Genereaz o instruciune FMULSU Genereaz o instruciune FMUL Genereaz o instruciune IJMP Atribuie o valoare ntr-un registru procesor Returneaz un octet din codul memoriei Genereaz o instruciune MULS Genereaz o instruciune MULSU Genereaz o instruciune MUL Genereaz o instruciune NOP Introduce o instruciune SLEEP Swap-uri bit cu bit 0-3 cu 4-7 Resetare watchdog

Figura 3.22 Funcii intrinseci

60

Laborator 3 - Aprinderea unui LED folosind delay_cycles(). Funcii intrinseci Seciunea urmtoare ofer informaii de referin despre fiecare funcie intrinsec. 3.5.1 __DELAY_CYCLES(UNSIGNED LONG);

void __delay_cycles(unsigned long); Aceast funcie genereaz cod care consum exact numrul de ciclii specificat ca parametru, fr alte efecte secundare. Valoarea specificat trebuie s fie o constant cunoscut la compilare. Datorit faptului c procesorul se blocheaz cnd este apelat funcia, aceasta nu este o funcie optim. Momentele n care procesorul parcurge acel cod generat sunt nite timpi nefolosii. Pentru o optimizare a acestui proces, se pot folosi ntreruperi de procesor, ce vor fi studiate ntr-un laborator viitor. Aceast funcie este preferat n instruciunile simple, deoarece este foarte uor de folosit. 3.5.2 __DISABLE_INTERRUPT (VOID);

void __disable_interrupt(void); Dezactiveaz ntreruperile prin introducerea de instruciuni CLI. 3.5.3 __ENABLE_INTERRUPT (VOID);

void __enable_interrupt(void); Activeaz ntreruperile prin introducerea de instruciuni SEI. 3.5.4 __EXTENDED_LOAD_PROGRAM_MEMORY(UNSIGNED CHAR __FARFLASH *);

unsigned char __extended_load_program_memory(unsigned char __farflash *); Returneaz un octet din memoria cod. Se utilizeaz aceast funcie intrinsec pentru accesul la datele constante din memoria cod. 3.5.5 __LOAD_PROGRAM_MEMORY(UNSIGNED CHAR __FLASH *); __load_program_memory(const unsigned char

unsigned char __flash *);

Returneaz un octet din memoria cod. Constantele trebuie s fie plasate n primii 64 Kb de memorie.

61

Laborator 3 - Aprinderea unui LED folosind delay_cycles(). Funcii intrinseci

3.5.6

__NO_OPERATION (VOID);

void __no_operation(void); Genereaz o instruciune NOP. 3.5.7 __SLEEP (VOID);

void __sleep(void); Inserii de o instruciune sleep. Pentru a utiliza aceast funcie intrinsec, trebuie asigurat faptul c instruciunea a fost activat n registrul MCUCR. 3.5.8 __SWAP_NIBBLES (UNSIGNED CHAR);

unsigned char __swap_nibbles(unsigned char); Aceast funcie face bit swap-urile biilor 0-3 cu bii 4-7 din parametrul specificat i returneaz valoarea interschimbat. 3.5.9 __WATCHDOG_RESET (VOID);

void __watchdog_reset(void); Inserii de o instruciune de resetare watchdog.

3.6
Enun

APLICAII

Aprinderea unui led o dat pe secund (frecvena de 1Hz, perioad ON de 0.5s, perioad OFF de 0.5s). Rezolvare Trebuie urmat o secven logic de pai: trebuie incluse bibliotecile de lucru cu simbolurile, constantele i funciile intrinseci: #include <inavr.h> #include <ioavr.h> 1. 2. trebuie setat direcia pinului. Aa cum a fost menionat n laborator, implicit toi pinii sunt pini de intrare. Se va seta pinul ales (de exemplu, PD1 din portul D) ca pin de ieire prin urmtoarea instruciune: DDRD = (1<<PD1); 62

Laborator 3 - Aprinderea unui LED folosind delay_cycles(). Funcii intrinseci se vor realiza operaii de toggle asupra portului de ieire selectat. Astfel, pentru operaia de aprindere i stingere succesiv a led-ului, va trebui scris valoarea de 1 logic, respectiv 0 logic pe portul de ieire ( PORTD=0), cu o anumit frecven; acea frecven va fi generat cu ajutorul funciei prezentate mai sus: __delay_cycles(); Parametrul trimis funciei va fi calculat n funcie de frecvena oscilatorului intern (n acest caz, 4Mhz).

3.

Cum calculm valoarea transmis ca parametru pentru delay_cycles(): -frecvena oscilatorului intern este de 4Mhz (teoretic) -calculm durata unui ciclu de instruciune: 1 ciclu......................1/4Mhz=0,25 s x ciclii......................0,5s x=0,5s/0,25s=2000000 ciclii 4. aa cum a fost prezentat n prima parte a laboratorului, conectarea led -ului n cadrul circuitului este esenial pentru funcionarea acestuia. Astfel, minusul led-ului va fi conectat la unul din pinii de GND (mas) ai microcontroler-ului, iar plusul led-ului va fi conectat, prin intermediul unei rezistene de valoare ce va fi calculat cu formula dat, la pin-ul setat ca ieire (PD1).

Cod surs
#include <inavr.h> //aceast bibliotec conine prototipurile funciilor delay_cycles(), enable_interrupt(),disable_interrupt() etc. #include <ioavr.h> //conine definiiile funciilor pentru input/output int main(void) { DDRD = (1<<PD1); //seteaz pinul PD1 ca pin de ieire while(1) { PORTD=2;// se seteaz valoarea 1 logic pe pinul de ieire //2(DEC)=0b00000010, ceea ce seteaz pinul PD1 (al doilea pin din portul D) cu valoarea de 1 logic //PORTD=0x02; //echivalentul n hexa __delay_cycles(2000000); //numrul de cicli echivaleni pentru 0,5s PORTD=0;// setm toi pinii portului D pe 0 logic, inclusiv pinul PD1. Avem astfel 0 Voli la ieirea acestuia ceea ce va determina stingerea ledului. n acest mod se realizeaz operaia de toggle(nchis/deschis) __delay_cycles(2000000); } return 0; }

63

Laborator 4 Comunicaia serial

4 Comunicaia serial
4.1 INTRODUCERE

Transmisia digital de date a evoluat de la conexiunea ntre un calculator i echipamentele periferice, la calculatoare care comunic n reele internaionale complexe. ns sunt multe de nvat pornind de la simpla legtur punct la punct sau RS232 dup standardul EIA. Cu toate c transferul paralel este mai rapid, majoritatea transmisiilor de date ntre calculatoare sunt fcute pe cale serial pentru a reduce costul cablurilor i conectorilor. Exist i limitri fizice de distan, care nu pot fi depite de magistrale paralele. n comunicaia serial, datele sunt transmise bit cu bit. Toate comunicaiile sunt caracterizate de trei elemente principale: Date - nelegerea lor, scheme de codificare, cantitate; Temporizri - sincronizarea ntre receptor i emitor, frecven i faz; Semnale - tratarea erorilor, controlul fluxului i rutarea interfeelor seriale.

4.2

MODELUL COMUNICAIEI SERIALE


Centrala telefonica Centrala telefonica

ETD

ECD (modem)

ECD (modem)

ETD

Linie de comunicatie Circuit de date Legatura de date

Figura 4.1 Sistem de comunicaie serial Componentele unui sistem de comunicaie serial sunt urmtoarele: 1. 2. ETD (Echipamente terminale de date: calculatoare, terminale de date). Acestea conin i interfeele seriale sau controlerele de comunicaie; ECD (Echipamente pentru comunicaia de date). Aceste echipamente se numesc modemuri i permit calculatorului s transmit informaii printr-o linie telefonic analogic. Funciile principale realizate de un modem sunt urmtoarele: Conversia digital/analogic a informaiilor din calculator i conversia; analog/digital a semnalelor de pe linia telefonic analogic. 64

Laborator 4 Comunicaia serial Modularea/demodularea unui semnal purttor. La transmisie, modemul suprapune (moduleaz) semnalele digitale ale calculatorului peste semnalul purttor al liniei telefonice. La recepie, modemul extrage (demoduleaz) informaiile transportate de semnalul purttor i le transfer calculatorului;

3.

Linia de comunicaie reprezint o linie fizic sau o linie telefonic. Linia telefonic poate fi o linie comutat (conectat la o central telefonic) sau o linie nchiriat (dedicat); Circuitul de date cuprinde poriunea dintre dou echipamente terminale de date, modemurile i linia de comunicaie. Pe distane reduse, este posibil comunicaia serial direct ntre dou echipamente terminale de date prin linii fizice, fr utilizarea unor modem-uri. n acest caz, circuitul de date este reprezentat de aceste linii; Legtura de date conine circuitul de date i interfeele seriale ale echipamentelor terminale de date.

4.

5.

n funcie de numrul de echipamente interconectate, o legtur serial poate fi punct la punct (dou echipamente) sau multi-punct (mai mult de dou echipamente).

4.3

TIPURI DE COMUNICAIE SERIAL

Din punctul de vedere al direciei de transfer, se pot distinge urmtoarele tipuri de comunicaie serial: Simplex; Semiduplex; Duplex. n cazul comunicaiei simplex, datele sunt transferate ntotdeauna n aceeai direcie, de la echipamentul transmitor la cel receptor. La comunicaia semiduplex, fiecare echipament terminal de date funcioneaz alternativ ca transmitor, iar apoi ca receptor. Pentru acest tip de conexiune, este suficient o singur linie de transmisie (dou fire de legtur). ntr -o comunicaie duplex (numit i duplex integral), datele se transfer simultan n ambele direcii. Primele conexiuni duplex necesitau dou linii de transmisie (patru fire de legtur), dar conexiunile ulterioare necesit o singur linie. Din punctul de vedere al sincronizrii dintre transmitor i receptor, exist dou tipuri de comunicaie serial: Asincron; Sincron. 4.3.1 COMUNICAIA ASINCRON

Pentru a asigura sincronizarea dintre transmitor i receptor, fiecare caracter transmis este precedat de un bit de START, cu valoarea logic 0 (space) i este urmat de cel puin un bit de STOP, cu valoarea logic 1 (mark). Biii de START i de STOP ncadreaz fiecare caracter transmis; caracterul transmis ntre aceti doi bii reprezint un cadru de date. Un asemenea cadru reprezint informaia digital de baz ntr-un sistem de comunicaie serial. n cazul comunicaiei asincrone, intervalul de timp ntre transmisia a dou caractere succesi ve este variabil, pe durata

65

Laborator 4 Comunicaia serial acestui interval linia de comunicaie fiind n starea 1 logic. Acest mod de comunicaie este numit i start-stop. Sincronizarea la nivel de bit se realizeaz cu ajutorul semnalelor de ceas locale cu aceeai frecven. Atunci cnd receptorul detecteaz nceputul unui caracter indicat prin bitul de START, pornete un oscilator de ceas local, care permite eantionarea corect a biilor individuali ai caracterului. Eantionarea biilor se realizeaz aproximativ la mijlocul intervalului corespunztor fiecrui bit. Figura 4.2 ilustreaz transmisia caracterului cu codul ASCII 0x61. Dup bitul de START, avnd durata T corespunztoare unui bit, transmisia caracterului ncepe cu bitul cel mai puin semnificativ b0. Dup transmisia bitului cel mai semnificativ b7, se transmite un bit de paritate p; n acest exemplu, paritatea este impar. Bitul de par itate este opional, iar n cazul n care se adaug la caracterul transmis, paritatea poate fi selectat pentru a fi par sau impar. Exist i posibilitatea ca bitul de paritate s fie setat la 0 sau 1, indiferent de paritatea efectiv a caracterului. n exemplul ilustrat, la sfritul caracterului se transmit doi bii de STOP s1 i s2, dup care linia rmne n starea 1 logic un timp nedefinit. Acest timp corespunde unui interval de pauz.
1 1 b0 0 T Pauz START 1 bit Transmisie Caracter Cod ASCII pentru a (61h) Paritate STOP 2 bii Pauz b1 b2 b3 b4 b5 b6 b7 p s1 s2 0 0 0 0 1 1 0 0

Figura 4.2 Comunicaia asincron n cazul comunicaiei asincrone, sincronizarea la nivel de bit este asigurat numai pe durata transmisiei efective a fiecrui caracter. O asemenea comunicaie este orientat pe caractere individuale i are dezavantajul c necesit informaii suplimentare n proporie de cel puin 25% pentru identificarea fiecrui caracter. 4.3.2 COMUNICAIA SINCRON

n cazul comunicaiei sincrone, un cadru nu conine un singur caracter, ci un bloc de caractere sau un mesaj. Sincronizarea la nivel de bit trebuie asigurat permanent, nu numai n timpul transmisiei propriu-zise, ci i n intervalele de pauz. De aceea, timpul este divizat n mod continuu n intervale elementare la transmitor, intervale care trebuie regsite apoi la receptor. Aceasta pune anumite probleme. Dac ceasul local al receptorului are o frecven care difer ntr-o anumit msur de frecvena transmitorului, vor apare erori la recunoaterea caracterelor, din cauza lungimii blocurilor de caractere. Pentru a se evita asemenea erori, ceasul receptorului trebuie resincronizat frecvent cu cel al transmitorului. Aceasta se poate realiza dac se asigur c exist suficiente tranziii de la 1 la 0 i de la 0 la 1 n mesajul transmis. Dac datele de transmis constau din iruri lungi de 1 sau de 0, trebuie inserate tranziii suficiente pentru resincronizarea ceasurilor. Asemenea tehnici sunt dificil de implementat, astfel nct se utilizeaz de obicei o tehnic numit comunicaie asincron sincronizat (numit n mod simplu comunicaie sincron). Acest tip de comunicaie este caracterizat de faptul c, dei mesajul este transmis ntr-un mod sincron, nu exist o sincronizare n intervalul de timp dintre dou mesaje. Informaia este 66

Laborator 4 Comunicaia serial transmis sub forma unor blocuri de caractere sau a unor bii succesivi, fr bii de START i STOP. Pentru ajustarea oscilatorului local la nceputul unui mesaj, fiecare mesaj este precedat de un numr de caractere speciale de sincronizare, de exemplu, caracterul SYN (0x16). Pentru meninerea sincronizrii, se pot insera caractere de sincronizare suplimentare n mesajul transmis, la anumite intervale de timp. La receptor exist trei nivele de sincronizare: 4.3.3 Sincronizare la nivel de bit, utiliznd circuite cu calare de faz PLL (PhaseLocked Loop), pe baza tranziiilor existente n semnalul recepionat; Sincronizare la nivel de caracter, asigurat prin recunoaterea anumitor caractere de sincronizare; Sincronizare la nivel de bloc sau mesaj, care depinde de protocolul de date utilizat. STANDARDUL RS-232C

Specificaiile electrice ale portului serial au fost definite n standardul RS-232C (Reference Standard No. 232, Revision C), elaborat n anul 1969 de ctre Comitetul de Standarde din SUA, cunoscut azi sub numele de Asociaia Industriei Electronice (EIA Electronic Industries Association). Standardul a fost elaborat pentru comunicaia digital ntre un calculator i un terminal aflat la distan sau ntre dou terminale fr utilizarea unui calculator. Terminalele erau conectate prin linii telefonice, astfel nct erau necesare modem-uri la ambele capete ale liniei de comunicaie. Standardul RS-232C a suferit diferite modificri, fiind elaborate mai multe revizii ale acestuia. De exemplu, n anul 1987 a fost elaborat o nou revizie a standardului, numit EIA RS-232D. n anul 1991, EIA i Asociaia Industriei de Telecomunicaii (TIA Telecommunications Industry Association) au elaborat revizia E a standardului (EIA/TIA RS-232E). Revizia curent este EIA RS-232F, publicat n anul 1997. Totui, indiferent de revizia acestuia, standardul este numit de cele mai multe ori RS-232C sau RS-232. n Europa, versiunea echivalent standardului RS-232C este V.24, elaborat de comitetul CCITT (Comit Consultatif International pour Tlphonie et Tlgraphie). Denumirea acestui comitet a fost schimbat la nceputul anilor 1990 n International Telecommunications Union (ITU). Ambele standarde specific semnalele utilizate pentru comunicaie, nivelele de tensiune, protocolul utilizat pentru controlul fluxului de date i conectorii interfeei seriale. Standardul RS-232C definete att o comunicaie asincron, ct i una sincron. Nu sunt definite detalii cum sunt codificarea caracterelor (ASCII, Baudot, EBCDIC), ncadrarea caracterelor (lungimea caracterului, numrul biilor de stop, paritatea) i nici vitezele de comunicaie, dei standardul este destinat pentru viteze mai mici de 20.000 bii/s. Echipamentele actuale permit ns viteze superioare de comunicaie, utiliznd nivele de tensiune care sunt compatibile cu cele specificate de standard. Porturile seriale ale calculatoarelor permit, de obicei, selecia uneia din urmtoarele viteze de comunicaie: 150; 300; 600; 1.200; 2.400; 4.800; 9.600; 19.200; 38.400; 57.600; 115.200 bii/s. O legtur de baz RS-232C necesit doar trei conexiuni: una pentru transmisie, una pentru recepie i una pentru masa electric comun. Cele mai multe legturi seriale utilizeaz ns i semnale pentru controlul fluxului de date. Spre deosebire de alte tipuri de comunicaie serial care sunt difereniale, comunicaia RS232C este una obinuit, utiliznd cte un fir pentru fiecare semnal. Dei astfel se simplific 67

Laborator 4 Comunicaia serial circuitele necesare interfeei, n acelai timp se reduce i distana maxim de comunicaie n cazul unei legturi directe, fr utilizarea modem-urilor. Standardul RS-232C specific o distan maxim de 15 m. Distana poate fi mrit dac se utilizeaz viteze de comunicaie mai reduse. Tensiunile electrice specificate de standardul RS-232C sunt urmtoarele: Valoarea logic 0 corespunde unei tensiuni pozitive ntre +3 V i +25 V; Valoarea logic 1 corespunde unei tensiuni negative ntre 3 V i 25 V.

4.4

CONTROLUL FLUXULUI DE DATE

Pentru a fi posibil comunicaia ntre dispozitive cu viteze diferite, proiectanii interfeei seriale au prevzut semnale speciale pentru controlul fluxului de date. Aceste semnale permit unui echipament oprirea i apoi reluarea transmiterii datelor la cererea echipamentului de la cellalt capt al liniei de comunicaie serial. Pe lng aceast metod hardware pentru controlul fluxului de date, exist i o metod software, bazat pe transmiterea unor caractere speciale ntre cele dou echipamente. Atunci cnd echipamentul receptor (de exemplu, o imprimant) nu mai poate primi date deoarece bufferul acestuia este plin, transmite un anumit caracter de control echipamentului transmitor (de exemplu, calculatorului). Atunci cnd echipamentul receptor poate primi noi date, transmite un alt caracter de control care semnaleaz echipamentului transmitor c poate relua transmiterea datelor. De obicei, metoda de control care va fi utilizat de calculator poate fi selectat prin intermediul driver-ului software al controlerului serial. Unele programe pot utiliza n mod implicit o anumit metod. n cazul perifericelor, metoda de control poate fi selectat fie prin program, fie printr-un comutator. Este important s se utilizeze aceeai metod de control att pentru calculator, ct i pentru periferic pentru a evita pierderile de date. 4.4.1 METODA DE CONTROL HARDWARE

Metoda de control hardware presupune utilizarea unui protocol de comunicaie cu ajutorul semnalelor de control ale interfeei seriale. Protocolul utilizat se bazeaz pe comunicaia serial prin intermediul unor modem-uri i a unei linii telefonice, pentru care a fost elaborat interfaa serial original. Acest protocol implic stabilirea conexiunii ntre dou modem-uri prin linia telefonic i meninerea fluxului de date dintre acestea ct timp conexiunea este activ. Etapele acestui protocol sunt descrise n continuare. ntr-o form simplificat, acest protocol este utilizat i n cazul comunicaiei seriale directe ntre dou echipamente, fr utilizarea unor modem-uri i a unei linii telefonice. 1. Atunci cnd un modem aflat la distan dorete stabilirea conexiunii cu modemul local, transmite semnalul de apel pe linia telefonic. Acest semnal este detectat de ctre modemul local, care activeaz semnalul RI pentru a informa calculatorul local asupra existenei unui apel telefonic. La detectarea activrii semnalului RI, pe calculatorul local se lanseaz n execuie un program de comunicaie. Acest program indic disponibilitatea calculatorului de a ncepe comunicaia prin activarea semnalului DTR. Atunci cnd modemul local sesizeaz faptul c terminalul de date (calculatorul) este pregtit, rspunde la apelul telefonic i ateapt activarea semnalului purttor de ctre modemul aflat la distan. Atunci cnd modemul local detecteaz semnalul purttor, activeaz semnalul CD. Modemul local negociaz cu modemul aflat la distan o conexiune cu anumii parametri. De exemplu, cele dou modem-uri pot determina viteza optim de 68

2.

3.

4.

Laborator 4 Comunicaia serial comunicaie n funcie de calitatea legturii telefonice. Dup aceast negociere, modemul local activeaz semnalul DSR. La sesizarea activrii semnalului DSR, programul de pe calculatorul local activeaz semnalul RTS pentru a indica modemului c poate transmite date ctre calculator. Atunci cnd modemul sesizeaz activarea semnalului RTS, activeaz semnalul CTS pentru a indica faptul c este pregtit pentru recepia datelor de la calculator. n continuare, datele sunt transferate n ambele sensuri ntre echipamentele aflate la distan, pe liniile TD i RD. Deoarece viteza liniei telefonice este mai redus dect cea a legturii dintre calculator i modemul local, bufferul modemului se va umple. Modemul local solicit calculatorului oprirea transmiterii datelor prin dezactivarea semnalului CTS. La golirea bufferului, modemul reactiveaz semnalul CTS. n cazul n care calculatorul nu mai poate primi date de la modem, dezactiveaz semnalul RTS. Atunci cnd calculatorul poate primi din nou date de la modem, reactiveaz semnalul RTS. La ncheierea sesiunii de comunicaie, semnalul purttor este dezactivat, iar modemul local dezactiveaz semnalele CD, CTS i DSR. Atunci cnd sesizeaz dezactivarea semnalului CD, calculatorul local dezactiveaz semnalele RTS i DTR. Din protocolul descris mai sus, rezult urmtoarele: Calculatorul trebuie s detecteze activarea semnalelor DSR i CTS nainte de a transmite date ctre modem. Dezactivarea oricruia din aceste semnale va opri, de obicei, fluxul de date de la calculator; Modemul trebuie s detecteze activarea semnalelor DTR i RTS nainte de a transmite date pe lini serial sau ctre calculator. Dezactivarea semnalului DTR va opri transmiterea datelor pe linia serial, iar dezactivarea semnalului RTS va opri transmiterea datelor ctre calculator; Starea semnalului CD nu este interpretat de toate sistemele de comunicaie serial. La anumite sisteme, semnalul CD trebuie s fie activat nainte ca terminalul de date s nceap transmiterea datelor. La alte sisteme, starea semnalului CD este ignorat. METODA DE CONTROL SOFTWARE

5. 6. 7. 8.

9.

10. 11.

4.4.2

Metoda software pentru controlul fluxului de date presupune transmiterea unor caractere de control ntre cele dou echipamente. De exemplu, perifericul va transmite un anumit caracter de control pentru a indica faptul c nu mai poate primi date de la calculator i va transmite un alt caracter de control pentru a indica faptul c transmiterea datelor poate fi reluat de calculator. Exist dou variante ale acestei metode. Prima variant utilizeaz caracterele de control XON/XOFF, iar a doua variant utilizeaz caracterele de control ETX/ACK. n cazul utilizrii variantei XON/XOFF, perifericul transmite caracterul XOFF pentru a indica faptul c bufferul su este plin i transmiterea datelor trebuie oprit de calculator. Acest caracter mai este denumit DC1 (Device Control 1) i are codul ASCII 0x13, fiind echivalent cu caracterul Ctrl-S. Caracterul Ctrl-S poate fi introdus i de utilizator la anumite programe de comunicaie pentru a opri transmiterea datelor de ctre un echipament cu care este conectat calculatorul. Atunci cnd perifericul este pregtit pentru a primi noi date, transmite calculatorului caracterul XON. Acest 69

Laborator 4 Comunicaia serial caracter mai este denumit DC3 (Device Control 3) i are codul ASCII 0x11, fiind echivalent cu caracterul Ctrl-Q. La anumite programe de comunicaie, introducerea caracterului Ctrl-Q anuleaz efectul caracterului Ctrl-S. n cazul utilizrii variantei ETX/ACK, transmiterea caracterului ETX (End of TeXt) de ctre periferic indic faptul c transmiterea datelor trebuie oprit de calculator. Acest caracter are codul ASCII 0x03 i este echivalent cu caracterul Ctrl-C. Transmiterea caracterului ACK (ACKnowledge) indic posibilitatea relurii transmiterii datelor de ctre calculator. Acest caracter are codul ASCII 0x06 i este echivalent cu caracterul Ctrl-F.

4.5

CONECTORI

Porturile seriale pot utiliza unul din dou tipuri de conectori. Conectorul DB-25 cu 25 de pini a fost utilizat la calculatoarele din generaiile anterioare. La calculatoarele mai noi se utilizeaz conectorul DB-9 cu 9 pini. Pentru porturile seriale ale calculatoarelor se utilizeaz conectori tat, iar pentru porturile seriale ale echipamentelor periferice se utilizeaz conectori mam. Conectorul DB-25 al portului serial are o form similar cu conectorul DB-25 al portului paralel. Portul serial care utilizeaz un conector DB-25 se poate deosebi de portul paralel prin faptul c pentru portul serial se utilizeaz un conector tat, n timp ce pentru portul paralel se utilizeaz un conector mam. Figura 4.3 ilustreaz conectorul DB-25 al portului serial.

Figura 4.3 Conectorul DB-25 Din cele 25 de semnale ale conectorului DB-25, se utilizeaz cel mult 10 semnale pentru o conexiune serial obinuit. Tabel 4.1 indic numele acestor semnale i asignarea lor la pinii conectorului DB-25. Pin 1 2 3 4 5 6 7 8 20 22 Semnal PG TD RD RTS CTS DSR SG CD DTR RI Semnificaie In Out

Protective Ground Transmit Data Receive Data Request To Send Clear To Send Data Set Ready Signal Ground Carrier Detect Data Terminal Ready Ring Indicator Tabel 4.1 Pentru a se reduce spaiul ocupat de conectorul portului serial, conectorul DB-25 a fost nlocuit cu un conector de dimensiuni mai reduse, conectorul cu 9 pini DB-9 (Figura 4.4).

70

Laborator 4 Comunicaia serial

Figura 4.4 Conectorul DB-9

4.6

CABLURI

Exist mai multe variante de cabluri care se pot utiliza pentru comunicaia serial. Pentru viteze de comunicaie reduse i lungimi scurte, se pot utiliza cabluri obinuite, care nu sunt ecranate. Pentru a reduce interferenele cu alte echipamente, trebuie utilizate cabluri ecranate care conin un nveli sub forma unei folii de aluminiu. n mod ideal, ecranul cablului trebuie conectat la masa de protecie a conectorului, dac acesta este de tip DB-25. Conectorul DB-9 nu conine un pin pentru masa de protecie. n cazul utilizrii conectorilor de acest tip, ecranul cablului se poate conecta la masa electric. Observaii: n cazul cablului serial care utilizeaz conectori DB-25, masa electric sau masa de semnal SG (Signal Ground) este separat de masa mecanic sau masa de protecie PG (Protective Ground). Masa de protecie este conectat direct la carcasa conectorului (i a echipamentului), avnd un rol de protecie. Prin realizarea acestei conexiuni, carcasele metalice ale celor dou echipamente conectate prin cablul serial se vor afla la acelai potenial, evitndu-se formarea unor diferene de tensiune ntre cele dou echipamente, tensiuni care pot fi periculoase pentru acestea. Deseori, conexiunea mesei de protecie lipsete din cablurile seriale. Masa de protecie PG nu trebuie conectat niciodat la masa electric SG. Semnalele interfeei seriale au fost prevzute n scopul conectrii unui echipament terminal de date (ETD) la un echipament pentru comunicaia de date (ECD). Atunci cnd se conecteaz dou asemenea echipamente, de exemplu, un calculator cu un modem, care dispun de conectori de acelai tip (de exemplu, DB-25), este necesar un cablu care conecteaz pinii cu acelai numr ai conectorilor de la cele dou capete. Acesta este un cablu direct. Dac se conecteaz dou echipamente cu conectori diferii, este necesar un cablu adaptor. Dac se conecteaz dou echipamente terminale de date, de exemplu, dou calculatoare, datele transmise pe pinul TD al unui echipament trebuie recepionate pe pinul RD al celuilalt echipament. De aceea, conexiunile acestor pini trebuie inversate la cele dou capete ale cablului; un asemenea cablu este numit cablu inversor.

71

Laborator 4 Comunicaia serial

4.7

MODULUL USART

Clock Generator UBRR[H:L] OSC

BAUD RATE GENERATOR

SYNC LOGIC

PIN CONTROL

XCK

Transmitter UDR (Transmit) PARITY GENERATOR TX CONTROL

DATABUS

TRANSMIT SHIFT REGISTER

PIN CONTROL

TxD

Receiver CLOCK RECOVERY RX CONTROL

RECEIVE SHIFT REGISTER

DATA RECOVERY

PIN CONTROL

RxD

UDR (Receive)

PARITY CHECKER

UCSRA

UCSRB

UCSRC

Figura 4.3 USART Block Diagram ATMega16 dispune de trei subsisteme pentru comunicaia serial: 1. 2. 3. Universal Synchronous & Asynchronous Serial Receiver & Transmitter (USART); Serial Peripheral Interface (SPI); Two-wire Serial Interface (TWI).

72

Laborator 4 Comunicaia serial 4.7.1 MODULUL USART

Componenta principal a unui port serial este un circuit UART ( Universal Asynchronous Receiver/Transmitter). Acest circuit realizeaz conversia datelor paralele de la calculator n formatul necesar pentru transmisia serial i conversia datelor seriale recepionate n formatul paralel utilizat de calculator. Circuitul adaug bitul de start, bitul de stop i bitul de paritate la datele seriale transmise i detecteaz aceti bii n cadrul datelor seriale recepionate. Modulul UART (Universal Asinchronous Receiver Transmiter) efectueaz recepia/transmisia datelor de la/ctre un dispozitiv periferic cu acces serie. Principalele caracteristici sunt: Funcionare full-duplex complet att n modul sincron ct i n mod asincron; Posed generator de rat de baud propriu de rezoluie mare; Formate de date seriale diverse; Detecteaz automat erorile de transmisie; Execut comunicaii de tip multiprocesor; Modulul execut conversia serie/paralel a datelor la recepie, respectiv conversia paralel/serie la transmisie. Transmiterea datelor este iniializat prin scrierea datelor care trebuie transmise n registrul UDR (UART Data Register). Datele sunt transferate de la UDR la registrul Transmit Shift cnd: Un nou caracter este scris n UDR i caracterul precedent a fost deja transferat. Registrul de deplasare este ncrcat imediat; Un nou caracter este scris n UDR nainte ca un caracter precedent s fi fost transferat complet. Registul de deplasare este ncrcat dup ce prima operaie a fost finalizat. 4.7.2 INTERFA A SPI

Interfaa de comunicaie SPI (Serial Peripheral Interface) asigur transferul rapid sincron de date ntre microcontroler i dispozitivele periferice sau cu alte microcontrolere AVR. 4.7.3 INTERFA A TWI

Interfaa TWI (Two Wire Interface) implementeaz un protocol de comunicaie pe dou fire permind interconectarea a pn la 128 de dispozitive diferite. Interfaa folosete dou linii bidirecionale, una pentru tact (SCL) i una pentru date (SDA). Toate dispozitivele conectat e la acest bus au propria adres.

73

Laborator 4 Comunicaia serial

4.8

REGITRII USART

Pentru a comunica via USART trebuie s fie setate anumite valori pentru regitrii USART, informaii care se pot obine din datasheet-ul microcontroler-ului. UDR : USART Data Register : conine data receptat sau transmis; UCSRA / USCRB / UCSRC : USART Control and Status Registers : folosit pentru a configura USART-ul i a stoca statusul acestuia; UBRRH / UBRRL : USART Baud Rate Register : stocheaz valoarea corespunztoare baud rate-ului folosit. 4.8.1 USCRA: USART CONTROL AND STATUS REGISTER A:
Bit

7
RXC

6
TXC
R/W 0

5
UDRE
R 1

4
FE
R 0

3
DOR
R 0

2
PE
R 0

1
U2X
R/W 0

0
MPCM
R/W 0

UCSRA

Read/Write Valoare iniial

R 0

RXC : Este setat cnd USART a terminat de primit date. TXC : Este setat cnd USART a terminat de transmis un byte ctre cellalt dispozitiv. 4.8.2 USCRB: USART CONTROL AND STATUS REGISTER B:
Bit

4
RXEN
R/W 0

3
TXEN
R/W 0

2
UCSZ2
R/W 0

1
RXB8
R 0

0
TXB8
R/W 0

RXCIE TXCIE UDRIE Read/Write Valoare iniial


R/W 0 R/W 0 R/W 0

UCSRB

RXCIE: Receive Complete Interrupt Enable dac este setat pe 1, ntreruperea pe flagul RXC este activat. TXCIE: Transmit Complete Interrupt Enable dac este setat pe 1, ntreruperea pe flagul TXC este activat. RXEN: Receiver Enable pentru a activa recepia trebuie setat pe 1. TXEN: Transmitter Enable pentru a activa transmisia trebuie setat pe 1. UCSZ2: USART Character Size este utilizat pentru a stabili numrul de bii per pachet.

74

Laborator 4 Comunicaia serial 4.8.3 USCRC: USART CONTROL AND STATUS REGISTER C:
Bit

4
UPM0
R/W 0

0
UCSRC

URSEL UMSEL UPM1 Read/Write Valoare iniial


R/W 1 R/W 0 R/W 0

USBS UCSZ1 UCSZ0 UCPOL


R/W 0 R/W 1 R/W 1 R/W 0

UMSEL: USART Mode Select acest bit selecteaz ntre modurile sincron i asincron. UMSEL 0 1 Mod Asincron Sincron

UPM1:0: Parity Mode Aceti bii activeaz i seteaz tipul generrii i verificrii paritii. Dac este activat, transmitorul va genera automat i va trimite paritatea biilor din dat. Receptorul va genera o valoare de paritate pentru datele primite i o va compara cu setarea UPM0. Dac se detecteaz o nepotrivire, va fi setat flagul PE din UCSRA. UPM1 0 0 1 1 date. USBS 0 1 Bii de stop 1 BIT 2 BIT UPM10 0 1 0 1 Modul paritii Dezactivat Rezervat Activat, paritate par Activat, paritate impar

USBS: USART Stop Bit Select Acest bit selecteaz numrul de bii de stop din transferul de

UCSZ: USART Character size Aceti trei bii (unul n UCSRB) selecteaz numrul de bii din dat. ntotdeauna vom opta pentru 8 bii, ntruct acesta este standardul. UCSZ2 UCSZ1 UCSZ0 Dimensiune 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 5Bit 6Bit 7Bit 8Bit Rezervat Rezervat Rezervat 9Bit 75

Laborator 4 Comunicaia serial 4.8.4 UBRR: USART BAUD RATE REGISTER

Acest registru are o dimensiune de 16 bii, aadar UBRRH este High Byte i UBRRL Low byte. Acest registru este folosit de ctre USART pentru a genera baud rate (de exemplu 9600Bps). Valoarea UBRR este calculat n funcie de urmtoarea formul: Operating Mode
Asynchronous Normal Mode (U2X = 0) Asynchronous Double Speed Mode (U2X = 1) Synchronous Master Mode

Equition for calculating Baud Rate

Equition for calculating UBRR value

4.9
Enun

APLICAII
S se transmit prin comunicaie serial un ir dac se primete litera s sau S.

Codul surs
usart.h #ifndef __USART__ #define __USART__ #include <inavr.h> #include <iom16.h> #define F_OSC 4000000 #define BAUD 19200 #define BAUD_RATE (F_OSC/16/BAUD - 1) void USART_initialize(unsigned short int baud_rate); void USART_transmit(unsigned char data); unsigned char USART_Receive( void ); //#pragma vector = USART_RXC_vect //__interrupt void interrupt_routine_USART_RXC(void); #endif

usart.c #include "usart.h" void USART_initialize(unsigned short int baud_rate)

76

Laborator 4 Comunicaia serial


{ /* seteaz baud rate */ UBRRH = (unsigned char)(baud_rate >> 8); UBRRL = (unsigned char)(baud_rate & 0xFF); UCSRB = (1 << RXEN) | (1 << TXEN); /* activeaz transmisia i recepia la ieire */ /* seteaz pinul TXD: ieire */ DDRD |= (1 << PD1); /* seteaz pinul RXD: intrare */ DDRD &= ~(1 << PD0); /* activeaz ntreruperea */ //UCSRB |= (1 << RXCIE); } void USART_transmit(unsigned char data) { /* ateapt pn ce se termin de transmis toate datele i dup trece la urmtoarele informaii */ while (!( UCSRA & (1 << UDRE))) { ; } UDR = data; } unsigned char USART_Receive( void ) { /* Ateapt recepionarea datelor */ while ( !(UCSRA & (1<<RXC)) ) { ; } /* Preia i returneaz datele recepionate din buffer */ return UDR; }

main.c #include"usart.h" void main( void ) { unsigned char string[]="Hello world!", aux; unsigned int i=0; USART_initialize(BAUD_RATE); while(1) {

77

Laborator 4 Comunicaia serial


aux=USART_Receive(); i=0; if(aux=='s'||aux=='S') { while(string[i]!='\0') { USART_transmit(string[i]); i++; } } } }

78

Laborator 5 Funcii IAR. Funcia Printf.

5 Funcii IAR. Funcia Printf.


5.1
5.1.1

INTRODUCERE
PERSPECTIV ASUPRA M EDIULUI DE DEZVOLTARE IAR Exist dou limbaje de programare de nivel nalt disponibile cu compilatorul AVRIAR C/C++ : C, cel mai rspndit limbaj de nivel nalt de programare folosit n industria de sisteme embedded. Folosind compilatorul AVRIAR putei construi aplicaii de sine stttoare, ce urmeaz standardul ISO 9899:1990. Acest standard este cunoscut ca ANSI C; C++, un limbaj modern orientat obiect, cu o bibliotec ce dispune de toate caracteristicile necesare pentru o programare modular. Sistemele IAR suport dou nivele ale limbajului C++:

1.

2.

Embedded C++ (EC++), un subset al standardului de programare C++, care este destinat programrii sistemelor embedded. Este definit de un consoriu industrial, Embedded C++ Technical Comitee; IAR Extended EC++, cu caracteristici suplimentare cum ar fi suportul total pentru template-uri, suportul pentru namespace-uri, operatorii de cast, precum i Standard Template Library (STL).

Fiecare din cele dou limbaje de programare suportate pot fi folosite fie ntr-un mod strict, fie n unul mai puin strict, fie n unul mai puin strict cu extensiile IAR activate. Modul strict ader la standard, pe cnd cellalt mod permite anumite deviaii de la acest standard. Este de asemenea posibil ca anumite pri ale aplicaiei s fie implementate n limbaj de asamblare. 5.1.2 MEDIUL DE RULARE

Pentru crearea mediului de rulare este necesar alegerea unei biblioteci de rulare i setarea opiunilor de bibliotec. Exist dou seturi de biblioteci de rulare puse la dispoziie: IAR DLIB Library, care suport ISO/ANSI C i C++. Aceast bibliotec suport de asemenea numere n virgul mobil n format IEEE 754 i poate fi configurat pentru a include diferite nivele de suport pentru locale, descriptori de fiier, caractere multibyte, etc. IAR CLIB Library, este o bibliotec din categoria uoar, care nu este compilat n totalitate cu ISO/ANSI C. De asemenea nu ofer suport deplin pentru numere n virgul mobil n format IEEE 754 sau suport pentru Embedded C++ (aceast librrie este folosit implicit). Librria de rulare aleas poate fi una dintre librriile prebuilt, sau o librrie pe care ai customizat-o sau ai construit-o chiar dumneavoastr. IAR Embedded Workbench IDE ofer template-uri pentru librriile de proiect pentru ambele librrii, care se pot folosi pentru construirea 79

Laborator 5 Funcii IAR. Funcia Printf. propriilor tipuri de librrii. Acest lucru ofer control deplin asupra mediului de rulare. Dac proiectul conine doar cod surs n assembler nu este necesar alegerea unei librrii de rulare. 5.1.2.1 Alegerea unei biblioteci de rulare n IAR Embedded Workbench Pentru alegerea unei librrii, se alege Project Options, click pe tab-ul Library Configuration din categoria General Options. Se alege tipul de librrie adecvat din meniul drop-down. Pentru DLIB library exist dou configurri diferite Normal i Full, ce includ diferite nivele de suport pentru locale, descriptori de fiier, caractere multibyte, etc. 5.1.2.2 Alegerea unei biblioteci de rulare de la linia de comand Se folosesc urmtoarele opiuni ale liniei de comand pentru specificarea bibliotecii i fiierele de dependen: Linia de comand -I\avr\inc I\avr\inc\{clib|dlib} libraryfile.r90 --dlib_config C:\...\configfile.h Descriere Specific calea pentru includere Specific calea pentru fiiere specifice bibliotecii. Utilizai clib// dlib depinznd de ce biblioteca folosii. Specific fiierul obiect. Specific fiierul de configurare pentru biblioteca(doar pentru biblioteca DLIB).

5.1.2.3 Setarea opiunilor bibliotecii i a mediului de rulare Se pot seta anumite opiuni pentru a reduce dimensiunile bibliotecii i a mediului de rulare: Funciile de intrare/ieire (cel mai des utilizate sunt scanf i printf); Dimensiunea stivei i heap-ului. 5.1.3 MEDIUL RUNTIME DLIB

Descrie mediul de execuie n care o cerere se execut. n special, se refer la biblioteca runtime DLIB i modul n care se poate modifica, la opiunile de setare a modulelor implicite ale bibliotecii, sau construirea bibliotecii proprii pentru a putea fi optimizat aplicaia. Acesta se refer att la iniializarea sistemului, ct i la funcionarea sistemului; modul n care o aplicaie poate controla ceea ce se ntmpl nainte de funcia principal. 5.1.3.1 Introducere n mediul Runtime Mediul de rulare (IAR DLIB) este mediul n care cerererile se execut. Acesta depinde de destinaia hardware i software. IAR DLIB poate fi folosit mpreun cu IAR C-SPY Debugger. Aceast seciune ofer o privire de ansamblu asupra: Mediului de execuie i a componentelor sale; Biblioteca de selecie. 80

Laborator 5 Funcii IAR. Funcia Printf. 5.1.3.2 Funcionalitatea mediului Runtime Mediul de rulare (RTE) sprijin ISO/ANSI C i C++, inclusiv biblioteca standard de abloane. Mediul de rulare este format din runtime library, care conine funciile definite de aceste standarde, i includ fiiere care definesc biblioteca interfa. Biblioteca Runtime este disponibil att n biblioteci precompilate, ct i ca fiiere surs. Mediul de rulare amintit mai sus, cuprinde: Suport pentru caracteristici hardware; Acces direct la operaiunile de procesor low-level prin intermediul funciilor intrinseci; Registrele de unitate i definiiile incluse n fiiere; Suportul compilatorului special pentru accesarea irurilor de caractere n memoria flash ; Suportul mediului de runtime, care este, cod de intrare, cod de ieire i interfaa low-level la unele funcii de bibliotec.

Unele pri, cum ar fi codul de intrare i de ieire i mrimea heap-urilor trebuie s fie adaptate att pentru hardware-ul specificat, ct i pentru cerinele aplicaiei. 5.1.3.3 Selectarea bibliotecii Pentru a configura ct mai eficient mediul de rulare al codului, trebuie s fie cunoscute cerinele hardware ale aplicaiei. IAR Embedded Workbench vine cu un set de biblioteci runtime precompilate. Pentru a se obine mediul de execuie necesar, sunt necesare urmtoarele: Setarea opiunilor de bibliotec, de exemplu, pentru alegerea lui scanf i printf, i pentru a preciza dimensiunea stivei i heap-ului; Setarea funciilor bibliotec, de exemplu cstartup.s90, cu propria versiune; Alegerea nivelului de sprijin pentru anumite funcionaliti a bibliotecii standard, de exemplu: locale, descriptori de fiiere i multibytes, prin alegerea unui library configuration: normal sau complet.

n plus, se pot face, de asemenea modificri propriei biblioteci, fapt care necesit reconstruirea bibliotecii. Acest lucru permite obinerea controlului deplin a mediului runtime. Not: Aplicaia proiectului trebuie s poat localiza biblioteca, inclusiv fiier ele de configurare ale bibliotecii. 5.1.3.4 Situaii care necesit construirea bibliotecii Construirea unei biblioteci proprii este un proces complex. Prin urmare, ar trebui s se ia n considerare doar ceea ce este cu adevrat necesar. Propria bibliotec se construiete: Atunci cnd nu exist nici o bibliotec precompilat pentru combinaia necesar de opiuni a compilatorului sau a suportului hardware; Pentru a defini configuraia proprie a bibliotecii, cu suport pentru locale, descriptori de fiier, caractere multioctet, etc. 81

Laborator 5 Funcii IAR. Funcia Printf. 5.1.3.5 Configurarea bibliotecii Este posibil configurarea nivelului de sprijin pentru: locale, descriptori de fiiere,multibytes. Biblioteca de configuraie runtime este definit library configuration file. Aceasta conine informaii despre ceea ce nseamn funcionalitatea unei pri a mediului de rulare. Fiierul de configurare este utilizat pentru realizarea unei biblioteci runtime, precum i realizarea antetului, folosit atunci cnd se face compilarea aplicaiei. Sunt disponibile urmtoarele configuraii bibliotec DLIB: Biblioteca de configurare Normal DLIB Full DLIB Descriere Nu conine: interfa local, C locale, suport de descriptor de fiier, caractere multibyte n printf i scanf, hex floats in strtod. Conine interfa local complet, C locale, suport descriptor de fiier, caractere multibyte n printf i scanf i hex floats n strtod. Tabel 5.1 Configuraii bibliotec n plus, fa de aceste configuraii, se pot defini configuraii proprii, ceea ce nseamn c trebuie modificat fiierul de configurare existent. Deci, fiierul de configurare a bibliotecii descrie modul n care o bibliotec a fost construit, i, prin urmare nu poate fi schimbat dect dac se reconstruiete biblioteca. Bibliotecile precompilate sunt bazate pe configuraii implicite. Exist, de asemenea, template-uri ale proiectului bibliotec gata fcute care se pot utiliza, pentru reconstruirea bibliotecii runtime. 5.1.3.6 Suportul debug n mediul bibliotecii Putei oferi bibliotecii diferite nivele de depanare-suport de baz, runtime i depanare I/O. Urmtorul tabel descrie diferite niveluri a suportului de depanare: Opiune linker n IAR Embedded Workbench Informaii C-SPY Cu module control funcionrii Cu module emulare I/O de a de

Suport de depanare Depanare de baz Depanarea funcionrii Depanare I/O

Comanda linker optiune de linie -Fubrof -r

Descriere

-rt

Asisten pentru depanare C-SPION fr nici un sprijin de funcionare La fel ca-Fubrof, dar, de asemenea, include suport debugger pentru manipularea programului La fel ca r, doar c include suport pentru manipulare I/O (stdin i stdout sunt redirecionate la Terminalul CSPY)

Tabel 5.2 Niveluri de depanare suport in bibliotecile runtime 82

Laborator 5 Funcii IAR. Funcia Printf. Dac se construiete aplicaia proiectului cu opiunile XLINK With runtime control modules sau With I/O emulation modules, anumite funcii din bibliotec vor fi nlocuite cu funcii care comunic cu C-SPY IAR Debugger. Pentru a seta opiunile linker pentru depanarea suport n IAR Embedded Workbench, se alege Project>Options i categoria Linker. Pe pagina Output, se selecteaz opiunea corespunztoare Format. 5.1.3.7 Utilizarea bibliotecii precompilate Bibliotecile precompilate runtime sunt configurate pentru diferite combina ii de caracteristici cum ar fi: Tipul de bibliotec; Opiunea procesor (-v); Opiunea modelului de memorie (--memory_model); Opiune de baz AVR (--enhanced_core); Mici opiuni ale memoriei flash (--64k_flash); Opiune 64-bit doubles (--64bit_doubles); Biblioteca de configurare-normal sau complet.

Pentru AVR IAR C/C++ Compiler i configuraia bibliotec Normal, exist precompilate biblioteci runtime pentru toate combinaiile acestor opiuni. Urmtorul tabel prezint numele bibliotecilor i modul n care sunt reflectate setrile utilizate: Fiierul de Biblioteca dlavr-3secsfn.r90 dlavr-3sec64-f.r90 Opiune Generic Procesor -v3 -v3 Opiune Generic Procesor -v3 -v3 Modelul memoriei Small Enhanced core X Small flash X 64-bit doubles -Configurarea bibliotecii Normal

Small

--

Full

Tabel 5.3 Biblioteci precompilate Numele bibliotecilor sunt construite n felul urmtor: <library><target>-<cpu><memory_model>-<enhanced_core>-<small_f lash>-<64-bit_doubles>-<library_configuration>.r90 unde: <library>este dl pentru biblioteca DLIB IAR sau cl pentru biblioteca CLIB IAR (pentru o list de fiiere bibliotec CLIB, a se vedea Runtime environment) <target>este avr <cpu> este o valoare de 0-6, optiunea-v <memory_model> este fie t, e, sau l pentru modelul de memorie respectiv(Tiny, Small, Large) 83

Laborator 5 Funcii IAR. Funcia Printf. <enhanced_core> este CE atunci cnd baza consolidat este folosit. n cazul n care baza consolidat nu este folosit, aceast valoare nu este specificat <small_flash> este SF atunci cnd memoria flash small este disponibil. Cnd memoria flash nu este disponibil, aceast valoare nu este specificat <64-bit_doubles> este de 64 bii cnd se utilizeaz 64 bii doubles. Cnd sunt utilizai 32 de bii doubles, aceast valoare nu este specificat <library_configuration> N=normal sau F=full

Not: Fiierul de configurare al bibliotecii are acelai nume de baz ca biblioteca. 5.1.4 MEDIUL RUNTIME CLIB

Se descrie mediul runtime n care o aplicaie este executat. n particular aceasta acoper biblioteca mediului CLIB runtime i cum se poate optimiza aplicaia. Mediul CLIB descrie sistemul de iniializare i oprire. Acesta prezint cum o aplicaie poate fi controlat i ceea ce se ntmpl nainte de pornirea funciei main, precum i metoda de personalizare a interfeei. n cele din urm, interfaa de runtime C-SPY este inclus. 5.1.4.1 Mediul Runtime Mediul de rulare CLIB include biblioteci standard C. Link-editarea va include numai acele rulri care sunt necesare direct sau indirect de ctre aplicaie. IAR Embedded Workbench vine cu un set de biblioteci de rulare precompilate, care sunt configurate pentru diferite combinaii: Tipul bibliotecii; Opiunile procesorului (-v); Opiunile modelului de memorie (--memory_model); Opiunile consolidate ale nucleului AVR-ului (--enhanced_core); Opiunile memoriei flash mai mici (--64k_flash); Opiunile n dubl precizie pe 64-bii (--64bit_doubles).

Pentru compilatorul AVR IAR C/C++, nseamn c este precompilat biblioteca de rulare pentru diferite combina ii ale acestor opiuni. n tabelul 5.5, este artat numele bibliotecii i cum se reflect asupra setrilor utilizate. Fiierul librrie cl0t.r90 cl1s-64.r90 cl61-ec64.r90 Opiunea procesorului -v0 -v1 -v6 Modelul memoriei Tiny Small Large Baz consolidat --X Small flash ---64-bit doubles -X X

Tabel 5.4 Precompilarea bibliotecilor

84

Laborator 5 Funcii IAR. Funcia Printf. Numele bibliotecii este construit n urmtorul mod: <library><cpu><memory_model>-<enhanced_core>-<small_flash>-<64bit_doubles>.r90 Unde:

5.2

<library> este cl pentru biblioteca IAR CLIB, sau dl pentru biblioteca IAR DLIB; <cpu> este o valoare de la 0 la 6; <memory_model> este t, s, sau l pentru modelele memoriei (Tiny,Small, Large); <enhanced_core> este ec i este folosit atunci cnd se consolideaz nucleele. Cnd consolidarea nucleelor nu este folosit , aceast valoare nu este specificat; <small_flash> este sf cnd memoria flash este disponibil. Cnd memoria flash nu este disponibil, aceast valoare nu este specificat ; <64-bit_doubles> este 64 cnd este utilizat dubla precizie pe 64 bii. Cnd este utilizat dubla precizie pe 32 bii, aceast valoare nu este specificat.

FUNCII
Se gsete o privire de ansamblu la mecanismele de control asupra funciilor.

5.2.1

CUVINTE EXTINSE PENTRU FUNCII Cuvintele cheie care pot fi folosite pentru funcii pot fi mprite n trei categorii:

Cuvinte cheie care pot controla locaia i tipul funciilor. Cuvintele cheie din acest grup trebuie specificate i cnd funciile sunt definite, i cnd funciile sunt declarate: __nearfunc i __farfunc Cuvinte cheie care controleaz tipul funciilor. Cuvintele cheie din acest grup trebuie folosite doar atunci cnd funcia este definit: __interrupt, __task, i __version_1 Cuvinte cheie care controleaz doar funciile definite : __root, __monitor, i __noreturn

Cuvintele cheie care controleaz locaia i tipul funciilor sunt de asemenea denumite type attributes (atribute de tip). De obicei, aceste funcii controleaz aspecte ale funciei vizibile din contextul exterior. Cuvintele cheie care controleaz doar comportamentul funciei i nu afecteaz interfaa funciei, sunt numite object attributes (atribute de obiect). 5.2.2 SINTAXA

Cuvintele cheie extinse sunt menionate nainte de tipul returnat, de exemplu: __interrupt void alpha(void); Cuvintele cheie care sunt atribute de tip trebuie specificate att atunci cnd sunt definite, ct i n declaraie. Atributele de Obiect trebuie s fie specificate doar cnd sunt definite, att timp ct nu afecteaz modul n care funcia este folosit. n plus, fa de regulile prezentate aici pentru a plasa cuvntul cheie direct n cod pot fi folosite directivele #pragma type_attribute i #pragma object_attribute 85

Laborator 5 Funcii IAR. Funcia Printf. pentru specificarea cuvintelor cheie. STOCAREA FUNCIILOR

5.2.3

Exist dou atribute de memorie pentru controlarea stocrii funciilor : __nearfunc i __farfunc. Urmtorul tabel rezum caracteristicile fiecrui atribut de memorie: Atribut de memorie __nearfunc __farfunc Interval de adres 0-0x1FFFE Kbytes) 0-0x7FFFFE Mbytes) (128 (8 Dimensiune pointer 16 bii 24 bii Folosit n opiunea procesor -v0, -v1, -v2, -v3, v4 -v5, -v6

Tabel 5.5 Atribute de memorie pentru funcii Cnd este folosit opiunea v5 sau v6 este posibil ca, pentru anumite funcii, s treac peste atributul __farfunc i n locul su s foloseasc atributul __nearfunc. Atributul de memorie implicit poate fi ignorat prin specificarea explicit a atributului de memorie n declaraia funciei folosind directiva #pragma type_attribute: #pragma type_attribute=__nearfunc void MyFunc(int i) { ... } Este posibil s fie apelat o funcie cu atributul __nearfunc dintr-o funcie __farfunc i viceversa. Doar dimensiunea pointerului la funcie este afectat. Pointerii cu atribute ale funciilor de memorie au restricii n cast-urile implicite i explicite la cast-urile dintre pointeri, i de asemenea la cast-urile dintre pointeri i valori integer. Este posibil plasarea funciilor n segmente, folosind operatorul @ sau directiva #pragma location. FUNCIA MYPRINT

5.2.4

Se va crea o funcie proprie pentru comunicaia pe serial. Prin intermediul acestei funcii, se vor putea trimite pe serial caractere sau numere. Funcia va primi trei parametri dup cum urmeaz: tip semnific tipul argumentului valoare. Poate lua una din urmtoarele valori: 0 - caz n care pe serial se va transmite un numr de tip integer ; 1 - caz n care pe serial se va transmite un numr de tip long long n form hexazecimal; 2 - caz n care pe serial se va transmite un numr de tip double ; 3 - caz n care pe serial se va transmite un ir de caractere. 86

1.

Laborator 5 Funcii IAR. Funcia Printf.

2. 3.

nr_car semnific numrul efectiv de caractere de transmis pe serial, inclusiv semnul - in cazul unui numr; val - reprezint pointer la valoarea efectiv de transmis pe serial. Tipul acestei variabile este void* .

Deci, prototipul funciei este urmtorul: void myprint(unsigned int tip, unsigned int nr_car, void * val) Implementarea acestei funcii: void myprint(unsigned int tip, unsigned int nr_car, void * val) { switch(tip) { case 0: integerTransmit(tip, nr_car, val); break; case 1: hexadecimalTransmit(tip, nr_car, val); break; case 2: doubleTransmit(tip, nr_car, val); break; case 3: characterTransmit(tip, nr_car, val); break; } } //transmiterea unui ntreg pe serial void integerTransmit (unsigned int p1, unsigned int p2, void * p3) { int index=0; char aux[5]; int x=*((int *)(p3)); if(x<0) { USART_transmit('-'); x*=(-1); } while(x!=0) { aux[index]=x%10+'0'; 87

Laborator 5 Funcii IAR. Funcia Printf. index++; x=x/10; } while(p2>0 ) { USART_transmit(aux[index-1]); index--; p2--; } } //transmiterea unui numr hexazecimal pe serial void hexadecimalTransmit (unsigned int p1, unsigned int p2, void * p3) { long long x=*((long long *)(p3)); int index=0; USART_transmit('0'); USART_transmit('x'); while(x!=0) { aux[index]=x&0x0F; if(aux[index]<=9) { aux[index]+='0'; } else { aux[index]=aux[index]+'A'-10; } index++; x>>=4; } while(p2>0 && index>0) { USART_transmit(aux[index-1]); index--; p2--; } } //transmiterea unui numr de tip double pe serial void doubleTransmit(unsigned int p1, unsigned int p2, void * p3) { int index=0; int dataIntreg; double x=*((double *)(p3)); if(x<0) { 88

Laborator 5 Funcii IAR. Funcia Printf. USART_transmit('-'); x*=(-1); } dataIntreg=(int)x; while((int)dataIntreg!=0) { aux[index]=(int)dataIntreg%10+'0'; index++; dataIntreg=dataIntreg/10; } while(index>0 ) { USART_transmit(aux[index-1]); index--; } dataIntreg=(int)x; x=x-dataIntreg; if(x>0) { USART_transmit('.'); } while(x>0 && p2>0) { x=x*10; dataIntreg=(int)x; USART_transmit(dataIntreg+'0'); x=x-dataIntreg; p2--; } }
//transmiterea unui numar de tip float void floatTransmit(unsigned int p1, unsigned int p2, void * p3) { char buff[30]={0}; int j, nrCaract; long long nr; char nrNeg; int i; float floatNr; floatNr=*((float *)p3); nrCaract=0; nr=(long long)floatNr; nrNeg=(nr<0); if (nrNeg) nr*=-1; while(nr!=0)

89

Laborator 5 Funcii IAR. Funcia Printf.


{ j=nr%10; nr=nr/10; buff[nrCaract]=j+'0'; nrCaract++; } if(nrCaract ==0) { buff[0]='0'; nrCaract=1; } if(nrNeg) { buff[nrCaract]='-'; nrCaract++; } for(i=nrCaract-1; i>=0; i--) { USART_transmit(buff[i]); } USART_transmit('.'); if (floatNr<0) floatNr*=-1; for (i=0; i<p2; i++) { floatNr=floatNr-(long long)floatNr; floatNr*=10; nr=(int)floatNr; USART_transmit(nr+'0'); } }

//transmiterea unui ir de caractere pe serial void characterTransmit (unsigned int p1, unsigned int p2, void * p3) { unsigned char *x=(unsigned char *)(p3); int index=p2; while(index!=0) { USART_transmit(x[index]); index--; } } Exemplu de utilizare al acestei funcii: #include"usart.h" #include<iom16.h> #include<inavr.h> 90

Laborator 5 Funcii IAR. Funcia Printf. void main( void ) { USART_initialize(BAUD_RATE); unsigned int tip=2, nr_car=4; double a = -2.13; double *val = &a; USART_transmit(0x0d); USART_transmit(0x0a); myprint(tip, nr_car, val); } Not: Pentru crearea i utilizarea acestei funcii este nevoie de fiierele: usart.h i usart.c.

5.3

CREAREA UNEI BIBLIOTECI N IAR EMBEDDED WORKBENCH

Dup ce am creat proiectul i avem toate fiierele ce vrem s le includem n bibliotec se va naviga ctre Project>Options>General Options>Output. Aici se va alege Output file de tipul Library. n continuare se va rula proiectul: Project>Make, iar apoi se va merge n directorul proiectului, iar apoi se vor accesa urmtoarele foldere: Debug>Exe. n acesta din urm se va gsi un fiier cu extensia .r90. Acest fiier reprezint biblioteca creat de noi.

Figura 5.1 Setarea fiierelor de ieire 91

Laborator 5 Funcii IAR. Funcia Printf.

5.4

IMPORTAREA UNEI BIBLIOTECI NTR-UN NOU PROIECT

Pentru importarea unei biblioteci ntr -un nou proiect este nevoie de fiierul header ce conine toate prototipurile funciilor care pot fi apelate prin intermediul bibliotecii importate. Primul pas pentru importarea unei biblioteci ntr -un nou proiect este de a include fiierul header corespunztor. Acest lucru se poate face fie prin intermediul directivei #include ,fie prin navigarea ctre Project>Options>C/C++ Compiler>Preprocessor>Preinclude File unde se alege fiierul header corespunztor. Urmtorul pas reprezint navigarea ctre Project>Options>Linker>Extra options. Aici se va bifa opiunea Use command line options. n zona text nou activat se va include biblioteca creat astfel: -I\avr\inc\cib <calea complet ctre fiierul .r90 >

Figura 5.2 Adugare cale bibliotec 92

Laborator 6 - ntreruperi

6 ntreruperi
6.1
6.1.1

NTRERUPERI. TABELA VECTORILOR DE NTRERUPERI.


INTRODUCERE

O ntrerupere reprezint un semnal sincron sau asincron de la un periferic ce semnalizeaz apariia unui eveniment care trebuie tratat de ctre procesor. Tratarea ntreruperii are ca efect suspendarea firului normal de execuie al unui program si lansarea in execuie a unei rutine de tratare a ntreruperii (RTI). ntreruperile hardware au fost introduse pentru a se elimina buclele pe care un procesor ar trebui sa le fac in ateptarea unui eveniment de la un periferic. Folosind un sistem de ntreruperi, perifericele pot ateniona procesorul n momentul producerii unei ntreruperi (IRQ), acesta din urma fiind liber s ruleze programul normal n restul timpului i s ntrerup execuia doar atunci cnd este necesar. nainte de a lansa in execuie o RTI, procesorul trebuie sa aib la dispoziie un mecanism prin care s salveze starea n care se afl in momentul apariiei ntreruperii. Aceasta se face prin salvarea ntr-o memorie, de cele mai multe ori organizat sub forma unei stive, a registrului contor de program (Program Counter), a registrelor de stare precum i a tuturor variabilelor din program care sunt afectate de execuia RTI. La sfritul execuiei RTI starea anterioar a registrelor este refcut i programul principal este reluat din punctul de unde a fost ntrerupt. ntreruperile sunt indispensabile n proiectarea unui sistem care s reacioneze corect i eficient n raport cu lumea exterioar. Faptul c au suport hardware ofer un timp de rspuns i overhead minimal. n acelai timp, din punct de vedere software, ntreruperile au un neajuns intrinsec. n primul rnd, ele nu sunt portabile pe diferite procesoare i chiar pe diferite compilatoare. n al doilea rnd, ntreruperile pot determina numeroase erori software greu de identificat.

6.2

NOIUNI
O ntrerupere are dou nelesuri apropiate: transferul hardware al controlului (saltul firului de execuie) ctre un vector de ntrerupere pe baza nregistrrii unui fenomen exterior procesorului ; funcia de tratare a ntreruperii secvena de cod la care se ajunge plecnd de la vectorul de ntrerupere.

93

Laborator 6 - ntreruperi

Fir de execuie

Starea microprocesorului este copiat pe stiv

Rutin de ntrerupere

Starea microprocesorului este restaurat

Figura 6.1 ntrerupere Pentru a asocia o ntrerupere cu o anumit rutin din program, procesorul folosete tabela vectorilor de ntrerupere (Tabel 6.1). Fiecrei ntreruperi i este asociat o adres la care programul va face salt n cazul apariiei acesteia. Aceste adrese sunt predefinite i sunt mapate n memoria de program ntr-un spaiu contiguu care alctuiete TVI. Adresele ntreruperilor n TVI sunt setate n funcie de prioritatea lor, cu ct adresa este mai mic cu att prioritatea este mai mare.

94

Laborator 6 - ntreruperi Pentru ATMega16, TVI este dat n tabelul de mai jos:

Numr vector 1

Adresa programului $000

Sursa

Definiia ntreruperii

RESET

External Pin, Power-on Reset, Brown-out Reset, Watchdog Reset, and JTAG AVR Reset

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

$002 $004 $006 $008 $00A $00C $00E $010 $012 $014 $016 $018 $01A $01C $01E $020 $022 $024 $026 $028

INT0 INT1 TIMER2 COMP TIMER2 OVF TIMER1 CAPT TIMER1 COMPA TIMER1 COMPB TIMER1 OVF TIMER0 OVF SPI,STC USART, RXC USART, UDRE USART, TXC ADC EE_RDY ANA_COMP TWI INT2 TIMER0 COMP SPM_RDY

External Interrupt Request 0 External Interrupt Request 1


Timer/Counter2 Compare Match

Timer/Counter2 Overflow Timer/Counter1 Capture Event Timer/Counter1 Compare Match A Timer/Counter1 Compare Match B Timer/Counter1 Overflow Timer/Counter0 Overflow Serial Transfer Complete USART, Rx Complete USART Data Register Empty USART, Tx Complete ADC Conversion Complete EEPROM Ready Analog Comparator Two-wire Serial Interface External Interrupt Request 2
Timer/Counter0 Compare Match

Store Program Memory Ready

Tabel 6.1 Tabela vectorilor de ntrerupere (TVI) Se observ c TVI este plasat de la prima adres a memoriei de program i c ntreruperile sunt puse din dou n dou adrese consecutive. Prioritatea cea mai mare o are ntreruperea de RESET, de la adresa 0, apoi ntreruperea extern 0 (INT0). Perifericele care pot genera ntreruperi la ATMega16 sunt timer -ele, interfaa serial (USART), convertorul analog-digital (ADC), controlerul de memorie EEPROM, comparatorul analog i interfaa seriala I2C. De asemenea, procesorul poate s primeasc cereri de ntreruperi externe din trei surse (INT0, 1 i 2), ce corespund unui numr egal de pini exteriori. 95

Laborator 6 - ntreruperi

6.3

ACTIVAREA/DEZACTIVAREA NTRERUPERILOR

ntreruperile pot fi activate sau dezactivate de utilizator n program prin setarea individual a biilor de interrupt enable pentru fiecare periferic folosit i prin setarea flagului de Global Interrupt Enable (I) din Status Register (Figura 6.2).

Bit

7
I

6
T
R/W 0

5
H
R/W 0

4
S
R/W 0

3
V
R/W 0

2
N
R/W 0

1
Z
R/W 0

0
C
R/W 0

SREG

Read/Write Valoare iniial

R/W 0

Figura 6.2 Registrul de stare (SREG) O ntrerupere este dezactivat dac s-a utilizat un suport hardware pentru a preveni declanarea ntreruperii. Suportul hardware este dat de 2 bii: unul specific fiecrui tip de ntrerupere i unul ce se refer la toate ntreruperile. ntreruperea de Reset face abatere de la aceast regul prin faptul c nu poate fi prevenit. Saltul ctre un vector oarecare de ntrerupere poate avea loc doar dac cei doi bii au valoarea 1. Pentru ATmega16, bitul ce se refer la toate ntreruperile se numete I i se afl n registrul de stare al microprocesorului (bitul 7 din Figura 6.2). Pentru a-l modifica se pot utiliza urmtoarele instruciuni:

Mnemonic SEI CLI

Descriere Global Interrupt Enable Global Interrupt Disable

Operaie I1 I0

Numr de cicli 1 1

Funcii IAR __enable_interrupt __disable_interrupt

Pentru a modifica bitul individual de validare a ntreruperii, acesta trebuie cutat pentru fiecare tip de ntrerupere. De exemplu, pentru ntreruperea extern INT0, acesta se regsete n registrul Figura , pe poziia 6. Astfel, pentru a admite ntreruperi de tip INT0, pe frontul cresctor al semnalului extern, putem utiliza urmtorul cod: Cod surs 1:
#include <inavr.h> //include biblioteca inavr.h #include <iom16.h> //include biblioteca iom16.h int main(void) {

96

Laborator 6 - ntreruperi

// nceputul iniializrilor MCUCR |= ((1 << ISC01) | (1 << ISC00)); // seteaz ca front pozitiv GICR |= (1 << INT0); // activeaz INT0 (External Interrupt Request 0 Enable) __enable_interrupt(); /* activeaz ntreruperea globala */ // sfritul iniializrilor }

Se remarc faptul c ultimul lucru din procedura de iniializare a ntreruperilor este validarea ntreruperilor la nivel global (ordine bottom-up). Pentru fiecare tip de ntrerupere exist un bit ce este setat ori de cte ori platforma hardware nregistreaz producerea fenomenului cauz specific i, de regul, este pus pe 0 de ctre microprocesor la intrarea n rutina de ntrerupere. De exemplu, n cazul ntreruperii INT0 acest bit se numete INTF0 i se afl n registrul GIFR pe poziia 6. Observaie: Pentru a reseta bitul ce semnific producerea fenomenului de ntrerupere i se va asigna acestui bit valoarea 1. Prioritatea ntreruperilor are justificare n cazul n care mai multe ntreruperi se gsesc n ateptare. ntreruperea cu numrul de ordine cel mai mic va fi urmtoarea tratat (a se vedea Tabel 6.1). O funcie de ntrerupere n curs nu poate fi ntrerupt la rndul ei de ctre o ntrerupere cu prioritate mai nalt. Latena ntreruperii reprezint practic timpul de rspuns al microprocesorului. Se definete ca fiind intervalul de timp dintre momentul de timp n care condiia de ntrerupere a avut loc i momentul de timp n care s-a intrat n rutina de ntrerupere. De regul, latena ntreruperii nu este o mrime constant i se poate vorbi despre cea mai defavorabil laten. O funcie de ntrerupere se termin cu instruciunea RETI (return from interrupt). Aceast instruciune realizeaz de fapt o revenire n program n punctul n care acesta a fost ntrerupt. Adresa de revenire (2 octei) este stocat (pe stiv, de regul) nainte de a se efectua saltul ctre vectorul de ntrerupere (deci n momentul n care ntreruperea se afl n stare de ateptare i s -a decis tratarea ei). n general, ntreruperile pot fi sau nu reentrante. Se spune despre o ntrerupere c este reentrant dac execuia ei poate fi ntrerupt la apariia unei ntreruperi cu o prioritate mai mare. ntreruperile de pe microprocesorul ATmega16 nu sunt reentrante.

6.4

REGISTRE PENTRU TRATAREA NTRERUPERILOR EXTERNE


Bit

7
INT1

6
INT0
R/W 0

5
INT2
R/W 0

4
R/W 0

3
R/W 0

2
R/W 0

1
IVSEL
R/W 0

0
IVCE
R/W 0

GICR

Read/Write Valoare iniial

R/W 0

Figura 6.3 Registrul de control a ntreruperilor (GICR = General Interrupt Control Register) Acest registru este rspunztor pentru plasarea tabelului vectorului de ntreruperi. 97

Laborator 6 - ntreruperi

Bitul 0 din acest registru se numete IVCE (Interrupt Vector Change Enable). Acest bit trebuie iniializat cu valoarea logic 1 pentru a permite schimbarea urmtorului bit din registru i anume IVSEL. Setnd acest bit, nu se vor mai putea genera ntreruperi. Bitul 1 din acest registru se numete IVSEL (Interrupt Vector Select). Cnd acest bit are valoarea logic 0 vectorii de ntreruperi sunt plasai la nceputul memoriei de program (Flash). Cnd acest bit este setat cu valoarea logic 1, vectorii de ntreruperi sunt mutai la nceputul zonei de boot . Bitul 7 INT1:External Interrupt Request 1 Enable: Cnd INT1 e setat cu valoarea logic 1 si bitul I din Figura 6.2este setat cu aceeai valoare, pinul destinat ntreruperii externe INT1 este activat. Biii ISC11 i ISC10 definesc logica de generare a ntreruperii, respectiv dac aceasta este generat pe front cresctor sau descresctor. ntreruperea va fi setat conform rutinei asociate vectorului de ntrerupere. Bitul 6INT0:External Interrupt Request 0 Enable: Cnd INT0 e setat cu valoarea logic 1 si bitul I din Figura 6.2este setat cu aceeai valoare pinul destinat ntreruperii externe 0 este activat. Biii ISC01 si ISC00 definesc logica de generare a ntreruperii, respective dac aceasta este generat pe tranziia de cretere sau pe cea de scdere. Bitul 5INT2:External Interrupt Request 2 Enable: Cnd INT0 e setat cu valoarea logic 1 si bitul I din Figura 6.2este setat cu aceeai valoare, pinul destinat ntreruperii externe 2 este activat. Bitul ISC2 define te logica de generare a ntreruperii, respectiv dac aceasta este generat pe tranziia de cretere sau pe cea de scdere. NTRERUPERILE EXTERNE

6.4.1

Aceste ntreruperi sunt generate prin intermediul pinilor INT0, INT1 i INT2. Ele sunt activate chiar dac aceti pini sunt setai ca fiind de output (ieire). Modul n care se pot genera ntreruperile externe poate fi setat prin configurarea registrelor Figura 6.4 i Figura 6.5 .
Bit

7
SM2

6
SE
R/W 0

5
SM1
R 0

4
SM0
R/W 0

3
ISC11
R/W 0

2
ISC10
R/W 0

1
ISC01
R/W 0

0
ISC00
R/W 0

MCUCR

Read/Write Valoare iniial

R/W 0

Figura 6.4 MCU Control Register

ISC11 0 0 1 1

ISC10 0 1 0 1

Descriere Nivelul sczut al lui INT1 genereaz o cerere de ntrerupere. Orice schimbare logic pe INT1 genereaz o cerere de ntrerupere. Pe frontul negativ al lui INT1 se genereaz o cerere de ntrerupere. Pe frontul pozitiv al lui INT1 se genereaz o cerere de ntrerupere. Tabel 6.3

98

Laborator 6 - ntreruperi

Bit

7
JTD

6
ISC2
R/W 0

5
R 0

4
JTRF
R/W 0

3
WDRF
R/W 0

0
MCUCSR

BORF EXTRF PORF


R/W 0 R/W 0 R/W 0

Read/Write Valoare iniial

R/W 0

Figura 6.5 MCU Control and Status Register De exemplu, pentru a folosi ntreruperea externa INT2 sunt necesare urmtoarele configurri: 1. Bitul I din Figura 6.2 trebuie s fie setat (global interrupt enable); 2. Bitul INT2 din Figura trebuie setat (INT2 enable) ; 3. Daca ISC2 este iniializat cu valoarea zero, INT2 va fi activat pe front descresctor (tranziie din 1 in 0 a pinului INT2), n caz contrar ea va fi activat pe front cresctor. Perifericele care pot genera ntreruperi sunt: timerele, convertorul analog -digital, interfeele seriale (RS232, I2C, SPI) etc.

6.5
6.5.1

PROBLEME
CORECTITUDINEA CONCURENIAL

ntreruperile pot provoca un comportament neateptat al microprocesorului dac nu s -au prevzut toate aspectele legate de concuren. Se presupune c o ntrerupere poate avea loc oricnd. Deci o funcie de ntrerupere va avea structura urmtoare:

1 2 3

F o copie a tuturor regitrilor ce vor fi eventual modificai n corpul funciei de ntrerupere Realizeaz toate operaiile proprii rutinei de ntrerupere Ref toi regitrii referii la pasul 1
Tabel 6.4 Structura unei ntreruperi

ntr-o funcie de ntrerupere scris n C nu se specific paii 1 i 3, deoarece compilatorul are grij s studieze ce regitri sunt modificai n corpul funciei de ntrerupere i s-i salveze. Oricum, estimrile compilatorului pot fi altele dect cele fcute de programator (compilatorul va lua cel mai probabil nite precauii mai mari dect cele necesare), astfel nct, la un moment dat, s apar dorina de a scrie funcia de ntrerupere n limbaj de asamblare. 6.5.1.1 Depirea stivei Se presupune c o rutin de ntrerupere are nevoie de un spaiu propriu peste stiva programului. Dimensiunea acestui spaiu reflect un consum de memorie i, poate cel mai important, existena unor instruciuni de scriere-citire ce se execut n ntrerupere. Din acest motiv, n rutinele de ntrerupere se evit apelurile de funcie.

99

Laborator 6 - ntreruperi Ceea ce rmne de fcut din partea proiectantului este s scrie rutine de ntrerupere care s utilizeze ct mai puin stiv i s dimensioneze stiva astfel nc t s nu se ajung la coruperea ei. 6.5.1.2 Suprancrcarea procesorului La proiectarea unui sistem se va lua n consideraie frecvena de ntrerupere i timpul utilizat de ctre rutinele de tratare a ntreruperilor. De exemplu, conectarea direct a unui buton la un pin de ntrerupere extern ar putea nsemna generarea unui numr mare de ntreruperi inutile (din cauza fenomenului de bouncing). 6.5.1.3 Tipuri: hard i soft Att timp ct fenomenul cauz al ntreruperii este de natur extern ntreruperea este de tip hard. Exist i posibilitatea ca printr-o metod software s se satisfac condiia de ntrerupere. O ntrerupere declanat pe aceast cale va fi de tip soft. De exemplu, dac o ntrerupere extern este activat (INT0, INT1, INT2) i pinul corespunztor este setat ca ieire, atunci ntreruperea poate fi declanat prin scrierea pinului. O alt cale prin care se poate genera software o ntrerupere este de a seta bitul folosit de ctre platforma hardware pentru nregistrarea satisfacerii condiiei de ntrerupere. 6.5.1.4 Vectori de ntrerupere Vectorii de ntrerupere sunt definii n fiierul iom16.h, dup cum urmeaz (adresele sunt exprimate n octei):
#define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define RESET_vect INT0_vect INT1_vect TIMER2_COMP_vect TIMER2_OVF_vect TIMER1_CAPT_vect TIMER1_COMPA_vect TIMER1_COMPB_vect TIMER1_OVF_vect TIMER0_OVF_vect SPI_STC_vect USART_RXC_vect USART_UDRE_vect USART_TXC_vect ADC_vect EE_RDY_vect ANA_COMP_vect TWI_vect INT2_vect TIMER0_COMP_vect SPM_RDY_vect (0x00) (0x04) (0x08) (0x0C) (0x10) (0x14) (0x18) (0x1C) (0x20) (0x24) (0x28) (0x2C) (0x30) (0x34) (0x38) (0x3C) (0x40) (0x44) (0x48) (0x4C) (0x50)

100

Laborator 6 - ntreruperi

6.5.2

DEFINIIA UNEI FUNCII DE NTRERUPERE N LIMBAJUL C

Pentru a defini o funcie de ntrerupere pentru Timer1 Overflow, n limbajul C, se vor crea fiierele isr.h i isr.c dup cum urmeaz: Cod surs 1: isr.h #ifndef __ISR__ #define __ISR__
#include <iom16.h> //include biblioteca iom16.h #pragma vector = TIMER1_OVF_vect //asocierea dintre o funcie i un vector de ntrerupere //vectorul ntreruperii este dat sub forma unui simbol //definit de regul ntr-un fiier header aflat n biblioteca compilatorului __interrupt void isr_TIMER1_overflow(void); //declararea funciei de ntrerupere #endif

isr.c
#include "isr.h" //include fiierul header de mai sus __interrupt void isr_TIMER1_overflow(void) { /* to do */ }

Se poate observa de mai sus c asocierea dintre o funcie i un vector de ntrerupere se face cu ajutorul directivei #pragma vector = [vectorul ntreruperii], unde vectorul ntreruperii este dat sub forma unui simbol definit de regul ntr-un fiier header aflat n biblioteca compilatorului. 6.5.3 VERIFICRI LA NIVEL DE COD MAIN

n continuare se va considera exemplul funciei de ntrerupere pentru fenomenul de Timer1 Overflow (a se vedea codul surs 1). Observaie: n fiierul iom16.h TIMER1_OVF_vect este definit ca fiind numrul 0x20. Specificaia #pragma vector = TIMER1_OVF_vect face legtura ntre funcia de ntrerupere isr_TIMER1_overflow i vectorul de ntrerupere aflat la adresa 0x20. Observaie: n documentaia tehnic a microprocesorului ATmega16 se spune c ntreruperea TIMER1 OVF are asociat n zona de program adresa $010. Aceast adres are semnificaia de numr de cuvinte. Pentru fenomenul de Timer1 Overflow, dac bitul TOIE1 din registrul TIMSK1 este 1 (ntreruperea este validat), procesorul va executa instruciunea aflat la adresa 0x20 din memoria

101

Laborator 6 - ntreruperi Flash. Aceast instruciune reprezint un salt la funcia de ntrerupere corespunztoare. Pentru a verifica acest lucru vom studia fiierul generat la compilare: In segment CODE, align 2, keep-with-next 3 __interrupt void isr_TIMER1_overflow(void) \ isr_TIMER1_overflow: 4 { \ 00000000 930A ST -Y, R16 \ 00000002 B70F IN R16, 0x3F 5 /* to do */ 6 } \ 00000004 BF0F OUT 0x3F, R16 \ 00000006 9109 LD R16, Y+ \ 00000008 9518 RETI \ In segment INTVEC, offset 0x20, root \ `??isr_TIMER1_overflow??INTVEC 32`: \ 00000020 ........ JMP isr_TIMER1_overflow 7 Observm faptul c, n segmentul vectorilor de ntrerupere, la adresa 0x20, se afl o instruciune Tabel , ce va efectua un salt la func ia isr_TIMER1_overflow, aflat n segmentul de cod, la o adres relocabil. Adresa efectiv (adresa fizic din memoria Flash) a acestei instruciuni Tabel i a funciei de ntrerupere poate fi cutat n fiierul Disassembler pus la dispoziie de mediul AVR Studio (menu = View, option = Disassembler): +0000000F: 9518 RETI Interrupt return @00000010: _..X_CSTACK_SIZE +00000010: 940C002A JMP 0x0000002A Jump +00000012: 9518 RETI Interrupt return +00000013: 9518 RETI Interrupt return Se observ aadar faptul c n memoria de cod la adresa 0x10 (numr de cuvinte) urmeaz o instruciune Tabel cu operandul 0x43 (numr de cuvinte). La adresa 0x2A se gsete de fapt funcia de ntrerupere: @0000002A: isr_TIMER1_overflow ---- isr.c ---------------------------------------------------------------------------------------__interrupt void isr_TIMER1_overflow(void) 4: { +0000002A: 930A ST -Y,R16 Store indirect and predecrement +0000002B: B70F IN R16,0x3F In from I/O location 6: } +0000002C: BF0F OUT 0x3F,R16 Out to I/O location +0000002D: 9109 LD R16,Y+ Load indirect and postincrement +0000002E: 9518 RETI Interrupt return @0000002F: main 102

Laborator 6 - ntreruperi

n mediul AVR Studio putem vizualiza direct memoria de cod ( menu = View, option = Memory Window):

Observm faptul c la adresa 0x10 (numr de cuvinte) se gsete un dublu-cuvnt cu valoarea 0C94 2A00. Aceast valoare capt sens dac se studiaz codificarea instruciunii Tabel cu operandul 0x2A. Remarc: Cuvintele din codul main sunt scrise dou cte dou n ordine invers. 6.5.3.1 Instruciunea JMP Not: aceste informaii pot fi regsite n fiierul Instruction Set Nomenclature. Sintax JMP k Operanzi 0 k < 4M Cod main 1001 kkkk Tabel 6.5 Observaie: Instruciunea Tabel se codific ntr-un dublu-cuvnt. Not: n cazul n care exist vectori de ntrerupere pentru care nu s -au definit funcii de ntrerupere, n zona de cod corespunztoare se pun instruciuni Tabel (mai puin pentru ntreruperea de Reset pentru care se definete implicit o funcie de ntrerupere). Acest lucru se poate observa n fiierul Disassembler sau analiznd memoria de program i codificarea instruciunii Tabel . 6.5.3.2 Instruciunea RETI Sintax RETI Operanzi Cod main 1001 Tabel 6.6 103 0101 0001 1000 010k kkkk kkkk kkkk 110k kkkk

Laborator 6 - ntreruperi

Observaie: instruciunea Tabel se codific ntr-un cuvnt. 6.5.3.3 Definiia unei funcii de ntrerupere n limbaj de asamblare Pentru a defini n limbaj de asamblare o rutin de ntrerupere corespunztoare, de exemplu, vectorului INT0, se poate utiliza codul surs 2 (unde rutina de ntrerupere va seta i, imediat, va reseta pinul 0 de la portul B): Cod surs 2 :
NAME EXT_INT0 #include <iom16.h> extern isr_INT0 // numele funciei // include biblioteca iom16.h //funcia extern utilizat

COMMON INTVEC(1) //codul din segmentul vectorului de ntrerupere ORG INT0_vect //regiunea care conine codul din vectorul de ntrerupere jmp isr_INT0 //salt la funcia de ntrerupere ENDMOD NAME CODE_int0 //numele funciei #include <iom16.h> // include biblioteca iom16.h set_B0 MACRO //macrodefiniia care seteaz pinul 0 de la portul B sbi 0x18, 0x00 ENDM reset_B0 MACRO //macrodefiniia care reseteaz pinul 0 de la portul B cbi 0x18, 0x00 ENDM PUBLIC isr_INT0 //declar isr_INT0 public pentru a fi exportat ntr-o funcie C

RSEG CODE:ROOT // codul este relocabil isr_INT0: //eticheta la care se face jump set_B0 //apeleaz funcia care seteaz pinul 0 de la portul B reset_B0 // apeleaz funcia care reseteaz pinul 0 de la portul B reti ENDMOD END

6.5.4

MSURAREA LATENEI NTRERUPERII

A msura latena ntreruperii nseamn practic a examina intervalul de timp dup care microprocesorul rspunde la o ntrerupere extern (care este probabil acelai pentru toate tipurile de ntreruperi). Rspunsul la o ntrerupere dureaz minim 4 cicli, timp n care se salveaz pe stiv PC (Program Counter) i se face posibil executarea instruciunii aflate n vectorul de ntrerupere 104

Laborator 6 - ntreruperi

corespunztor. Aceast instruciune este de regul Tabel (deci nc 3 cicli) ctre rutina propriuzis de ntrerupere. Pentru a msura timpul de rspuns la o ntrerupere extern s-a utilizat o funcie de ntrerupere scris n limbaj de asamblare (codul surs 2). O descriere aproximativ n domeniul timp a ceea ce se ntmpl pn la apariia rspunsului funciei de ntrerupere este dat n Diagrama 6.1:
CPU clock T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12 T13 T14 T15 T16

External interrupt Effect of instruction Set bit in I/O register Output pin

Current instruction

Push PC. Go to interrupt vector.

Execute jump to interrupt subroutine

Set bit in I/O register

Reset bit in I/O register

Return from interrupt

End of current instruction

Interrupt service routine

Diagrama 6.1

S-a msurat durata de timp dintre fronturile cresctoare a 2 semnale: intrarea pentru INT0 (port D, pin 2); ieirea modificat n rutina de ntrerupere (port B, pin 0) .

Not: Frecvena procesorului este de 4MHz. Tensiunea de intrare pentru INT0 a fost luat de la un generator de pulsuri cu o frecven de 10KHz i un factor de umplere de 20% (frecvena pulsurilor trebuie s fie mai mic de 500MHz, iar durata pulsului trebuie s fie mai mare de 50ns). S-au obinut urmtoarele imagini (unda de culoare albastr este semnalul de excitaie, iar unda de culoare roie este semnalul rspuns):

105

Laborator 6 - ntreruperi

Figura 6.6 Observaii: efectul funciei de ntrerupere se produce cu aproximativ 2.4s dup condiia de ntrerupere (fenomenul cauz). Acest timp corespunde a 9 -10 cicli main. Scrierea unui pin de ieire dureaz 2 cicli; intervalul de timp ct pinul de ieire se afl pe 1 logic este egal cu aproximativ 500ns (a se vedea figura 6.6). Acest timp corespunde a 2 cicli main, ceea ce pare a fi normal , dac se consider faptul c instruciunile SBI (set bit in I/O register) i CBI (clear bit in I/O register) dureaz, fiecare, 2 cicli main. n Figura este redat rezultatul aceluiai program, doar c a fost mrit persistena n timp a semnalelor (exist o astfel de opiune la osciloscop).

106

Laborator 6 - ntreruperi

Figura 6.7

Observaii: timpul de rspuns al procesorului nu este constant, ci variaz ntr-un interval de circa 0.5s (aa-zisul jitter). Jitter-ul este dat de faptul c microprocesorul ntotdeauna va termina execuia curent i apoi va trata ntreruperea, iar timpul cnd se nregistreaz condiia de ntrerupere nu este sincronizat cu sfritul execuiei instruciunii curente. Instruciunea ce se execut la infinit este (se poate vedea n fiierul Disassembler) RJMP (relative jump se sare napoi cu o instruciune) i dureaz 2 cicli. Rezult deci, c ne putem atepta la un jitter de maxim 500ns, ceea ce corespunde cu rezultatele ob inute (unde se poate observa un interval de aprox. 450ns). n cazul n care vom defini o funcie de ntrerupere n limbajul C, compilatorul va mbrca corpul funciei cu instruciuni ce vor avea ca efect conservarea strii microprocesorului (contextul de execuie). n Figura se poate vedea efectul unei funcii de ntrerupere definit n C n care se seteaz i se reseteaz pinul 0 de la portul B. Funcia de ntrerupere are deci aceeai funcionalitate cu rutina definit n limbaj de asamblare mai sus, ns modificarea pinului se va produce mai trziu, deoarece este salvat registrul de stare al microprocesorului ( Figura 6.2).

107

Laborator 6 - ntreruperi

Figura 6.8 De regul, ntr-o funcie de ntrerupere scris n C, compilatorul va salva: registrul de stare, ntotdeauna; regitrii cu funcie general, dac sunt modificai. DECLARAREA UNEI FUNCII DE NTRERUPERE N C

6.5.5

Pentru a declara o funcie de ntrerupere n asamblare i a defini-o n C, de exemplu pentru vectorul INT1, se poate utiliza ca suport: Cod surs 3 : main.c
#include <inavr.h> //include biblioteca inavr.h #include <iom16.h> //include biblioteca iom16.h int main( void ) { /* INT1 este pe pinul PD3 */ DDRD = 0xFF; // seteaz ca ieire PORTD = 0xFF; MCUCR |= ((1 << ISC11) | (1 << ISC10)); /* Pe frontul pozitiv al lui INT1 se genereaz o cerere de ntrerupere */

108

Laborator 6 - ntreruperi

GICR |= (1 << INT1); /* activeaz ntreruperea extern INT1 */ __enable_interrupt(); //activeaz ntreruperea global while (1) { PORTD = ~PORTD; // genereaz o ntrerupere software } }

INT1_definition.c #include <iom16.h> //include biblioteca iom16.h /* declararea acestei funcii se gsete n INT1_declaration.asm */ __interrupt void isr_INT1(void) { unsigned char test = 0; test += 1; // putem pune un breakpoint aici }

Not: Compilatorul d un mesaj de avertisment n fiierul INT1_definition.c referitor la faptul c funcia isr_INT1 este definit c funcie de ntrerupere, ns nu se cunoate vectorul de ntrerupere asociat.

109

Laborator 7 - Coduri Redundante Ciclice

7
7.1

Coduri redundante ciclice

INTRODUCERE

Codurile Redundante Ciclice sunt o metod de detectare a erorilor folosit pe larg n reelistic i dispozitive de stocare pentru a detecta modific rile accidentale ale datelor. Blocurile de date binare care circul n interiorul acestor sisteme au ataate cte o valoare de control, care este de fapt restul unei mpriri polinomiale a coninutului lor; la recepie calculul se repet i se pot face corecii mpotriva coruperii datelor n cazul n care valorile de control nu coincid. Codurile Redundante Ciclice se numesc astfel pentru c valoarea de control este o redundan (aceasta mrete lungimea mesajului fr a aduga informaie), iar algoritmul se bazeaz pe coduri ciclice. CRC sunt att de populare pentru c sunt simplu de implementat n dispozitivele digitale, uor de analizat matematic i, n particular, foarte eficiente la detectarea erorilor produse din cauza zgomotului n canalele de transmitere. Datorit faptului c valoarea de control are o lungime fix, funcia care genereaz aceast valoare este adesea folosit ca o funcie hash. Controlul redundant ciclic a fost inventat de ctre W. Wesley Peterson n 1961; polinomul pe 32 bii utilizat n funcia CRC a standardului Ethernet i multor altora este rezultatul muncii mai multor cercettori i a fost publicat n 1975. Codurile ciclice nu sunt doar simplu de implementat, dar sunt i foarte convenabile pentru detectarea erorilor de tip explozie, a secvenelor continue de date eronate, n diferite tipuri de canale de comunicaie, inclusiv dispozitive de stocare optice i magnetice. De obicei, un CRC pe n bii, aplicat unui bloc de date de lungime arbitrar, va detecta oricare eroare cu lungimea mai mic de n bii i o mic parte 1-2-n din erorile cu o lungime mai mare. Specificaiile unui CRC necesit definirea unui aa-numit polinom generator. Acest polinom reprezint mpritorul n cadrul mpririi polinomiale, unde mesajul este dempritul, ctul este ignorat, iar restul reprezint valoarea de control (codul CRC propriu-zis). Deosebirea cea mai important n cadrul acestei mpriri este folosirea aritmeticii modulo 2, adic a operatorului XOR. Lungimea restului obinut este tot timpul mai mic dect lungimea polinomului generator, ceea ce determin lungimea mesajului rezultat. Cel mai simplu mod de detectare a erorilor, bitul de paritate, este de fapt un CRC pe 1 bit ce folosete polinomul generator . Un dispozitiv ce utilizeaz CRC, calculeaz o secven binar de lungime fix pentru fiecare bloc de date care urmeaz a fi transmis i o ataeaz acestuia, formnd astfel un cuvnt de cod. Cnd un cuvnt de cod este recepionat sau citit, dispozitivul compar valoarea de control cu valoarea rezultat din calculul CRC asupra blocului de date, sau efectueaz o mprire polinomial asupra ntregului mesaj (mpreun cu valoarea de control) i compar rezultatul cu zero. Dac aceste valori nu coincid, atunci mesajul conine o eroare. Dispozitivul poate aciona n diferite moduri pentru a corecta eroarea, de exemplu s mai citeasc o dat blocul de date sau s cear ca blocul de date s fie transmis din nou.

110

Laborator 7 - Coduri Redundante Ciclice

7.2

CRC I INTEGRITATEA DATELOR

Codurile ciclice au fost proiectate s protejeze datele de erorile cel mai des ntlnite n canalele de comunicaie. n acest domeniu, CRC ofer o siguran rezonabil a mesajelor transmise. Totui, aceste coduri nu sunt convenabile contra alterrii intenionate a datelor. n primul rnd, CRC nu necesit nici un fel de autentificare, adic u n atacator poate edita mesajul i recalcula suma de control fr ca aceast substituie s fie detectat. Dac sunt stocate alturi de date, codurile redundante ciclice i funciile criptografice hash nu protejeaz mpotriva alterrii intenionate a datelor. Orice aplicaie care necesit protecie mpotriva acestui tip de atacuri trebuie s utilizeze mecanisme de autentificare, ca mesaje de autentificare sau semnturi digitale (care sunt adesea bazate pe funcii criptografice hash). n al doilea rnd, spre deosebire de funciile criptografice hash, CRC este o funcie uor reversibil, ceea ce o face inconvenabil pentru a fi folosit n semnturile digitale. n al treilea rnd, CRC este o funcie liniar cu proprietatea c i, ca rezultat, chiar dac CRC-ul ar fi criptat, mesajul i CRC-ul asociat ar putea fi manipulate fr cunoaterea cheii de criptare; acesta este un neajuns bine-cunoscut al protocolului Wired Equivalent Privacy (WEP).

7.3

SPECIFICAII CRC

Conceptul de CRC referitor la coduri de detectare a erorilor se complic atunci cnd un dezvoltator sau comisie de standardizare l folosesc la proiectarea unui sistem practic. Acestea sunt unele dintre complicaiile care apar: Uneori implementarea adaug un ir fix de bii naintea irului care trebuie verificat. Acest fapt este util atunci cnd erorile de sincronizare insereaz bii de zero n faa unui mesaj fr a modifica irul ce va fi verificat; De obicei, dar nu ntotdeauna, o implementare ataeaz nc N bii (N fiind dimensiunea CRC-ului) la irul de bii nainte ca acesta s fie divizat cu polinomul generator. Acest fapt este convenabil, pentru c astfel restul mpr irii irului de bii original la valoarea de control este exact zero, deci CRC-ul poate fi verificat prin simpla mprire polinomial a irului de bii recepionat i compararea valorii obinute cu zero. Datorit proprietilor de asociativitate i comutativitate a operatorului XOR , implementrile ce utilizeaz tabele pot obine un rezultat numeric egal cu zero fr a ataa zerourile explicit, prin folosirea unui algoritm echivalent mai rapid care combin mesajul iniial cu irul rezultat din registrul pentru CRC; Unele implementri aplic operatorul XOR asupra restului divizrii polinomiale; Ordinea biilor: Unele scheme vd cel mai nesemnificativ bit dintr-un octet ca fiind primul, ceea ce nseamn cel mai din stnga n timpul mpririi polinomiale. Aceast convenie are sens atunci cnd mesajele transmise pe interfaa serial sunt verificate cu CRC n interiorul dispozitivelor, datorit rspndirii pe larg a conveniei conform creia cel mai nesemnificativ bit este transmis primul; Ordinea octeilor: La CRC-urile pe mai muli octei, poate aprea o confuzie cu privire la primul octet transmis (sau octetul stocat la adresa mai mic n memorie) dac acesta este cel mai semnificativ octet (LSB) sau cel mai semnificativ octet (MSB). De exemplu, unele implementri ale CRC interschimb octeii polinomului generator; Omiterea celui mai semnificativ bit al polinomului generator. Datorit faptului c cel mai semnificativ bit este tot timpul 1 i pentru c un CRC pe N bii trebuie definit printr-un 111

Laborator 7 - Coduri Redundante Ciclice divizor pe N+1 bii, unii dezvoltatori cred c este inutil de menionat bitul cel mai semnificativ al divizorului; Omiterea celui mai nesemnificativ bit al polinomului generator. Datorit faptului c cel mai nesemnificativ bit este tot timpul 1, unii autori ca Philip Koopman reprezint polinomul divizor cu bitul cel mai semnificativ intact, dar fr cel mai nesemnificativ bit (x0). Aceast convenie codeaz polinomul mpreun cu gradul su ntr-un singur ntreg. Aceste complicaii nseamn c exist trei modaliti uzuale de a exprima polinomul ca un ntreg: primele dou sunt constantele regsite n cod, cea de-a treia este numrul regsit n materialele lui Koopman. n orice caz, un termen este omis. Deci, polinomul 0x3 = 0b0011, reprezentnd 0xC = 0b1100, reprezentnd 0x9 = 0b1001, reprezentnd poate fi transcris ca: (MSB-first code) (LSB-first code) (notaia Koopman)

Reprezentri Normal 0x3 Inversat 0xC Tabel 7.1 Inversat reciproc (Koopman) 0x9

7.4

CRC STANDARDIZATE

Numeroase varieti de control redundant ciclic au fost ncorporate n standarde tehnice. Niciodat un anumit algoritm nu poate satisface toate scopurile/necesit ile. De aceea, Koopman i Chakvarty recomand selectarea unui polinom ce corespunde cerinelor aplicaiei i lungimii mesajelor. Numrul mare al CRC-urilor distincte a zpcit dezvoltatorii i aceti autori au ncercat s rezolve aceast situaie. Exist trei polinoame pentru CRC-12, aisprezece polinoame conflictuale pentru CRC-16 i ase pentru CRC-32. Tabelul de mai jos prezint doar polinoamele utilizate n diferi i algoritmi. Diferite variaii ale aceluiai protocol pot implica inversarea, post-inversarea i inversarea complet a biilor. De exemplu, CRC-32 folosit n Gzip i Bzip2 au acelai polinom, dar Bzip2 implic inversarea ordinii biilor.

112

Laborator 7 - Coduri Redundante Ciclice

Reprezentri Nume Normal CRC-1 CRC-4-ITU CRC-5-EPC CRC-5-USB CRC-6-ITU CRC-7 CRC-8-CCITT CRC-8 CRC-8-Dallas/Maxim CRC-8-SAE J1850 CRC-8-WCDMA CRC-10 CRC-11 CRC-12 CRC-15-CAN CRC-15-MPT1327 CRC-16-IBM (ANSI) CRC-16-CCITT CRC-16-T10-DIF CRC-16-DNP CRC-16-DECT CRC-16-ARINC CRC-24 CRC-32 0x1 0x3 0x09 0x05 0x03 0x09 0x07 0xD5 0x31 0x1D 0x9B 0x233 0x385 0x80F 0x4599 0x6815 0x8005 0x1021 0x8BB7 0x3D65 0x0589 0xA02B 0x5D6DCB 0x04C11DB7 Tabel 7.2 0x1 0xC 0x12 0x14 0x30 0x48 0xE0 0xAB 0x8C 0xB8 0xD9 0x331 0x50E 0xF01 0x4CD1 0x540B 0xA001 0x8408 0xEDD1 0xA6BC 0x91A0 0xD405 0xD3B6BA 0xEDB88320 Inversat Inversat reciproc 0x1 0x9 0x14 0x12 0x21 0x44 0x83 0x8E 0x98 0x8E 0xCD 0x319 0x5C2 0xC07 0x62CC 0x740A 0xC002 0x8810 0xC5DB 0x9EB2 0x82C4 0xD015 0xAEB6E5 0x82608EDB

113

Laborator 7 - Coduri Redundante Ciclice

7.5
7.5.1

NOIUNI DESPRE CALCULUL CRC


SOFTWARE

Pentru a realiza o aplicaie software pentru calculul CRC exist mai multe metode de implementare, n funcie de: ipotezele de la care se pornete calculul; dimensiunea polinomului generator; dimensiunea i structura mesajului pentru care se calculeaz CRC-ul; timpul n care se genereaz CRC-ul; dimensiunea spaiului de memorie alocat; performanele procesorului de calcul. Metodele de implementare se pot clasifica n dou categorii: algoritmi de vitez redus; algoritmi de mare vitez. Pentru implementarea software a unui algoritm CRC,va trebui realizat implementarea mpririi n binar folosite de aritmetic CRC. Instruciunea de mprire a unui calculator nu poate fi folosit deoarece mprirea CRC nu este acelai lucru cu mprirea normal i datorit dimensiunii mesajului, ntruct acesta poate ajunge la dimensiuni de ordinul MB, iar procesoarele actuale nu folosesc registre att de mari. Pentru implementare, trebuie s existe un registru de deplasare, avnd dimensiunea egal cu gradul polinomului generator n care s se afle bi ii mesajului. Prelucrarea mesajului se va face bit cu bit. O alt metoda de implementare presupune existena unui tabel n care se gsesc biii polinomului CRC deplasai. Pentru a micora timpul de execuie s-a trecut la procesarea n acelai timp cantiti mai mari de bii (prelucrare paralel): semi-octei (4bii), octei (8bii), cuvinte (16bii) i dublu-cuvinte (32bii). Dintre acestea, prelucrarea semi-octeilor este evitat deoarece calculatoarele opereaz cu octei. Pentru mrirea vitezei de execuie majoritatea implementrilor opereaz cu octei sau cu multipli ai acestora. 7.5.2 HARDWARE

Implementarea hardware a CRC sub forma unui sistem ce are la baza un microcontroler are urmtoarele avantaje: Permite modificarea cu uurin a metodei de calcul; Permite o introducere i prelucrare simpl a datelor nainte de a fi supuse calculului ; Permite comunicaia cu diferite periferice; Permite comunicaia cu calculatorul prin intermediul porturilor cum ar fi cel serial; Pentru obinerea unor timpi foarte mici se folosete o implementare de tip hardware cu bistabile n varianta paralel.

114

Laborator 7 - Coduri Redundante Ciclice

7.5.3

EXEMPLU DE CALCUL CRC

Pentru calculul unui CRC pe n bii, se vor poziiona n partea stng a mesajului iniial cei n+1 bii ai polinomului generator. Se pornete de la mesajul iniial: 11010011101100 Se completeaz mesajul iniial cu n zerouri corespunztoare celor n bii de la CRC. Mai jos sunt prezentate calculele pentru un CRC pe 3 bii: 11010011101100 000 <--- completm mesajul cu cei 3 bii 1011 <--- divizorul (4 bii) = x+x+1 -----------------01100011101100 000 <--- rezultatul Dac bitul deasupra bitului cel mai semnificativ din divizor este 0, nu trebuie fcute calcule. Dac bitul din mesajul iniial deasupra bitului cel mai semnificativ din divizor este 1, se face un XOR ntre mesajul iniial i divizor. Apoi divizorul este mutat cu o pozi ie n dreapta i procesul se repet pn cnd divizorul ajunge n partea dreapt a mesajului iniial. Mai jos este prezentat calculul complet: 11010011101100 000 1011 01100011101100 000 1011 00111011101100 000 1011 00010111101100 000 1011 00000001101100 000 1011 00000000110100 000 1011 00000000011000 000 1011 00000000001110 000 1011 00000000000101 000 101 1 ----------------00000000000000 100 <--<--<--<--mesajul este completat cu 3 bii divizor rezultat divizor ...

<---rest (3 bii)

Restul obinut reprezint valoarea propriu-zis a funciei CRC. Pentru verificarea validitii unui mesaj primit, acesta este divizat cu polinomul generator. Dac nu exist erori detectabile, restul obinut trebuie s fie zero. 11010011101100 100 <--- mesajul cu valoarea de control 1011 <--- divizor 01100011101100 100 <--- rezultat 1011 <--- divizor ... 115

Laborator 7 - Coduri Redundante Ciclice 00111011101100 100 ...... 00000000001110 100 1011 00000000000101 100 101 1 -----------------0 <--- rest

7.6
7.6.1

POINTERI N IAR
POINTERI I TIPURI DE MEMORIE

Pointerii sunt folosii pentru a referi locaia datelor. n general, pointerii au un tip. De exemplu, un pointer de tipul int * indic ctre un ntreg. n compilator, pointerul indic ctre un anumit tip de memorie. Tipul memoriei este specificat utiliznd un cuvnt cheie nainte de asterisc. De exemplu un pointer care indic ctre un ntreg stocat n memoria far este declarat astfel: int_ _far * MyPtr; Trebuie menionat faptul c locaia variabilei pointer MyPtr nu este afectat de cuvntulcheie care precede asteriscul. n exemplul urmtor variabila MyPtr2 este plasat n memoria tiny. Ambele variabile, MyPtr i MyPtr2, indic ctre o dat de tip caracter din memoria far. char __far * __tiny MyPtr2; Oricnd este posibil, pointerii trebuie declarai fr atribute de memorie. De exemplu, funciile din biblioteca standard toate sunt declarate fr specificarea explicit a tipului de memorie. 7.6.2 DIFERENE NTRE TIPURI DE POINTERI

Un pointer trebuie s conin informaia necesar pentru a specifica locaia unui anumit tip de memorie. Acest fapt nseamn c dimensiunile pointerilor sunt diferite pentru diferite tipuri de memorie. n IAR C/C++ Compiler for AVR este interzis conversia pointerilor de tipuri diferite fr utilizarea unui cast explicit. 7.6.2.1 Pointeri la funcii Dimensiunea unui pointer la func ie este tot timpul 16 sau 24 de bii i acetia pot adresa ntreaga memorie. Reprezentarea intern a unui pointer la funcie reprezint adresa de la care ncepe funcia mprit la doi.

116

Laborator 7 - Coduri Redundante Ciclice n IAR sunt disponibile urmtoarele tipuri de pointeri la func ii: Cuvnt-cheie Interval de memorie Dimensiune pointer Tip index Descriere Poate fi apelat din oriunde n memoria program, dar trebuie s refere o locaie din primii 128KB ai acelui spaiu de memorie. Poate fi apelat de oriunde.

__nearfunc

0-0x1FFFE

2 octei

signed int

__farfunc

0-0x7FFFFE

3 octei

signed long Tabel 7.3

7.6.2.2 Pointeri la date Pointerii la date pot avea trei dimensiuni: 8, 16 sau 24 bii. Pointerii la date disponibili sunt: Cuvnt-cheie __tiny __near __far __huge __tinyflash __flash __farflash __hugeflash __eeprom __eeprom Dimensiune pointer 1 octet 2 octei 3 octei 3 octei 1 octet 2 octei 3 octei 3 octei 1 octet 2 octei Spaiul de memorie Data Data Data Data Code Code Code Code EEPROM EEPROM Tabel 7.3 Intervalul de memorie 0x0-0xFF 0x0-0xFFFF 0x0-0xFFFFFF 0x0-0xFFFFFF 0x0-0xFF 0x0-0xFFFF 0x0-0xFFFFFF 0x0-0xFFFFFF 0x0-0xFF 0x0-0xFFFF

Tipul indicelui signed char signed int signed int signed long signed char signed int signed int signed long signed long signed int

117

Laborator 7 - Coduri Redundante Ciclice

7.7

IMPLEMENTARE CRC N IAR/AVR

7.7.1

CONFIGURAREA MEDIULUI IAR

Pentru a genera n mod automat CRC-ul pentru toat memoria flash, mediul IAR trebuie configurat ca n figura urmtoare:

Figura 7.1 Se las debifat csua Initialize unused interrupt vectors with RETI instructions pentru a evita un conflict cu opiunea Fill unused code memory din categoria Linker.

118

Laborator 7 - Coduri Redundante Ciclice

Figura 7.2 Fill unused code memory seteaz valoarea cu care se completeaz memoria neutilizat. Generate checksum seteaz generarea CRC-ului. Size seteaz dimensiunea CRC-ului generat n octei. Arithmetic sum calculeaz suma tuturor biilor de 1. CRC polynomial seteaz un polinom propriu pentru generarea CRC -ului. Complement seteaz modul de reprezentare al CRC-ului generat: As is rezultatul rmne neschimbat. 1s Complement complement fa de 1. 2s Complement complement fa de 2. Bit order modul de reprezentare al CRC-ului generat. LSB first primul bit reprezint coeficientul termenului la puterea 0. MSB first primul bit reprezint coeficientul termenului la puterea cea mai mare. Initial value seteaz valoarea iniial a CRC-ului. 119

Laborator 7 - Coduri Redundante Ciclice

Implementare CRC-16 Setri IAR:

Figura 7.3

120

Laborator 7 - Coduri Redundante Ciclice Rezultatele rulrii n AVR:

Figura 7.4 Cod surs 7.1:


#define CRC16_CCITT 0x1021 enum BitOrder { LSBF, MSBF }; unsigned int crc16(unsigned int polinom16, unsigned int init_val_16, unsigned int adr_start,unsigned int len, enum BitOrder ord) { //rezultatul final unsigned int crc = init_val_16; //reine n octetul cel mai semnificativ datele //extrase din memoria flash unsigned int data = 0;

121

Laborator 7 - Coduri Redundante Ciclice

while( len-- ) { unsigned int i; //se extrage valoarea unui octet de la adresa de start //din memoria flash data = *(__flash char *)adr_start; if ( ord == MSBF ) //opiunea cu shiftare spre MSB { //octetul este shiftat la stnga pentru a se alinia //cu polinomul generator data <<= 8; //datele sunt "transferate" n rezultat crc ^= data; adr_start++; //pentru biii de date se face XOR cu polinomul generator, //daca bitul cel mai semnificativ este 1 sau se shifteaza datele //la stnga, dac bitul cel mai semnificativ este 0 for( i = 0; i < 8; ++i ) { //se verific dac bitul cel mai semnificativ este 1 if( crc & 0x8000 ) crc = (crc << 1) ^ polinom16; else crc = crc << 1; } } else //opiunea cu shiftare spre LSB //parametrul polinom16 al funciei trebuie s aib biii inversai n //prealabil { crc ^= data; adr_start++; //se verific bitul cel mai putin semnificativ i dac //acesta este 1 se face XOR cu polinomul generator, // altfel datele sunt shiftate la dreapta for( i = 0; i < 8; ++i ) { //se verific daca cel mai puin semnificativ bit este 1 if( crc & 0x0001 ) crc = (crc >> 1) ^ polinom16; else crc = crc >> 1; } } } return crc; }

122

Laborator 7 - Coduri Redundante Ciclice

//aceasta implementare utilizeaz o tabel cu valori pre-calculate ale //funciei CRC16 __flash const unsigned int crc16tab[256]= { 0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7, 0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef, 0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6, 0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de, 0x2462,0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485, 0xa56a,0xb54b,0x8528,0x9509,0xe5ee,0xf5cf,0xc5ac,0xd58d, 0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695,0x46b4, 0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc, 0x48c4,0x58e5,0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823, 0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,0x9969,0xa90a,0xb92b, 0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0x0a50,0x3a33,0x2a12, 0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1a, 0x6ca6,0x7c87,0x4ce4,0x5cc5,0x2c22,0x3c03,0x0c60,0x1c41, 0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,0x8d68,0x9d49, 0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0x0e70, 0xff9f,0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78, 0x9188,0x81a9,0xb1ca,0xa1eb,0xd10c,0xc12d,0xf14e,0xe16f, 0x1080,0x00a1,0x30c2,0x20e3,0x5004,0x4025,0x7046,0x6067, 0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e, 0x02b1,0x1290,0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256, 0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,0xe54f,0xd52c,0xc50d, 0x34e2,0x24c3,0x14a0,0x0481,0x7466,0x6447,0x5424,0x4405, 0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c, 0x26d3,0x36f2,0x0691,0x16b0,0x6657,0x7676,0x4615,0x5634, 0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,0xb98a,0xa9ab, 0x5844,0x4865,0x7806,0x6827,0x18c0,0x08e1,0x3882,0x28a3, 0xcb7d,0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9a, 0x4a75,0x5a54,0x6a37,0x7a16,0x0af1,0x1ad0,0x2ab3,0x3a92, 0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,0x8dc9, 0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0x0cc1, 0xef1f,0xff3e,0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8, 0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,0x3eb2,0x0ed1,0x1ef0 }; unsigned int crc16wtable(unsigned int init_val_16,unsigned int adr_start, unsigned int len) { unsigned int counter; unsigned int crc = init_val_16; for( counter = 0; counter < len; counter++) crc = (crc<<8) ^ crc16tab[((crc>>8) ^ *(__flash char *)adr_start++) & 0x00FF]; return crc; }

123

Laborator 7 - Coduri Redundante Ciclice

7.7.2

IMPLEMENTARE CRC-32 Setri IAR:

Figura 7.5

124

Laborator 7 - Coduri Redundante Ciclice Rezultatele rulrii n AVR:

Figura 7.6 Cod surs 7.2:


unsigned long crc32(unsigned long polinom32, unsigned long init_val_32, unsigned int adr_start,unsigned int len, enum BitOrder ord) { //variabile pe 32 bii unsigned long crc = init_val_32; unsigned long data = 0; while( len-- ) { int i; //se extrage un octet din memoria flash

125

Laborator 7 - Coduri Redundante Ciclice

data = *(__flash char *)adr_start; if ( ord == MSBF ) //opiunea cu shiftare spre MSB { //octetul extras este shiftat pn la cel mai semnificativ bit data <<= 24; crc ^= data; adr_start++; for( i = 0; i < 8; ++i ) { //se verific dac cel mai semnificativ bit este 1 if( crc & 0x80000000 ) crc = (crc << 1) ^ polinom32; else crc = crc << 1; } } else //opiunea cu shiftare spre LSB //parametrul polinom32 al funciei trebuie s aib biii inversai n prealabil { crc ^= data; adr_start++; for( i = 0; i < 8; ++i ) { //se verific dac cel mai puin semnificativ bit este 1 if( crc & 0x00000001 ) crc = (crc >> 1) ^ polinom32; else crc = crc >> 1; } } } return crc; } //implementare ce utilizeaz un tabel cu valori funciei CRC __flash unsigned long crc32tab[256] = { 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, pre-calculate ale

0x130476dc, 0x2f8ad6d6, 0x4c11db70, 0x569796c2, 0x791d4014, 0x91a18d8e, 0xbe2b5b58, 0xa4ad16ea, 0xc7361b4c, 0xfbb8bb46, 0x34867077, 0x2e003dc5, 0x018aeb13,

0x17c56b6b, 0x2b4bcb61, 0x48d0c6c7, 0x52568b75, 0x7ddc5da3, 0x95609039, 0xbaea46ef, 0xa06c0b5d, 0xc3f706fb, 0xff79a6f1, 0x30476dc0, 0x2ac12072, 0x054bf6a4,

126

Laborator 7 - Coduri Redundante Ciclice

0x0808d07d, 0x6b93dddb, 0x571d7dd1, 0xaca5c697, 0xb6238b25, 0x99a95df3, 0xe9362689, 0xc6bcf05f, 0xdc3abded, 0x7a089632, 0x46863638, 0x251d3b9e, 0x3f9b762c, 0x1011a0fa, 0xf8ad6d60, 0xd727bbb6, 0xcda1f604, 0xae3afba2, 0x92b45ba8, 0x5d8a9099, 0x470cdd2b, 0x68860bfd, 0x18197087, 0x3793a651, 0x2d15ebe3, 0xd6ad50a5, 0xea23f0af, 0x89b8fd09, 0x933eb0bb, 0xbcb4666d, };

0x0cc9cdca, 0x6f52c06c, 0x53dc6066, 0xa864db20, 0xb2e29692, 0x9d684044, 0xedf73b3e, 0xc27dede8, 0xd8fba05a, 0x7ec98b85, 0x42472b8f, 0x21dc2629, 0x3b5a6b9b, 0x14d0bd4d, 0xfc6c70d7, 0xd3e6a601, 0xc960ebb3, 0xaafbe615, 0x9675461f, 0x594b8d2e, 0x43cdc09c, 0x6c47164a, 0x1cd86d30, 0x3352bbe6, 0x29d4f654, 0xd26c4d12, 0xeee2ed18, 0x8d79e0be, 0x97ffad0c, 0xb8757bda,

0x7897ab07, 0x6211e6b5, 0x4d9b3063, 0xa527fdf9, 0x8aad2b2f, 0x902b669d, 0xf3b06b3b, 0xcf3ecb31, 0x690ce0ee, 0x738aad5c, 0x5c007b8a, 0x2c9f00f0, 0x0315d626, 0x19939b94, 0xe22b20d2, 0xdea580d8, 0xbd3e8d7e, 0xa7b8c0cc, 0x8832161a, 0x5408abf7, 0x7b827d21, 0x61043093, 0x029f3d35, 0x3e119d3f, 0xc5a92679, 0xdf2f6bcb, 0xf0a5bd1d, 0x803ac667, 0xafb010b1, 0xb5365d03,

0x7c56b6b0, 0x66d0fb02, 0x495a2dd4, 0xa1e6e04e, 0x8e6c3698, 0x94ea7b2a, 0xf771768c, 0xcbffd686, 0x6dcdfd59, 0x774bb0eb, 0x58c1663d, 0x285e1d47, 0x07d4cb91, 0x1d528623, 0xe6ea3d65, 0xda649d6f, 0xb9ff90c9, 0xa379dd7b, 0x8cf30bad, 0x50c9b640, 0x7f436096, 0x65c52d24, 0x065e2082, 0x3ad08088, 0xc1683bce, 0xdbee767c, 0xf464a0aa, 0x84fbdbd0, 0xab710d06, 0xb1f740b4,

0x71159069, 0x5e9f46bf, 0x44190b0d, 0xbfa1b04b, 0x832f1041, 0xe0b41de7, 0xfa325055, 0xd5b88683, 0x608edb80, 0x4f040d56, 0x558240e4, 0x36194d42, 0x0a97ed48, 0xf12f560e, 0xeba91bbc, 0xc423cd6a, 0xb4bcb610, 0x9b3660c6, 0x81b02d74, 0x4e8ee645, 0x7200464f, 0x119b4be9, 0x0b1d065b, 0x2497d08d, 0xcc2b1d17, 0xe3a1cbc1, 0xf9278673, 0x9abc8bd5, 0xa6322bdf,

0x75d48dde, 0x5a5e5b08, 0x40d816ba, 0xbb60adfc, 0x87ee0df6, 0xe4750050, 0xfef34de2, 0xd1799b34, 0x644fc637, 0x4bc510e1, 0x51435d53, 0x32d850f5, 0x0e56f0ff, 0xf5ee4bb9, 0xef68060b, 0xc0e2d0dd, 0xb07daba7, 0x9ff77d71, 0x857130c3, 0x4a4ffbf2, 0x76c15bf8, 0x155a565e, 0x0fdc1bec, 0x2056cd3a, 0xc8ea00a0, 0xe760d676, 0xfde69bc4, 0x9e7d9662, 0xa2f33668,

unsigned long crc32wtable(unsigned int init_val_32, unsigned int adr_start, unsigned int len) { unsigned int counter; unsigned long crc = init_val_32; for( counter = 0; counter < len; counter++) crc = (crc<<8) ^ crc32tab[((crc>>24) ^ *(__flash char *)adr_start++) & 0xff]; return crc; }

127

Laborator 7 - Coduri Redundante Ciclice COMPARAREA TIMPILOR DE EXECUIE CRC-16 lent:

7.7.3

Figura 7.7 CRC-16 ce utilizeaz tabel cu valori pre-calculate:

Figura 7.8

128

Laborator 7 - Coduri Redundante Ciclice

7.8

ANEX

Cod surs 7.3:


unsigned int reverse_bits_16(unsigned int input) { unsigned int output = 0; unsigned int n = sizeof(input) << 3; unsigned int i = 0; for (i = 0; i < n; i++) if ((input >> i) & 0x1) output |= (0x1 << (n - 1 - i)); return output; } unsigned long reverse_bits_32(unsigned long input) { unsigned int left = input>>16; left = reverse_bits_16(left); unsigned int right = input; right = reverse_bits_16(right); unsigned long output = 0; output |= right; output <<= 16; output |= left; return output; }

129

Laborator 8 - Frecvenmetru. Timer/Counter 0

8 Frecvenmetru. Timer/Counter 0
8.1
8.1.1

FRECVENMETRUL
DEFINIIE

Un frecvenmetru este un instrument electronic sau o component dintr-un instrument electronic folosit pentru msurarea frecvenei. Acesta msoar numrul de evenimente (oscilaii sau pulsuri ) pe o anumit perioad de timp a semnalului primit. 8.1.2 PRINCIPIU DE OPERARE

Frecvenmetrele folosesc un numrtor pentru a acumula numrul de evenimente (pulsaii) nregistrate ntr-o anumit perioad de timp. Dup acea perioad specificat valoarea din numrtor este transferat pe display i numrtorul este resetat la 0. Exist dou moduri de msurare a frecvenei : numrare direct i numrare reciproc. 8.1.2.1 Numrarea direct Frecvenmetrele care folosesc acest principiu acumuleaz numrul de di n care semnalul de input (intrare) traverseaz n creterea sau n descreterea lui o anumit valoare prestabilit.
Amplificator
Semnal intrare

Counter

Display

33 MHz

Decade dividers Clock

Flip flop

Figura 8.1 Diagrama bloc a unui numrtor cu numrare direct Cnd un semnal intr ntr-un frecvenmetru prima dat intr ntr-un amplificator unde este convertit n semnal rectangular pentru a putea fi procesat de restul circuitului. De obicei, n aceast faz a procesrii este ntlnit un circuit de tip trigger Schmitt pentru a putea atenua zgomotele semnalului de intrare. Pentru a putea crea semnalele din numrtor este necesar un clock. De ob icei acesta este un oscilator cu cristal care poate fi intern sau extern. Semnalul preluat de la oscilator se mparte cu ajutorul unor decade dividers trecnd apoi prin flip flop pentru a obine pulsul pentru poarta principal. Poarta principal primete semnalul de la flip flop i de la input i are ca output un numr de pulsuri pe o perioad precis de timp. De exemplu, dac semnalul de input este de 1 MHz i poarta a fost deschis pentru o secund aceasta va avea ca output 1 milion de pulsuri. 130

Laborator 8 - Frecvenmetru. Timer/Counter 0 Numrtorul preia pulsaiile de la poarta principal i le mparte la 10 n multiple faze , numrul de faze fiind egal cu numrul de cifre afiate minus 1. De exemplu , n prima faz mparte la 10 , n faza a doua mparte la 10 x 10 , .a.m.d. Latch-ul este folosit pentru a memora ultimul rezultat ct timp counter -ul primete alt input pentru a putea pstra un rezultat static pe display. Display-ul preia output-ul de la latch i l afieaz. n acest caz :

8.1.2.2 Numrarea reciproc O alt metod de a msur frecvena unui semnal este de a msura perioada unui ciclu din forma de und i de a calcula reciproca acesteia. De exemplu, numrtorul ncepe s calculeze la primul front pozitiv al semnalului de input i se oprete la urmtorul front pozitiv . n acest caz :

8.2

TIMER/COUNTER 0

TCCR0

count clear direction BOTTOM TOP Control Logic clkT0 Clock Select Detector de front

TOV0 Intr.

T0

DATABUS

Numrtor TCNT0 =0 = 0xFF

(de la Prescaler) OC0 Intr.

Generator form de und

OC0

OCR0

Figura 8.2 Diagrama bloc Timer/Counter0 131

Laborator 8 - Frecvenmetru. Timer/Counter 0 NOIUNI INTRODUCTIVE

8.2.1

Atmega16 dispune de trei timere dintre care dou sunt pe 8 bii (Timer/Counter0 , Timer/Counter2 ) i unul este pe 16 bii (Timer/Counter1) . Sursa semnalului de clock poate fi selectat intern (de la Prescaler), sau de la o surs de clock extern conectat la pinul T0. Timer -ul este inactiv cnd nu este selectat nici o surs de clock. Ieirea din blocul Clock Select reprezint semnalul de clock la care va opera Timer/Counter 0 (clkT0). 8.2.1.1 Regitri n Error! Reference source not found.2 putem observa urmtorii registri : TCCR0 ( Timer/Counter Control Register) : biii acestui registru de control configureaz modul de operare al timerului; TCNT0 este un registru numrtor; OCR0 (Output Compare Register) este comparat tot timpul cu valoarea lui TCNT0. Rezultatul comparrii poate fi folosit de generatorul de und pentru a genera la ieire un semnal PWM sau semnal de clock cu frecvene variabile pe pinul Output Compare (OC0). Rezultatul comparrii va seta, de asemenea, i Compare Flag (OCF0), care poate fi folosit pentru a genera o cerere de ntrerupere la ieire. 8.2.1.2 Unitatea de numrare

132

Laborator 8 - Frecvenmetru. Timer/Counter 0

DATA BUS

TOV0 Intr.

count TCNT0 clear direction Control Logic clkT0 Prescaler

TOSC1
T/C Oscillator

TOSC2

clkI/O bottom top

Figura 8.3 Diagrama bloc a unitii de numrare Unitatea


DATA BUS

de

numrare

este

pe

bii,

bidirecional

programabil.

TOV0 Intr.

count TCNT0 clear direction Control Logic clkT0 Prescaler

TOSC1
T/C Oscillator

TOSC2

clkI/O bottom top

Figura 8.3 se poate vedea structura acestei uniti. Semnificaia semnalelor : count incrementarea sau decrementarea registrului TCNT0 cu 1 unitate; direction selecia ntre incrementare i decrementare; clear resetare registru TCNT0; clkT0 clock-ul Timer/Counter; top TCNT0 a ajuns la valoarea sa maxim ; bottom TCNT0 a ajuns la valoarea minim.

133

Laborator 8 - Frecvenmetru. Timer/Counter 0

8.2.1.3 Unitatea de comparare ( Output Compare )


DATA BUS

OCR0

TCNT0

Comparator pe 8 bii

OCF0 Intr.

top bottom FOC0 Generator Form de Und OC0

WGM01:0

COM01:0

Figura 8.4 : Diagrama bloc a unitii de comparare Aceast unitate compar TCNT0 cu registrul Output Compare (OCR0). Dac TCNT0 este egal cu OCR0 se va seta flag-ul Output Compare (OCF0) la urmtorul ciclu de clock. Acest flag va genera o ntrerupere de output compare dac aceast ntrerupere este activat. Flag-ul Output Compare(OCF0) poate fi resetat prin soft scriind la locaia sa un 1 logic. Generatorul semnalului de ieire (Wave Generation Mode) folosete semnalul de ieire al comparatorului pentru a genera forma de und corespunztoare cu modul de operare setat prin biii WGM01:00 i biii Compare Output Mode (COM01:00). 8.2.2 Moduri de funcionare

Definiii: BOTTOM : reprezint valoarea minim a counterului 0x00 MAX : reprezint valoarea maxim a counterului 0xFF ( aceasta difer n funcie de numrul de bii al counter-ului) TOP : counterul ajunge la valoarea de TOP cnd devine egal cu cea mai mare valoare din secvena de numrat. Aceasta poate fi o valoare fix (MAX) sau valoarea stocat n registrul OCR n funcie de modul de operare. Un timer poate funciona n urmtoarele moduri: Normal se numr periodic de la BOTTOM la MAX 134

Laborator 8 - Frecvenmetru. Timer/Counter 0

Clear Timer on Compare (CTC) se numr periodic de la BOTTOM la TOP Fast PWM se numr periodic de la BOTTOM la TOP cu posibilitatea de a modula n durat ieirea de la pinul Ocn (sau OCnx ). De exemplu : atunci cnd valoarea din registrul numrtor devine egal cu BOTTOM, pinul OCn este resetat; atunci cnd valoarea din registrul numrtor devine egal cu valoarea din registrul de comparare pentru ieire, pinul OCn este setat.

8.3
Enun

PROBLEM REZOLVAT
Generarea unui semnal PWM de 50Hz avnd un factor de umplere de 45 %.

Notaii F = frecvena T = perioada DC = Duty cycle = factorul de umplere Rezolvare F = 50Hz

T = T(on) + T(off) DC = 45%

T(off) = 20 ms 9 ms =11 ms Configurare Timer/Counter 0


Bit

1
CS01
R/W 0

0
CS00
R/W 0

FOC0 WGM00 COM01 COM00 WGM01 CS02 Read/Write Valoare iniial


R/W 0 R/W 0 R/W 0 R/W 0 R/W 0 R/W 0

TCCR0

Figura 8.5 : Timer/Counter Control Register TCCR0 Din aceast figur biii de interes sunt :

135

Laborator 8 - Frecvenmetru. Timer/Counter 0 Biii 6,3: WGM01:0 - Waveform Generation Mode. Acetia pot fi setai pe 0 sau pe 1, n funcie de tipul de pwm pe care dorim s l obinem , conform Tabel 8.1 Waveform Generation Mode Bit Description

Mod 0 1 2 3

WGM01 (CTC0) 0 0 1 1

WGM00 Mod de operare TOP Actualizare (PWM0) OCR0 0 Normal 0xFF Imediat 1 PWM, Phase Correct 0xFF TOP 0 CTC OCR0 Imediat 1 Fast PWM 0xFF TOP Tabel 8.1 Waveform Generation Mode Bit Description

Setare Flag TOV0 MAX BOTTOM MAX MAX

=> Biii COM01:0 . Cu ajutorul lor putem controla dac PWM poate fi inversabil sau nu.
COM01 0 0 1 1 COM00 0 1 0 1 Descriere Mod normal de operare, OC0 deconectat Toggle OC0 la compare match Resetare OC0 la compare match Setare OC0 la compare match Tabel 8.2 Codul surs : #include <inavr.h> #include <iom16.h> void timer0_init() { // iniializare TCCR0 TCCR0 |= (1<<WGM00)|(1<<COM01)|(1<<WGM01)|(1<<CS00); // setare pinul OC0 ca output (este pinul PB3) DDRB |= (1<<PB3); } void main() { uint8_t duty; duty = 115; // duty cycle = 45% i deoarece Timer 0 este pe 8 bii acesta poate numra pn la 255. Deci 45% din 255 = 114.75 = 115 timer0_init();// iniializarea timer-ului while(1) // crearea unei bucle infinite { OCR0 = duty; //Output Compare registrer } } 136

Laborator 8 - Frecvenmetru. Timer/Counter 0

Rezultate

Figura 8.6 Captur de imagine osciloscop

8.4

PROBLEM PROPUS

Folosind Timer 0 cu modul fast pwm s se foloseasc semnalele pentru a varia luminozitatea unui LED de la minim la maxim i apoi de la maxim la minim . Indicaie: pentru a putea vedea schimbarea n luminozitatea LED-ului se va folosi funcia __delay_cycles(). #include <inavr.h> #include <iom16.h> void Init() { /* Timer Clock = CPU Clock (fr prescalare) Mode = Fast PWM */ TCCR0|=(1<<WGM00)|(1<<WGM01)|(1<<COM01)|(1<<CS00); //Setare pin OC0 ca output DDRB|=(1<<PB3); }

137

Laborator 8 - Frecvenmetru. Timer/Counter 0

void SetOutput(unsigned int duty) { OCR0=duty; //Output Compare registrer } void Wait()//este necesar o funcie de ateptare { __delay_cycles(3200); } void main() { unsigned int brightness=0; Init(); while(1) { for(brightness=0;brightness<255;brightness++) { SetOutput(brightness); Wait(); } for(brightness=255;brightness>0;brightness--) { SetOutput(brightness); Wait(); } } }

138

Laborator 9 - Watchdog. Calculul timpului, frecvena oscilatorului.

9 Watchdog. Calculul timpului, frecvena oscilatorului.


9.1 NOIUNI INTRODUCTIVE. FAMILIA AVR XMEGA.

Ideea de baz ce st n spatele existenei unui , este de a avea un mecanism care s reseteze microcontroler-ul n cazul n care dintr-un motiv exceptional, aplicaia nu rspunde un timp ndelungat. Familia ofer un intern foarte robust cu o surs de clock separat fa de microcontroler. O eroare a clock-ului principal nu afecteaz Clarificarea unor termini folosii n acest laborator: modul periferic care poate fi configurat s genereze un semnal de reset , dac este resetat prea devreme sau prea trziu potrivit unei perioade specificate. resetarea registrului ( revenirea la o valoare iniial stabilit). resetarea microcontroler-ului . 9.1.1 SCHEMA DE PRINCIPIU

Watchdog timer

Reset

Procesor

Restart
Clock

Figura 9.1 Schema de principiu

139

Laborator 9 - Watchdog. Calculul timpului, frecvena oscilatorului.

9.1.2

SURSA DE CLOCK

din familia AVR XMEGA are o surs de clock intern de separat, reprezentat de un oscilator RC cu un consum redus. Ac est oscilator poate fi folosit i de timer-ul sau dac este configurat n modul eantionare. Dac unul din aceste module este configurat s foloseasc acest oscilator, atunci este pus n funciune. nu este foarte precis. Acest lucru se datoreaz faptului c este proiectat pentru un consum redus de energie pentru a putea fi folosit n aplicaii pe o perioad mai mare de timp. Dezavantajul unui consum redus este precizia redus. Precizia tipic este de . De aici rezult ca frecvena oscilatorului poate varia de la un dispozitiv la altul. Atunci cnd se proiecteaz aplicaii care folosesc -ul, variaia dispozitiv-la-dispozitiv trebuie pstrat pentru a se asigura c perioadele de folosite sunt valabile pentru toate dispozitivele, nu numai pentru dispozitivele din laboratorul de dezvoltare a aplicaiilor. In plus sursa de clock este sensibil i la variaia temperaturii sau a tensiunii de alimentare dei variaia este semnificativ mai mic dect . SINCRONIZAREA NTRE DOMENII DIFERITE DE CLOCK

9.1.3

i opereaz n domenii de clock diferite, iar sincronizarea ntre aceste domenii trebuie luat n considerare atunci cnd folosim watchdog-ul. Pentru a configura sunt necesare 2-3 perioade de clock . Setrile sunt scrise n registrele de control ale , ele sunt efective la urmtor ul front pozitiv al clock-ului , adic dup dup ce setrile sunt scrise n registru. De aici rezult c perioada iniial de este cu mai lung. Dac perioada de este de , perioada actual este ntre i . Acest lucru este relevant atunci cnd se folosete i perioade de mici. Aceast caracteristic nu este specific doar , toate timer-ele asincrone opereaz n acest fel pentru sincronizarea cl ock-ului ntre diferite domenii. este resetat atunci cnd are loc o scriere valid n registrele de control. O alt caracteristic de sincronizare este diferena de timp dintre executarea instruciunii de i resetarea acestuia efectiv, problem ce ine de sincronizare dintre domenii de clock. este resetat dup 3 perioade de clock dup ce instruciunea de reset este executat, adic ntre dup executarea instruciunii. Dac se folosete o perioad de de prima instruciune de va fi executat dup de la activarea . innd cont de precizia oscilatorului , instruciunea trebuie s fie executat n sau mai puin. Intervalul dintre dou intstruciuni de poate fi de sau mai mic incertitudineprecizia oscilatorului). Efectul acestei sincronizri este minimizat atunci cnd perioada de este mai mare. Dac genereaz un semnal de reset (de ex. dup expirarea perioadei de ) resetarea sistemului are loc la urmtorul front al clock-ului . Resetarea sistemului are loc la dup ce perioada de a expirat. Acest lucru n mod normal nu ar trebui s creeze nici o problem, dar este important de tiut dac se dorete s se msoare perioada watchdog-ului urmrind nivelului logic de tensiune al unui pin. Cea mai bun metod de calcul a perioadei efective a watchdog-ului este folosirea XMEGA Real Time Clock timer-ului. Toate aceste caracteristici sunt valabile n ambele moduri, normal i fereastr.

140

Laborator 9 - Watchdog. Calculul timpului, frecvena oscilatorului.

Executarea instructiunii WDT reset WDT timer TOWD=8 2 3 Resetarea sistemului Resetarea WDT WDT timeout 5 6 7 8

0 T0 WDT clock

5 4 TWDT_Reset 0 5

2 10

t[ms] 15

Figura 9.2 Sincronizarea clock-ului MODURILE DE FUNCIONARE

9.1.4

pe lng modul normal de lucru n care trebuie resetat nainte de o perioada stabilit, ofer i modul fereastr n care poate fi resetat doar ntr-o anumit perioad de timp n modul fereastr dac este resetat prea devreme sau prea trziu se genereaz o condiie de resetare a microcontroler-ului. 9.1.4.1 Modul normal Atunci cnd este configurat n modul normal este setat o singur perioad de Dac watchdog-ul nu este resetat nainte de expirarea acestei perioade , va genera o condiie de reset. Intervalul marcat pe grafic indic faptul c poate fi resetat oricnd nainte de expirarea perioadei de . Modul de funcionare normal este ilustrat n Figura 9.3 .
WDT timer TOWDT=16 Resetarea sistemului WDT reset

Deschis

WDT time-out

t[ms] 5 10 15 20 TOWDT 25 30 35

Figura 9.3 Modul Normal

141

Laborator 9 - Watchdog. Calculul timpului, frecvena oscilatorului. 9.1.4.2 Modul fereastr Atunci cnd -ul este folosit n modul fereastr sunt setate dou perioade de , o perioada nchis i o perioad deschis . Prima perioad reprezint un interval de la pn la n care nu poate fi resetat, dac este resetat atunci va genera o condiie de reset. A doua perioad reprezint un interval de la pn la n care poate fi resetat. Perioade deschis va succede ntotdeauna perioada nchis. Perioada total de este calculat ca fiind suma celor dou perioade menionate mai sus. Modul de funcionare fereastr este ilustrat n Figura 9.4 .
WDT timer WDT reset

Deschis

TOWDT=8

Resetare prematur a WDT

TOWDTW=8

nchis

Resetarea sistemului t[ms] 5 10 15 20


TOWDTW

25

30
TOWDT

35

40

Figura 9.4 Modul fereastr

9.2

STANDARDUL INTERNAIONAL IEC 60730

IEC 60730 este un standard de siguran pentru aparatele de uz casnic , care abordeaz aspectele de design i funcionare a produselor. Acest standard este menionat i de alte standarde care vizeaz sigurana dispozitivelor, de exemplu standardul IEC 60335. Pentru siguran este foarte important ca sistemul s fie certificat de acest standard. 9.2.1 CLASELE STANDARDULUI IEC 60730

Anexa H a standardului IEC 60730 definete trei clase de control al soft -ului pentru diferite aparate electrocasnice : funcii de control care nu sunt destinate a fi invocate pentru sigurana echipamentelor; aplicaii care includ cod cu scopul de a preveni alte erori dect cele software; aplicaii care includ cod destinat s previn erorile fr utilizarea altor dispozitive de protecie. 9.2.2 WATCHDOG-UL DE CLAS B

142

Laborator 9 - Watchdog. Calculul timpului, frecvena oscilatorului. Arhitectura XMEGA este prevzut cu un mecanism de protecie care asigur faptul c setrile WDT nu pot fi modificate accidental. Pentru o siguran sporit este prevzut o siguran (fuse) pentru a bloca setrile WDT. Deoarece WDT este un element de siguran integrat n familia Atmel AVR XMEGA s-a conceput o rutin de autodiagnosticare care testeaz ambele moduri de funcionare, normal i fereastr. Aceasta se execut dup resetare, n partea de pre-iniializare a aplicaiei naintea funciei main. Diagrama de test este reprezentat n Figura 9.5 Diagrama de test Rutina de autodiagnosticare ne asigur c: Resetarea sistemului ; este realizat dup expirarea perioadei de time-out a

poate fi resetat; Sistemul este resetat la resetarea prematur a fereastr.

n modul de funcionare

Conform diagramei logice dispozitivul este resetat de cteva ori n timpul testului. Prin urmare variabila SRAM i flag-urile de reset ale dispozitivului sunt utilizate de rutina de autodiagnosticare, pentru a urmri faza de testare. n continuare utilizatorul poate configura ce s fac n cazul unui reset software , brown-out sau cum s proceseze resetul cauzat de watchdog, atunci cnd testul se afl n starea . Rutina de autodiagnosticare folosete un pentru a verifica perioada . are o sursa de clock independent fa de i . Ambele module au oscilatoare care funcioneaz la . Cu toate acestea oscilatorul este optimizat pentru un consum redus de energie. -ul este folosit pentru estimarea perioadei , iar programul verific dac aceast perioad este n intervalul unde este perioada nominal a . Fluxul de execuie fr erori este : 1. Dup punerea sub tensiune sau reset extern se verific dac poate reseta sistemul. Se seteaz starea . Sistemul este resetat de . 2. Se verific dac poate fi resetat. Se seteaz starea . Sistemul este resetat de . 3. Se verific dac modul window funcioneaz corect. Se seteaz . Sistemul este resetat de . 4. Se configureaz conform setrilor .Se seteaz starea testului . Se continu cu funcia main. Primul pas este asigurarea faptului c poate genera semnalul de reset. Acest lucru se realizeaz configurnd conform datasheet-ului i ateptnd pn cnd 1 procesul de resetare a avut loc. n plus este folosit pentru a estima perioada watchdog-ului, care este necesar n fazele ulterioare ale testului. Acest lucru se realizeaz setnd perioada cu o valoare destul de mic (aproximativ ) i numrnd perioadele pn la resetare. Exist un timp maxim de ateptare care poate fi configurat, dup expirarea acestui timp programul intr ntr -o stare de eroare.

este testat implicit de aceast rutin de autodiagnosticare, n cazul n care diferena de frecven dintre i este mai mare de se trece n starea de eroare. 143

Laborator 9 - Watchdog. Calculul timpului, frecvena oscilatorului. Al doilea pas este asigurarea faptului c poate fi resetat i verificarea perioadei . Starea de eroare este setat temporar, iar apoi se verific dac perioada este mai mare dect un minim stabilit. Se verific dac diferena de frecven ntre i este situat ntr-un interval care ne asigur c ambele module funcioneaz dup ateptri. Apoi este configurat, se folosete pentru a atepta din perioada care a fost estimat la pasul anterior, astfel se verifica dac perioada nu expir mai devreme dect se ateapt. Dup aceea este resetat, iar programul ateapt din nou din perioada . Dac mecanismul de resetare a a descurs far probleme sistemul ar trebui s se reseteze n timp ce programul este n a doua ateptare. Acest lucru se datoreaz faptului c perioada total de atepta re este din perioada total a estimat anterior. n plus aceast resetare prematur ar duce testul n starea de eroare. Presupunnd c a fost resetat corect, sistemul trebuie s fie resetat n aproximativ din perioada . Testul trece n starea urmtoare, iar programul este n ateptarea resetului. Al treilea pas este asigurarea faptului c funcioneaz corect n modul fereastr. Acest lucru are la baz setarea i trecerea testului n urmtoarea stare i apoi resetarea lui prematur. Avnd n vedere c perioada nu este respectat ar trebui s genereze un semnal de reset. Astfel, dup resetarea prematur a programul ateapt resetarea sistemului din perioada total a . Dac a aprut o problem sistemul nu se va reseta, iar programul va semnala starea de eroare. Al patrulea i ultimul pas: programul pur i simplu seteaz n modul fereastr, iar testul n starea . Dup acesta, aplicaia este responsabil de resetarea n funcie de setri. Dac testul se afl n starea de eroare va fi apelat un sistem de tratare a erorilor predefinit de utilizator. n mod implicit dispozitivul va fi su spendat deoarece un WDT funcional este esenial pentru o aplicaie software sigur. i variabilele de stare sunt declarate n aa fel nct compilatorul nu le iniializeaz dup resetare. Acest lucru permite folosirea lor pe durata tuturor resetr ilor.

9.2.3

TESTAREA RUTINEI DE AUTODIAGNOSTICARE

n primul rnd rutina de autodiagnosticare va seta starea de eroare dac nu are loc resetarea sistemului. O posibil problem care poate mpiedica s genereze un semnal de reset ar putea fi dezactivarea lui. Starea de eroare va fi stabilit, iar sistemul pur i simplu va fi suspendat. O eroare a frecvenei sau a poate fi simulat printr-un break point i modificnd variabila , astfel nct s fie n afara intervalului prestabilit. O eroare n mecanismul de resetare a poate fi simulat prin nlturarea liniei de cod n care . Fiind dat structura programului, n al doilea rnd rutina de autodiagnosticare va seta starea de eroare nainte ca s urmeze constrngerile de timp care sunt impuse. O eroare n modul fereastr al watchdog -ului poate fi simulat prin nlturarea setrilor acestui mod. Codul va reseta i apoi va atepta din perioada de time -out. La momentul respectiv perioada watchdog-ului va fi mai mare sau egal cu perioada estimat (perioada total este suma perioadelor nchis i deschis). Prin urmare sistemul nu va fi resetat nainte de setarea strii de eroare.

144

Laborator 9 - Watchdog. Calculul timpului, frecvena oscilatorului.

WDT Test

Power-on Reset Extern PDI

Cauza Resetului? WDT

Brownout sau Software

Configurat de utilizator Configurat de utilizator

WDT_OK WDT_3 WDT_2

Alta Stare Poate WDT reseta sistemul? Nu

Starea testului? WDT_1

Da

Nu

Poate WDT fi resetat? Da Nu

Setarea WDT

WDT functioneaza corect in modul window?

Da Starea WDT_1 Starea WDT_ERR Starea WDT_2 Starea WDT_3 Starea WDT_OK

Eroare WDT Test Stop Resetat de WDT

Figura 9.5 Diagrama de test

145

Laborator 9 - Watchdog. Calculul timpului, frecvena oscilatorului.

9.3
9.3.1

ATMEGA16
NTRERUPEREA DE RESET

ntotdeauna cnd are loc o condiie de , microcontroler-ul va atepta un numr de cicli (o durat de timp )), dup care se va executa instruciunea aflat n locaia de memorie corespunztoare vectorului de ntrerupere , care este de regul un salt (JMP) la o rutin de ntrerupere adecvat. RUTINA DE NTRERUPERE DE RESET

9.3.2

n rutina de ntrerupere de Reset se fac anumite iniializri necesare aplicaiei. De regul, pentru un proiect scris n limbajul C, compilatorul de la IAR genereaz automat o rutin de ntrerupere de Reset n care iniializeaz vrful stivei (implicit i dimensiunea ei). Scrierea unei rutine de Reset proprii nu este posibil. De fapt, compilatorul de la IAR construiete 2 stive: segmentul CSRACK; segmentul RSTACK (return address stack). Compilatorul utilizeaz acest spaiu pentru adresele de revenire salvate de instruciunile de apel de procedur i la tratarea ntreruperilor.

ntotdeauna nainte de funcia main, va fi executat rutina de ntrerupere de Reset (de fapt main-ul este apelat din rutina de Reset).

9.3.3

SURSELE DE RESETARE ALE MICROCONTROLER-ULUI

Exist 5 surse de resetare a microcontroler-ului: att timp ct tensiunea de alimentare este sub valoarea prag microcontroler-ul nu funcioneaz. n momentul cnd crete peste microcontrolerul va genera o condiie de ; meninerea pinului pe 0 logic pentru o durat de timp mai mare dect va rezulta n resetarea microcontroler-ului; expirarea numrtorului ,dac este activat va genera o condiie de reset; coborrea tensiunii de alimentare sub prag ul va avea ca efect resetarea microcontroler-ului, dac unitatea este activat; interfaa JTAG poate ea nsi reseta microcontroler-ul.

146

Laborator 9 - Watchdog. Calculul timpului, frecvena oscilatorului.

9.3.3.1 Watchdog Reset Atunci cnd perioada watchdog-ului expir se genereaz un impuls de reset scurt pe durata unui ciclu de clock. Pe frontul negativ al acestui impuls va ncepe a contoriza perioada de time-out ( .).
Vcc RESET 1 CK Cycle WDT TIME-OUT tTOUT RESET TIMEOUT

RESET INTERN

Figura 9.6 Watchdog reset

9.3.4

REGISTRUL MCUCSR

Acest registru ofer informaii despre cauza resetrii microcontroler-ului.


Bit

7
JTD

6
ISC2
R/W 0

5
R 0

4
JTRF
R/W

3
WDRF
R/W

0
MCUCSR

BORF EXTRF PORF


R/W R/W R/W

Read/Write Valoare iniial

R/W 0

JTRF: JTAG Reset Flag acest bit este setat dac resetarea sistemului este cauzat de scrierea de 1 logic n registrul JTAG Reset selectat de instruciunea JTAG, AVR_RESET. Acest bit este resetat printr-un power-on reset sau prin scrierea de 0 logic. WDRF: Watchdog Reset Flag - acest bit este setat dac resetarea sistemului este cauzat de . Acest bit este resetat printr-un power-on reset sau prin scrierea de 0 logic. BORF: Brown-out Reset Flag - acest bit este setat dac se produce un brown-out reset. Bitul este resetat prin power-on reset sau prin scrierea de 0 logic. EXTRF: External Reset Flag acest bit este setat dac se produce un reset extern. Bitul este resetat prin power-on reset sau prin scrierea de 0 logic. PORF: Power-on Reset Flag Acest bit este setat dac se produce un power -on reset. Bitul este resetat numai prin scrierea de 0 logic. Pentru a folosi aceti bii ei trebuiesc citii i resetai ct mai devreme n program. 147

Laborator 9 - Watchdog. Calculul timpului, frecvena oscilatorului.

9.3.5

WATCHDOG TIMER

de pe microcontroler-ul ATmega16, Figura are o surs de clock intern proprie de . Aceasta este o valoare tipic pentru . Perioada de time-out a watchdog-ului poate fi ajustat conform tabelului ( Tabelul 9.1 Modurile de configurare a perioadei de time-out. Dac perioada de time-out expir fr ca watchdog-ul s fie resetat atunci ATmega16 va fi resetat.

OSCILATOR

WATCHDOG PRESCALER
OSC/1024K OSC/2048K OSC/128K OSC/256K OSC/512K

OSC/16K

OSC/32K

WATCHDOG RESET WDP0 WDP1 WDP2 WDE

OSC/64K

RESET

Figura 9.7 Watchdog timer

9.3.5.1 Registrul WDTCR


Bit

7 R 0

6 R 0

5 R 0

4
WDTOE

3
WDE R/W 0

2
WDP2 R/W 0

1
WDP1 R/W 0

0
WDP0 R/W 0

WDTCR

Read/Write Valoare iniial

R/W 0

WDTOE: Watchdog Turn-off Enable este un bit pentru siguran n ideea de a nu dezactiva accidental Watchdog timer-ul, aceast procedur a fost fcut mai complicat pentru a dezactiva Watchdog timer-ul este nevoie s fie setat bitul WDTOE i apoi, ct mai repede (cel mult n 4 cicli) trebuie resetat bitul WDE WDE: Watchdog Enable setarea acestui bit echivaleaz cu activarea Watchdog timerului; resetarea acestui bit va determina dezactivarea Watchdog timer-ului, dac bitul WDTOE are n acest timp valoarea 1 WDP2:0 :Watchdog Timer Prescaler aceti bii determin practic timpul de expirare a Watchdog timer-ul, conform tabelului urmtor:

148

Laborator 9 - Watchdog. Calculul timpului, frecvena oscilatorului.

WDP2

WDP1

WDP0 Numrul de cicli ai WDT 16K(16,384) 32K(32,768) 64K(65536) 128K(131,072) 256K(262,144) 512K(524,288) 1024K(1,048,576) 2048K(2,097,152)

0 0 0 0 1 1 1 1

0 0 1 1 0 0 1 1

0 1 0 1 0 1 0 1

Timpul de expirare pentru VCC = 3.0V 17.1 ms 34.3 ms 68.5 ms 0.14 s 0.27 s 0.55 s 1.1 s 2.2 s

Timpul de expirare pentru VCC = 5.0V 16.3 ms 32.5 ms 65 ms 0.13 s 0.26 s 0.52 s 1.0 s 2.1 s

Tabelul 9.1 Modurile de configurare a perioadei de time-out.

9.4
9.4.1 9.1.1.1

APLICAII
APLICAIA 1 Enun

S se creeze o aplicaie care s demonstreze resetarea microprocesorului de ctre Watchdog timer. 9.1.1.2 Rezolvare

n primul rnd se va activa Watchdog timer-ul (atenie i la timpul de expirare). n al doilea rnd se va bloca microprocesorul, de exemplu ntr -o bucl infinit, lsnd Watchdog timer-ul s expire. Pentru a observa din exterior pornirea din nou a aplica iei (ceea ce se va ntmpla dup resetarea microprocesorului), se poate, de exemplu, s se seteze i apoi s se reseteze un pin de ieire, de exemplu PB0, nainte de a bloca microprocesorul. Not: Deoarece pinul PB0 va fi urmrit pe o durat de timp de ordinul sutelor de milisecunde, este posibil durata ct acesta va avea valoarea 1 logic s fie inobservabil pe osciloscop. Din acest motiv este binevenit introducerea unei ntrzieri nainte de a reseta pinul PB0.

149

Laborator 9 - Watchdog. Calculul timpului, frecvena oscilatorului. Schema logic

9.1.1.3

START

Seteaz Watchdog-ul cu o perioad de time-out de 0.26 ms

Activeaz watchdog-ul

Seteaz pinul PD6 pe 1 logic Ateapt 8.1 ms Seteaz pinul PD6 pe 0 logic

Nu f nimic

Rezultate

150

Laborator 9 - Watchdog. Calculul timpului, frecvena oscilatorului. Codul surs main.c

9.1.1.4

#include <iom16.h> #include <inavr.h> #define DELAY_CYCLES 32768 int main( void ) { __disable_interrupt(); /*Setare perioad de time-out 0.26s*/ WDTCR|=(1<<WDP2); /*Activare watchdog timer*/ WDTCR|=(1<<WDE); /*Setare PD6 ca pin de ieire*/ DDRD|=(1<<PD5); __enable_interrupt(); /*Setare PD6 pe 1 logic*/ PORTD|=(1<<PD5); __delay_cycles(DELAY_CYCLES); /*Setare PD6 pe 0 logic*/ PORTD&=~(1<<PD5); while(1); return 0; }

9.4.2 9.1.1.5

APLICAIA 2 Enun S se creeze o aplicaie care s calculeze perioada efectiv a Rezolvare

9.1.1.6

Pentru a putea aproxima aceast perioad cu ajutorul osciloscopului se folosete un pin de ieire . Pe durata perioadei de time-out a acest pin i va schimba valoarea. Astfel diferena de tensiune va fi sesizat de osciloscop. Prin urmare perioada aproximat a va fi de fapt perioada de la primul front poziti v pn la ultimul front negativ al semnalului generat de pinul . Pentru claritate nainte de resetarea se va bloca microprocesorul pe durata a de cicli de clock.

151

Laborator 9 - Watchdog. Calculul timpului, frecvena oscilatorului. Schema logic


START
Initializeaz USART Initializeaz Timer Initializeaz Watchdog
Calculeaz frecvena folosint variabilele __no_init Trimite frecvena pe serial

9.1.1.7

Pune variabilele pe 0 Reseteaz Watchdog-ul

Activeaz Watchdog-ul

Actualizeaz variabila care menine valoare curent a timer-ului

9.1.1.8

Rezultate

9.1.1.9

Codul surs

#include <iom16.h> #include <inavr.h> int main( void )

152

Laborator 9 - Watchdog. Calculul timpului, frecvena oscilatorului.

{ __enable_interrupt(); /*iniializare Watchdog*/ /*Setare time-out de 16.3 ms*/ WDTCR|= (~(1<<WDP0))| (~(1<<WDP1))| (~(1<<WDP2)); __delay_cycles(100000); /*Resetare WDT*/ asm("WDR"); /*Activare WDT*/ WDTCR|=(1<<WDE); DDRC|=(1<<DDC1); PORTC|=(1<<PC1); while(1) { PORTC^=(1<<PC1); __delay_cycles(1000); } return 0; }

9.4.3 9.1.1.10

APLICAIA 3

Enun S se scrie o aplicaie care calculeaz frecvena efectiv a . Pentru calculul exact al frecvenei se va folosi unul dintre timer-ele microcontroler-ului. Frecvena va fi trimis pe serial. Nu se va folosi tipul de dat double. 9.1.1.11 Rezolvare

Pentru a pstra valoarea curent a timer-ului si numrul de overflow-uri se folosesc dou variabile pentru a-i pstra valoarea i dup reset. Dac n momentul activrii watchdog-ului se starteaz un timer, dup resetarea microcontroler -ului se va ti perioada de time-out. tiind perioada conform formulei se poate calcula frecvena.

153

Laborator 9 - Watchdog. Calculul timpului, frecvena oscilatorului. Schem logic


START
Initializeaz USART Initializeaz Timer Initializeaz Watchdog
Calculeaz frecvena folosint variabilele __no_init Trimite frecvena pe serial

9.1.1.12

Pune variabilele pe 0 Reseteaz Watchdog-ul

Activeaz Watchdog-ul

Actualizeaz variabila care menine valoare curent a timer-ului

9.1.1.13

Rezultate

154

Laborator 9 - Watchdog. Calculul timpului, frecvena oscilatorului. Codul surs

9.1.1.14

#include <iom16.h> #include <inavr.h> #include "usart.h" __no_init unsigned int Timer1_currentValue; __no_init unsigned int Timer1_numberOverflows; #pragma vector = TIMER1_OVF_vect __interrupt void T1_OVF() { Timer1_numberOverflows++; } int main( void ) { /*iniializare usart*/ USART_initialize(BAUD_RATE); /*iniializare Timer 1*/ /*Mod de funcionare Normal*/ /*Setare prescaler */ TCCR1B|=(1<<CS10); /*Activare ntrerupere*/ TIMSK|=(1<<TOIE1); __enable_interrupt(); /*iniializare Watchdog*/ /*Setare time-out de 32.5 ms*/ WDTCR|= (1<<WDP0); if(Timer1_numberOverflows >0 || Timer1_currentValue>0) { /*calculul perioadei efective de time-out a watchdog-ului*/ unsigned long number=Timer1_numberOverflows*65535+Timer1_currentValue; /*calculul perioadei n ms*/ unsigned long period=number*0.00025; /*calculul perioadei unui ciclu de clock al watchdog-ului*/ unsigned long time_per_clock=(unsigned long)((period*1000000)/32768); /*calculul frecvenei n Hz*/ unsigned long frecv=(unsigned long)((1000000./time_per_clock)); print(frecv); } Timer1_numberOverflows=0; Timer1_currentValue=0; TCNT1=0; /*Resetare WDT*/ asm("WDR"); /*Activare WDT*/ WDTCR|=(1<<WDE); while(1) { Timer1_currentValue=TCNT1; } return 0; }

155

Laborator 10 - Generare de frecvene. Fast PWM, factor de umplere

10 Generare de frecvene. Fast PWM, factor de umplere.


Pulse Width Modulation (PWM) este o tehnic de modulare a perioadei frecvenei unui semnal dreptunghiular prin controlarea timpului ct semnalul are valoarea 1 i ct 0 ntr-o perioad. Factorul de umplere (eng. Duty cycle) este valoarea ce indic ct din ntreaga perioad semnalul are valoarea 1. Factorul de umplere se exprim n procente. ; unde p este timpul de 1, q este timpul de 0, iar p+q este actuala perioad a semnalului modulat. PWM este considerat o implementare simplist a unui convertor numeric analogic. Multe aplicaii de control necesit semnale analogice de control pentru diverse task-uri, astfel sistemele PWM pe microcontrolere dau posibilitatea de generare de semnale electrice de frecvene dorite, evident limitate de capacitile microcontrolerului. PWM este folosit ca metod eficient de generare a tensiunilor variabile pentru a controla componente externe precum motoare AC i DC sau sisteme de nclzire, fr a fi necesare componente adiionale cum ar fi convertoarele numeric-analogice. n funcie de necesitate un modul PWM poate fi implementat hardware i/sau software. Implementarea hardware difer de la un microcontroler la altul, pe cnd cea software se bazeaz pe folosirea ntreruperilor i poate fi generalizat pentru o gam mai mare de implementri fizice. n implementarea hardware se ine cont, n aproape toate microcontrolerele, de registrele Timer/Counter. Astfel generearea unei frecvene prin PWM ine cont de frecvena microcontroler-ului i capacitile registrelor Timer/Counter: rezoluie, posibilitate de output compare, posibilitate de modificare a factorului de umplere. De exemplu dac avem o frecven a microcontroler-ului de 1kHz i folosim un Timer/Counter pe 8 bii, perioada de semnal maxim ce poate fi generat este 256x1ms adic 256ms, iar frecvena minim este de ~4Hz. n cazul microcontroler-ului ATmega16 se poate genera un semnal PWM cu toate 3 registrele Timer/Counter. n plus, acestea pot fi comandate att de clock-ul microcontroler-ului ct i de un clock extern.

10.1

GENERAREA UNUI SEMNAL PWM CU ATMEGA16

n funcie de frecvena ce se dorete a fi generat, microcontroler-ul ATmega16 pune la dispoziie 3 registre Timer/Counter, 2 din ele pe 8 bii i unul pe 16 bii, ce pot fi configurate pentru a satisface aceast cerin ct mai bine. Astfel utilizatorul poate alege care din cele 3 registre poate genera cel mai corect frecven a dorit. Aceste registre pot fi controlate de clock-ul intern al microcontroler-ului, dar li se poate furniza i un clock extern.

156

Laborator 10 - Generare de frecvene. Fast PWM, factor de umplere

10.2

UTILIZARE TIMER/COUNTER1

Timer/Counter1 este o unitate de timer pe 16 bii care permite acuratee la sincronizarea execuiei programului (management al evenimentelor), generare de und. Principalele caracteristici ale timer-ului Timer/Counter1 sunt: design pe 16 bii (permite PWM pe 16 bii), dou uniti independente de Output Compare, regitri dublu buffer de Output Compare, o unitate Input Capture, auto reload, PWM, perioad variabil de PWM, generator de frecven, patru surse independente de ntreruperi (TOV1, OCF1A, OCF1B, ICF1).
Numar Reseteaz Direcie TOP Timer/Counter TCNTn = =0 BOTTOM (de la prescaler) OCnA (Int. req.) Generator de forma de und Control Logic TOVn (Int. Req.) Selectarea clock-ului Detector de front Tn

ICPn

OCRnA Valori TOP fixate =

OCnB (Int. req.) Generator de forma de und

ICPn

OCRnB ICFn(Int. req.) Detector de front Atenuator de zgomot

De la ieirea comparatorului analogic

ICRn

ICPn TCCRnA TCCRnB

Figura 10.1 Diagrama bloc a numrtorului pe 16 bii n generarea de frecvene intervin Timer/Counter (TCNT1), Input Capture Register (ICR1) i Output Compare Register (OCR1A/B sau OCR1x), toate 3 fiind registre pe 16 bii. Timer/Counter1 folosete 2 registre de 8 bii Timer Counter Control Register (TCCR1A/B), fr restricii de acces la procesor, pentru configurarea modului n care vrem s utilizm Timer-ul. Semnalele cererilor de ntrerupere sunt vizibile n registrul Timer Interrupt Flag (TIFR). Toate ntreruperile sunt mascate de registrul Time Interrupt Mask (TIMSK).

157

Laborator 10 - Generare de frecvene. Fast PWM, factor de umplere

10.2.1 ACCESAREA REGITRILOR PE 16 BII Regitrii pe 16 bii TCNT1, ICR1, OCR1A/B pot fi accesai de AVR CPU prin intermediul unei magistrale de 8 bii. Registrul pe 16 bii trebuie accesat pe octet folosindu-se 2 operaii de citire sau scriere. Fiecare registru pe 16-bii are un registru temporar pe 8 bii pentru stocarea octetului High. Registrul temporar este folosit de toate registrele de 16 bii ale aceluiai timer. Accesarea octetului Low lanseaz o operaie de citire sau scriere pe 16 bii. Cnd octetul Low al unui registru pe 16 bii este scris, octetul High stocat n registul temporar i octetul Low sunt copiate n registrul de 16 bii n acelai ciclu de clock. Cnd octetul Low este citit, octetul High este copiat n registrul temporar n acelai ciclu de clock n care octetul Low este citit. Nu toate registrele de 16 bii utilizeaz registrul temporar pentru octetul High. Citirea registrelor OCR1A/B nu implic utilizarea acestuia. La o operaie de scriere pe 16 bii, octetul High trebuie scris naintea octetului Low. La o operaie de citire, octetul Low trebuie citit naintea octetului High. Urmtorul exemplu de cod prezint cum se acceseaz regitrii timer pe 16 bii, presupunnd c nici o ntrerupere nu actualizeaz registrul temporar. Acela i principiu poate fi folosit la accesarea direct a regitrilor OCR1A/B i ICR1. Cnd se utilizeaz limbajul C, compilatorul se ocup de accesul pe 16 bii. Exemplu de cod n asamblare ... ; Set TCNT1 to 0x01FF ldi r17,0x01 ldi r16,0xFF out TCNT1H,r17 out TCNT1L,r16 ; Read TCNT1 into r17:r16 in r16,TCNT1L in r17,TCNT1H ... Exemplu de cod C
unsigned int i; ... /* Seteaz valoarea din TCNT1 la 0x01FF */ TCNT1 = 0x1FF; /* Citete valoarea din TCNT1 n i */ i = TCNT1; ...

Codul n limbaj de asamblare returneaz valoarea TCNT1 din perechea de registre r17:r16. Important de reinut este c accesarea regitrilor pe 16 bii este o operaie atomic. Dac o ntrerupere intervine ntre 2 instruc iuni de accesare a unui registru pe 16 bii, iar codul ntreruperii actualizeaz registrul temporar prin accesarea aceluia i sau a oricrui alt registru pe 16 bii al timer-ului, rezultatul accesrii din afara ntreruperii va fi eronat. Astfel, cnd i codul principal i cel al ntreruperii actualizeaz registrul temporar, codul principal trebuie s dezactiveze ntreruperile n timpul accesrii pe 16 bii. 158

Laborator 10 - Generare de frecvene. Fast PWM, factor de umplere

10.3 URMTORUL EXEMPLU ARAT CUM SE FACE O CITIRE ATOMIC A CONINUTULUI REGISTRULUI TCNT1. CITIREA REGISTRELOR ICR1 I OCR1A/B SE POATE FACE SIMILAR.
Exemplu de cod n asamblare TIM16_ReadTCNT1: ; Save global interrupt flag in r18,SREG ; Disable interrupts cli ; Read TCNT1 into r17:r16 in r16,TCNT1L in r17,TCNT1H ; Restore global interrupt flag out SREG,r18 ret Exemplu de cod C unsigned int TIM16_ReadTCNT1( void ) { unsigned char sreg; unsigned int i; /* Salveaz flagul global de ntreruperi */ sreg = SREG; /* Dezactiveaz ntreruperile */ _CLI(); /* Citete valoarea din TCNT1 n i */ i = TCNT1; /* Restaureaz flagul de ntreruperi */ SREG = sreg; return i; } Codul n limbaj de asamblare returneaz valoarea TCNT1 din perechea de registre r17:r16. Urmtorul exemplu arat cum se face o scriere atomic a coninutului registrului TCNT1. Citirea registrelor ICR1 i OCR1A/B se poate face similar. Exemplu de cod in asamblare TIM16_WriteTCNT1: ; Save global interrupt flag in r18,SREG ; Disable interrupts cli ; Set TCNT1 to r17:r16 out TCNT1H,r17 out TCNT1L,r16 ; Restore global interrupt flag out SREG,r18 159

Laborator 10 - Generare de frecvene. Fast PWM, factor de umplere

ret Exemplu de cod C void TIM16_WriteTCNT1 ( unsigned int i ) { unsigned char sreg; unsigned int i; /* Salveaz flagul global de ntreruperi */ sreg = SREG; /* Dezactiveaz ntreruperile */ _CLI(); /* Seteaz valoarea din TCNT1 n i */ TCNT1 = i; /* Restaureaz flagul de ntreruperei */ SREG = sreg; } Codul n asamblare necesit ca regitrii r17:r16 s conin valoarea ce trebuie scris in TCNT1. 10.3.1 UNITATEA DE NUMRARE Partea principal a Timer/Counter-ului pe 16 bii este unitatea de numrare pe 16 bii, bidirecional i programabil. n Figura 10.2 se poate vedea structura aceste uniti, unde semnificaia semnalelor este urmtoarea: count incrementare sau decrementare a TCNT1 cu 1 direction selecteaz ntre incrementare sau decrementare clear resetare TCNT1 clkT1 clock-ul Timer/Counter1 top TCNT1 a ajuns la valoarea sa maxim bottom TCNT1 a ajuns la valoarea minim (zero)
DATABUS (8-bit) TEMP (8-bit) TOVn (Int. req.)
Numr

TCNTnH (8-bit)

TCNTnL (8-bit)

Resetare
Direcie

TCNTn (numrtor pe 16 bii)

Control Logic
BOTTOM

clkTn

Detector de front

Tn

De la prescal er

Figura 10.2 Unitatea de numrare, Diagrama Bloc Numrtorul pe 16 bii este mapat la dou locaii de 8 bii de memorie I/O : Counter High (TCNT1H) coninnd primii 8 bii ai numrtorului, i Counter Low (TCNT1L) coninnd ultimii 8 bii. Registrul TCNT1H poate fi accesat doar indirect de ctre CPU. Atunci cnd CPU realizeaz un acces la locaia TCNT1H, CPU acceseaz registrul TEMP. Acesta din urm este actualizat cu valoarea TCNT1H atunci cnd 160

TOP

Laborator 10 - Generare de frecvene. Fast PWM, factor de umplere

TCNT1L este citit, iar TCNT1H este actualizat cu valoarea TEMP cnd TCNT1L este scris. Acest lucru face posibil scrierea sau citirea de ctre CPU a ntregii valori de 16 bii a numrtorului ntr-un singur ciclu de clock prin intemediul magistralei de 8 bii. n funcie de modul de operare folosit, numrtorul este resetat, incrementat, sau decrementat la fiecare ciclu de clock clkT1. ClkT1 poate fi generat extern sau intern, in funcie de biii de selecie a clock-ului (CS12:10). Atunci cnd nu este selectat nici o surs de clock (CS12:10=0) timer-ul este oprit. Indiferent dac clkT1 este prezent sau nu valoarea TCNT1 poate fi accesat de ctre CPU. Secvena de numrare este determinat de biii ce determin Modul De Generare A Formei De Und (WGM13:10), aflai in regitrii TCCR1A i TCCR1B. Flag-ul Timer/Counter Overflow (TOV1) este setat n funcie de modul de operare selectat de biii WGM13:10. TOV1 poate fi folosit pentru a genera ntreruperi CPU. 10.3.2 UNITATEA INPUT CAPTURE Timer-ul ncorporeaz o unitate Input Capture ce poate capta evenimente externe i le poate da o marc de timp ce indic momentul producerii. Semnalul extern ce indic un eveniment sau mai multe evenimente poate fi aplicat pe pinul ICP1 sau prin comparatorul analogic. Mrcile de timp pot fi folosite n calcularea frecven ei, factorului de umplere i altor caracteristici aplicate semnalelor. Mrcile de timp mai pot fi folosite n crearea unui event log. Unitatea Input Capture este ilustrat n diagrama bloc din Figura 10.3 . Elementele ce nu fac parte direct din acest ansamblu sunt colorate cu gri. Litera n din registre i numele biilor indic numrul Timer/Counter.

TEMP (8 bii)

ICRnH(8 bii)

ICRnL(8 bii)

TCNTnH(8 bii)

TCNTnL(8 bii)

WRITEICRn(Registru pe 16 bii)

TCNTn(Registru pe 16 bii)

+ ICPn

ACO

Analog Comparator

Atenuator de zgomot

Detector de front

Figura 10.3 Unitatea Input Capture, Diagrama bloc Cnd apare o schimbare a nivelului logic (un eveniment) apare pe Input Capture pin (ICP1), sau pe Analog Comparator output (ACO), iar schimbarea este confirmat de modul n care a fost setat detectorul de front, o captur va fi declanat. n acest moment, valoarea pe 16 bii a counterului TCNT1 este scris n ICR1. Flag-ul ICF1 este setat n aceeai perioad de clock n care valoarea din TCNT1 este scris n ICR1. Flag-ul ICF1 este pus pe 1 imediat ce ntreruperea este executat. 161

Laborator 10 - Generare de frecvene. Fast PWM, factor de umplere

Citirea valorii pe 16 bii din ICR1 se face prin citirea mai nti a octetului Low (ICR1L) i apoi a octetului High (ICR1H). Cnd se citete octetul Low, octetul High este copiat n registrul temporar (TEMP). Cnd procesorul citete locaia I/O a ICR1H va accesa registrul TEMP. Registrul ICR1 poate fi scris doar n modurile de generare de forme de und ce folosesc acest registru pentru redefinirea valorii TOP a numrtorului. n aceste cazuri modul de generare a formei de und trebuie setat nainte ca valoarea de TOP s poat fi scris n registrul ICR1. Atunci cnd se scrie registrul ICR1 octetul High trebuie scris n ICR1H naintea octetului Low n ICR1L. Registrul ICR1 poate fi scris doar n modurile de generare de forme de und pentru redefinirea valorii de TOP a registrului TCNT1. Astfel biii de mod WGM13:10 trebuie setai nainte de scrierea unei valori n ICR1. 10.1.1.1 Input Capture Pin Source

Sursa principal de declanare pentru unitatea Input Capture este Input Capture pin (ICP1). Timer/Counter1 poate folosi unitatea Analog Comparator output (ACO) c surs de declanare pentru unitatea Input Capture. Aceast unitate este selectat ca surs de declanare prin setarea bitului Analog Comparator Input Capture (ACIC) din registrul Analog Comparator Control and Status Register (ACSR). A se avea grij la schimbarea sursei de declanare deoarece aceasta poate declan o captur. Astfel flag-ul ICF1 trebuie eliberat dup efectuarea schimbrii. Att ICP1 ct i ACO sunt evaluate folosind aceeai tehnic ca pentru pinul T1. Detectorul de front este de asemenea identic. De altfel, dac atenuatorul de zgomot este activ, o logic adiional este inserat naintea acestuia, fapt ce crete ntrzierea cu 4 cicli de clock. Intrarea atenuatorului de zgomot i detectorului de front este ntotdeauna activ cu excepia modurilor de generare de forme de und ce folosesc ICR1 pentru a redefini valoarea de TOP. O captur de intrare poate fi declanat software prin controlarea portului n care se gsete pinul ICP1. 10.3.2.2 Utilizarea unitii Input Capture Principala provocare n utilizarea unitii Input Capture este alocarea de suficiente resurse procesor pentru tratarea evenimentelor. Timpul ntre 2 evenimente este critic. Dac procesorul nu a citit valoarea captat n registrul ICR1 nainte de apariia evenimentului urmtor, ICR1 va fi suprascris cu noua valoare. n acest caz, rezultatul capturii va fi incorect. Cnd se folosete ntreruperea Input Capture, registrul ICR1 ar trebui citit ct mai repede posibil n rutina de tratare a ntreruperii. Chiar dac ntreruperea Input Capture are o prioritate relativ ridicat, timpul maxim de rspuns al ntreruperii este dependent numrul de cicli de clock necesari tratrii altor cereri de ntrerupere. Utilizarea unitii Input Capture n alte moduri de operare n afar de cele n care valoarea de TOP trebuie schimbat nu este recomandat. Msurarea factorului de umplere a unui semnal extern necesit ca frontul de declan are s fie schimbat dup fiecare captur. Schimbarea detectrii frontului trebuie fcut pe ct de repede posibil dup ce registrul ICR1 a fost citit. Dup o schimbare de front, flag-ul ICF1 trebuie eliberat prin software (scrierea a 1 logic la adresa acestuia). 162

Laborator 10 - Generare de frecvene. Fast PWM, factor de umplere

Pentru msurarea frecvenei, eliberarea flag-ului ICF1 nu este necesar (dac se folosete o ntrerupere). 10.3.3 UNITATEA OUTPUT COMPARE Comparatorul face continuu comparri ntre TCNT1 i Output Compare Register (OCR1x), iar n cazul n care TCNT1 este egal cu OCR1x, se va genera o potrivire ntre semnale. Potrivirea va seta Output Compare Flag (OCF1x) la urmtorul ciclu de clock. Dac este activat (OCIE1x = 1), OCF1x va genera o ntrerupere la ieire i se va reseta automat n caz c ntreruperea este executat. Generatorul de und folosete potrivirea de semnal n concordan cu modul de operare setat de biii Waveform Generator mode(WGM13:0) si Compare Output mode (COM1x1:0). O caracteristic special a OCR1A este ca permite definirea valorii TOP a timerului, valoare ce definete perioada de timp pentru unda generat de Waveform Generator. n Figura 10.4 este prezentat diagrama bloc a Output Compare:

TEMP (8 bii)

OCRnxH Buf.(8 bii)

OCRnxL Buf.(8 bii)

TCNTnH Buf.(8 bii)

TCNTnL Buf.(8 bii)

OCRnx Buffer (Registru pe 16 bii)

TCNTn (Regsitru pe 16 bii)

OCRnxH (8 bii)

OCRnxL (8 bii)

OCRnx (Registru pe 16 bii)

= (Comparator pe 16 bii) OCFnx (Int. Req.)

TOP BOTTOM

Generator de forme de und

OCnx

WGMn3:0

COMnx1:0

Figura 10.4 Diagrama bloc Unitatea Output Compare 10.3.3.1 Utilizarea unitii Output Compare Cum scrierea TCNT1 n oricare mod de operare blocheaz toate potrivirile la comparare pentru un ciclu de timer clock, exist riscuri n schimbarea TCNT1 cnd sunt utilizate oricare din unitile Output Compare, chiar dac Timer/Counter este n 163

Laborator 10 - Generare de frecvene. Fast PWM, factor de umplere

funciune sau nu. Dac valoarea scris n TCNT1 este egal cu valoarea din OCR1x, potrivirea la comparare va fi srit rezultnd un semnal generat incorect. A nu se scrie TCNT1 egal cu TOP n modurile PWM cu valori de TOP variabile. Potrivirea la comparare pentru TOP va fi ignorat i numrtorul va continua pn la 0xFFFF. Similar a nu se egala TCNT1 cu BOTTOM cnd numrtorul funcioneaz descresctor. Setarea OC1x trebuie fcut nainte de setarea registrului Data Direction pentru pinul de ieire. Cea mai uoar modalitate de setare a valorii OC1x este folosirea biilor Force Output Compare (FOC1x) n modul Normal. Registrul OC1x i pstreaz valoarea la schimbarea modurilor de generare de forme de und. A se avea grij c biii COM1x1:0 nu sunt double buffered mpreun cu valoarea comparat. Schimbarea acestora va declana efectul dorit imediat. 10.3.3.2 Unitatea Compare match output Biii Compare Output mode (COM1x1:0) au dou funcii. Generatorul de forme de und i folosete pentru definirea strii Output Compare (OC1x) la urmtoarea potrivire. n al doilea rnd acetia controleaz sursa de ieire a pinului OC1x. Figura 10.5 prezint o schem simplificat a logicii afectate de setarea biilor COM1x1:0. Registrele, biii i pinii I/O din figur sunt evideniate prin bold. Sunt prezentate doar prile generale are regitrilor de I/O Port Control (DDR i PORT) care sunt afectate. Cnd spunem starea OC1x, ne referim la registrul intern OC1x i nu pinul OC1x. La apariia unui reset de sistem, registrul OC1x este resetat la 0.

COMnx1 COMnx0 FOCnX Generator de forme de und

SET

CLR

OCnx
SET

OCN x Pin

D
0 0 0

CLR

PORT
SET

CLK_I/O

CLR

DDR

Figura 10.5 SchemUnitate Compare match output Funcia general a portului I/O este nclcat de OC1x din generatorul de forme de und dac oricare din biii COM1x1:0 sunt setai. De altfel, direcia pinului OC1x (intrare sau ieire) este nc controlat de Data Direction Register (DDR). Bitul pentru pentru pinul OC1x din DDR (DDR_OC1x) trebuie setat nainte ca valoarea de ieire pe pinul OC1x s fie vizibil. 164

Laborator 10 - Generare de frecvene. Fast PWM, factor de umplere

Logica pinului de output compare permite iniializarea strii OC1x nainte ca ieirea s fie activat. Unele setri ale biilor COM1x1:0 sunt rezervate pentru anumite moduri de operare. Acetia nu au nici un efect asupra unitii Input Capture. 10.3.3.3 Modul Compare Output si Generarea de forme de und Generatorul de forme de und utilizeaz biii COM1x1:0 diferit n modurile normal, CTC i PWM. Pentru toate modurile COM1x1:0 semnaleaz generatorului de forme de und c nici o aciune nu va fi fcut asupra registrului OC1x la urmtoarea potrivire. O schimbare a strii biilor COM1x1:0 va lua efect la prima potrivire dup ce biii au fost scrii.

10.3.4 MODURI DE OPERARE Timer-ul 1 poate funciona in cinci moduri de operare: mod normal, mod Clear Timer on Compare Match(CTC), mod Fast PWM, mod Phase Correct PWM, mod Phase and Freqency Correct PWM. 10.3.4.1 Modul Fast PWM Modul Fast Pulse Width Modulation sau modul Fast PWM ( WGM13:0 = 5,6,7,14, sau 15) furnizeaz o opiune de generare a unei unde PWM de frecven mare. Fast PWM difer de alte PWM-uri prin funcionarea pe o singur pant. Counter-ul numr de la BOTTOM la TOP apoi se restarteaz de la BOTTOM. La modul non-inversat Compare Output, Output Compare (OC1x) este resetat cnd valorile lui TCNT1 i OCR1x sunt egale i este setat la BOTTOM. Datorit funcionrii pe o singur pant, frecvena de operare a modului Fast PWM poate fi de dou ori mai mare dect n cazul modurilor care funcioneaz pe dou pante. Frecvena mare a modului Fast PWM face acest mod potrivit pentru regulrile, rectificrile de tensiune i aplicaiile DAC. Funcionarea la frecvene nalte permite i componentelor de mici dimensiuni s funcioneze (bobine, condensatori), reducndu-se, prin urmare, consumul sistemului. Rezoluia PWM-ului pentru modul Fast PWM poate fi fixat la 8, 9 sau 10 bii sau definit de ICR1 sau OCR1A. Rezoluia minim admis este de 2 bii (ICR1 sau OCR1A setat la 0x0003) i cea maxim de 16 bii (ICR1 sau OCR1A setat la MAX). Rezoluia PWM-ului n bii poate fi calculat folosind urmtoarea ecuaie:

FPWM

log(TOP 1) log(2)

n modul Fast PWM counterul este incrementat pn cnd valoarea lui atinge una din valorile fixate 0x00FF, 0x01FF sau 0x03FF (WGM13:0 = 5, 6 sau 7), valoarea n ICR1 (WGM13:0 = 14), sau valoarea n OCR1A (WGM13:0 = 15). Counter-ul este resetat la urmtorul ciclu de clock al timer -ului.

165

Laborator 10 - Generare de frecvene. Fast PWM, factor de umplere

OCRnx/TOP update and TOVn Interrupt Flag Set and OCnA Interrupt Flag Set OCnA Interrupt Flag Set (Interrupt on TOP)

OCnx

COMnx1:0=2

OCnx

COMnx1:0=3

Perioada

Figura 10.6 Modul Fast PWM, Diagrama de timp n Figura 10.6 este descris modul de operare Fast PWM cnd OCR1A sau ICR1 sunt utilizai ca TOP. Valorile lui TCNT1 din diagram ilustreaz modul de operare pe o singur pant. Linia orizontal dintre pantele lui TCNT1, reprezint comparrile dintre OCR1x i TCNT1. OC1x va fi setat atunci cnd apare o potrivire de valori. Timer/Counter Overflow Flag (TOV1) este setat de fiecare dat cnd counterul ajunge la TOP. n plus, OC1A sau ICF1 Flag este setat la acelai ciclu de clock al timer-ului ca TOV1 atunci cnd OCR1A sau ICR1 este folosit pentru a defini valoarea TOP. Dac vreuna dintre ntreruperi este permis, rutina de ntreruperi poate fi folosit pentru updatarea valorii TOP i compararea valorilor. Cnd se schimb valoarea TOP, programul trebuie s se asigure c noua valoare TOP este mai mare sau egal cu valoarea tuturor celorlali regitri. Dac valoarea TOP este mai mic dect una dintre valorile regitrilor Compare nu va aprea nici o potrivire de valori ntre TCNT1 i OCR1x. Cnd sunt folosite valori fixe TOP, biii nefolosii sunt redui la zero cnd oricare dintre valorile regitrilor OCR1x este stabilit. Procedura de updatare pentru ICR1 difer de updatarea pentru OCR1A cnd este folosit pentru definirea valorii TOP. Registrul ICR1 nu este dublu buffered. Asta nseamn c, dac ICR1 este schimbat la o valoarea mai mic c nd counter-ul funcioneaz fr nici o valoare sau cu o valoare mic a prescaler -ului, atunci exist riscul ca noua valoare stabilit pentru ICR1 s fie mai mic dect valoarea curent a TCNT1. n acest fel counter -ul nu va atinge nici o valoarea comun la valoarea TOP. Counter-ul va trebui atunci s numere pn la valoarea MAX (0xFFFF) i s revin la 0x0000 pentru a atinge o valoarea comun. Registrul OCR1A este dublu buffered. Aceast caracteristic permite ca locaia I/O pentru OCR1A s fie scris oricnd. Cnd locaia I/O pentru OCR1A este stabilit 166

Laborator 10 - Generare de frecvene. Fast PWM, factor de umplere

aceasta va fi pus pe buffer -ul registrului OCR1A. Registrul OCR1A va fi updatat la urmtorul ciclu al timer-ului de clock cnd TCNT1 atinge TOP. Updatarea este fcut n acelai ciclu al timer clock-ului n care TCNT1 este resetat i TOV1 Flag este setat. Folosirea registrului ICR1 pentru definirea valorii TOP este potrivit atunci cnd sunt folosite valori TOP fixe. Folosind ICR1, registrul OCR1A este liber s fie folosit pentru a genera o ieire PWM pe OC1A. Cu toate acestea, n cazul n care frecvena de baz a PWM este schimbat activ (prin schimbarea valorii TOP), f olosirea lui OCR1A pentru TOP este o alegere mai bun datorit buffer-ului dublu. n modul Fast PWM, unitile Compare permit generarea undelor PWM pe pinii OC1x. Setarea biilor COM1x1:0 la 2 va produce un PWM non-inversat, iar un PWM inversat poate fi obinut prin setarea lui COM1x1:0 la 3. Valoarea actual a lui OC1x va fi vizibil doar pe pinul portului dac direcia pentru acesta este setat ca ieire (DDR_OC1x). Unda PWM este generat prin setarea (resetarea) registrului OC1x la o valoarea comun ntre OCR1x i TCNT1 i setarea (resetarea) registrului OC1x la ciclul timer clock-ului cnd counterul este setat (se schimb din TOP n BOTTOM). Frecvena PWM pentru ieire poate fi calculat prin urmtoarea formul:

OCnxPWM

clk _ I / O

N * (1 TOP )

Variabila N reprezint divizorul pentru prescaler (1, 8, 64, 256, or 1024). Valorile extreme pentru registrul OCR1x reprezint cazuri speciale cnd este generat o und de ieire PWM n modul Fast PWM. Setnd valoarea lui OCR1x egal cu TOP va rezulta o ieire nalt sau joas (depinznd de polaritatea ieirii setat de biii COM1x1:0). O anumit frecven a undei de ieire (cu 50% duty cycle) n modul Fast PWM poate fi obinut prin setarea lui OC1A s-i comute level-ul logic la fiecare valoare comun (COM1A1:0 = 1). Asta se aplic doar dac OCR1A este folosit pentru a defini valoarea TOP (WGM13:0 = 15). Unda generat va avea frecvena maxim la

OC 1 A

clk _ I / O

/ 2 cnd OCR1A este setat la zero (0x0000). Aceast

caracteristic este similar i la comutarea OC1A n modul CTC, exceptnd caracteristica c bufferul dublu al unitii Output Compare exist doar n modul Fast PWM. 10.3.5 DESCRIEREA REGITRILOR Timer-ul pe 16 bii Timer1 conine un set de regitri care trebuie configurai pentru ca s funcioneze n modul de operare dorit, n cazul nostru Fast PWM. O descriere a regitrilor timerului Timer/Counter1 este fcut n continuare.

167

Laborator 10 - Generare de frecvene. Fast PWM, factor de umplere

10.3.5.1 Timer/Counter1 Control Register A TCCR1A


Bit

0
TCCR1A

COM1A1 COM1A0 COM1B1 COM1B0 FOC1A FOC1B WGM11 WGM10

Read/Write Valoare iniial

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

Biii 7:6 - COM1A1:0 : Modul Compare Output pentru canalul A Biii 5:4 - COM1B1:0 : Modul Compare Output pentru canalul B Biii COM1A1:0 i COM1B1:0 controleaz comportamentul pinilor de Output Compare (OC1A i respectiv OC1B). Dac unul sau amndoi din biii COM1A1:0 sunt scrii pe 1, ieirea OC1A suprascrie funcionalitatea normal a portului I/O la care este conectat pinul. Acelai lucru i n cazul COM1B1:0, cu precizarea c cel care suprascrie este OC1B. n orice caz bitul corespunztor lui OC1A sau OC1B din registrul Data Direction (DDR) trebuie setat ca ieire. Atunci cnd OC1A sau OC1B este conectat la pin, funcionalitatea COM1x1:0 este dependent de setrile din WGM13:10. COM1 COM1A0/ Descriere A1/CO COM1B0 M1B1 0 0 Operaie normal pe port, OC1A/OC1B deconectate. 1 WGM13:0 = 15: Folosete OC1A la potrivire, OC1B 0 deconectat, operaie normal pe port). Pentru toate celelalte moduri WGM13:0, operaie normal pe port, OCnA/OCnB deconectate. 0 Reseteaz OC1A/OC1B la potrivire, seteaz OC1A/OC1B la 1 BOTTOM, (mod neinversabil) 1 Seteaz OC1A/OC1B la potrivire, reseteaz OC1A/OC1B la 1 BOTTOM, (mod inversabil) Tabel 100.1 Modul Compare Output, Fast PWM Bitul 3 FOC1A: Force Output Compare pentru canalul A Bitul 2 FOC1B: Force Output Compare pentru canalul B Aceti bii sunt activi numai cnd WGM13:0 specific un mod non-PWM. n orice caz, pentru a asigura compatibilitate cu viitoarele dispozitive, aceti bii trebuie setai pe zero atunci cnd TCCR1A este scris, cnd se opereaz in moduri PWM. Cnd se scrie 1 logic la aceti bii este forat o potrivire imediat la unitatea de generare a formelor de und. Biii 1:0 WGM11:10 :Modul de generare a formelor de und

168

Laborator 10 - Generare de frecvene. Fast PWM, factor de umplere

Mode

WG M13 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1

WGM 12 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1

WG M11 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1

WGM 10 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1

Moduri de operare ale Timer/Counter Normal PWM, Phase Correct, 8-bit PWM, Phase Correct, 9-bit PWM, Phase Correct, 10-bit CTC Fast PWM, 8-bit Fast PWM, 9-bit Fast PWM, 10-bit PWM, Phase and Frequency Correct PWM, Phase and Frequency Correct PWM, Phase Correct PWM, Phase Correct CTC Rezervat Fast PWM Fast PWM

TOP

Actualizare OCR1x Imediat TOP TOP TOP Imediat BOTTOM BOTTOM BOTTOM BOTTOM BOTTOM TOP TOP Imediat BOTTOM BOTTOM

Flag-ul TOV1 setat pe MAX BOTTOM BOTTOM BOTTOM MAX TOP TOP TOP BOTTOM BOTTOM BOTTOM BOTTOM MAX TOP TOP

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

0xFFFF 0x00FF 0x01FF 0x03FF OCR1A 0x00FF 0x01FF 0x03FF ICR1 OCR1A ICR1 OCR1A ICR1 ICR1 OCR1A

Tabel 100.2 Moduri de operare Not: FPWM = Fast PWM PFC = Phase and Frequency Correct PC = Phase Correct

10.3.5.2 Timer/Counter1 Control Register B TCCR1B


Bit

7
ICNC1

6
ICNS1
R/W 0

5
R/W 0

1
CS11
R/W 0

0
CS10
R/W 0

WGM13 WGM12 CS12


R/W 0 R/W 0 R/W 0

TCCR1B

Read/Write Valoare iniial

R/W 0

Bitul 7 ICNC1 : Input Capture Noise Canceler Setnd acest bit (valoarea 1) se activeaz Input Noise Canceler. 169

Laborator 10 - Generare de frecvene. Fast PWM, factor de umplere

Bitul 6 ICES1 : Input Capture Edge Select Bitul 5 Rezervat Biii 4:3 WGM13:12: Modul de generare formei de und A se vedea registrul TCCR1A Biii 2:0 CS12:10 : Selecia clock-ului CS12 0 0 0 0 1 1 1 1 CS11 0 0 1 1 0 0 1 1 CS10 0 1 0 1 0 1 0 1 Descriere Fr surs clock ( Timer/Counter oprit) clkI/O (fr prescaler) clkI/O/8 (de la prescaler) clkI/O/64 (de la prescaler) clkI/O/254 (de la prescaler) clkI/O/1024 (de la prescaler) Surs extern de clock pe pinul T0. Clock pe front negativ. Surs extern de clock pe pinul T0. Clock pe front pozitiv.

Tabel 100.3 Descrierea biilor de selecie a clock-ului

10.3.5.3 Timer/Counter1 TCNT1H i TCNT1L


Bit

0
TCNT1H TCNT1L

TCNT1[15:8] TCNT1[7:0]

Read/Write Valoare iniial

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

Cele dou locaii dau acces direct la numrtorul pe 16 bii a Timer/Counter-ului, att pentru operaii de scriere, ct i pentru operaii de citire. Modificarea valorii din TCNT1 n timp ce counter-ul este activ introduce riscul de a pierde o potrivire ntre TCNT1 i unul din regitrii OCR1x. Scriind n TCNT1 blocheaz potrivirea n urmtorul ciclu de clock pentru toate unitile de comparare. 10.3.5.4 Output Compare Register 1 A OCR1AH i OCR1AL
Bit

0
OCR1AH OCR1AL

OCR1A[15:8] OCR1A[7:0]

Read/Write Valoare iniial

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

170

Laborator 10 - Generare de frecvene. Fast PWM, factor de umplere

10.3.5.5 Output Compare Register 1 B OCR1BH i OCR1BL


Bit

0
OCR1BH OCR1BL

OCR1B[15:8] OCR1B[7:0]

Read/Write Valoare iniial

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

R/W 0

Registrul Output Compare conine o valoare pe 16 bii ce este comparat permanent cu valoarea TCNT1. O potrivire poate fi folosit s genereze o ntrerupere, sau s genereze o form de und la ieirea pinului OC1x. 10.3.5.6 Input Capture Register 1 ICR1H i ICR1L
Bit 7 6 5 4 3 2 1 0 ICR1H ICR1L R/W 0 R/W 0 R/W 0

ICR1[15:8] ICR1[7:0] Read/Write Valoare iniial R/W 0 R/W 0 R/W 0 R/W 0 R/W 0

Input Capture se updateaz cu valoarea lui TCNT1 de fiecare dat cnd intervine un eveniment pe pinul ICP1. Input Capture poate fi utilizat pentru definirea valorii TOP a counter-ului.

10.3.5.7 Timer/Counter Interrupt Mask Register TIMSK


Bit

7
OCIE2

6
TOIE2
R/W 0

1
OCIE0
R/W 0

0
TOIE0
R/W 0

TICIE1 OCIE1A OCIE1B TOIE1 R/W 0 R/W 0 R/W 0 R/W 0

TIMSK

Read/Write Valoare iniial

R/W 0

Bitul 5 TICIE1 : Timer/Counter1 Input Capture Interrupt Enable Bitul 4 OCIE1A: Timer/Counter1 Output Compare A Match Interrupt Enable Bitul 3 OCIE1B: Timer/Counter1 Output Compare B Match Interrupt Enable Bitul 2 TOIE1: Timer/Counter1, Overflow Interrupt Enable Atunci cnd unul din aceti bii este setat pe 1 , iar ntreruperile sunt activate global, se activeaz ntreruperea corespunztoare. Vectorul corespunztor ntreruperii este executat atunci cnd flag-ul corespunztor ntreruperii, din registrul TIFR (Timer/Counter Interrupt Flag Register) este setat.

171

Laborator 10 - Generare de frecvene. Fast PWM, factor de umplere

10.4

PAII PENTRU GENERAREA UNEI FORME DE UND CU ATMEGA16

Exemplu: S se genereze un semnal cu frecven a de 1kHz utiliznd Timer/Counter1 n modul Fast PWM (14) fr prescaler, cu factor de umplere de 50%. Trebuie specificat c ATmega16 are un clock intern de 4MHz, dar acesta este cazul ideal. n realitate acesta funcioneaz la ~4MHz. Scopul este de a genera o frecven de 1kHz real, pornind de la cteva date ideale. Pasul 1. Se verific cte perioade de clock ale microcontroler-ului sunt necesare pentru a compune o perioad din semnalul cerut.

Rezult c perioada noastr ar trebui s cuprind exact 4000 perioade de clock interne. Acest numr va fi stocat n registrul ICR1 (va fi valoarea de TOP a TCNT1). Factorul de umplere fiind de 50% va avea valoarea OCR1A=(ICR1)/2. Pasul 2. Construirea programului de generare a frecvenei

#include<inavr.h> #include<iom16.h> int cnt=0; //variabila pentru ntrerupere //ntreruperea de overflow la timer1 #pragma vector=TIMER1_OVF_vect __interrupt void T1int(void) { cnt++; } //configurarea timer 1 void timer1_INIT() { /* Modul Fast PWM: WGM13:10=1110; Fr prescaler: CS12:10=001; Compare Output Mode: 10 */ TCCR1B|=(1<<WGM13)|(1<<WGM12)|(1<<CS10); TCCR1A|=(1<<COM1A1)|(1<<WGM11); TIMSK|=(1<<TOIE1); }

172

Laborator 10 - Generare de frecvene. Fast PWM, factor de umplere

void main() { //Alegerea pinului de ieire DDRD|=(1<<PD5); PORTD&=(1<<PD5); //Iniializarea timer-ului timer1_INIT(); //Valoarea care se ncarc frecvena necesar ICR1=4000; //Factor de umplere de 50% OCR1A=ICR1>>1; //pornirea ntreruperii __enable_interrupt(); while(1) { } } n registru n funcie de

Pasul 3. Se execut programul, se verific cu COUNTER HM 8021 -4 i se constat c frecvena generat nu este exact 1kHz. Pasul 4. Se calculeaz perioada frecvenei obinute i se utilizeaz regula de 3 simpl pentru a calcula noua valoare ce trebuie nregistrat n ICR1. Perioada.ICR1 Calculat4000 1ms.x Este posibil ca i de aceast data s nu rezulte exact 1kHz. Se va reaplica pasul 4 sau dac frecvena rezultat este deja foarte apropiat de rezultatul dorit se va modifica ICR1 intuitiv.

173

Laborator 10 - Generare de frecvene. Fast PWM, factor de umplere

Figura 100.7 Forma final a semnalului generat

10.5

APLICAII

S se genereze un semnal Fast PWM utiliznd Timer/Counter1 (mod 14).


a. Frecvena semnalului iniial este de 1kHz. Factorul de umplere este de 50%. Utiliznd terminalului la trimiterea caracterului + frecvena va crete cu 1kHz, iar la trimiterea caracterului - frecvena va scade cu 1kHz intervalul de variaie fiind [1kHz,10kHz]. Factorul de umplere trebuie s rmn la 50%. Avnd un factor de umplere iniial de 5%, utiliznd terminalului la trimiterea caracterului + factorul de umplere va crete cu 5%, iar la trimiterea caracterului - va scade cu 5%, intervalul de variaie fiind [5%,95%]. Frecvena rmne constant. Frecvena iniial este de 1kHz i factorul de umplere iniial de 5%. Utiliznd terminalului la trimiterea caracterului + frecvena va crete cu 500Hz i factorul de umplere cu 3%, iar la trimiterea caracterului - frecvena va scade cu 500Hz i factorul de umplere cu 3%. Intervalul de varia ie pentru frecven: [1kHz,15kHz], iar pentru factorul de umplere [5%,95%].

b.

c.

174

Laborator 11 - Periodmetrul. Calcul timp.

11 Periodmetrul. Calcul timp.


11.1 PERIODMETRUL
11.1.1 DEFINIIE Periodmetru este un aparat electronic folosit pentru msurarea perioadelor semnalelor periodice. Pentru frecventele mici cnd eroarea frecvenmetrului crete foarte mult datorit numrului mic de impulsuri contorizate pe durata timpului de msurare se folosete schema unui periodmetru care este asemntoare cu a frecvenmetrului doar c timpul de msurare este definit de semnalul necunoscut iar impulsurile de numrat sunt cele provenite de la oscilator. Impulsurile de la oscilator au o foarte mare importanta incrementarea numrtorului iar restul este asemntor frecvenmetrului. De observat ca, frecvenmetru numeric singular se utilizeaz, de regul, ca aparat de tablou i mai rar ca aparat de laborator, deoarece, in acest ultim caz, este mai economic includerea lui intr-un aparat cu funcionaliti multiple: frecvenmetru/ periodmetru, numrtor/temporizator universal (foarte rspndit pan la apariia unor instrumente similare, dar bazate pe microprocesor), generator de semnal, osciloscop numeric,etc. Frecvenmetrul numeric poate fi utilizat i pentru msurarea tensiunilor sau curenilor, prin asocierea sa cu un convertor tensiune-frecven. Un exemplu de periodmetru este aparatul de msur Hameg 8021-4, care poate fi folosit si ca frecvenmetru aa cum s-a prezentat in laboratorul 8. Aadar, la frecvene mici, singura modalitate de a msura precis frecvena, fr a mri exagerat timpul de msur, este folosirea modului periodmetru. Principala caracteristica a periodmetrului este ca, tactul numrtorului este furnizat de baza de timp , din care sunt selectate de aceast dat frecvene mari , ncepnd cu frecvena oscilatorului ; Aadar un semnal se numete periodic dac se reproduce ide ntic la intervale de timp egale.Cel mai mic dintre aceste intervale este perioada T, iar numr ul de perioade ce au loc intr-o secund reprezint frecvena f=1/T. Exista dou metode de msurare a frecvenelor : analogice(metode ce se bazeaz pe compararea cu o alta frecven), numerice (se bazeaz pe numrarea ciclilor ntr-un interval de timp dat). Msurarea numeric a perioadei, este o metod care const in numrarea a numrului de cicli de clock trecui de la startul perioadei pn la sfritul acesteia. Aadar marea majoritate a aplicaiilor de control se bazeaz pe msurarea timpului. Mai exact, este necesar s tim cnd s -a scurs un anumit timp.

175

Laborator 11 - Periodmetrul. Calcul timp. Exist trei moduri n care se poate face acest lucru: Primul mod n care se poate atepta un anumit interval de timp este s se numere. De exemplu, se poate determina cnd a trecut un minut numrnd de la 120 la 180, fcnd cte un pas la fiecare secund. n software aceasta metod are drept corespondent incrementarea unei variabil ntr -o bucl for:
for(i=120; i<180; i++){wait(o_secunda);}

Metoda are dezavantajul c att timp ct se numr nu se mai pot executa alte aciuni; Toat fora de calcul a procesorului este folosit pentru incrementare. n plus metoda este imprecis. Cu toate acestea metoda este uneori utilizat. Al doilea mod n care se poate atepta presupune s avem un ceas sau un temporizator. n acest caz ateptarea este mult mai precis i n plus se pot executa i alte aciuni n timp ce temporizatorul funcioneaz. ntr -un sistem de calcul rolul ceasului sau al temporizatorului este ndeplinit de numrtoare. Al treilea mod reprezint o mbuntire a modului doi. Se va aduga la temporizator o ntrerupere care se va activa la o anumit valoare dat. La procesoare acest mod de lucru se numete execuie pe ntreruperi i necesit tot numrtoare, ca la modul 2.

11.2 MSURAREA INTERVALELOR DE TIMP


O alt aplicaie frecvent a numrtoarelor const n msurarea perioadei unui semnal: de exemplu se dorete construirea unui turometru electronic. Pe axul motorului se monteaz un senzor care ofer un puls la fiecare rotaie complet a motorului, notat Puls de la traductor PT n Figura 11.1. Perioada acestuia este notat Tx n figur.
Puls de la Traductor - PT Tnum Numrtor 0 1 2 Registru x 0 3 4 5 6 Tx 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 9 24 17

Figura 11.1 Pentru a calcula perioada semnalului PT se folosete metoda ceasului pentru msurarea duratei unei activiti sau fenomen: se noteaz timpul la care a nceput activitatea i timpul la care aceasta s-a sfrit i apoi se face diferena celor doi timpi. Numrtorul joac rolul ceasului. n Figura 11.1 prima perioad a lui PT ncepe cnd numrtorul are valoarea 1 i se termin cnd are valoarea 9. Perioada Tx a lui PT este 9-1=8 perioade ale ceasului numrtorului. Pentru un Tnum de 1us obinem Tx=8 us. 176

Laborator 11 - Periodmetrul. Calcul timp. Msurarea perioadei lui TP se face ncontinuu. Pentru urmtoarele perioade diferena timpilor este 17-9=8 i 24-17=7. Desigur, valoarea 8 are scop didactic. n realitate turaia unui motor variaz ntre 800 i 10000 de rotaii pe minut, ceea ce nsemn 13 167 rotaii pe secund, adic o perioad ntre 77 ms i 6 ms. Pe baza acestor dou valori se alege perioada Tnum. Tnum trebuie s fie suficient de mare ca 77 ms s se reprezinte pe cel mult 16 bii, ct este dimensiunea numrtoarelor din majoritatea microcontrolerelor. De exemplu, pentru Tnum = 1us, 77 ms nseamn o valoarea a numrtorului de 77000 de pulsuri. Aceast valoarea nseamn un numrtor pe mai mult de 16 bii, aa c Tnum = 1us este prea mic. Pe de alt parte, pentru ca msurarea s fie precis, perioada lui Tnum trebuie s fie de cel puin 100 de ori mai mic dect Tx. Astfel se obine o precizie mai bun de 1%. Valoarea inferioar a lui Tx, i anume 6 ms, impune valoarea maxim 6ms/100=60 us pentru Tnum. Oricare numrtor (timer/counter) poate fi configurat s numere fie impulsuri interne (timer), fie impulsuri externe (counter). Cele trei numrtoare pot fi pr ogramate s funcioneze n 4 moduri: normal, CTC( Clear Timer on Compare Match), PWM rapid i PWM cu faz corect. n modul normal numrtorul 0 poate fi folosit pentru aplicaiile detaliate anterior: generarea de intervale de timp i numrarea evenimentelor. Exist o categorie de aplicaii care nu poate fi implementat corect n modul normal, cum ar fi divizorul de impulsuri pentru care se folosete metoda CTC. Tehnica variaiei factorului de umplere se numete PWM-Pulse With Modulation. Pe lng controlul turaiei motoarelor de curent continuu , metoda este folosit i pentru controlul luminozitii LED -urilor.

11.3
Enun

APLICAII

Msurare impuls fr ntreruperi.


#include <inavr.h> #include <iom16.h> unsigned long nr_us; unsigned int nr_cicli; //msurare impuls fr ntrerupere void main( void ) { TCCR1A=0;//iniializare timer mod normal i dezactivare clock TCCR1B=0; DDRD&=~(1<<PD2);//pinul PD2 este de input

while(PIND & (1<<PD2)==0);//ateptam frontul pozitiv

177

Laborator 11 - Periodmetrul. Calcul timp.

//a aprut frontul pozitiv TCCR1B|=(1<<CS12);//pornire clock timer cu prescaler de 256 while(PIND & (1<<PD2)==1);//ateptam frontul negativ //a aprut frontul negativ nr_cicli=TCNT1;//salvm numrul de ciclii //calculam perioada n microsecunde nr_us=nr_cicli/4*256; //nr_us=nrciclii* (perioada unui ciclu, adic 0.25 microsecunde) * prescaler //aici se poate trimite pe serial perioada. return; }

Msurarea impulsului cu ntreruperi.


#include #include unsigned unsigned unsigned <inavr.h> <iom16.h> int per; int nr_cicli; int flag_per;

#pragma vector=INT0 __interrupt void isr_INT0(void){ if(PIND&(1<<PD2)==1){ TCNT1=0;///reset timer TCCR1B=(1<<CS12);//start timer cu prescaler de 256 } else{ nr_cicli=TCNT1;//salveaz nr cicli per=(nr_cicli/4)*256;//calculeaz perioada n microsecunde flag_per=1; } } int main( void ) { unsigned int x; // iniializare ntrerupere extern MCUCR |=(1<<ISC00); MCUCR &=~(1<<ISC01); GICR |=(1<<INT0); //activare ntrerupere extern

178

Laborator 11 - Periodmetrul. Calcul timp.

while(1){ while(flag_per==0);//ateapt msurare ntrerupere flag_per=0;//reseteaz flag x=per;//se face ceva cu valoarea msurat } }

Msurare perioadei fr ntrerupere


#include <inavr.h> #include <iom16.h> unsigned long nr_us; unsigned int nr_cicli; //msurare perioada fr ntrerupere void main( void ) { TCCR1A=0;//iniializare timer mod normal si dezactivare clock TCCR1B=0; DDRD&=~(1<<PD2);//pinul PD2 este de input

while(PIND & (1<<PD2)==0);//ateptm frontul pozitiv //a aprut frontul pozitiv TCCR1B|=(1<<CS12);//pornire clock timer cu prescaler de 256 while(PIND & (1<<PD2)==1);//ateptm frontul negativ //a aprut frontul negativ while(PIND & (1<<PD2)==0);//ateptm frontul pozitiv pentru a completa perioada nr_cicli=TCNT1;//salvm numrul de ciclii //calculam perioada in microsecunde nr_us=nr_cicli/4*256; //nr_us=nrciclii* (perioada unui ciclu, adic 0.25 microsecunde) * prescaler //aici se poate trimite pe serial perioada return; }

179

Laborator 12 - Combinarea codului C i ASM n IAR

12
12.1

Combinarea codului C i ASM n IAR

INTRODUCERE

Se va nva modul de folosire a compilatorului pentru C pus la dispoziie de IAR pentru controlerele AVR n proiecte ce conin att cod C, ct i cod ASM. Combinnd C i ASM se pot combina instruciunile puternice puse la dispoziie de limbajul C mpreun cu eficacitatea instruciunilor scrise n ASM specifice pentru fiecare component n parte.

Assembly
+Control total al modului de utilizare a resurselor + Compact i foarte rapid n aplicaii mici - Ineficient n aplicaii de dimensiuni mari -Greu de neles -Greu de meninut -Nu e portabil

C
+Eficient n aplicaii mari +Cod structurat +Uor de metinut +Uor de portat -Contol limitat al modului de utilizare a resurselor -Cod de dimensiuni mai mari i mai ncet n aplicaii mici

Figura 12.1 Plusurile i minusurile ale C i ASM

12.2

TRANSMITEREA DE VARIABILE NTRE FUNCIILE SCRISE N C I FUNCIILE SCRISE N ASM

Cnd compilatorul IAR este folosit mpreun cu controllerele AVR, fiierele registru sunt segmentate precum n Figura 122.2. Registrele Scratch sunt acele registre ce pot fi folosite de ctre mod ulele ASM, sau n alte obiecte externe fr a fi necesar salvarea coninutului. Registrele Scratch nu sunt pstrate ntre apelurile de funcii, ns registrele locale sunt pstrate. Registrul Y (R28:R29) este folosit ca stack pointer pentru SRAM. Registrele Scratch sunt folosite pentru transmiterea parametrilor i a valorilor de return ntre funcii. Cnd o funcie este apelat parametrii necesari vor fi salvai n Regitrii R16R23. Cnd o funcie returneaz o valoare, aceast valoare va fi salvat n Regitrii R16R19 n funcie de dimensiunea parametrilor i a variabilei returnate. Figura 122.3 arat cteva exemple de salvare a parametrilor , pentru diferite apeluri de funcii.

180

Laborator 12 - Combinarea codului C i ASM n IAR

Scratch Register

R0-R3

Local Register

R4-R15

Scratch Register

R16-R23

Local Register Data Stack Pointers (Y) Scratch Register


Figura 122.2 Fiierele Registru

R24-R27 R28-R29 R30-R31

Function

Parameter 1 Registers

Parameter 2 Registers

Func (char , char)

R16

R20

Func (char , int)

R16

R20, R21

Func (int , long)

R16,R17

R20, R21, R22 , R23

Func (long , long)

R16,R17,R18,R19

R20, R21, R22 , R23

Figura 122.3 Exemplu de salvare a parametrilor la apelul unei func ii 181

Laborator 12 - Combinarea codului C i ASM n IAR

Un exemplu de apel de funcie n C : int get_port (unsigned char temp , int num) Cnd se apeleaz aceast funcie parametrul temp, pe 1 octet, este salvat n R16 , parametrul num, pe 2 octei, este salvat n R20:R21 . Funcia returneaz o valoare pe 2 octei care este stocat n R16:R17 cnd se iese din funcie. Dac o funcie este chemat cu mai mult de 2 parametri, primii 2 parametri sunt trimii ctre funcie, cum am artat mai sus, iar urmtorii sunt transmii funciei cu ajutorul stivei de date. Dac o funcie este chemat cu o structur sau o uniune ca parametru, un pointer ctre structur sau uniune este trimis ctre funcie folosind stiva de date. Dac o funcie este nevoit s foloseasc un registru local, prima dat introduce valoarea din registru n stiva de date. Valoarea de return din funcie este salvat la adresa R16-R19, n funcie de dimensiunea valorii de return. 12.2.1 EXEMPLU DE APEL AL UNEI FUNCII ASM DINTR-UN PROGRAM C 12.2.1.1 Fr parametri i fr variabil de return Exemplu Program scris n C cheam o funcie scris n ASM
#include "io8515.h" extern void get_port(void);/* Prototipul funciei ASM */ void main(void) { DDRD = 0x00;/* Iniializeaz porturile de I/O*/ DDRB = 0xFF; while(1)/* Bucla infinit*/ { get_port();/* Apelul funciei scrise n ASM */ } }

Codul ASM ce va fi chemat n modulul C Function NAME get_port #include "io8515.h" ; Fiierul #include trebuie s fie n interiorul modulului ; Declararea simbolurilor ce vor fi chemate de funcia C ; Aceasta bucata de cod este relocat, ; Etichet, aici ncepe execuia 182

PUBLIC get_port

RSEG CODE RSEG get_port:

Laborator 12 - Combinarea codului C i ASM n IAR

in R16, PIND swap R16 out PORTB, R16 ret END

; Citete valoarea pinului D ; Interschimb valorile ; Seteaz pe PORTB valoarea din R16 ; ntoarcere n main

12.2.1.2 Cu parametri i valoare de return n exemplul de mai jos se apeleaz o funcie ASM. Variabila mask pe un octet este trimis ca parametru ctre funcia ASM , mask este salvat n R16 nainte de apelul funciei . Dup terminarea funciei valoarea de return este salvat n R16 i apoi salvat n variabila value. #include "io8515.h" char get_port(char mask); /*Prototipul funciei ASM */ void C_task main(void) { DDRB=0xFF while(1) /* Bucl infinit*/ { char value, temp;/*Declarare variabile locale */ temp = 0x0F; value = get_port(temp); /* Apelul funciei scrise in ASM */ if(value==0x01) { /* Se intr n if */ PORTB=~(PORTB); /* Neag valoarea din PORTB */ } } } Codul ASM ce va fi chemat n modulul C Function NAME get_port #include "io8515.h" ; Fiierul #include trebuie s fie n interiorul modulului ; Declararea simbolurilor ce vor fi chemate de funcia C ; Aceasta bucat de cod este relocat, RSEG 183

PUBLIC get_port

RSEG CODE

Laborator 12 - Combinarea codului C i ASM n IAR

get_port: in R17, PIND xor R16, R17

; Etichet, aici ncepe execuia ; Citete valoarea pinului D ; XOR cu valoarea din mask(n R16) din main()) ; Interschimb valorile ; Rotete R16 la stnga ; Jump, dac flagul carry e gol ; Pune valoarea de 1 n R16 ; Return ; Pune valoarea de 0 n R16 ; Return

swap R16 rol R16 brcc ret0 ldi r16,0x01 ret ret0: clr R16 ret END

12.3

APELAREA DE FUNCII SCRISE N C DE CTRE PROGRAME SCRISE N ASM

n acest exemplu, programul scris n ASM va apela funcia de standard de librrie rand() pentru a primi un numr aleatoriu. Funcia rand() returneaz un ntreg pe 2 octei. Exemplul de mai jos scrie doar primii 8 bii. NAME get_port #include "io8515.h" ; Fiierul #include trebuie s fie n interiorul modulului EXTERN rand, max_val ; Simboluri externe ce vor fi folosite n funcie PUBLIC get_port ; Declararea simbolurilor ce vor fi chemate de funcia C RSEG CODE ; Aceast bucat de cod este relocat, RSEG get_port: ; Etichet, aici ncepe execuia clr R16 ; Clear R16 sbis PIND, 0 ; Testeaz dac PIND0 e 0 rcall rand ; Apeleaz RAND() dac PIND0 este 0 out PORTB,R16 ; n PORTB salveaz valoarea random lds R17,max_val ; ncarc valoarea din main, max_val cp R17,R16 ; Testeaz dac valoarea e mai mare ca max_val brlt nostore ; Sari peste dac e adevrat sts max_val,R16 ; Salveaz noua valoare 184

Laborator 12 - Combinarea codului C i ASM n IAR

ret END

; Return

12.4

FUNCII DEDICATE NTRERUPERILOR N ASM

n ASM se pot scrie i funcii dedicate ntreruperilor. Funciile dedicate ntreruperilor nu pot avea parametri i nu pot avea valoare de return. Fiindc o ntrerupere poate avea loc n orice moment n timpul executrii unui program este nevoie ca n momentul apariiei s salveze valorile din toi regitrii pe stiv. Trebuie avut mare grij cnd se folosete ASM-ul pentru a scrie astfel de funcii pentru a evita incompatibiliti cu funciile scrise n C. Exemplu de funcie ASM salvat n vectorul de ntreruperi: NAME ext_int1 #include "io8515.h" extern c_int1 COMMON INTVEC(1) ; Cod localizat n segmentul vectorilor de ntrerupere ORG INT1_vect ; Localizeaz codul n zona vectorilor de ntrerupere RJMP c_int1 ; Jump la funcia n asm pentru ntrerupere ENDMOD ; Codul din vectorul de ntrerupere face un jump la funcia c_int1 de mai jos: NAME c_int1 #include "io8515.h" PUBLIC c_int1 ; Declararea simbolurilor ce vor fi chemate de funcia C RSEG CODE ; Aceast bucat de cod este relocat, RSEG c_int1: st -Y,R16 ; Push regitri pe stiv in R16,SREG ; Citete status register st -Y,R16 ; Citete status register in R16,PIND ; Salveaz valoare din port D com R16 ; Inversare out PORTB,R16 ; Se salveaz valoarea n port B ld R16,Y+ ; Pop status register out SREG,R16 ; Salveaz status register ld R16,Y+ ; Pop Register R16 reti END

12.5

ACCESAREA DE VARIABILE GLOBALE N INTERIORUL MODULELOR ASM

Dac n programul principal exist variabile globale spre exemplu max_val pentru a accesa aceast variabil n modulul ASM, variabila trebuie declarat ca EXTERN max_val. Pentru a accesa aceast variabil modulul ASM folosete instruciunile LDS(Load direct from SRAM) i STS(Store direct to SRAM). 185

Laborator 12 - Combinarea codului C i ASM n IAR

#include "io8515.h" char max_val ; void get_port(void) ; /* Prototipul funciei ASM */ void C_task main(void) { DDRB = 0xFF; /* Seteaz ca output port B */ while(1) /* Bucl infinit */ { get_port(); /* Apeleaz funcia ASM */ } }

NAME get_port #include "io8515.h"

; Fiierul #include trebuie sa fie in interiorul modulului EXTERN rand, max_val ; Simboluri externe ce vor fi folosite n funcie PUBLIC get_port ; Simboluri externe ce vor fi folosite n funcie RSEG CODE ; Aceast bucat de cod este relocat, RSEG get_port: ; Etichet,aici ncepe execuia clr R16 ; Clear R16 sbis PIND,0 ; Testeaz dac PIND0 este 0 rcall rand ; Apeleaz RAND() dac PIND0 = 0 out PORTB,R16 ; Seteaz valoarea de output n PORTB lds R17, max_val ; ncarc valoarea max_val din main cp R17, R16 ; Verific dac numrul este mai mare ca max_val brlt nostore ; Sari peste dac nu este mai mare ca max_val sts max_val, R16 ; Salveaz noua valoare dac este mai mare nostore: ret ; Return

END

12.6

PARALELE NTRE C I ASM

Acest exemplu seteaz pinii portului B astfel: pinii 0 i 1 pe high iar pinii 2 i 3 pe low i definete porturile de la 4 la 7 ca input: ldi r16,(1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0) ldir17,(1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0) out PORTB,r16 out DDRB,r17 ; Apeleaz nop pentru sincronizare nop ; Citete valorile din pini in r16, PINB unsigned char i; ... PORTB = (1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0); DDRB = (1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0); /* Apeleaz nop pentru sincronizare */ _NOP(); /* Citete valorile din pini */ i = PINB;

n exemplul de mai jos se arat modul de accesare a registrului timer-ului pe 16 bii: 186

Laborator 12 - Combinarea codului C i ASM n IAR

TIM16_ReadTCNT1: ; Salveaz flagul global de ntreruperi in r18,SREG ; Dezactiveaz ntreruperile cli ; Read TCNT1 into r17:r16 in r16,TCNT1L in r17,TCNT1H ; Restaureaz flagul de ntreruperi out SREG,r18 ret

unsigned int TIM16_ReadTCNT1( void ) { unsigned char sreg; unsigned int i; /* Salveaz flagul global de ntreruperi */ sreg = SREG; /* Dezactiveaz ntreruperile */ _CLI(); /* Citete valoarea din TCNT1 n i */ i = TCNT1; /* Restaureaz flagul de ntreruperi */ SREG = sreg; return i; }

Acest exemplu arat cum s iniializm SPI-ul ca master i cum s realizm o simpl transmisie: SPI_MasterInit: ; Seteaz MOSI i SCK ca output, i restul ca input ldi r17,(1<<DD_MOSI)|(1<<DD_SCK) out DDR_SPI,r17 ;Activeaz SPI, ca Master, seteaz clock rate ca fck/16 ldi r17,(1<<SPE)|(1<<MSTR)|(1<<SPR0) out SPCR,r17 ret
void SPI_MasterInit(void) { /* Seteaz MOSI i SCK ca output, i restul ca input */ DDR_SPI = (1<<DD_MOSI) |(1<<DD_SCK); /* Activeaz SPI, ca Master, seteaz clock rate ca fck/16 */ SPCR = (1<<SPE)|(1<<MSTR) |(1<<SPR0); } void SPI_MasterTransmit(char cData) { /* ncepe transmisia de date */ SPDR = cData; /* Ateapt ca transmisia sa fie complet */ while(!(SPSR & (1<<SPIF))) ; }

SPI_MasterTransmit: ; ncepe transmisia de date (r16) out SPDR,r16 Wait_Transmit: ; Ateapt ca transmisia s fie complet sbis SPSR,SPIF rjmp Wait_Transmit ret

Acest exemplu arat cum s iniializm SPI-ul ca slave i cum s realizm o simpl recepie: SPI_SlaveInit: ; Seteaz MISO ca output, i restul ca input ldi r17,(1<<DD_MISO) out DDR_SPI,r17 ; Enable SPI ldi r17,(1<<SPE)
void SPI_SlaveInit(void) { /* Seteaz MISO ca output,i restul ca input */ DDR_SPI = (1<<DD_MISO); /* Enable SPI */

187

Laborator 12 - Combinarea codului C i ASM n IAR

out SPCR,r17 ret SPI_SlaveReceive: ; Ateapt ca recepia s fie complet sbis SPSR,SPIF rjmp SPI_SlaveReceive ; Citete valorile recepionate in r16,SPDR ret
}

SPCR = (1<<SPE);

char SPI_SlaveReceive(void) { /* Ateapt ca recepia s fie complet */ while(!(SPSR & (1<<SPIF))) ; /* Citete valorile recepionate */ return SPDR; }

Acest exemplu ne arat cum s iniializm USART-ul: USART_Init: ; Seteaz baud rate out UBRRH, r17 out UBRRL, r16 ; Enable receiver i transmitter ldi r16, (1<<RXEN)|(1<<TXEN) out UCSRB,r16 ; Seteaz formatul frame-ului ca : 8data, 2stop bit ldi r16, (1<<URSEL)|(1<<USBS)|(3<<UCSZ0) out UCSRC,r16 ret
#define FOSC 1843200// Clock Speed #define BAUD 9600 #define MYUBRR FOSC/16/BAUD-1 void main( void ) { ... USART_Init ( MYUBRR ); ... } void USART_Init( unsigned int ubrr) { /* Seteaz baud rate-ul */ UBRRH = (unsigned char)(ubrr>>8); UBRRL = (unsigned char)ubrr; /* Activeaz receiver i transmitter */ UCSRB = (1<<RXEN)|(1<<TXEN); /* Seteaz formatul frame-ului ca : 8data, 2stop bit */ UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0); }

Acest exemplu ne arat cum s transmitem un mesaj simplu folosind USART: USART_Transmit: ; Ateapt ca buffer-ul de transmisie s fie gol sbis UCSRA,UDRE rjmp USART_Transmit ; Copie al 9-lea bit din r17 n TXB8 cbi UCSRB,TXB8 sbrc r17,0 sbi UCSRB,TXB8 ; Salveaz LSB data (r16) n buffer, trimite datele out UDR,r16
void USART_Transmit( unsigned int data ) { /* Ateapt ca buffer-ul de transmisie s fie gol */ while ( !( UCSRA & (1<<UDRE))); /* Copie al 9-lea bit din r17 n TXB8*/ UCSRB &= ~(1<<TXB8); if ( data & 0x0100 ) UCSRB |= (1<<TXB8);

188

Laborator 12 - Combinarea codului C i ASM n IAR

ret

/* Salveaz LSB data (r16) in buffer, trimite datele */ UDR = data; }

Acest exemplu ne arat cum s recepionm un mesaj simplu folosind USART: USART_Receive: ; Ateapt ca buffer-ul de recepie s fie gol sbis UCSRA, RXC rjmp USART_Receive ; Salveaz statusul i al 9-lea bit, apoi datele din buffer in r18, UCSRA in r17, UCSRB in r16, UDR ; n caz de eroare, return -1 andi r18,(1<<FE)|(1<<DOR)|(1<<PE) breq USART_ReceiveNoError ldi r17, HIGH(-1) ldi r16, LOW(-1) USART_ReceiveNoError: ; Filtreaz al 9-lea bit,apoi return lsr r17 andi r17, 0x01 ret
unsigned int USART_Receive( void ) { unsigned char status, resh, resl; /* Ateapt ca buffer-ul de recepie s fie gol */ while ( !(UCSRA & (1<<RXC)) ); /* Salveaz statusul i al 9-lea bit, apoi datele din buffer */ status = UCSRA; resh = UCSRB; resl = UDR; /* n caz de eroare, return -1*/ if ( status & (1<<FE)|(1<<DOR)|(1<<PE) ) return -1; /* Filtreaz al 9-lea bit, apoi return */ resh = (resh >> 1) & 0x01; return ((resh << 8) | resl); }

Acest exemplu ne arat cum s golim buffer-ul de recepie: USART_Flush: sbis UCSRA, RXC ret in r16, UDR rjmp USART_Flush
void USART_Flush( void ) { unsigned char dummy; while ( UCSRA & (1<<RXC) ) dummy = UDR; }

Acest exemplu ne arat cum s accesm registrul UCSRC: unsigned char USART_ReadUCSRC( void ) USART_ReadUCSRC: { ; Citete UCSRC unsigned char ucsrc; in r16,UBRRH /* Citete UCSRC */ in r16,UCSRC ucsrc = UBRRH; ret ucsrc = UCSRC; return ucsrc; } 189

Laborator 13 - Microcontrolere AVR

13
13.1

Microcontrolere AVR

CARACTERISTICI

Microcontroler-ele AVR pe 8 bii (Atmel) au la baz un nucleu RISC cu arhitectur Harvard. Aceste microcontrolere sunt destinate aplicaiilor simple: controlul motoarelor, controlul fluxului de informa ie pe portul USB, aplicaii din domeniul automotive, controlul accesului de la distan (Remote Access Control), .a.. Pe baza acestui nucleu firma Atmel a dezvoltat mai multe familii de microcontrolere, cu diferite structuri de memorie i de interfee I/O, destinate diferitelor clase de aplicaii. Familia de procesoare AVR pe 8 bii are urmtoarele caracteristici: - arhitectur RISC; - 32 de registre de lucru de 8 bii; - multiplicator hardware; - au o arhitectur Harvard modificat (exist memorii i bus-uri separate pentru program i date). Exist un nivel de pipeline n timp ce o instruciune este executat, instruciunea urmtoare este adus din memorie; - frecven de lucru de 0 - 16 MHz; - procesoarele sunt prevzute cu o gama larg de dispozitive I/O i de periferice ncorporate; - timer programabil cu circuit de prescalare; - surse de ntrerupere interne i externe; - timer de urmrire (watchdog) cu oscilator independent; - interfa JTAG (standardul IEEE 1149.1 Compliant); - 6 moduri de operare SLEEP i POWER DOWN pentru economisirea energiei; - oscilator integrat RC; - densitate mare a codului i compatibilitate integral a codului ntre membrii familiei; - procesoarele sunt disponibile n capsule variate, de la circuite cu 8 pini la procesoare cu 68 de pini; - familia AVR beneficiaz de existena unui set unitar de instrumente software pentru dezvoltarea aplicaiilor. Microcontrolerele din familia AVR folosesc o arhitectur RISC care permite execuia celor mai multe instruciuni ntr-un singur ciclu de tact, ceea ce duce la mbuntirea performanei de 10 ori fa de procesoarele convenionale (de exemplu, Intel 8051) care opereaz la aceeai frecven.

13.2

FAMILIA AVR

Exemplu este microcontrolerul de 8 bii ATmega16, realizat n tehnologie CMOS, bazat pe arhitectura RISC AVR mbuntit. Procesorul dispune de un set de 131 instruciuni i 32 de registre de uz general. Cele 32 de registre sunt direct adresabile de unitatea aritmetic i logic (ALU). O instruciune poate accesa dou registre independente.

190

Laborator 13 - Microcontrolere AVR

Caracteristicile procesorului ATmega16 sunt: 16 Kb de memorie Flash reinscriptibil pentru stocarea programelor; 1 Kb de memorie RAM pentru date; 512 bytes de memorie EEPROM pentru constante; dispozitive periferice i porturi I/O: - dou numrtoare/temporizatoare de 8 bii; - un numrtor/temporizator de 16 bii; - un convertor analog/digital de 10 bii, cu 8 intrri; - 4 canale PWM; - un comparator analogic; - timer de urmrire (watchdog) cu oscilator propriu; - conine 3 interfee pentru comunicaie: USART pentru comunicaie serial (port serial), interfa serial TWI, interfa serial SPI; - ceas de timp real cu oscilator separat; - 32 de linii I/O organizate n patru porturi (PA, PB, PC, PD).

Structura intern general a microcontroler-ului este prezentat n Error! Reference source not found.. Se poate observa c exist o magistral general de date la care sunt conectate mai multe module: - unitatea aritmetic i logic (ALU); - registrele generale; - memoria RAM i memoria EEPROM; - porturile I/O de uz general i celelalte blocuri de intrare/ieire . Aceste module sunt controlate de un set special de registre din spa iul I/O, fiecare modul avnd asociat un numr de registre specifice. Memoria flash de program mpreun cu ntreg blocul de extragere a instruciunilor, decodare i execuie va comunica printr-o magistral proprie, separat de magistrala de date. Acest tip de organizare este specific arhitecturii Harvard i permite controllerului s execute instruciunile foarte rapid. n modul power-down procesorul salveaz coninutul registrelor, dar blocheaz oscilatorul, dezactivnd toate celelalte funcii al chip-ului pn la urmtoarea ntrerupere extern sau la activarea intrrii de iniializare hardware (Reset). n modul power -save, timer-ul asincron continu s funcioneze, permind utilizatorului s menin o baz de timp n timp ce restul dispozitivului este oprit. n modul standby, oscilatorul funcioneaz n timp ce restul dispozitivului este oprit. Acest lucru permite un start foarte rapid combinat cu un consum redus de energie. n modul standby extins (Extended Stand-by Mode), att oscilatorul principal ct i timer-ul asincron continu s funcioneze. Memoria flash intern poate fi reprogramat printr-o interfa serial SPI, de ctre un programator de memorie nonvolatil convenional, sau de ctre un program de pornire rezident (on-chip) ce ruleaz pe nucleul AVR. Acest program poate folosi orice interfa pentru a ncrca programul de aplicaie n memoria flash. Combinnd un nucleu CPU-RISC de 8 bii cu o memorie flash ntr -un singur chip, ATmega 16 este un microcontroler puternic ce ofer o soluie extrem de flexibil i cu un cost redus. n plus ATmega16 AVR este susinut de o serie complet de instrumente de programare i de dezvoltare a sistemului, care include: compilatoare C, macroasambloare, programe de depanare i simulare, etc.

191

Laborator 13 - Microcontrolere AVR

13.2.1 ATMEGA 16 - DESCRIEREA PINILOR

(XCK) PB0 PB1 PB2 PB3 (SS) PB4 (MOSI) PB5 SPI (MISO) PB6 (SCK) PB7 RESET VCC GND XTAL2 XTAL1 (RXD) PD0 USART (TXD) PD1 PD2 PD3 PD4 PD5 PD6

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21
Figura 13.1

PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 AREF GND AVCC PC7 PC6 PC5 PC4 PC3 PC2 PC1 (SDA) PC0 (SCL) PD7

TWI

VCC Sursa de alimentare GND Masa Portul A (PA7PA0) Portul A este un port bidirecional de 8 bii programabil. Liniile portului A sunt folosite i ca intrri analogice pentru convertorul A/D. Liniile portului pot fi conectate opional la VCC prin rezistene de agare (pull-up resistor), selectate pentru fiecare linie. Buffer-ele de ieire ale portului A au caracteristici de amplificare. Portul B (PB7PB0) Portul B este un port I/O de 8 bii bidirecional prevzut cu rezistene de agare interne (opional). Buffer-ele de ieire ale portului B au caracteristici de amplificare. Portul B ndeplinete de asemenea funcii speciale ale microcontrolerului ATmega16. Portul C (PC7PC0) Portul C este un port I/O de 8 bii bidirecional cu prevzut cu rezistene de agare interne (opional). Buffer-ele de ieire ale portului C au caracteristici de amplificare. Dac interfaa JTAG (de depanare) este activat, rezistenele pinilor PC5(TDI), PC3(TMS) i PC2(TCK) vor fi activate, chiar dac are loc o resetare. Port -ul C ndeplinete de asemenea funcii ale interfeei JTAG i alte funcii speciale ale ATmega16. Port D (PD7PD0) 192

Laborator 13 - Microcontrolere AVR Portul D este un port I/O de 8 bii bidirecional prevzut cu rezistente de agare interne (opional). Buffer-ele de ieire ale portului D au caracteristici de amplificare. Portul D ndeplinete de asemenea funcii speciale ale ATmega16. Reset Un nivel sczut la acest pin mai mare ca durat dect o valoare prestabilit, va provoca iniializarea procesorului. XTAL1 i XTAL2. Intrarea i respectiv ieirea amplificatorului inversor al oscilatorului generatorului de tact. AVCC este pinul de alimentare pentru portul A i pentru convertorul A/D. Trebuie conectat extern la Vcc chiar dac ADC nu este folosit. Dac ADC este folosit, trebuie conectat la Vcc printr-un filtru trece-jos. AREF este pinul de intrare pentru referin analogic a convertorului A/D. 13.2.2 UNITATEA CENTRAL DE PRELUCRARE (CPU) Arhitectura nucleului AVR este prezentat n Figura 13.2. Funcia principal a nucleului CPU-AVR este aceea de a asigura execuia corect a programului. Pentru aceasta, nucleul este capabil s acceseze memoriile, s execute calcule, s controleze perifericele i s prelucreze ntreruperile.

Data Bus 8-bit Flash Program Memory Instruction Register Instruction Register Control Lines Program Counter Status and Control Interrupt Unit SPI Unit Watchdog Timer ALU Analog Comparator I/O Module 1 Data SRAM I/O Module 2 I/O Module n EEPROM I/O LINES

Direct addressing

Indirect Addressing

32 x 8 General Purpose Registers

193

Laborator 13 - Microcontrolere AVR

Figura 13.2 Schema bloc a nucleului CPU-AVR 13.2.3 ALU (UNITATEA ARITMETIC I LOGIC) Unitatea aritmetic i logic execut operaiile de prelucrarea a datelor. ALUAVR lucreaz direct cu cele 32 de registre. Operaiile pe care le execut unitatea ALU sunt mprite n trei categorii: aritmetice, logice i operaii pe bit. Unele implementri ale arhitecturii AVR pot efectua i multiplicri de operanzi cu sau fr semn.

13.3

EXECUIA INSTRUCIUNILOR

Pentru obinerea unei performane bune CPU-AVR combin avantajul arhitecturii Harvard a spaiului de memorie i accesul rapid la registre cu execuia pipeline. Procesorul folosete un pipeline cu dou etaje, unul pentru extragerea instruciunilor i altul pentru execuie. n timp ce o instruciune este executat, o nou instruciune este extras din memorie. n felul acesta, procesorul furnizeaz un rezultat la fiecare tact, chiar dac o instruciune dureaz mai mult de un tact. Aceast secveniere este prezentat n Figura 13.3.
T1 T2 T3 T4

clkCPU 1st Instruction Fetch 1st Instruction Execute 2nd Instruction Fetch 2nd Instruction Execute 3rd Instruction Fetch
CPHA=0

3rd Instruction Execute 4th Instruction Fetch

Figura 13.3 Funcionarea pipeline n acest mod, performana nucleului se apropie de 1 MIPS/MHz i ofer cele mai bune rezultate din punct de vedere al raportului func iuni/cost, funciuni/timp i funciuni/unitate. n Error! Reference source not found. este prezentat modul de folosire a registrelor. ntr-un singur ciclu de tact ALU folosete 2 registre pentru a executa o operaie, iar rezultatul este stocat napoi n registrul de destinaie.

194

Laborator 13 - Microcontrolere AVR

T1

T2

T3

T4

clkCPU Total Execution Time Register Operands Fetch ALU Operation Execute Reset Write Back

T4

Figur 13.4 Operaii cu registre executate de ALU ntr-un singur ciclu de tact Instruciunile care acceseaz memoria necesit doi cicli de tact pentru o operaie dup cum se vede din Figura 13.5.
T1 T2 T3

clkCPU Address Data WR Data RD


Memory Access Instruction Next Instruction Complete Address Address Valid

Figura 13.5 Execuia instruciunilor care acceseaz memoria SRAM

13.4

TRATAREA NTRERUPERILOR I INIIALIZARE


195

Read

Write

Laborator 13 - Microcontrolere AVR Nucleul AVR folosete mai multe tipuri de ntreruperi. ntreruperile sunt vectorizate; vectorii de ntrerupere i cel corespunztor iniializrii procesorului reprezint adrese ale unor locaii din memoria de program. ntreruperile pot fi activate/dezactivate global (cu ajutorul bitului I din registrul de stare) sau individual. Sursele de ntrerupere i vectorii corespunztori sunt prezentai n tabelul urmtor: Nr. vectorului Adresa din program Sursa Definirea ntreruperii

$000

Reset

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

$002 $004 $006 $008 $00A $00C $00E $010 $012 $014 $016 $018 $01A $01C $01E $020 $022 $024 $026 $028

EXT_INT0 EXT_INT1 TIM2_COMP TIM2_OVF TIM1_CAPT TIM1_COMPA TIM1_COMPB TIM1_OVF TIM0_OVF SPI_STC UART_RXC UART_DRE UART_TXC ADC EE_RDY ANA_COMP TWI INT2 TIM0_COMP SPM_RDY

Pin extern, Reset la pornire,Reset Watchdog, JTAG AVR Reset External IRQ0 External IRQ1 Comparare Timer2 Timer2 overflow Capturare eveniment Timer1 Comparare Timer1 Comparare Timer1 Timer 1 overflow Timer 0 overflow Transfer compet (SPI) UART RX complet UART UDR empty UART TX complet Conversie ADC terminat EEPROM ready Comparator analogic Interfa serial cu 2 fire ntrerupere extern IRQ2 Comparare Timer0 ncarcarea programului

Pentru vectorii de ntrerupere sunt rezervate adresele inferioare din memoria de program. Prioritatea diferitelor surse este dat de poziia vectorului n harta de memorie. Cu ct sursa de ntrerupere are vectorul mai mic cu att prioritatea ei este mai mare. 196

Laborator 13 - Microcontrolere AVR RESET-ul are cea mai mare prioritate. Vectorii de ntrerupere pot fi mutai la nceputul seciunii Boot Flash prin setarea bitului IVSEL din registrul global de control al ntreruperilor (GICR). Vectorul de RESET poate fi de asemenea mutat la nceputul aceleiai seciuni prin programarea seciunii BOOTRST. Cnd apare o ntrerupere bitul I din registrul de stare este resetat i toate ntreruperile sunt invalidate. n cadrul subrutinei de tratare utilizatorul poate reactiva sistemul de ntreruperi. Dac sistemul de ntreruperi este activat subrutina de tratare poate fi la rndul ei ntrerupt de o sursa de ntrerupere cu prioritate mai mar e. Bitul I este automat setat cnd este executat instruciunea RETI. ntreruperile externe pot fi controlate individual cu ajutorul registrului GIMSK (adresa 3B n spaiul I/O). Fiecare bit din acest registru corespunde unei ntreruperi. Bitul 7 controleaz INT1, iar bitul 6 controleaz INT0. Setarea bitului corespunztor activeaz ntreruperea. Registrul GIMSK poate fi citit/scris cu instruciunile IN/OUT. Starea ntreruperilor este indicat de registrul GIFR (adresa 3A n spaiul I/O). Dac o ntrerupere extern a fost activat este setat bitul corespunztor din GIFR. AVR are o structur complex a sistemului de ntreruperi. Aproape toate dispozitivele periferice au fost dotate cu capaciti de ntrerupere, motiv pentru care programul principal nu trebuie s verifice periodic starea acestor dispozitive. Secvena de aciuni care se deruleaz cnd apare o ntrerupere este urmtoarea: 1. 2. 3. 4. 5. 6. 7. Dispozitivul periferic emite o cerere de ntrerupere care ntrerupe procesorul ; Execuia instruciunii curente este finalizat; Adresa urmtoarei instruciuni din programul curent este memorat n stiv; Este ncrcat n PC adresa subrutinei de tratare asociat ; Procesorul execut subrutina de tratare; Subrutina se ncheie cu instruciunea RETI (Return from Interrupt); Procesorul reia execuia programului ntrerupt de la adresa memorat n stiv.

Un factor important de luat n seam cnd sunt folosite ntreruperile, este ct de repede poate rspunde un procesor la o ntrerupere. Aceasta depinde de arhitectura procesorului. Pentru controlerele AVR, rspunsul la ntreruperi se face n minim 4 cicli de tact. n timpul celor 4 cicli, este salvat n stiva PC ( 2 bytes), iar SP este decrementat cu 2. Transferul execuiei la rutina de ntrerupere necesit doi cicli. Dac o ntrerupere apare n timpul unei instruciuni multiciclu, aceast instruciune este finalizat nainte de a fi servit ntreruperea. Revenirea dintr -o subrutin de tratare dureaz ali 4 cicli. n timpul acestor 4 cicli, este restaurat starea PC salvat n stiv (2 bytes), iar SP este incrementat cu 2. n acelai timp este setat bitul I din SREG.

13.5

MEMORIA

Memoria de program este de tip Flash i are o mrime de 256K. Este organizat pe 16 bii (128K x 16) deoarece instruciunile se codific pe 2 sau 4 octei. Nu se poate aduga memorie de program extern. Din considerente de securitate software, spaiul memoriei de program este mprit n 2 regiuni (Figura 13.6): 197

Laborator 13 - Microcontrolere AVR

0 Application flash section

Boot flash section 0x1FFFF

Figura 13.6 Regiunile memoriei de program Memoria de program suport minim 10000 de cicli de tergere -scriere. Un astfel de ciclu reprezint de fapt reprogramarea microcontrolerului i se ntmpl relativ rar (cel mai adesea n etapa de dezvoltare, pe echipamentele de test). Adresa instruciunii ce urmeaz a fi executat este ntotdeauna coninut n registrul PC (Program Counter). Modificarea registrului PC poate fi efectuat cu o instruciune de salt sau apel. 13.5.1 ADRESAREA MEMORIEI DE PROGRAM Memoria de program este adresabil liniar. n cazul altor microcontrolere memoria poate fi, de exemplu, segmentat, ceea ce implic o adresare prin intermediul registrelor de segment (acest lucru poate reprezenta o facilitate n cazul unei aplicaii cu multiple fire de execuie). Pentru a scrie un program n limbajul C nu este nevoie cunoaterea modurilor de adresare a memoriei (nu conteaz de ce tip). nelegerea modurilor de adresare este ns necesar pentru a scrie cod surs n limbaj de asamblare (ceea ce se ntmpl adeseori n dezvoltarea sistemelor embedded). Exist 2 clase de instruciuni ce pot referi memoria de cod: instruciunile de salt sau apel adresa efectiv se calculeaz n cuvinte (pentru c o instruciune se codific pe 2 sau 4 octei); instruciunile de scriere i citire a memoriei de cod adresa efectiv se calculeaz n octei (pentru c exist 2 operanzi surs i destinaie unul dintre care este unul sau doi regitri cu funcie general). Instruciunile de salt sau apel pot adresa memoria de program n 3 moduri: 1. direct adresa efectiv este operandul instruciunii. Acest mod de adresare este folosit de instruciunile JMP i CALL;

198

Laborator 13 - Microcontrolere AVR

21 Adres

Memoria de program (FLASH)

21 PC

Exemplu:
farp: jmp farp ... nop

2.

indirect adresa efectiv este coninutul registrului Z. Acest mod de adresare este folosit de instruciunile IJMP i ICALL;
15 Registrul Z 0 Memoria de program (FLASH)

15 PC

Exemplu:
ijmp ; salt la rutina indicat n r31:r30

3.

relativ adresa efectiv este suma dintre valoarea curent a registrului PC, coninutul registrului Z i 1. Acest mod de adresare este folosit de instruciunile RJMP i RCALL.
15 PC 0 Memoria de program (FLASH)

+
0

11 Deplasament

Exemplu:
rjmp error ... error: nop

199

Laborator 13 - Microcontrolere AVR Instruciunile de scriere i citire a memoriei de program pot utiliza 2 moduri de adresare: 1. indirect adresa efectiv este coninutul registrului Z. Acest mod de adresare este folosit de instruciunile LPM, ELPM, i SPM;
Memoria de program (FLASH)

15 Registrul Z

LSB

2.

indirect cu post-decrement adresa efectiv este coninutul registrului Z, fiind incrementat dup citirea memoriei. Acest mod de adresare este folosit de instruciunile LPM i ELPM.
15 Registrul Z 0 Memoria de program (FLASH)

LSB

n memoria de program pot fi pstrate variabilele constante. 13.5.2 MEMORIA DE DATE Exist 2 tipuri de memorie de date: SRAM i EEPROM . SRAM SRAM-ul este un tip de memorie foarte rapid i relativ scump, celula de baz fiind construit din tranzistori. ATmega2560 dispune de 8K de SRAM. Spaiul din SRAM este organizat n mai multe regiuni ( Error! Reference source not found.):

200

Laborator 13 - Microcontrolere AVR

32 Registers

0 1F 20 5F

64 I/O Registers

416 External I/O Registers

60 1FF

Internal SRAM 8192 x 8

200 21FF

External SRAM 0 64K x 8

2200 FFFF

Figura 13.7 Organizarea SRAM-ului Instruciunile de scriere/citire pe SRAM, de tipul load/store, se execut n minim 2 cicli main. Pentru anumite poriuni din SRAM ns, exist instruciuni specializate, ce se execut ntr-un ciclu main: registrele cu funcie general pot fi adresate cu instruciunile MOV (opereaz pe un octet) i MOVW (opereaz pe cuvnt) registrele I/O pot fi adresate cu instruciunile IN i OUT SRAM-ul extern reprezint de fapt spaiul de adresare disponibil pentru a conecta la microcontroler o memorie extern de tip SRAM, Flash sau chiar nite periferice. Exist 5 moduri de adresare:

1.

direct
Adres

SRAM

201

Laborator 13 - Microcontrolere AVR

2.

indirect cu deplasament
15 Registrul Y, Z 0

+
5 Deplasament 0

SRAM

3.

indirect
15 Registrul X, Y, Z 0

SRAM

4.

indirect cu pre-decrementare
15 Registrul X, Y, Z 0

+
-1

SRAM

5.

indirect cu post-decrementare
15 Registrul X, Y, Z 0

-1

SRAM

+
202

Laborator 13 - Microcontrolere AVR

Registrele mapate n SRAM (adresele mici) au scheme de adresare optimizate. 13.5.2.1 EEPROM

EEPROM-ul (4K x 8) este un tip de memorie nevolatil, ce suport minim 100000 cicli de scriere. De fapt, aceast memorie este vzut ca un periferic, care poate fi adresat prin 3 registre: de control (EECR), de date (EEDR), de adres (EEAR). Operaiile de scriere i citire pot fi implementate n limbajul C sub forma unor proceduri, dup cum urmeaz:

void EEPROM_write(unsigned int uiAddress, unsigned char ucData) { /* Ateapt completarea scrierii anterioare */ while(EECR & (1<<EEPE)) ; /* Seteaz adresa i regitrii de date */ EEAR = uiAddress; EEDR = ucData; /* Scrie 1 logic n EEMPE */ EECR |= (1<<EEMPE); /* Pornete scrierea n eeprom, odat cu EEPE */ EECR |= (1<<EEPE); } unsigned char EEPROM_read(unsigned int uiAddress) { /* Ateapt completarea scrierii anterioare */ while(EECR & (1<<EEPE)) ; /* Seteaz adresa registrului */ EEAR = uiAddress; /* Pornete citirea eeprom, odat cu EERE */ EECR |= (1<<EERE); /* Returneaz registrul de date */ return EEDR; }
Funcia de scriere a unui octet n EEPROM poate fi optimizat astfel nct s mreasc durata de via a EEPROM-ului deoarece numrul de cicli de scriere este limitat, are sens ca: nainte de a efectua o operaie de scriere, s se compare valoarea de scris cu cea existent n memorie; gradul de utilizare a tuturor locaiilor s fie ct mai uniform. Procesul de scriere a unei locaii de memorie n EEPROM dureaz un timp relativ ndelungat. Operaia de citire a unei locaii n curs de scriere va returna valoarea 203

Laborator 13 - Microcontrolere AVR 0xFF. Din acest motiv, pentru a efectua o citire corect a unei locaii de memorie ce a fost anterior scris, se va atepta minim tWD_EEPROM = 9.0 ms dup scrierea ei.

13.6

POINTERI
Cunotine necesare: limbajul C structura i organizarea memoriei la ATmega2560

13.6.1 TIPURI DE POINTERI Odat ce exist mai multe tipuri de memorie este normal ca s exist e mai multe tipuri de pointeri. Tipul unui pointer este dat de: organizarea memoriei n cazul mainilor AVR, memoria fiind adresabil liniar, structura intern a unui pointer reprezint doar o adres (nu i o adres de segment, de exemplu); tipul de memorie n care este stocat obiectul referit SRAM, Flash, EEPROM, etc deoarece, de regul, exist spaii de adresare separate ; spaiul adresabil cu ct dimensiunea pointerului este mai mare cu att spaiul este mai vast (dac el exist fizic); natura obiectului referit (funcie sau variabil) acest aspect determin efectul operatorului de indexare aplicat asupra pointerului. Pentru declararea unui pointer de un anumit tip se vor folosi nite cuvinte cheie specifice compilatorului (acestea nu fac parte din limbajul C standard) cu rol de modificator al variabilei. a) Pointeri la funcii Pointerii la funcii pot avea o dimensiune de 2 sau 3 octei. Valoarea unui pointer la funcie este adresa referit n octei mprit la 2, adic adresa exprimat n cuvinte. Cuvnt cheie Spaiul de adresare Dimensiunea Tipul indexului 00x1FFFE 2 octei signed int __nearfunc 00x7FFFFE 3 octei signed long __farfunc

204

Laborator 13 - Microcontrolere AVR

b) Pointeri la variabile Pointerii la variabile pot avea o dimensiune de 1, 2 sau 3 octei. Cuvnt Spaiul de adresare Dimensiunea Tipul cheie indexului 0x00xFF 1 octet signed __tiny char 0x00xFFFF 2 octei signed int __near 0x00xFFFFFF 3 octei signed int __far 0x00xFFFFFF 3 octei signed __huge long 0x00xFF 1 octet signed __tinyflash char 0x00xFFFF 2 octei signed int __flash 0x00xFFFFFF 3 octei signed int __farflash 3 octei signed __hugeflash 0x00xFFFFFF long 0x00xFF 1 octet signed __eeprom char 0x00xFFFF 2 octei signed int __eeprom Cel mai semnificativ bit 1-2 octei signed int, __generic (MSB) indic tipul de signed memorie referit (1=Flash, long 2=SRAM)

Tipul memoriei SRAM SRAM SRAM SRAM Flash Flash Flash Flash EEPROM EEPROM SRAM, Flash

13.6.2 APLICAII Enun S se copie 6 octei din memoria de program de la adresa 0x0020 ntr-o variabil definit n memoria de date i s se verifice dac operaia a fost fcut corect. Rezolvare Se va declara o variabil de tip pointer ctre o zon din memoria de cod (variabila propriu-zis va fi stocat n memoria de date). Se va iniializa variabila de tip pointer cu adresa primului octet ce trebuie de copiat. Acum, cei 6 octei se pot obine derefereniind de 6 ori variabila de tip pointer adunat cu un offset corespunztor. Verificarea se face comparnd coninutul memoriei din surs (0x0020) i destinaie.

205

Laborator 13 - Microcontrolere AVR

Codul surs main.c

#include <inavr.h> #include <iom16.h> unsigned char destination[6]; #define SOURCE 0x0020 int main( void ) { unsigned char __flash *ptr; unsigned char i; ptr = SOURCE; for (i = 0; i < 6; i += 1) { destination[i] = *(ptr + i); // <=> destination[i] = ptr[i]; } return 0; }

206

Laborator 14 - ATMega16 I2C

14
14.1

ATMega16 I2C

INTRODUCERE N I2C

I2C (Inter Integrated Circuit) este un protocol de transmisie serial de tip master slave, folosit pentru a permite comunicarea ntre dispozitivele electronice integrate. Acest tip de transmisie a fost inventat n anul 1982 de ctre divizia de circuite semiconductoare NXP a companiei olandeze Philips. Pe parcursul dezvoltrii circuitelor integrate, protocolul I2C a suferit mai multe schimbri regsite n urmtoarele versiuni: 1982: Versiunea iniial a sistemului I2C folosit pentru transmisia de informaii ntre diversele circuite implementat de Philips; 1992: Versiunea 1.0 prima versiune standardizat care a adugat, pe lng modul standard de 100 kHz i aa-numitul Fast Mode (Fm) de 400 khz. De asemenea a fost modificat i modul de adresare, acesta fiind trecut pe 10 bii crescnd astfel capacitatea nodurilor suportate de protocol; 1998: Versiunea 2.0 a adugat modul High Speed 3.4 MHz; 2000: Versiunea 2.1 implementeaz mici modificri de mentenan a versiunii anterioare; 2007: Versiunea 3.0 a adugat modul Fast-Mode Plus (Fm+) i un nou mecanism de identificare a dispozitivelor; 2013: Versiunea 4.0 a adugat modul Ultra Fast-Mode (UFm) pentru noile canale USDA si USCL care foloseau logica de tip push-pull fr a mai fi nevoie de rezistene de pull-up. I2C folosete ca mediu de transmisie numai dou linii de bus bidirecionale, una pentru pachetele de date (SDA) i una pentru clock (SCL). De asemenea, pentru fiecare linie a bus-ului I2C este nevoie de o singur rezisten de pull-up conectat la sursa de alimentare. Voltajele tipice folosite au valorile de +5V sau de +3.3V, de i sunt permise i alte valori. Un device conectat ntr-o reea I2C poate avea dou roluri: cel de master i respectiv, cel de slave, acest device purtnd denumirea de nod. Astfel, un nod master are rolul de a iniia comunicarea cu nodurile slave i de a genera clock-ul. Un nod slave recepioneaz clock-ul de la un device de tip master i rspunde la cererile acestuia. Pentru un nod dintr-o conexiune I2C exist patru moduri de operaie posibile: 1. Master transmitter nodul master transmite mesaje ctre un nod slave; 2. Master receiver nodul master recepioneaz date de la un nod slave; 3. Slave transmitter nodul slave transmite mesaje ctre un nod master; 4. Slave receiver nodul slave recepioneaz date de la un nod master.

207

Laborator 14 - ATMega16 I2C

Vcc

Device 1

Device 2

Device 3

Device n

R 1

R 2

SDA SCL

Figura 14.1 Conectarea device-urilor n protocolul I2C

14.2

INTERFAA TWI (TWO WIRE INTERFACE)

Acest tip de interfa este compatibil cu protocolul I2C, avnd un mod de adresare pe 7 bii, permind utilizatorului s conecteze ntr-o reea I2C pn la 128 de device-uri pe acelai bus de date. Nodurile din aceast reea sunt capabile de a transmite date att n modul standard (<100 kBps) ct i n modul Fast (<400 kBps). 14.2.1 TRANSMISIA DE DATE FOLOSIND INTERFA A I C O transmise de tip TWI const dintr-un bloc de start, un bloc indicator de read/write, confirmarea de la device-ul slave, unul sau mai multe pachete de date i un bloc de stop. Fiecare bit din mesajele vehiculate pe bus-ul TWI este nsoit de un puls pe linia de clock. Pentru a asigura validitatea datelor, voltajul liniei de transmisie a datei trebuie sa rmn stabil pe nivelul logic high, excepie fcnd cazurile cnd sunt generate condiiile de start/stop.
2

208

Laborator 14 - ATMega16 I2C

SDA

SCL Data Stable Data Stable Data Change


Figura 14.2 Validitatea datelor la transmisia TWI

14.2.2 CONDIIILE DE START/STOP Unul din rolurile unui nod master este de a iniia i de a ncheia o transmisie pe bus-ul TWI. Transmisia este iniiat cnd device-ul master emite o condiie de START, i este ncheiat atunci cnd este emis condiia de STOP. ntre aceste dou condiii busul este considerat ocupat, nici un alt master neputnd sa acceseze bus -ul n acest timp. Singura excepie n acest caz este atunci cnd ntre emisia condiiilor de START/STOP se emite o noua condiie de START. Aceast condiie se numete REPEATED START i este folosit de un nod de tip master care dorete sa reiniieze un transfer fr a elibera controlul bus-ului TWI. Dup emisia unei condiii de tip REPEATED START bus-ul este ocupat pn la apariia condiiei de STOP. Condiiile de START/STOP sunt evideniate prin schimbarea nivelului logic a liniei SDA atunci cnd SCL este pe nivelul logic high, conform Figura 14.3.

SDA

SCL

START

STOP START

REPEATED START

STOP

Figura 14.3 Condiiile de START, STOP i REPEATED START

209

Laborator 14 - ATMega16 I2C

14.2.3 FORMATUL PACHETELOR DE ADRESE Toate pachetele de adres vehiculate pe bus-ul TWI au lungimea de nou bii, dintre care apte bii sunt cei de adres, un bit de control al operaiei de READ/WRITE i un bit de confirmare. Daca se va seta bitul de READ/WRITE pe high, atunci se va executa o operaie de citire, n caz contrar se va executa o operaie de scriere. Cnd un device slave detecteaz c este adresat, atunci ar trebui s confirme adresarea setnd linia SDA pe low n al noulea ciclu SCL. Dac nodul slave adresat este ocupat sau nu poate rspunde la cererea device-ului master, atunci linia SDA rmne pe nivelul logic high n ciclul de confirmare a SCL. n acest caz master -ul trimite o condiie de STOP sau una de REPEATED START pentru a reiniia transmisia. Un pachet de adres constituit din adresa unui Slave i o cerere de READ/WRITE este denumit generic SLA+R, respective SLA+W. Bitul cel mai semnificativ al pachetului de adresare este transmis mai nti. Adresele device-urilor slave sunt alocate la alegere de ctre utilizator da r adresa 0000 000 este rezervat pentru un apel general. Atunci cnd un apel general este emis, toate device-urile slave trebuie s rspund prin setarea liniei SDA pe nivelul logic 0 n timpul ciclului de recunoatere. Atunci cnd dup apelul general se trans mite un bit de comand pentru scriere, toate device-urile slave rspund prin setarea liniei SDA pe low n timpul ciclului de confirmare. Astfel, pachetele de date care vor urma vor fi recepionate de ctre toate device-urile slave care au confirmat apelul general. n cazul n care apelul general este urmat de un bloc de read, atunci acest apel este ignorat de ctre sistem, deoarece acest lucru ar nsemna ca toate device -urile slave ar transmite mesaje diferite concomitent.

Addr MSB SDA

Addr LSB

RW

ACK

SCL 1 2 7 8 9

Figura 14.4 Formatul pachetelor de adrese

Pachetele de date transmise pe bus-ul TWI au lungimea fix de nou bii, acestea fiind alctuite dintr-un bit de confirmare si opt bii de date. Atunci cnd este iniiat un transfer de date, device-ul master genereaz pulsul de clock, condiiile de START i de STOP, n acest timp device -ul receiver confirmnd datele recepionate. Device-ul care recepioneaz mesajul confirm primirea acestuia setnd linia SDA pe nivelul logic 0 n timpul celui de al noulea puls al liniei SCL. Dac receiver -ul las linia SDA pe high, este semnalat cazul de NACK (No Acknowledge).

210

Laborator 14 - ATMega16 I2C

Data MSB Aggregate SDA SDA from Transmitter SDA from receiverR SCL from Master 1 SLA+R/W 2 7 Data Byte

Data LSB

ACK

9 STOP, REPEATED START or Next Data Byte

Figura 14.5 Formatul pachetelor de date 14.2.4 COMBINAREA ADRESELOR I A PACHETELOR DE DATE N TIMPUL TRANSMISIEI O transmisie const dintr-o condiie de START, un pachet de tipul SLA+R/W, unul sau mai multe pachete de date i o condiie de stop. Un mesaj gol, format dintr-un START urmat de o condiie de STOP, este incorect. Slave-ul poate extinde perioada low a SCL mutnd linia SCL pe un nivel logic 0. Acest lucru este folositor dac viteza clock-ului setat de device-ul master este prea mare pentru slave sau dac slave-ul are nevoie de mai mult timp pentru procesare ntre transmisiile de date. Faptul c slave-ul mrete perioada de nivel logic low a SCL-ului nu va afecta perioada high a SCL-ului, aceasta fiind determinat de nodul master. Ca o consecin, slave-ul poate reduce viteza de transfer a datelor TWI prelungind ciclul SCL.

14.3 STRUCTURA MODULULUI TWI N ATMEGA16


Principalele submodule componente ale blocului TWI pot fi observate n Figura 14.6.

211

Laborator 14 - ATMega16 I2C

SCL

SDA
Spike Filter Slew-rate Control Spike Filter

Slew-rate Control

Bus Interface Unit


START/STOP Control Spike Suppresion

Bit Rate Generator


Prescaler

Arbitration detection

Address/Data Shift Register (TWDR)

Ack

Bit Rate Register (TWBR)

Address Match Unit


Address Register (TWAR) Address Comparator

Control Unit
Status Register (TWSR) Control Register (TWCR)

TWI Unit

State Machine and Status control

Figura 14.6. Structura modulului TWI

14.3.1

PINII SCL I SDA

Aceti pini au rolul de interfa ntre modulele TWI i cel MCU. Driverele de output conin componente limitatoare pentru a respecta specifica iile TWI. Astfel, semnalele cu durate mai mici de 50 de nanosecunde sunt eliminate de la nceput. 14.3.2 MODULUL GENERATOR DE BIT RATE

Acest modul controleaz perioada liniei SCL atunci cnd se opereaz n modul master. Aceast perioad este controlat configurnd registrul TWBR i biii de prescaler din registrul TWSR. Operaiile de tip slave nu depind de bit rate sau de configurarea prescaler-ului, dar este necesar ca frecvena de clock a device-ului slave s fie de cel puin 16 ori mai mare dect frecvena liniei SCL. Frecvena liniei SCL este generat folosind relaia urmtoare:

n aceast relaie TWBR reprezint valoarea registrului TWI Bit Rate Register iar TWPS valoarea biilor de prescale din registrul TWI Status Register.

212

Laborator 14 - ATMega16 I2C

14.3.3

MODULUL DE INTERFA BUS

Conine registrul de date i adrese TWDR i un controler al condiiilor de START/STOP. Registrul TWDR conine adresele sau biii de date care urmeaz a fi transmii sau adresa biilor recepionai. Pe lng registrul TWDR, interfaa bus-ului conine registrul care semnalizeaz bitul (N)ACK care urmeaz a fi transmis/recepionat. Acest registru poate fi alterat doar la recepie modificnd registrul TWCR. Controler-ul de condiii de START/STOP este responsabil cu generarea i detecia semnalelor START, REPEATED START i STOP. Controler-ul de START/STOP poate detecta condiiile acestea chiar dac microcontroler-ul AVR este ntr-un mod pasiv, permind microcontroler-ului s poat fi adresat de modul master.

14.4

DESCRIEREA REGITRILOR TWI


14.4.1
Bit

TWI BIT RATE REGISTER TWBR


6 5 4 3 2 1 0
TWBR

TWBR7 TWBR6 TWBR5 TWBR4 TWBR3 TWBR2 TWBR1 TWBR0 Read/Write Valoare iniial
R/W 0 R/W 0 R/W 0 R/W 0 R/W 0 R/W 0 R/W 0 R/W 0

Biii 7-0 TWI Bit Rate Register TWBR selecteaz factorul de diviziune pentru generatorul de flux a biilor. Generatorul de flux este un divizor de frecven care genereaz o frecven de clock pentru SCL n modul MASTER. 14.4.2 TWI CONTROL REGISTER TWCR

TWCR este utilizat pentru a controla operaiile din TWI. Acesta es te folosit pentru a activa TWI, pentru a iniia accesul la Master prin aplicarea unor condiii de Start pe bus, pentru a genera condiiile de stop i pentru a stopa controlul bus -ului ct timp datele ce trebuie scrise pe bus, sunt scrise n TWDR
Bit

1
R 0

0
TWIE
R/W 0

TWINT TWEA TWSTA TWSTO TWWC TWEN Read/Write Valoare iniial


R/W 0 R/W 0 R/W 0 R/W 0 R 0 R/W 0

TWCR

Bitul 7 TWINT : TWI Interrupt Flag Acest bit este setat de hardware cnd TWI a terminat sarcina curent i ateapt rspunsul aplicaiei software. Bitul 7 TWEA: TWI Enable Acknowledge Bit Bitul TWEA controleaz generarea pulsului acknowledge. Dac TWEA este setat pe 1, ACK este generat pe bus dac sunt ndeplinite urmtoarele condiii: 213

Laborator 14 - ATMega16 I2C 1. Adresa dispozitivului Slave a fost recepionat; 2. Un apel general a fost primit, att timp ct bitul TWGCE din TWAR este setat ; 3. O dat a fost recepionat n modul Master Receiver sau Slave Receiver. Dac se seteaz bitul pe 0, dispozitivul poate fi virtual deconectat de la bus -ul TWI. Bitul 5 TWSTA: TWI START Condition Acest bit se seteaz pe 1 cnd se dorete s devin Master pe busul TWI. Hardwar e+ul TWI verific dac bus-ul este liber i n acest caz genereaz o condiie de start. Oricum, daca bus-ul nu este liber, acesta ateapt o condiie de STOP pentru a genera o nou condiie de START. Bitul 4 TWSTO: TWI STOP Condition Setnd bitul TWSTO pe 1 n mod Master, acesta va genera o condiie de STOP pe bus. Cnd o condiie de STOP este executat, TWSTO se reseteaz automat. Bitul 3 TWWC: TWI Write Collision Flag Bitul 2 TWEN: TWI Enable Bit TWEN seteaz operaiile TWI i activeaz interfaa TWI. Cnd TWEN este setat pe 1, TWI preia controlul asupra pinilor conectai la SCL i SDA. Bitul 1 Res: Reserved Bit Acest bit este tot timpul setat pe 0. Bitul 0 TWIE: TWI Interrupt Enable Cnd acest bit este pe 1, cererile de ntrerupere vor fi activate att timp ct flagul TWINT este high. 14.4.3 TWI STATUS REGISTER TWSR
Bit

7
TWS7

6
TWS6
R 1

5
TWS5
R 1

4
TWS4
R 1

3
TWS3
R 1

2
R 0

0
TWSR

TWPS1 TWPS0
R/W 0 R/W 0

Read/Write Valoare iniial

R 1

Biii 7-3 TWS: TWI Status Aceti bii reflect statusul pe TWI logic i pe bus-ul TWI Bitul 2 Res: Reserved Bit Biii 1-0 TWPS: TWI Prescaler Bits Aceti bii controleaz bit rate-ul prescalerului TWPS1 TWPS0 0 0 1 1 0 1 0 1

Valoare prescaler 1 4 16 64

214

Laborator 14 - ATMega16 I2C

14.4.4

TWI DATA REGISTER TWDR


Bit

7
TWD7

6
TWD6

5
TWD5

4
TWD4

3
TWD3 R/W 1

2
TWD2 R/W 1

1
TWD1 R/W 1

0
TWD0 R/W 1

TWDR

Read/Write Valoare iniial

R/W 1

R/W 1

R/W 1

R/W 1

Biii 7-0 TWD:TWI Data Register Aceti bii conin data ce trebuie transmis, sau ultima dat primit pe bus-ul TWI. 14.4.5 TWI (SLAVE) ADDRESS REGISTER TWAR
Bit

7
TWA6

6
TWA5
R/W 1

5
TWA4
R/W 1

4
TWA3
R/W 1

3
TWA2
R/W 1

2
TWA1
R/W 1

0
TWAR

TWA0 TWGCE
R/W 1 R/W 0

Read/Write Valoare iniial

R/W 1

Biii 7-1 TWA: TWI (Slave) Address Register Aceti apte bii constituie adresa Slave a unitii TWI Bitul 0 - TWGCE: TWI General Call Recognition Enable Bit

14.5

PROBLEM REZOLVAT

Pentru a iniializa modulul TWI al controlerului ATMega16 se va folosi urmtoarea funcie: void TWIInit() { //setarea frecvenei liniei SCL la 400kHz TWSR = 0x00; TWBR = 0x0C; //TWI enable TWCR = (1<<TWEN); } Pentru a genera semnalele de START/STOP se vor crea dou funcii independente, descrise mai jos: void TWIStart() { TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); while ((TWCR & (1<<TWINT)) == 0); }
void TWIStop(void) { TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN); }

215

Laborator 14 - ATMega16 I2C Pentru a scrie pe bus-ul TWI se va utiliza funcia de mai jos. Aceasta scrie biii de date n registrul TWDR, iar mai apoi ateapt terminarea transmisiei i citirea statusului transmisiei din registrul TWSR. void TWIWrite(uint8_t data) { TWDR = data; TWCR = (1<<TWINT)|(1<<TWEN); while ((TWCR & (1<<TWINT)) == 0); } uint8_t TWIGetStatus(void) { uint8_t status; //citirea statusului prin mascare status = TWSR & 0xF8; return status; } Folosind modulele de mai sus se poate implementa funcia de scriere a memoriei EEPROM:
uint8_t EEWriteByte(uint16_t addr, uint8_t data) { //startarea modulului TWI TWIStart(); //verificarea strii acestuia if (TWIGetStatus() != 0x08) return -1; //eroare //selectarea adresei device-ului slave trimiterea datelor TWIWrite((uint8_t)(( addr & 0x0700)>>7)); //verificarea strii transmisiei if (TWIGetStatus() != 0x18) return -1; //eroare //stoparea modulului TWI TWIStop(); return 0; //succes }

corespunztor

Similar, mai jos este implementat funcia de citire din memoria EEPROM: uint8_t EEReadByte(uint16_t addr, uint8_t *data) { //startarea modului TWI TWIStart(); if (TWIGetStatus() != 0x10) return -1; //eroare //selectarea nodului i citirea statusului TWIWrite(((uint8_t)(( addr & 0x0700)>>7))); if (TWIGetStatus() != 0x40) return -1; //eroare //citirea statusului confirmrii i a valorii recepionate * data = TWIReadNACK(); if (TWIGetStatus() != 0x58) 216

Laborator 14 - ATMega16 I2C

return -1; //stopare TWI TWIStop(); return 0; } uint8_t TWIReadNACK(void) { TWCR = (1<<TWINT)|(1<<TWEN); while ((TWCR & (1<<TWINT)) == 0); return TWDR;

15 ADC - Convertorul Analog Numeric (Analog to Digital Converter)


15.1 CARACTERISTICI
Rezoluie de 10 bii Precizie absolut de 2 LSB Timp de conversie ntre 13 260 s 16 canale de intrare nedifereniale multiplexate 14 canale de intrare difereniale 4 canale difereniale cu amplificare de 10x i 200x Interval tensiune intrare ntre 0 i Vcc pentru modul nediferential Interval tensiune intrare ntre 2.7 i Vcc pentru modul diferenial Posibilitatea de a alege ntre 2.56V sau 1.1V ca tensiune referin Moduri de conversie Free Running sau Single Posibilitate de generare ntrerupere la sfritul conversiei AD Posibilitate de a diminua zgomotul

Microcontroler-ul ATmega16 include un convertor analog-numeric cu aproximaii succesive de o rezoluie de 10 bii. Unitatea de conversie (ADC) este conectat la un multiplexor analogic cu 8/16 canale ce permite 8 sau 16 intrri nedifereniale posibile de la pinii portului A i a portului F. Referina pentru intrrile nedifereniale este 0V (GND). Dispozitivul permite deasemenea 16/32 intrri difereniale. Patru dintre intrrile difereniale (ADC1 & ADC0, ADC3 & ADC2, ADC9 & ADC8 i ADC11 & ADC10) sunt prevzute cu un etaj programabil de amplificare, furniznd paii de amplificare de 0dB (1x), 20dB (10x) i 46dB (200x) la intrarea diferenial naintea conversiei AD. Cele 16 canale sunt mprite n 2 seciuni de cte 8 canale, unde n fiecare seciune cte 7 canale difereniale au n comun terminalul negativ. Dac se utilizeaz amplificarea de 1x sau 10x, este de ateptat o rezoluie de 8 bii. Pentru o amplificare de 200x este de ateptat o rezoluie de 7 bii. 217

Laborator 15 ADC (Analog to Digital Converter) Convertorul include un circuit de eantionare-memorare ce asigur tensiunea de intrare constant pe timpul conversiei. Diagrama bloc a convertorului este ilustrat n figura xx.
NTRERUPERE CONVERSIE COMPLET

FLAGURI DE NTRERUPERE ADTS[2:0]

ADIE

ADIF

15 Registrul de date ADC (ADCH/ADCL)


ADC[9:0]

Multiplexor ADC (ADMUX)


ADLAR REFS1 REFS0 MUX4 MUX3 MUX2 MUX1 MUX0

Registrul de control i stare A (ADCSRA)


ADATE ADPS2 ADPS1 ADIF ADPS0 ADEN ADSC

SELECIE TRIGGER DECODOR


SELECIE CANAL SELECIE AMPLIFICARE

PRESCALER

START

AVCC

LOGICA CONVERSIEI

Referin intern 2,56V

AREF

DAC 10 bii

+ COMPARATOR

GND

Referin lungime de band(1,1 V)

ADC7

ADC6

ADC5

MUX INTR. POZ.

IEIRE MULTIPLEXOR ADC

ADC4

ADC3 + ADC2 AMPLIFICATOR

MUX

ADC1

ADC0

MUX INTR. NEG.

Figura 15.1 Schema bloc a convertorului analog-numeric Convertorul are un pin de alimentare (AVCC). Tensiunea de pe acesta trebuie s nu difere cu mai mult de 3V fa de Vcc. 218

Laborator 15 ADC (Analog to Digital Converter) Tensiunile interne de referin de valori nominale de 2.56V sau AVCC, sunt furnizate de pe chip. Tensiunea de referin poate fi decuplat extern de la pinul AREF de un condensator pentru diminuarea zgomotului. Pentru a reduce energia consumat de convertor, bitul PRADC trebuie s fie dezactivat prin scrierea unui 0 logic. 15.1.1 FUNCIONARE Convertorul transform o tensiune analogic de intrare ctre o valoare digital de 10 bii prin aproximaii succesive. Valoarea minim este GND i valoarea maxim reprezint tensiunea pe pinul AREF minus 1 LSB. Opional, AVCC sau o referin de 1.1V sau 2.56V poate fi conectat la pinul AREF prin setarea biilor REFSn din registrul ADMUX. Referina intern poate fi decuplat de un condensator extern conectat la pinul AREF pentru diminuarea zgomotului. Canalul analogic de intrare este selectat prin setarea biilor MUX din ADMUX. Oricare din pinii convertorului, ca masa i referina, pot fi selectai ca intrri nedifereniale. Pinii pot fi selectai c intrri neinversoare sau inversoare ale amplificatorului operaional. Dac intrrile difereniale sunt selectate, diferena de tensiune dintre perechea pinilor canalului de intrare selectat devine valoarea de intrare ctre convertor. Convertorul este activat prin setarea bitului ADEN din registrul ADCSRA. Tensiunea de referin i selecia canalelor de intrare nu va avea efect pn cnd ADEN nu este setat. Convertorul nu consum energie cnd ADEN este resetat, n sensul acesta fiind recomandat oprirea convertorului nainte de intrarea n modul de Power Saving Sleep. Convertorul genereaz un rezultat pe 10 bii care este stocat n regitrii de date ADCH i ADCL. Implicit, rezultatul este aliniat la dreapta, dar opional poate fi aliniat la stnga prin setarea bitului ADLAR n registrul ADMUX. Dac rezultatul este aliniat la stnga i nu este necesar o precizie de mai mult de 8 bii, este suficient citirea lui ADCH pentru a afla valoarea conversiei. n orice caz, ADCL trebuie citit primul, apoi ADCH, pentru a fi siguri c valoarea citit din cele 2 registre aparine aceleiai conversii. 15.1.2 INIIALIZAREA UNEI CONVERSII O conversie este iniializat prin setarea bitului ADSC. Acesta rmne pe 1 att timp ct conversia are loc, i va fi resetat hardware cnd aceasta este complet. Dac un canal de date diferit este selectat n timpul unei conversii, convertorul va termina procesul curent nainte de a schimba canalul. Alternativ, o conversie poate fi declanat automat n mai multe moduri. Auto declanarea este activat prin setarea bitului ADATE n registrul ADCSRA. Sursa de declanare este selectat prin setarea biilor ADTS din registrul SFIOR. Cnd un front pozitiv al clockului este detectat de semnalul de declanare, prescaler-ul convertorului este resetat i procesul ncepe. Acest mod furnizeaz o posibilitate de ncepere a conversiei la intervale fixe. Dac alt front pozitiv este detectat n acest timp, acesta este ignorat. Flagul de ntrerupere trebuie resetat pentru a declana o nou conversie la urmtorul eveniment 219

Laborator 15 ADC (Analog to Digital Converter)

ADTS[2:0] PRESCALER ADIF SOURCE 1 ADATE START CLK convertor LOGICA CONVERSIE DETECIE FRONT

ADSC

SOURCE N

Figura 15.2 Blocul de auto-declanare Setarea flagului de ntrerupere va duce la nceperea unei noi conversii imediat ce se termina procesul curent. Convertorul opereaz astfel n modul Free Running, n mod constant eantionnd i actualiznd registrul de date. Prima conversie trebuie nceput prin setarea ctre bitul ADSC din registrul ADCSRA. Dac auto-declanarea este activat, conversiile Single pot fi ncepute prin setarea bitului ADSC din registrul ADCSRA. ADSC poate fi deasemenea utilizat pentru a afla dac o conversie este n progres. Bitul ADSC va fi citit ca 1 n timpul unei conversii, independent de modul cum a fost pornit procesul. 15.1.3 TIMPI DE PRESCALARE I CONVERSIE
ADEN START CK Reset PRESCALER 7 bii

ADPS0 ADPS1 ADPS2

Sursa clock convertor

Figura 15.3 Prescaler-ul convertorului analog-numeric Implicit, circuitul de aproximaii succesive necesit un clock de frecven ntre 50KHz i 200KHz. Dac este suficient o rezoluie mai mic de 10 bii, frecvena clock 220

Ck/128

Ck/16

Ck/32

Ck/64

Ck/2

Ck/4

Ck/8

Laborator 15 ADC (Analog to Digital Converter) ului convertorului poate fi mrita pna la 1000KHz, obinnd astfel o rat de eantionare mai mare. Convertorul conine un prescaler, care genereaz o frecven de clock acceptabil de la orice frecven CPU sub 100KHz. Factorul prescaler-ului este setat de biii ADPS din registrul ADCSRA. Prescalerul ncepe s numere din momentul cnd ADC -ul este pornit prin setarea bitului ADEN din ADCSRA. O conversie obinuit dureaz 13 cicli clock convertor. Prima procesare dup ce convertorul este pornit se face pe parcursul a 25 cicli clock pentru a iniializa circuitul analogic. Un proces de eantionare i memorare are loc n 1.5 cicli dup nceperea unei conversii obinuite i 13.5 cicli dup nceperea primei conversii. Cnd o procesare este definitivat, rezultatul este scris n regitrii de date i ADIF este setat. Software-ul poate s seteze ADSC din nou, i o nou conversie va fi iniializat la primul front cresctor al semnalului de tact. Cnd auto-declanarea este utilizat, valoarea din prescaler devine 1. Acest lucru asigur o ntrziere fix de la evenimentul declanator pna la nceputul conversiei. n acest mod, eantionarea i memorarea introduce 2 cicli de tact dup frontul pozitiv al sursei de clock al declanatorului. Pentru sincronizarea logic sunt necesari 3 cicli. n modul Free Running, o nou conversie va ncepe imediat dup o conversie complet, ct timp ADSC este 1.

Conversie curenta Numar ciclu Clock ADC ADSC 11 12 13 1 2

Conversia viitoare 3 4

ADIF Semnul si bitul, MSB al rezultatului Bitul LSB al rezultatului Conversia viitoare Actualizare MUX si REFS

ADCH

ADCL

Esantionare si memorare

Figura 15.4 Diagrama

de timp in cazul modului de conversie Free Runing

Condiie

Eantionare

& Timp
221

Laborator 15 ADC (Analog to Digital Converter)

Prima conversie Conversii normale, nediferentiale Conversii autodeclansate Conversii normale, difereniale

Memorare(Cicli de la Conversie(Cicli) inceputul conversiei) 13.5 25 1.5 2 1.5/2.5 13 13.5 13/14

Tabel 4 Timpii

asociai tipurilor de conversie

15.1.4 CANALELE DIFERENIALE Cnd se utilizeaz canalele difereniale, anumite aspecte ale conversiei trebuie luate n considerare. Conversiile difereniale sunt sincronizate cu clock-ul intern CKADC2 cu frecvena egal cu semnalul de tact al convertorului. Aceast sincronizare are loc n aa fel nct eantionarea i memorarea se execut la o faz specificat a CKADC2. Dac modul diferenial este utilizat i conversiile sunt auto -declanate, convertorul trebuie oprit ntre conversii. Cnd auto -declanarea este utilizat, prescalerul convertorului este resetat nainte de nceperea conversiei. Din moment ce acest stagiu este dependent de prioritatea stabilitii semnalului de tact, aceast conversie nu va fi valid. Prin dezactivarea i reactivarea convertorului ntre fiecare conversie (punnd 0, apoi 1 logic n bitul ADEN din ADCSRA) , doar conversiile extinse sunt realizate. 15.1.5 SCHIMBAREA CANALULUI SAU SELECIA REFERINEI Biii MUXn i REFS1:0 din registrul ADMUX sunt memorai ntr-un registru temporar la care procesorul are acces. Acest lucru asigur faptul c selecia referinei i a canalelor are loc la un moment de timp sigur n timpul conversiei. Canalul i selecia referinei este actualizat continuu pn la nceperea unei noi conversii. Odat ce conversia a nceput, posibilitatea de a schimba canalul i selecia referinei este blocat . Dac auto-declanarea este utilizat, timpul exact al momentului cnd a avut loc declanarea nu poate fi precizat cu acuratee. Consideraii speciale trebuie luate cnd se actualizeaz registrul ADMUX, cu scopul de a controla care conversie va fi afectat de noua setare. Dac biii ADATE i ADEN sunt setai, o ntrerupere poate avea loc n orice moment. Dac valoarea registrului ADMUX este schimbat n aceast perioad, utilizatorul nu poate spune care conversie este bazat pe nou sau vechea setar e. ADMUX poate fi actualizat sigur n urmtoarele moduri: Cnd ADATE i ADEN sunt resetai n timpul unei conversii, minim 1 ciclu clock ADC dup declanare Dup o conversie, nainte ca flagul de ntrerupere utilizat ca declanator s fie resetat 222

Laborator 15 ADC (Analog to Digital Converter)

15.1.6 CANALELE DE INTRARE Cnd are loc schimbarea canalelor, utilizatorul trebuie s in cont de urmtoarele precizri pentru a se asigura c selecia canalulului a fost corect: n modul de conversie Single, selecia canalului se face nainte de nceperea conversiei. Canalul selectat poate fi schimbat ntr-un ciclu de clock dup ce a avut loc scrierea unui 1 logic n ADSC. n orice caz, cea mai simpl metod este s se atepte finalul conversiei nainte de a schimba canalul. n modul Free Running, ntotdeauna canalul este selectat naintea primei conversii. Selecia canalului poate fi realizat ntr -un ciclu clock dup ce a avut loc scrierea unui 1 logic n ADSC. n orice caz, cea mai simpl metod este s se atepte finalul conversiei nainte de a schimba canalul . Din moment ce urmtoarea conversie a nceput automat, urmtorul rezultat va reflecta canalul selectat anterior. 15.1.7 TENSIUNEA DE REFERIN Tensiunea de referin pentru convertor indic intervalul de conversie. Canalele nedifereniale care depesc tensiunea de referin VREF vor avea valoarea 0x3FF. Tensiunea VREF poate fi selectat cu AVCC, prin 1.1V referin intern, sau extern cu valoarea de 2.56V de la pinul AREF. Pinul AVCC este conectat la convertor printr-un comutator pasiv. Referina intern de 1.1V este generat printr-un amplificator operaional. n cellalt caz, pinul extern AREF este conectat direct la convertor, i tensiunea de referin este mai bine protejat la zgomot prin conectarea unui capacitor ntre pinul AREF i mas. Dac utilizatorul lucreaz cu o surs de tensiune fix conectat la AREF, acesta poate s nu mai utilizeze opiunile de setare a tensiunii n aplicaie, deoarece ele vor fi direcionate direct ctre sursa de tensiune extern. Dac nu se aplic o tensiune extern la pinul AREF, utilizatorul poate alege ca tensiune de referin dintre 1.1V i 2.56V de la pinul AVCC. 15.1.8 DIMINUAREA ZGOMOTULUI Convertorul pune la dispoziie un element de circuit ce realizeaz diminuarea semnalului de zgomot prezent la intrare, indus de periferice i de microprocesor n general. Pentru a utiliza aceast caracteristic, urmtoarea procedur trebuie s fie urmat: 1. S se asigure c convertorul este activat i nu este n timpul unei procesri. Modul de conversie Single trebuie selectat i activat generarea de ntrerupere la sfritul conversiei. 2. Se intr n modul de diminuare a zgomotului (sau modul Idle). Convertorul va ncepe conversia odat ce procesorul este dezactivat. 3. Dac nici o ntrerupere nu are loc nainte de terminarea conversiei curente, generarea ntreruperii va activa procesorul i se va executa rutina de conversie. Dac o alt ntrerupere activeaz procesorul naintea terminrii conversiei ce are loc, aceasta va fi executat, i va avea loc o ntrerupere la sfritul conversiei.

223

Laborator 15 ADC (Analog to Digital Converter) De notat este faptul c convertorul nu va fi automat oprit cnd se intr n modul Sleep fa de modul Idle. Utilizatorul este sftuit s reseteze bitul ADEN nainte de a intra n modul Sleep pentru a evita consumul excesiv de energie. Dac convertorul este activat n modul Sleep i utilizatorul vrea s realizeze conversii difereniale, este recomandat s se opreasc convertorul i pornit atunci cnd este necesar determinarea rezultatului unei conversii extinse. 15.1.9 CONSTRUCIA INTRRILOR ANALOGICE

IIH ADCn

1..100k IIL CS/H=14pF

VCC/2

Figura 15.5 Structura electric a unui

pin de intrare n convertor

Construcia intrrilor analogice pentru canalele nedifereniale este ilustrat n figura xx Convertorul este optimizat pentru tensiunile analogice cu o impedan de ieire de aproximativ 10k sau mai puin. Dac o asemenea surs este folosit, timpul de eantionare va fi neglijabil. Dac o surs cu o impedan mai mare este folosit, timpul de eantionare va depinde de perioada necesar condensatorului S/H (de eantionare i memorare) s se ncarce. Este recomandat ca utilizatorul s utilizeze surse cu impedan mic i variaii neglijabile, din moment ce acest lucru va minimaliza transferul sarcinii ctre capacitorul S/H. Semnalele ce au n componen frecvene mai mari dect frecvena Nyquis t (FADC/2) nu sunt indicate, pentru a evita distorsiunile ce pot aprea din cauza convoluiei semnalului. Utilizatorul este indicat s ndeprteze componentele de frecven mare cu un filtru trece-jos nainte de a aplica semnalul la intrarea convertorului. 15.1.10 METODE DE DIMINUARE A ZGOMOTULUI ANALOGIC Circuitele digitale din interiorul i exteriorul convertorului genereaz inducie electro-magnetic (EMI) care poate afecta acurateea msurrilor analogice. Dac nivelul de precizie dorit este critic, nivelul de zgomot poate fi redus aplicnd urmtoarele puncte: 1. Dac este posibil, semnalul analogic trebuie distribuit ctre convertor pe o cale ct mai scurt. Cile analogice s aib o mas comun bine delimitat i acestea s fie la o distan suficient de traseele digitale de mare vitez. 224

Laborator 15 ADC (Analog to Digital Converter)

2. 3. 4.

Pinul AVCC s fie conectat la VCC prin intermediul unei reele LC ca n figura de mai jos. Este indicat s se utilizeze funcia de diminuare a zgomotului indus de ctre CPU. Dac oricare din pinii convertorului sunt folosii ca ieiri digitale, este esenial s nu fie comutai cnd o conversie este n funcionare.

PA0 (ADC0)

PA1 (ADC1)

PA2 (ADC2)

PA3 (ADC3)

GND

VCC

PA4 (ADC4) PA5 (ADC5) PA6 (ADC6) PA7 (ADC7) AREF GND

AVCC PC7

Figura 15.6 Conexiunile

convertorului

15.1.11 MRIMI DE PRECIZIE A CONVERTORULUI Un convertor nediferenial pe n bii transform o tensiune liniar cuprins ntre GND i VREF n 2n pai. Codul rezultat minim poate fi 0, iar maxim 2 n-1. O serie de parametri descriu deviaia de la comportamentul ideal: 225

100nF

100H

Laborator 15 ADC (Analog to Digital Converter)

Offset-ul: reprezint deviaia primei tranziii (0x000 la 0x001) comparat cu tranziia ideal (la 0.5 LSB). Valoarea ideal este 0 LSB
Cod Iesire

Mod ideal

Convertor real Convertor ideal

Mod real

Tensiune intrare VREF Offset

Figura 15.7 Eroarea de offset

unui convertor analog-numeric

Eroarea de amplificare: este definit ca fiind deviaia ultimei tranziii (de la 0x3FE la 0x3FF) comparat cu tranziia ideal (la 1.5 LSB sub valoarea maxim admis) n cazul n care eroarea de offset a fost calibrat. Valoarea ideal este 0 LSB.
Cod Iesire

Eroare castig

Mod real

Convertor real Convertor ideal

Mod ideal Tensiune intrare VREF

Figura 15.8 Eroarea de offset

unui convertor analog-numeric


226

Laborator 15 ADC (Analog to Digital Converter)

15.1.11.1

Eroarea de amplificare

Neliniaritatea integral (INL Integral Non-Linearity): n cazul n care eroarea de offset si eroarea de amplificare sunt compensate, neliniaritatea integral se definete ca fiind deviaia tranziiei curente comparat cu tranziia ideal corespunztoare oricrui cod. Valoarea ideal este 0 LSB.
Cod Iesire Eroare castig

Mod real

Convertor real Convertor ideal

Mod ideal Tensiune intrare VREF

Figura 15.9 Eroarea de offset 15.1.11.2 Neliniaritatea integral

unui convertor analog-numeric

Neliniaritatea diferenial (DNL Differential Non-Linearity): reprezint deviaia maxim a codului dintre 2 tranziii adiacente avnd ca referin valoarea ideal de 1 LSB. Valoarea ideal este 0 LSB.

227

Laborator 15 ADC (Analog to Digital Converter)

Cod Iesire

0x3FF

Convertor real Convertor ideal


1 LSB

0x01 0x00

DNL

Tensiune intrare VREF

Figura 15.10 Eroarea de offset unui convertor analog-numeric 15.1.11.3 Neliniaritatea diferenial

Eroarea de cuantizare: datorit cuantizrii tensiunii de intrare ntr -un numr finit de coduri (de ordinul 1 LSB), unele valori apropiate, dar diferite la tensiunii de intrare vor avea aceeai codificare. Precizia absolut: reprezint maximul deviaiei al unei tranziii curente raportat la o tranziie ideal o oricrui cod. Aceasta este un rezultat al erorii de offset, erorii de amplificare, neliniaritii i al erorii de cuantizare. Valoarea ideal este 0.5 LSB.

15.1.12 REZULTATUL CONVERSIEI Dup ce conversia este complet (ADIF este 1), rezultatul acesteia poate fi gsit n regitrii de date ale convertorului (ADCH, ADCL). Pentru conversiile nedifereniale, rezultatul este:

ADC

VIN *1024 VREF

unde Vin este tensiunea de pe pinul de intrare i VREF tensiunea de referin aleas. Dac sunt folosite canalele difereniale, rezultatul este:

ADC

(VPOS VNEG )*512 VREF

unde VIN este tensiunea pe pinul de intrare pozitiv i VNEG tensiunea de pe pinul negativ, iar VREF tensiunea de referin aleas. Rezultatul este pstrat n complement fa de 2, de la 0x200 (-512d) pn la 0x1FF (+511d). De meninut este faptul c dac utilizatorul vrea s verifice polaritatea rezultatului, este suficient ca bitul MSB s fie citit ( ADC9 din ADCH). Dac bitul este 1, atunci rezultatul este negativ, n caz contrar este pozitiv. 228

Laborator 15 ADC (Analog to Digital Converter)

Cod iesire 0x1FF

-VREF
`

0x00
`

0x3FF

VREF

Tensiune de intrare diferentiala

0x200

Figura 15.11 Eroarea de offset unui convertor analog-numeric 15.1.13 INTERVALELE DE MASUR N CADRUL FOLOSIRII INTRRILOR DIFERENIALE Tabelul de mai jos conine codurile de ieire rezultate dac se utilizeaz o pereche de intrri difereniale (ADCn-ADCm) la care se aplic amplificarea GAIN i tensiunea de referin VREF.

VADCn VADCm+ VREF/GAIN VADCm+ 0.999VREF/GAIN VADCm+ 0.998VREF/GAIN


...

Cod citit 0x1FF 0x1FF 0x1FE 0x001

Valoare decimal corespunztoare 511 511 510


...

VADCm+ 0.001VREF/GAIN

1
229

Laborator 15 ADC (Analog to Digital Converter)

VADCm VADCm- 0.001VREF/GAIN


...

0x000 0x3FF 0x201 0x200

0 -1
...

VADCm- 0.999VREF/GAIN VADCm- VREF/GAIN

-511 -512

Tabel 15.1 Corelaia dintre tensiunea de intrare i codurile de ieire

15.1.14 DESCRIERE REGITRI 15.1.14.1 ADMUX Registrul de selecie


Bit

3
MUX3
R/W 0

2
MUX2
R/W 0

1
MUX1
R/W 0

0
MUX0
R/W 0

REFS1 REFS0 ADLAR MUX4 Read/Write Valoare iniial


R/W 0 R/W 0 R/W 0 R/W 0

ADMUX

Biii 7:6 REFS1:0 : Biii de selecie ai referinei Aceti bii selecteaz tensiunea de referin pentru convertor, aa cum este artat n tabela de mai jos. Dac aceti bii sunt modificai n timpul conversiei, schimbarea nu va avea efect dect dup completarea conversiei curente ( ADIF din ADCSRA este 1). Opiunile pentru tensiunea de referin pot s nu fie utilizate dac o tensiune de referin extern este aplicat la pinul AREF.

REFS 1 0 0 1 1

REFS 0 0 1 0 1

Selecia tensiunii de referin


Referina la pinul AREF,VREF intern oprit Referina la pinul AVCC cu condensator extern conectat la pinul AREF 1.1V tensiune intern de referin cu condensator extern conectat la pinul AREF 2.56V tensiune intern de referin cu condensator extern conectat la pinul AREF

Tabel 15.2 Selecia tensiunii de referin pentru convertorul analog -numeric

230

Laborator 15 ADC (Analog to Digital Converter)

Bitul 5 ADLAR: Aliniere la stnga a rezultatului Acest bit modific aezarea rezultatului conversiei n registrul de date al acestuia. Scriind 1 n ADLAR, rezultatul va fi aliniat la stnga. n caz contrar, rezultatul este aliniat la dreapta. Biii 4:0 MUX4:0 : Biii de selecie ai canalului analogic i ai amplificrii Valoarea acestor bii selecteaz care combinaie de intrri analogice este prezent la intrarea convertorului. Dac aceti bii sunt schimbai n timpul conversiei, efectul lor va fi vizibil la urmtoarea conversiei (bitul ADIF din ADCSRA este 1).

Intrare Single MUX[4:0] Ended 00000 ADC0 00001 ADC1 00010 ADC2 00011 ADC3 00100 ADC4 00101 ADC5 00110 ADC6 00111 ADC7 01000 01001 01010 01011 01100 01101 01110 01111 N/A 10000 10001 10010 10011 10100 10101 10110

Intrare Diferenial Pozitiv

Intrare Diferenial Pozitiv

Ampl.

N/A

ADC0 ADC1 ADC0 ADC1 ADC2 ADC3 ADC2 ADC3 ADC0 ADC1 ADC2 ADC3 ADC4 ADC5 ADC6

ADC0 ADC0 ADC0 ADC0 ADC2 ADC2 ADC2 ADC2 ADC1 ADC1 ADC1 ADC1 ADC1 ADC1 ADC1

10x 10x 200x 200x 10x 10x 200x 200x 1x 1x 1x 1x 1x 1x 1x


231

Laborator 15 ADC (Analog to Digital Converter)

10111 11000 11001 11010 11011 11100 11101 11110 11111 1.22V (VBG) 0 V (GND)

ADC7 ADC0 ADC1 ADC2 ADC3 ADC4 ADC5 N/A

ADC1 ADC2 ADC2 ADC2 ADC2 ADC2 ADC2

1x 1x 1x 1x 1x 1x 1x

Tabel 15.3 Selecia canalului de conversie i a amplificrii

15.1.14.2
Bit

ADCSRA - Registrul A de control i stare a convertorului


7
ADEN

4
ADIF
R/W 0

3
ADIE
R/W 0

0
ADCSRA

ADSC ADATE
R/W 0 R/W 0

ADPS2 ADPS1 ADPS0


R/W 0 R/W 0 R/W 0

Read/Write Valoare iniial

R/W 0

Bitul 7 ADEN: Activare convertor Setnd acest bit, se va activa convertorul. La resetarea acestui bit, co nvertorul este oprit. Dac se oprete convertorul n momentul efecturii unei conversii, conversia este intrerupt, datele rezultate fiind pierdute. Bitul 6 ADSC: Bitul de pornire al unei conversii analog-numerice n modul de conversie Single, scriind n acest bit 1,se va declana o nou conversie. n modul Free Running, se scrie 1 n acest bit pentru a ncepe prima conversie. Bitul 5 ADATE: Bitul de activare al autodeclanrii Cnd acest bit este setat, autodeclanarea convertorului este activat. Convertorul va ncepe o nou conversie la apariia unui front pozitiv al semnalului de declanare. Sursa de declanare este selectat prin biii ADTS din registrul ADCSRB. Bitul 4 ADIF: Bitul de detecie a ntreruperii generate de o conversie Acest bit este setat cnd conversia curent este complet i rezultatul acesteia este scris n registrul de date. Generarea ntreruperii este efectuat la terminarea conversiei dac bitul ADIE i bitul I din registrul SREG sunt setai. ADIF este resetat hardware cnd are loc execuia vectorului de ntrerupere. 232

Laborator 15 ADC (Analog to Digital Converter)

Bitul 3 ADIE: Bitul de activare ntrerupere la sfritul conversiei Cnd n acest bit i bitul I din registrul SREG sunt setai, este activat o ntrerupere la terminarea conversiei n c urs de prelucrare. Biii 2:0 ADPS2:0: Biii de selecie ai factorului de prescalare al convertorului Aceti bii determina factorul de divizare dintre frecvena XTAL i semnalul de tact al convertorului.

ADPS2 0 0 0 0 1 1 1 1

ADPS1 0 0 1 1 0 0 1 1

ADPS0 0 1 0 1 0 1 0 1

Factor divizare 2 2 4 8 16 32 64 128

Tabel 5.4 Selecia factorului de prescalare al convertorului

15.1.14.3

ADCL i ADCH Regitrii de date ai convertorului

ADLAR = 0
Bit 15 ADC7 7 Read/Write R R Valoare iniial 0 0 14 ADC6 6 R R 0 0 13 ADC5 5 R R 0 0 12 ADC4 4 R R 0 0 11 ADC3 3 R R 0 0 10 ADC2 2 R R 0 0 9 ADC9 ADC1 1 R R 0 0 8 ADC8 ADC0 0 R R 0 0 ADCH ADCL

ADLAR = 1

233

Laborator 15 ADC (Analog to Digital Converter)

Bit

15 ADC9 ADC1 7

14 ADC8 ADC0 6 R R 0 0

13 ADC7 5 R R 0 0

12 ADC6 4 R R 0 0

11 ADC5 3 R R 0 0

10 ADC4 2 R R 0 0

9 ADC3 1 R R 0 0

8 ADC2 0 R R 0 0 ADCH ADCL

Read/Write

R R

Valoare iniial

0 0

Cnd conversia este complet, rezultatul este stocat n aceste registre. Dac sunt utilizate canalele difereniale, rezultatul este prezent sub complement fa de 2. Cnd registrul ADCL este citit, registrul de date nu este actualizat pn ce nu are loc citirea registrului ADCH. Dac rezultatul este aliniat la stnga i nu este necesar o precizie mai mare de 8 bii, este suficient numai citirea registrului ADCH. n caz contrar registrul ADCL trebuie citit mai nti, apoi registrul ADCH. ADC9:0 Biii rezultat ai conversiei Aceti bii sunt utilizai pentru a stoca rezultatul unei conversii analog numerice.

15.1.14.4
Bit

SFIOR - Registru cu funcie speciale


7 6 5 4
R/W 0

3
ACME
R/W 0

2
PUD
R/W 0

1
PSR2
R/W 0

0
PSR10
R/W 0

ADTS2 ADTS1 ADTS0 Read/Write Valoare iniial


R/W 0 R/W 0 R/W 0

SFIOR

Biii 2:0 ADTS2:0 : Biii de selecie ai sursei de autodeclanare Dac bitul ADATE din registrul ADCSRA este 1, valoarea acestor bii indic care surs va genera autodeclanarea unei conversii analog -numerice. Dac bitul ADATE este resetat, setarea biilor ADTS2:0 nu va avea nici un efect. O conversie va fi declanat de frontul pozitiv al flagului de ntrerupere selectat.

ADTS2 ADTS1 ADTS0 Sursa declanare 0 0 0 Modul Free Running 0 0 0 Comparator analogic
234

Laborator 15 ADC (Analog to Digital Converter)

0 0 1 1 1 1

1 1 0 0 1 1

0 1 0 1 0 1

Cerere de ntrerupere extern 0 Timer/Counter0 Compare Match A Timer/Counter0 Overflow Timer/Counter1 Compare Match B Timer/Counter1 Overflow Timer/Counter1 Capture Event

Tabel 15.5 Selecia sursei de autodeclanare a conversiei

235

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