Sunteți pe pagina 1din 235

Laborator 1 - Echipamente de laborator

1 Introducere n echipamentele de laborator


1.1

OBIECTIVE
Lucrarea prezinta echipamentele utilizate n cadrul laboratorului:

1.2

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.

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 ieire
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 ieirea 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.), permind 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 pentru 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 instruciunilor,
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

PC0 PC7

VCC

PORTA Buffers/Drivers

PORTC Buffers/Drivers

PORTA Interfa Digital

PORTC Interfa Digital

GND

AVCC

Mux i
ADC

Interfa
ADC

TWI

Program
Counter

Pointer
Stiv

Timer-e/
Counters

Program
Flash

SRAM

Oscilator
Intern

AREF

Registru
Instruciun
i
Decodor
Instruciun
i

Regitri de
uz general
X
Y
Z

Linii de
control

ALU

AVR CPU

Registru
de stare

Logica de
programare

SPI

+
-

Watchdog
Timer

Oscilator

Oscilator

MCU Control
& Timing

Unitate
ntreruperi

RESET

Oscilator
intern calibrat

EEPROM

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

INTRODUCERE N IAR EMBEDDED WORKBENCH 5.51

2.4.1

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

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

Analiza sintatic
Arbore sintactic; compatibilitate
tipuri de date

Analiza semantic
Informaii
despre nume

Recunoatere+emitere
mesaje

Gestionare T.S.

Tratarea erorilor

Generare cod intermediar

Similar limbajului de
asamblare,doar c nu se
specific registrele utilizate

Optimizare cod

Faz opional;
Timp de execuie/ spaiu de
memorie

Generare cod final

Program obiect
Figura 2.4 Etapele realizrii unei aplicaii

Setrile de baz pentru configurarea proiectului

o
o
o
o
o

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

Opiune generic
-v0
-v0
-v0
-v0
-v0
-v1
-v0
-v1
-v1
-v1
-v1
-v3

Derivate AVR suportate


AT90S1200
AT90S2313
AT90S2323
AT90S2333
AT90S2343
AT90S4414
AT90S4433
AT90S4434
AT90S8515
AT90S8534
AT90S8535
AT43USB320A

--cpu=at43usb325

-v3

--cpu=at43usb326
--cpu=at43usb351m

-v3
-v3

AT43USB325
AT43USB326
AT43USB351m

--cpu=at43usb353m

-v3

AT43USB353m

--cpu=at43usb355
--cpu=at94k

-v3
-v3

AT43USB355
FpSLic

--cpu=at86rf401
--cpu=can128
--cpu=m8

-v0

AT86RF401

-v3

AT90CAN128
ATmega8

--cpu=m16
--cpu=m32
--cpu=m48

-v1
-v3

ATmega16

-v3
-v1

ATmega32
ATmega48

--cpu=m64

-v3

ATmega64

--cpu=m88
--cpu=m103

-v1
-v3

ATmega88
ATmega103

--cpu=m128

-v3

ATmega128

--cpu=m161
--cpu=m162

-v3
-v3

ATmega161
ATmega162

--cpu=m163

-v3

ATmega163

--cpu=m165
--cpu=m168

-v3
-v3

ATmega165
ATmega168

--cpu=m169

-v3

ATmega169
18

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

--cpu=m2560
--cpu=m2561

-v5
-v5

ATmega2560
ATmega2561

--cpu=m323

-v3

ATmega323

--cpu=m325

-v3

ATmega325

--cpu=m3250

-v3

ATmega3250

--cpu=m329

-v3

ATmega329

--cpu=m3290

-v3

ATmega3290

--cpu=m406
--cpu=m645

-v3
-v3

ATmega406

--cpu=m6450

-v3

--cpu=m649
--cpu=m6490

-v3
-v3

--cpu=m8515

-v1

ATmega6490
ATmega8515

--cpu=m8535
--cpu=tiny10

-v1
-v0

ATmega8535
ATtiny10

--cpu=tiny11

-v0

ATtiny11

--cpu=tiny12
--cpu=tiny13

-v0
-v0

ATtiny12
ATtiny13

--cpu=tiny15

-v0

ATtiny15

--cpu=tiny25
--cpu=tiny26

-v0
-v0

ATtiny25
ATtiny26

--cpu=tiny28

-v0

ATtiny28

--cpu=tiny45
--cpu=tiny85

-v1
-v1

ATtiny45
ATtiny85

--cpu=tiny2313

-v0

ATtiny2313

ATmega645
ATmega6450
ATmega649

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

Data max.

__nearfunc
__nearfunc
__nearfunc
__nearfunc
__nearfunc
__farfunc*
__farfunc*

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 memorie : 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

Pointer
implicit

Dimensiunea
maxim a stivei

__tiny

__tiny

256 o

__near

__near

64 ko

__far

__far

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

c.

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 opiunii 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.

d.

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.

e.

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.

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 include_alias
#pragma inline
#pragma language

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

#pragma location

Specific adresa absolut a unei variabile

#pragma message

Afieaz un mesaj

#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

22

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

#pragma
object_attribute
#pragma optimize

Schimb definiia unei variabile sau a unei funcii

#pragma pack

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

Specific tipul i nivelul de optimizare

#pragma required
#pragma rtmodel
#pragma segment
#pragma type_attribute
#pragma vector

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:

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

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

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 funciei, 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

REALIZAREA UNUI PROIECT (PENTRU ATMEGA16)

2.5.1

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.

Adugarea fiierelor surs


menu=File menu=New menu=File
menu=File menu=Save
menu=Project menu=Add files

2.

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:

menu=Project menu=Make
se va indica locaia fiierului cu informaii despre spaiul de lucru.

2.5.2

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 ctre 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

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

1.

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

CUM FUNCIONEAZ UN LED

3.1.1

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 compoziia 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

DC
R

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

CONFIGURAIA PINILOR DIN ATMEGA16

3.2.1

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

PB4 (SS)
PB3 (AIN1/OC0)
PB2 (AIN0/INT2)
PB1 (T1)
PB0 (XCK/T0)
GND
VCC
PA0 (ADC0)
PA1 (ADC1)
PA2 (ADC2)
PA3 (ADC3)

TQFP/QFN/MLF
PDIP
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

44
(MOSI) PB5
(MISO) PB6
(SCK) PB7
RESET
VCC
GND
XTAL2
XTAL1
(RXD) PD0
(TXD) PD1
(INT0) PD2

43

42

41

40

39

38

37

36

34
35

1
2
3
4
5
6
7
8
9
10
11

33
32
31
30
29
28
27
26
25
24
23
12

13

14

15

16

17

18

19

20

21

PA4 (ADC4)
PA5 (ADC5)
PA6 (ADC6)
PA7 (ADC7)
AREF
GND
AVCC
PC7 (TOSC2)
PC6 (TOSC1)
PC5 (TDI)
PC4 (TDO)

22

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

(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

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

3.2.2

DESCRIEREA PE SCURT A PINILOR I UTILIZAREA LOR


FRECVENT

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.

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

3.2.3

PORTURILE DE INTRARE/IEIRE

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

PORTxn

I/O

Pull-up

0
1

PUD
(n SFIOR)
x
0

0
0

Input
Input

Nu
Da

0
1
1

1
0
1

1
x
x

Input
Output
Output

Nu
Nu
Nu

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

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
0xFF

0x00
r17
tpd,max
tpd,min

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
0xFF

r16
INSTRUCTIONS

out PORTx,r16

nop

in r17,PINx

SYNC LATCH
PIN xn
0xFF

0x00
r17
tpd

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.

3.2.6

FUNCII ALTERNATIVE ALE PORTURILOR

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

Descriere

Pull-up Override Enable

PUOV

Pull-up Override Value

DDOE

Data Direction Override


Enable

DDOV

Data Direction Override


Value

PVOE

Port
Value
Enable

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

Override

52

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

PVOV

Port Value Override Value

DIEOE

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

PB7/SCK

PB6/MISO

PB5/MOSI

PB4/ SS

SPE MSTR

SPEMSTR

SPE MSTR

SPE MSTR

PUOV

PB7 PUD

PB4 PUD

DDOV
PVOE

SPE MSTR
0
SPEMSTR

PB6 PUD
SPEMSTR

PB5 PUD

DDOE

SPE MSTR
0
SPEMSTR

SPE MSTR
0
0

PVOV

SCK OUTPUT

DIEOE
DIEOV
DI

0
0
SCK INPUT

AIO

SPI MSTR
OUTPUT
0
0
SPI SLAVE
INPUT
-

0
SPE MSTR
SPI SLAVE
OUTPUT
0
0
SPI MSTR
INPUT
-

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

PB3/OC0/AIN1

PB2/INT2/AIN0

PB1/T1

PB0/T0/XCK

0
0
0
0
OC0 ENABLE
OC0
0
0
-

0
0
0
0
0
0
INT2 ENABLE
1
INT2 INPUT

0
0
0
0
0
0
0
0
T1 INPUT

AIO

AIN1 INPUT

AIN0 INPUT

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

PC6/TOSC1

PC5/TDI

AS2
0
AS2
0

AS2
0
AS2
0

JTAGEN
1
JTAGEN
0

0
0
AS2
0
T/C2 OSC
OUTPUT

0
0
v
T/C2 OSC
INPUT

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

PC3/TMS

PC2/TCK

PC1/SDA

PC0/SCL

JTAGEN
1

JTAGEN
1

TWEN

TWEN

DDOE
DDOV
PVOE
PVOV
DIEOE
DIEOV
DI
AIO

JTAGEN
0
0
0
JTAGEN
0
TMS

JTAGEN
0
0
0
JTAGEN
0
TCK

PC1 PUD
TWEN
DA_OUT
TWEN
0
0
0
SDA INPUT

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

PD7/OC2

PD6/ICP

PD5/OC1A

PD4/OC1B

0
0
0
0
OC2 ENABLE

0
0
0
0
0

PVOV
DIEOE
DIEOV
DI
AIO

OC2
0
0
-

0
0
0
ICP INPUT
-

0
0
0
0
OC1A
ENABLE
OC1A
0
0
-

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

PD3/INT1

PD2/INT0

PD1/TXD

PD0/RXD

0
0

0
0

TXEN
0

RXEN

DDOE
DDOV
PVOE
PVOV
Numele
Semnalului
DIEOE

0
0
0
0
PD3/INT1

0
0
0
0
PD2/INT0

TXEN
1
TXEN
TXD
PD1/TXD

PD0 PUD
RXEN
0
0
0
PD0/RXD

INT1
ENABLE
1
INT1 INPUT
-

INT0
ENABLE
1
INT0 INPUT
-

0
-

0
RXD
-

DIEOV
DI
AIO

Figura 3.3 Semnalele de suprascriere pentru Portul D

3.3

REZISTENA DE PULL-UP

3.3.1

BITUL PUD DIN SFIOR (SPECIAL FUNCTION I/O REGISTER)


Bit

ADTS2 ADTS1 ADTS0 ADHSM ACME

PUD

PSR2

PSR10

Read/Write

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Valoare iniial

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 *);

unsigned char
__flash *);

__load_program_memory(const

unsigned

char

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.

APLICAII

3.6
Enun

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

3.

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

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:

4.2

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.

MODELUL COMUNICAIEI SERIALE


Centrala telefonica

ECD
(modem)

Centrala telefonica

ETD

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.

ETD (Echipamente terminale de date: calculatoare, terminale de date). Acestea conin i


interfeele seriale sau controlerele de comunicaie;

2.

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

4.

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;

5.

Legtura de date conine circuitul de date i interfeele seriale ale echipamentelor


terminale de date.

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 succesive 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 paritate 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

b0

b1

b2

b3

b4

b5

b6

b7

1
s1

s2

0
T
Pauz

Cod ASCII pentru a (61h)

START
1 bit

Paritate
Caracter

STOP
2 bii

Pauz

Transmisie

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:

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.

4.3.3

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.

2.

3.

4.

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

Laborator 4 Comunicaia serial

5.
6.
7.
8.

9.

10.
11.

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:

4.4.2

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

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

Semnal

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).
1
2
3
4
5
6
7
8
20
22

PG
TD
RD
RTS
CTS
DSR
SG
CD
DTR
RI

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)

TX
CONTROL

DATABUS

PARITY
GENERATOR
PIN
CONTROL

TRANSMIT SHIFT REGISTER

TxD

Receiver
CLOCK
RECOVERY

RX
CONTROL

RECEIVE SHIFT REGISTER

DATA
RECOVERY

PIN
CONTROL

UDR (Receive)

PARITY
CHECKER

UCSRA

UCSRB

RxD

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

INTERFAA 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

INTERFAA 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 conectate la
acest bus au propria adres.

73

Laborator 4 Comunicaia serial

REGITRII USART

4.8

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:


7

RXC

TXC

UDRE

FE

DOR

PE

U2X

MPCM

Read/Write

R/W

R/W

R/W

Valoare iniial

Bit

UCSRA

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:


7

Bit

RXCIE TXCIE UDRIE

RXEN

TXEN

UCSZ2

RXB8

TXB8

Read/Write

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Valoare iniial

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

URSEL UMSEL UPM1

UPM0

USBS UCSZ1 UCSZ0 UCPOL

Read/Write

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Valoare iniial

UCSRC

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

Modul paritii
Dezactivat
Rezervat
Activat, paritate par
Activat, paritate impar

UPM10
0
1
0
1

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

Bii de stop

1 BIT

2 BIT

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

Equition for calculating


Baud Rate

Equition for calculating


UBRR value

Asynchronous Normal
Mode (U2X = 0)
Asynchronous Double
Speed Mode (U2X =
1)
Synchronous Master
Mode

4.9

APLICAII

Enun
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

INTRODUCERE

5.1.1

PERSPECTIV ASUPRA MEDIULUI 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 fiierele 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:

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

Opiune linker n
IAR
Embedded
Workbench
Informaii C-SPY

Comanda
linker optiune
de linie
-Fubrof

Cu
module
control
funcionrii
Cu
module
emulare I/O

de
a

-r

de

-rt

Descriere

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 combinaii 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

Opiune
Generic
Procesor
-v3

Modelul
memoriei

Enhanced
core

Small

-v3

-v3

Small

Small
flash

64-bit
doubles

Configurarea
bibliotecii

--

Normal

--

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 combinaii 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.

5.2.3

STOCAREA FUNCIILOR

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.

5.2.4

FUNCIA MYPRINT

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.


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* .

2.
3.

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

NTRERUPERI. TABELA VECTORILOR DE NTRERUPERI.

6.1.1

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

Adresa
programului

Sursa

Definiia ntreruperii

$000

RESET

External Pin, Power-on Reset,


Brown-out
Reset, Watchdog Reset, and
JTAG AVR
Reset

2
3
4
5
6
7

$002
$004
$006
$008
$00A
$00C

INT0
INT1
TIMER2 COMP
TIMER2 OVF
TIMER1 CAPT
TIMER1 COMPA

$00E

TIMER1 COMPB

9
10
11
12
13
14
15
16
17
18
19
20
21

$010
$012
$014
$016
$018
$01A
$01C
$01E
$020
$022
$024
$026
$028

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

Read/Write

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Valoare iniial

Bit

SREG

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

Descriere

Operaie

SEI

Global Interrupt
Enable
Global Interrupt
Disable

CLI

I1

Numr de
cicli
1

__enable_interrupt

I0

__disable_interrupt

Funcii IAR

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


7

INT1

INT0

INT2

IVSEL

IVCE

Read/Write

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Valoare iniial

Bit

GICR

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 definete logica de generare a
ntreruperii, respectiv dac aceasta este generat pe tranziia de cretere sau pe cea de scdere.

6.4.1

NTRERUPERILE EXTERNE

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

SM2

SE

SM1

SM0

ISC11

ISC10

ISC01

ISC00

Read/Write

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Valoare iniial

Bit

MCUCR

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

JTD

ISC2

JTRF

WDRF

Read/Write

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Valoare iniial

Bit

BORF EXTRF PORF

MCUCSR

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 nct 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 funcia 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

010k
kkkk

kkkk
kkkk

110k
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

0101

0001

1000

Tabel 6.6
103

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

End of current
instruction

Reset bit
in I/O
register

Return from interrupt

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 obinute
(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.

6.5.5

DECLARAREA UNEI FUNCII DE NTRERUPERE N C

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 modificrile 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 un 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 mpririi 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

Inversat

0x3

0xC

Inversat reciproc
(Koopman)
0x9
Tabel 7.1

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/necesitile. 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 diferii 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

Inversat

Inversat reciproc

CRC-1

0x1

0x1

0x1

CRC-4-ITU

0x3

0xC

0x9

CRC-5-EPC

0x09

0x12

0x14

CRC-5-USB

0x05

0x14

0x12

CRC-6-ITU

0x03

0x30

0x21

CRC-7

0x09

0x48

0x44

CRC-8-CCITT

0x07

0xE0

0x83

CRC-8

0xD5

0xAB

0x8E

CRC-8-Dallas/Maxim

0x31

0x8C

0x98

CRC-8-SAE J1850

0x1D

0xB8

0x8E

CRC-8-WCDMA

0x9B

0xD9

0xCD

CRC-10

0x233

0x331

0x319

CRC-11

0x385

0x50E

0x5C2

CRC-12

0x80F

0xF01

0xC07

CRC-15-CAN

0x4599

0x4CD1

0x62CC

CRC-15-MPT1327

0x6815

0x540B

0x740A

CRC-16-IBM (ANSI)

0x8005

0xA001

0xC002

CRC-16-CCITT

0x1021

0x8408

0x8810

CRC-16-T10-DIF

0x8BB7

0xEDD1

0xC5DB

CRC-16-DNP

0x3D65

0xA6BC

0x9EB2

CRC-16-DECT

0x0589

0x91A0

0x82C4

CRC-16-ARINC

0xA02B

0xD405

0xD015

CRC-24

0x5D6DCB

0xD3B6BA

0xAEB6E5

CRC-32

0x04C11DB7

0xEDB88320

0x82608EDB

Tabel 7.2

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 biii
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 poziie 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 funcie 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 funcii:
Cuvnt-cheie

Interval de
memorie

Dimensiune
pointer

Tip index

__nearfunc

0-0x1FFFE

2 octei

signed int

__farfunc

0-0x7FFFFE

3 octei

signed long

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.

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

Dimensiune
pointer

Spaiul de
memorie

Tipul indicelui

Intervalul de
memorie

__tiny

1 octet

Data

signed char

0x0-0xFF

__near

2 octei

Data

signed int

0x0-0xFFFF

__far

3 octei

Data

signed int

0x0-0xFFFFFF

__huge

3 octei

Data

signed long

0x0-0xFFFFFF

__tinyflash

1 octet

Code

signed char

0x0-0xFF

__flash

2 octei

Code

signed int

0x0-0xFFFF

__farflash

3 octei

Code

signed int

0x0-0xFFFFFF

__hugeflash

3 octei

Code

signed long

0x0-0xFFFFFF

__eeprom

1 octet

EEPROM

signed long

0x0-0xFF

__eeprom

2 octei

EEPROM

signed int

0x0-0xFFFF

Tabel 7.3

117

Laborator 7 - Coduri Redundante Ciclice

7.7

7.7.1

IMPLEMENTARE CRC N IAR/AVR

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

7.7.3

COMPARAREA TIMPILOR DE EXECUIE


CRC-16 lent:

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

Flip flop

Clock

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 obicei 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

TOV0
Intr.

clear

Control Logic

direction

DATABUS

BOTTOM

clkT0

Clock Select
Detector de
front

TOP

Numrtor
TCNT0

T0

(de la
Prescaler)
=0

= 0xFF
OC0
Intr.

Generator
form de
und

OC0

OCR0

Figura 8.2 Diagrama bloc Timer/Counter0


131

Laborator 8 - Frecvenmetru. Timer/Counter 0

8.2.1

NOIUNI INTRODUCTIVE

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.

TOSC1

count
clear

TCNT0

direction

Control
Logic

clkT0

T/C
Oscillator

Prescaler

TOSC2

clkI/O
bottom

top

Figura 8.3 Diagrama bloc a unitii de numrare


Unitatea

de

numrare

DATA BUS

este

pe

bii,

bidirecional

TOV0 Intr.

TOSC1

count
TCNT0

programabil.

clear
direction

Control
Logic

clkT0

T/C
Oscillator

Prescaler

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

Generator Form de Und

OC0

FOC0

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.

PROBLEM REZOLVAT

8.3
Enun

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

FOC0 WGM00 COM01 COM00 WGM01 CS02

CS01

CS00

Read/Write

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Valoare iniial

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

COM00

0
0
1
1

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. Acest 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
.

9.1.3

SINCRONIZAREA NTRE DOMENII DIFERITE DE CLOCK

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 urmtorul 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 clock-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


Resetarea sistemului

WDT
timer

Resetarea WDT

TOWD=8

WDT timeout

5
4
TWDT_Reset
0

T0

t[ms]
10

15

WDT clock

Figura 9.2 Sincronizarea clock-ului

9.1.4

MODURILE DE FUNCIONARE

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 .
Resetarea sistemului

WDT timer

WDT reset

Deschis

TOWDT=16

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 .

TOWDT=8

Deschis

TOWDTW=8

nchis

WDT timer

WDT reset

Resetare prematur a WDT

Resetarea sistemului
t[ms]
5

10

15

20

25

TOWDTW

30

35

40

TOWDT

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

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

sistemului
;

este

realizat

dup

expirarea

perioadei

de

time-out

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 ateptare 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 suspendat 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 resetrilor.

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

Alta
Stare
Poate WDT
reseta sistemul? Nu

Brownout sau
Software

WDT_OK

Starea
testului?

Configurat de
utilizator
Configurat de
utilizator

WDT_3
WDT_2

WDT_1

Da

Poate WDT fi
resetat?

Nu

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

ATMEGA16

9.3.1

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.

9.3.2

RUTINA DE NTRERUPERE DE RESET

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 pragul
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.


7

JTD

ISC2

JTRF

WDRF

Read/Write

R/W

R/W

R/W

R/W

Valoare iniial

Bit

BORF EXTRF PORF


R/W

R/W

MCUCSR

R/W

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.

OSC/2048K

OSC/512K

OSC/1024K

OSC/128K

OSC/256K

OSC/32K

WATCHDOG
RESET

OSC/64K

WATCHDOG PRESCALER

OSC/16K

OSCILATOR

WDP0
WDP1
WDP2
WDE

RESET

Figura 9.7 Watchdog timer

9.3.5.1 Registrul WDTCR


7
-

6
-

5
-

WDTOE

WDE

WDP2

WDP1

WDP0

Read/Write

R/W

R/W

R/W

R/W

R/W

Valoare iniial

Bit

WDTCR

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

Timpul de
expirare pentru
VCC = 3.0V
17.1 ms

Timpul de
expirare pentru
VCC = 5.0V
16.3 ms

Numrul de cicli ai
WDT
16K(16,384)

32K(32,768)

34.3 ms

32.5 ms

64K(65536)

68.5 ms

65 ms

128K(131,072)

0.14 s

0.13 s

256K(262,144)

0.27 s

0.26 s

512K(524,288)

0.55 s

0.52 s

1024K(1,048,576)

1.1 s

1.0 s

2048K(2,097,152)

2.2 s

2.1 s

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

9.4

APLICAII

9.4.1

APLICAIA 1

9.1.1.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 aplicaiei (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.

9.1.1.3

Schema logic

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.

9.1.1.4

Codul surs
main.c

#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

APLICAIA 2

9.1.1.5

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

9.1.1.6

Rezolvare

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 pozitiv 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.

9.1.1.7

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

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

APLICAIA 3

9.1.1.10

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.

9.1.1.12

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

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.

9.1.1.14

Codul surs

#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 numericanalogic. 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 frecvena 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

TOVn (Int. Req.)


Selectarea clock-ului

Control Logic

Direcie

Detector
de front
TOP

Tn

BOTTOM

Timer/Counter

(de la prescaler)

TCNTn
=

OCnA (Int. req.)

=0

Generator
de forma
de und

OCRnA

OCnB (Int. req.)

Valori
TOP fixate

Generator
de forma
de und

OCRnB
ICFn(Int. req.)
Detector
de front

ICRn

ICPn

ICPn

De la ieirea
comparatorului
analogic

Atenuator
de zgomot
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. Acelai 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 instruciuni de accesare a unui registru pe
16 bii, iar codul ntreruperii actualizeaz registrul temporar prin accesarea aceluiai 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
ret
159

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

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)
TOVn
(Int.
req.)

TEMP (8-bit)

Numr

TCNTnL (8-bit)

Direcie

TOP

TCNTn (numrtor pe 16 bii)

Resetare

Control
Logic

clkTn

BOTTOM

TCNTnH (8-bit)

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
TCNT1L este citit, iar TCNT1H este actualizat cu valoarea TEMP cnd TCNT1L
160

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

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 frecvenei,
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)

WRITEICRn(Registru pe 16 bii)

+
ICPn

TCNTnH(8 bii)

TCNTnL(8 bii)

TCNTn(Registru pe 16 bii)

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.
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
161

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

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 declanare
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).
Pentru msurarea frecvenei, eliberarea flag-ului ICF1 nu este necesar (dac se
folosete o ntrerupere).
162

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

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)

OCRnx Buffer (Registru pe 16 bii)

OCRnxH (8 bii)

TCNTnL Buf.(8 bii)

TCNTn (Regsitru pe 16 bii)

OCRnxL (8 bii)

OCRnx (Registru pe 16 bii)

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

TOP
BOTTOM

Generator de forme de
und

WGMn3:0

OCnx

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
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
163

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

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

Generator de
forme de und

FOCnX

SET

CLR

OCnx

SET

OCN
x
Pin

0
0

CLR

CLK_I/O

PORT
SET

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 cnd 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), folosirea
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

OC1 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

COM1A1 COM1A0 COM1B1 COM1B0 FOC1A FOC1B WGM11 WGM10

Read/Write

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Valoare iniial

TCCR1A

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

WGM
12

WG
M11

WGM
10

0
1

0
0

0
0

0
0

0
1

4
5
6
7
8

0
0
0
0
1

1
1
1
1
0

0
0
1
1
0

0
1
0
1
0

10

11

12
13
14
15

1
1
1
1

1
1
1
1

0
0
1
1

0
1
0
1

Moduri de
operare ale
Timer/Counter

TOP

Actualizare
OCR1x

Flag-ul
TOV1 setat
pe

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

0xFFFF
0x00FF

Imediat
TOP

MAX
BOTTOM

0x01FF

TOP

BOTTOM

0x03FF

TOP

BOTTOM

OCR1A
0x00FF
0x01FF
0x03FF
ICR1

Imediat
BOTTOM
BOTTOM
BOTTOM
BOTTOM

MAX
TOP
TOP
TOP
BOTTOM

OCR1A

BOTTOM

BOTTOM

ICR1

TOP

BOTTOM

OCR1A

TOP

BOTTOM

ICR1
ICR1
OCR1A

Imediat
BOTTOM
BOTTOM

MAX
TOP
TOP

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


7

ICNC1

ICNS1

Read/Write

R/W

R/W

R/W

R/W

R/W

Valoare iniial

Bit

CS11

CS10

R/W

R/W

R/W

WGM13 WGM12 CS12

TCCR1B

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

TCNT1[15:8]

TCNT1H

TCNT1[7:0]

TCNT1L

Read/Write

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Valoare iniial

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

OCR1A[15:8]

OCR1AH

OCR1A[7:0]

OCR1AL

Read/Write

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Valoare iniial

170

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

10.3.5.5 Output Compare Register 1 B OCR1BH i OCR1BL


7

Bit

OCR1B[15:8]

OCR1BH

OCR1B[7:0]

OCR1BL

Read/Write

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Valoare iniial

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

Read/Write

R/W
0

Valoare iniial

R/W
0

R/W
0

ICR1[15:8]

ICR1H

ICR1[7:0]

ICR1L

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


7

OCIE2

TOIE2

Read/Write

R/W

R/W

R/W

R/W

R/W

Valoare iniial

Bit

OCIE0

TOIE0

R/W

R/W

R/W

TICIE1 OCIE1A OCIE1B TOIE1

TIMSK

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 frecvena 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;

registru

funcie

de

//pornirea ntreruperii
__enable_interrupt();
while(1)
{
}
}

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.

b.

c.

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 variaie pentru frecven:
[1kHz,15kHz], iar pentru factorul de umplere [5%,95%].

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 identic la intervale de timp
egale.Cel mai mic dintre aceste intervale este perioada T, iar numrul 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 programate
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

APLICAII

Enun
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 modulele 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

R24-R27

Data Stack Pointers (Y)

R28-R29

Scratch Register

R30-R31

Figura 122.2 Fiierele Registru

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 funcii


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"

PUBLIC get_port

; Fiierul #include trebuie s fie n interiorul


modulului
; Declararea simbolurilor ce vor fi chemate
de funcia C

RSEG CODE

; Aceasta bucata de cod este relocat,

get_port:

; Etichet, aici ncepe execuia

RSEG

182

Laborator 12 - Combinarea codului C i ASM n IAR

in R16, PIND

; Citete valoarea pinului D

swap R16

; Interschimb valorile

out PORTB, R16

; Seteaz pe PORTB valoarea din R16

ret

; ntoarcere n main

END
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

PUBLIC get_port

; Declararea simbolurilor ce vor fi chemate


de funcia C

RSEG CODE

; Aceasta bucat de cod este relocat, RSEG


183

Laborator 12 - Combinarea codului C i ASM n IAR

get_port:

; Etichet, aici ncepe execuia

in R17, PIND

; Citete valoarea pinului D

xor R16, R17

; XOR cu valoarea din mask(n R16) din


main())

swap R16

; Interschimb valorile

rol R16

; Rotete R16 la stnga

brcc ret0

; Jump, dac flagul carry e gol

ldi r16,0x01

; Pune valoarea de 1 n R16

ret

; Return

ret0: clr R16

; Pune valoarea de 0 n R16

ret

; Return

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

; Return

END

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

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

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)))
;
}

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

SPCR = (1<<SPE);

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

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

/* Salveaz LSB data (r16) in buffer,


trimite datele */
UDR = data;
}

ret

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 informaie 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 spaiul 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

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

TWI

Figura 13.1
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

Program
Counter

Status
and Control

Control
Lines

Indirect Addressing

Instruction
Register

Direct addressing

Instruction
Register

32 x 8
General
Purpose
Registers

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

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 funciuni/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

Complete Address

Address Valid

Write

Data
WR

Read

Data
RD
Memory Access Instruction

Next Instruction

Figura 13.5 Execuia instruciunilor care acceseaz memoria SRAM

13.4

TRATAREA NTRERUPERILOR I INIIALIZARE


195

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

$000

Reset

2
3
4
5
6

$002
$004
$006
$008
$00A

EXT_INT0
EXT_INT1
TIM2_COMP
TIM2_OVF
TIM1_CAPT

7
8
9
10
11

$00C
$00E
$010
$012
$014

TIM1_COMPA
TIM1_COMPB
TIM1_OVF
TIM0_OVF
SPI_STC

12
13
14
15

$016
$018
$01A
$01C

UART_RXC
UART_DRE
UART_TXC
ADC

16
17

$01E
$020

EE_RDY
ANA_COMP

18

$022

TWI

19

$024

INT2

20
21

$026
$028

TIM0_COMP
SPM_RDY

Definirea ntreruperii

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 mare. 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

0
Adres
Memoria de program (FLASH)

21
PC

Exemplu:
farp:

2.

jmp farp
...
nop

indirect adresa efectiv este coninutul registrului Z. Acest mod de adresare


este folosit de instruciunile IJMP i ICALL;
15

0
Registrul Z

Memoria de program (FLASH)

15
PC

Exemplu:
ijmp

3.

; salt la rutina indicat n r31:r30

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.
0

15

Memoria de program (FLASH)

PC

11

0
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

0
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

0
Memoria de program (FLASH)
Registrul Z

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

64 I/O Registers

20 5F

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

0
Registrul Y, Z

+
5

SRAM

0
Deplasament

3.

indirect
15

Registrul X, Y, Z

SRAM

4.

indirect cu pre-decrementare
15

Registrul X, Y, Z

SRAM

-1

5.

indirect cu post-decrementare
15

Registrul X, Y, Z

-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 existe 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, dei 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).
2

14.2.1 TRANSMISIA DE DATE FOLOSIND INTERFAA 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.

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 dar 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 transmite 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

Addr LSB

RW

ACK

SDA

SCL
1

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 LSB

Data MSB

ACK

Aggregate
SDA
SDA from
Transmitter
SDA from
receiverR
SCL from
Master
1
SLA+R/W

7
Data
Byte

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

Slew-rate
Control

SDA
Spike
Filter

Slew-rate
Control

Spike
Filter

Bit Rate Generator

Bus Interface Unit


START/STOP
Control

Arbitration detection

Prescaler

Spike Suppresion

Address/Data Shift
Register (TWDR)

Address Match Unit

Bit Rate Register


(TWBR)

Ack

Control Unit

Address Register
(TWAR)

Status Register
(TWSR)

Address
Comparator

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 specificaiile 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


TWI BIT RATE REGISTER TWBR

14.4.1
Bit

TWBR7 TWBR6 TWBR5 TWBR4 TWBR3 TWBR2 TWBR1 TWBR0


Read/Write

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Valoare iniial

TWBR

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 este 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

TWINT TWEA TWSTA TWSTO TWWC TWEN

TWIE

Read/Write

R/W

R/W

R/W

R/W

R/W

R/W

Valoare iniial

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. Hardware+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


7

TWS7

TWS6

TWS5

TWS4

TWS3

Read/Write

R/W

R/W

Valoare iniial

Bit

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

TWPS1 TWPS0

TWSR

Valoare prescaler

16

64

214

Laborator 14 - ATMega16 I2C

14.4.4

TWI DATA REGISTER TWDR


7

TWD7

TWD6

TWD5

TWD4

TWD3

TWD2

TWD1

TWD0

Read/Write

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Valoare iniial

Bit

TWDR

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


7

TWA6

TWA5

TWA4

TWA3

TWA2

TWA1

Read/Write

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Valoare iniial

Bit

TWA0 TWGCE

TWAR

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

ADPS0

ADPS1

ADPS2

ADIF

ADSC

ADATE

Registrul de date ADC


(ADCH/ADCL)

SELECIE
TRIGGER

ADC[9:0]

ADIF

15

Registrul de control i stare A


(ADCSRA)
ADEN

MUX0

MUX1

MUX2

MUX3

MUX4

REFS0

ADLAR

REFS1

Multiplexor ADC (ADMUX)

ADIE

ADTS[2:0]

AVCC

SELECIE AMPLIFICARE

SELECIE CANAL

DECODOR

PRESCALER

START

LOGICA CONVERSIEI

Referin
intern 2,56V

DAC 10 bii

AREF

+
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. Autodeclanarea 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
START

ADATE

ADIF
SOURCE 1

CLK convertor
LOGICA
CONVERSIE

DETECIE
FRONT

SOURCE N

ADSC

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

Reset

START

PRESCALER 7 bii

Ck/128

Ck/64

Ck/32

Ck/16

Ck/8

Ck/4

Ck/2

CK

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 clock220

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

11

12

Conversia viitoare

13

Clock ADC
ADSC

ADIF
Semnul si bitul,
MSB al rezultatului

ADCH

Bitul LSB al
rezultatului

ADCL

Conversia viitoare
Actualizare MUX si REFS

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

Tabel 4 Timpii

1.5

13

13.5

1.5/2.5

13/14

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 setare.
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 Nyquist
(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)

PA3 (ADC3)

PA2 (ADC2)

PA1 (ADC1)

GND

4.

PA0 (ADC0)

3.

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.

VCC

2.

PA4 (ADC4)
PA5 (ADC5)
PA6 (ADC6)

AREF

100H

PA7 (ADC7)

100nF

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

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

Convertor real

Mod 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

Convertor real

Mod real

Convertor ideal

Mod
ideal
Tensiune
intrare
VREF

Figura 15.9 Eroarea de offset


15.1.11.2

unui convertor analog-numeric

Neliniaritatea integral

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

DNL

0x01

Tensiune
intrare

0x00

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

0x00

-VREF
`

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

Valoare decimal
corespunztoare
511

0x1FF

511

0x1FE

510

...

VADCm+ 0.001VREF/GAIN

...

0x001

1
229

Laborator 15 ADC (Analog to Digital Converter)

VADCm
VADCm- 0.001VREF/GAIN

0x000
0x3FF

0
-1

...

...

VADCm- 0.999VREF/GAIN
VADCm- VREF/GAIN

0x201
0x200

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

Bit

REFS1 REFS0 ADLAR MUX4

MUX3

MUX2

MUX1

MUX0

Read/Write

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Valoare iniial

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

REFS
0
0

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

ADC7
ADC0
ADC1
ADC2
ADC3
ADC4
ADC5
1.22V
(VBG)
0 V (GND)

ADC1
ADC2
ADC2
ADC2
ADC2
ADC2
ADC2

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

N/A

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

ADSC ADATE

ADIF

ADIE

ADPS2 ADPS1 ADPS0

Read/Write

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Valoare iniial

ADCSRA

Bitul 7 ADEN: Activare convertor


Setnd acest bit, se va activa convertorul. La resetarea acestui bit, convertorul
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 curs 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

Read/Write

Valoare iniial

15

14

13

12

11

10

ADC9

ADC8

ADCH

ADC7

ADC6

ADC5

ADC4

ADC3

ADC2

ADC1

ADC0

ADCL

ADLAR = 1

233

Laborator 15 ADC (Analog to Digital Converter)

Bit

15

14

13

12

11

10

ADC9

ADC8

ADC7

ADC6

ADC5

ADC4

ADC3

ADC2

ADCH

ADC1

ADC0

ADCL

Read/Write

Valoare iniial

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 analognumerice.

15.1.14.4
Bit

SFIOR - Registru cu funcie speciale


7

ADTS2 ADTS1 ADTS0

ACME

PUD

PSR2

PSR10

Read/Write

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Valoare iniial

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