Sunteți pe pagina 1din 63

1.

 Sisteme încorporate 

1.1. Noțiuni generale 
Definiție: Un sistem încorporat – SI (Embedded System) este un sistem bazat pe microprocesor
sau microcontroler, proiectat astfel încât să îndeplinească anumite funcții bine stabilite. Un sistem
încorporat poate fi un produs final, sau o parte dintr-un sistem mai mare.
SI se găsesc într-o mare varietate de echipamente care pot fi grupate după domeniul de
interes astfel:
 echipamente consumatoare: telefoane mobile, aparate foto și camere video digitale,
 PDA;
 echipamente de uz casnic: mașini de spălat, cuptor cu microunde;
 echipamente de birou: imprimante, faxuri, xeroxuri, copiatoare;
 echipamente de reţelistică: switchuri, routere, sisteme wireless;
 echipamente pentru business: sisteme de securitate, sisteme de alarmă, sisteme de
pontaj, cititoare de carduri, cititoare coduri bară, case de marcat;
 automatizări industriale: de obicei, în industrie, SI se regăsesc ca părţi componente a
unor roboți industriali;
 automobile: sisteme de navigație, ABS (Anti Blocking System), ESP (Electronic
Stability Program), ASR (Auto Shredder Residue);
Un sistem încorporat este construit în jurul unei unitate de procesare centrală (CPU) care
poate fi un microprocesor sau un microcontroler. Schema de principiu a unui sistem încorporat
este prezentată în Fig.1.1.

Fig.1.1. Schema de principiu a unui sistem încorporat

Din Fig.1.1 se poate observa că un sistem încorporat este construit din:


 o unitare centrală de procesare (CPU) care poate fi formată atât dintr-un microprocesor
cât și dintr-un microcontroler;
 memorii externe care au rol de memorie de bază pentru sistemele cu microprocesoare
și de memorie de extensie pentru sistemele cu mic
 o interfață cu procesul formată din intrări și ieșiri digitale (I/O), intrări analogice
(CAN) și ieșiri analogice (CNA);
1
 o interfață cu utilizatorul denumită și HMI – Human Machine Interface;
 o interfață de comunicații;
 memorii externe pentru stocare diverselor informații care nu au loc în memoria inter;
 un pachet software prin care se implementează funcțiile sistemului încorporat.
Din schema din Fig.3.1 se observă că un sistem încorporat este asemănător cu un calculator
personal (PC). Pentru a nu se face confuzie între acestea, mai jos se prezintă care sunt principalele
diferențe ele:
 un SI este realizat astfel încât să îndeplinească anumite funcții bine stabilite, în timp ce
un PC are o utilizare generală, putând fi reprogramat să îndeplinească o funcție nouă;
 în general un SI nu are nevoie de sistem de operare, totuși dacă apare utilitatea folosirii
unui sistem de operare, acesta este unul special, care nu este foarte complex;
 un SI poate utiliza o gamă largă de microprocesoare și microcontrolere (spre exemplu
se pot utiliza microcontrolere pe 8 biți), ceea ce poate conduce la scăderea costului de
producție;
 SI trebuie să poată funcționa corect în anumite condiții de mediu;
 în general SI pot fi realizate de dimensiuni mai reduse;
 SI sunt capabile să prelucreze informațiile în timp real;
 un SI trebuie astfel realizat încât consumul de energie să fie cât mai mic posibil.
Se poate spune că numărul procesoarelor utilizate în sisteme de tip PC (Desktop, Laptop,
Server) este mult mai redus decât numărul procesoarelor utilizate în sisteme încorporate.

1.2. Proiectarea sistemelor încorporate 
Proiectarea unui sistem încorporat este o problemă complexă care trebuie tratată etapizat.
Un SI poate fi considerat un produs finit supunându-se criteriilor de proiectare generală (Fig.1.2).

Design mecanic

Desing electric, 
hidraulic, pneumatic

Desing hardware

Design software

Design de produs

Fig.1.2. Etapele proiectării generale a unui SI

În Fig.1.2 se observă că în funcție de scopul sistemului încorporat, acesta poate conține


mai multe părți:
 design mecanic se referă la proiectarea structurii mecanice care poate avea doar rol de
susținere a elementelor SI sau poate avea un rol activ, participând la realizarea
funcțiilor pe care le realizează SI. Este o parte importantă a proiectării sistemului
încorporat pentru că orice SI conține și o parte mecanică;
2
 design electric, hidraulic, pneumatic se referă la proiectarea circuitelor electrice,
hidraulice și pneumatice care se folosesc pentru realizarea funcțiilor SI. În timp ce
partea electrică se găsește în toate SI, părțile hidraulică și pneumatică se găsesc doar în
anumite SI;
 design hardware și software se referă la proiectarea părții electronice și a părții de soft
a SI. Aceste părți reprezintă elementul central al oricărui SI. Fără aceste părți, produsul
creat este un simplu produs care nu poate fi denumit SI;
 design de produs se referă la proiectarea acelor elemente care vor crea o atractivitate
pentru utilizatorul final al SI. Această parte se poate referii atât la adaptarea mecanică
a produsului pentru a se potrivii într-o anumită configurație cât și la adaptarea estetică
a produsului pentru a putea fi atractiv pentru utilizatorul final.
Deși toate elementele prezentate anterior prezintă o importanță majoră pentru realizarea
unui SI, în continuarea se va face referire doar la partea de design hardware și software.
1.2.1. Cerințe impuse pe durata proiectării unui SI 
Pornind de la diferențele dintre un SI și un PC, se pot identifica câteva particularități care
se impun la proiectarea unui SI (Fig.1.3).

cost de producţie
redus;

timpul până la lansare 
pe piaţă scurt;

dimensiune cât mai 
redusă;

siguranţă în 
funcţionare;

energie consumată 
mică;
Fig.1.3. Cerinţe impuse pe durata proiectării unui SI

Costul de producție redus este una dintre principalele cerințe pentru orice produs, implicit
și pentru un SI. Diminuarea costului de producție se poate analiza din două puncte de vedere:
 diminuarea cheltuielilor de proiectare, care se referă la scăderea investiției în faza de
proiectare. Scăderea acestor costuri depinde mult de tehnologia aleasă. De exemplu
dacă se alege ca și CPU un microcontroler cunoscut, cu capacități hardware mai ridicate
se poate reduce costul de proiectare prin scăderea numărului de ore manoperă investite
în etapele de proiectare hardware și software. În schimb dacă se alege microcontrolere
mai puțin cunoscute sau dacă se apelează la implementarea unor funcții prin
intermediul procesoarelor de semnal, acestea vor conduce la creșterea costului de
proiectare;
 diminuarea cheltuielilor efective de producție depinde major de numărul de produse
care se estimează a fi fabricate. În cazul seriilor mari de produse, fiecare optimizare în
ceea ce privește partea electronică (utilizarea CPU mai ieftine) sau implementarea de

3
funcții hardware (procesoare de semnal) pot scădea costul de producție chiar dacă
costul proiectării va crește.
Cele două categorii de costuri trebuie corelate, deoarece de cele mai multe ori ele se exclud,
adică reducând costul de proiectarea poate crește costul efectiv de producție și reciproca.
Timpul până la lansare pe piață este de asemenea o condiție esențială pentru anumite
categorii de SI. Este posibil ca investind prea mult timp în dezvoltarea SI să se obțină un produs
mai calitativ, dar în același timp produsul să nu mai poată fi valorificat din cauza unui alt produs
similar apărut pe piață mult mai repede. Acest timp de lansare pe piață reprezintă durata de la
începerea proiectării unui sistem cu microcontroler şi până la momentul în care este lansat pe piață.
Dimensiune SI poate fi o constrângere în realizarea unui SI. Sunt situații în care partea
electronică a unui SI trebuie să fie suficient de mică pentru a se potrivi într-un anumit spațiu mai
mic. Acest lucru se poate realiza prin utilizarea unor circuite electronice realizate într-o tehnologie
mai recentă dar care are dezavantajul că va crește atât costul general al produsului (atât cele ce
proiectare cât și cel de fabricație). De asemenea va crește și timpul de lansare pe piață pentru că se
consumă mai mult timp atât în faza de proiectare, cât și în faza de testare.
Siguranță în funcționare este una dintre cele mai importante caracteristici ale unui SI.
Totuși, în realitate, această cerință nu este tot timpul cea mai importantă cerință dintre cele
amintite. De exemplu, dacă se ia în considerare un telefon mobil, funcționarea eronată nu produce
în general daune materiale foarte ridicate motiv pentru care poate fi lansat pe piață chiar dacă nu
s-a realizat cel mai ridicat grad de siguranță în funcționare, în schimb dacă se consideră o protecție
digitală din sistemul electroenergetic, o funcționare eronată poate conduce la pierderi materiale
sau chiar de vieți umane.
Energie consumată reprezintă de asemenea o problemă pentru SI. Există o multitudine de
SI care funcționează alimentate de la o baterie (acumulator), iar pentru acestea se dorește ca
funcționarea sa să fie de cât mai lungă durată. În același timp există produse care au în componența
lor consumatori mari de energie motiv pentru care consumul părții electronice poate fi neglijat,
indiferent cât de mare ar fi.
Din analiza cerințelor de mai sus se poate constata că unele cerințe le exclud ce altele și
reciproca. În Tabelul 1.1 se prezintă comparativ câteva produse pentru a se vedea modul în care
criteriile prezentate mai sus se exclud unul pe altul. Este important de știut că aceste criterii se
aplică strict la partea electronică a produsului. În celulele în care s-a pus ”-” sunt poziții în care
acele cerințe sunt mai puțin importante.

Tabelul 1.1. Comparație cerințe de proiectare diverse SI


Produsul Cost Timp Dimensiune Siguranță Energie
lansare funcționare consumată
Mașină spălat mic mic - - -
Sistem modern endoscopic pentru
- - foarte mică mare foarte mică
medicină
ABS automobil - - medie foarte mare -
Sistem urmărire în caz de furt
automobil (se montează în structura mediu - medie mare foarte mică
de rezistență automobil)
Telefon mobil mic mic mică medie mare

4
Există o multitudine de cerințe ce se pot impune pe durata proiectării și realizării unui SI,
dar îmbunătățirea unei cerințe conduce automat la înrăutățirea alteia. În general la realizarea unui
SI trebuie stabilite prioritățile mai importante, şi apoi dacă se poate, se trece la îmbunătățirea altor
caracteristici, fără însă a le afecta pe cele considerate mai importante.
1.2.2. Etapele proiectării părților hardware și software a unui SI 
În literatura de specialitate există mai multe variante de clasificare a etapelor de proiectare
a părților hardware și software a unui SI. În Fig.1.4 se prezintă schema structurală a unei astfel de
variante.

Fig.1.4. Etapele proiectării părților hardware și software a unui SI

1. Analiza specificațiilor produsului. Această primă etapă este una dintre cele mai importante
etape, deoarece proiectantul SI trebuie să cunoască în detaliu necesitățile beneficiarului. Orice
neatenție sau neînțelegere a cerințelor beneficiarului poate conduce la pierderi financiare uriașe,
deoarece se investește timp și bani într-un produs care la final va părea o mare realizare, iar în
realitate nu va avea nici o valoare pentru că nu respectă una sau mai multe cerințe ale
beneficiarului. Din acest motiv, în momentul în care se dorește proiectarea unui SI dedicat,
proiectantul trebuie să aibă cât mai multe întâlniri cu beneficiarul, pentru a ajunge să cunoască cât
mai detaliat procesul pentru care va fi utilizat acest produs. Dacă beneficiarul nu are pregătire
tehnică în domeniu, proiectantul trebuie să intuiască necesitatea beneficiarului deoarece acesta nu
va ști să îi comunice corect cerințele pe care le are SI ce urmează a fi proiectat.
2. Stabilirea componenței hardware și software. În această etapă se stabilește ce anume va
conține pârțile hardware și software ale sistemului cu microcontroler. Această etapă este destul de
dificilă deoarece pentru diverse aplicații există atât soluții software cât și hardware. Fiecare dintre
aceste soluții are avantaje și dezavantaje. Astfel o soluție software reprezintă în general o soluție

5
mai ieftină și cu realizare mai rapidă. În plus orice greșeală care apare pe partea software se poate
corecta foarte ușor și într-un timp scurt. Dezavantajul acestei soluții este acela că va consuma din
resursele CPU-ului, ceea ce conduce la o scădere a vitezei de soluționare a aplicației, iar uneori
poate conduce la necesitatea schimbării CPU-ului cu unul mai performant. Soluția hardware este
o soluție mai costisitoare și în general mai greu de implementat. Orice eroare găsită în logica
implementată, presupune refacerea soluției hardware, ceea ce implică costuri suplimentare și un
timp mai mare de remediere a defectului. Această soluție are în schimb avantajele că soluția
rulează mai rapid și nu solicită CPU-ul. În general această soluție se implementează în cadrul SI
la care viteza de prelucrare a informației este o caracteristică esențială.
3. Dezvoltarea hardware și software. Aceste două pârți decurg separat și fiecare echipă trebuie
să finalizeze partea proprie până la termenul stabilit. În general în această etapă echipele de
proiectare folosesc simulatoare pentru a putea testa corectitudinea muncii lor.
4. Integrarea pârții hardware cu cea software. Această etapă este cea mai dificilă, deoarece la
concatenarea celor două părți pot apărea diverse probleme. De multe ori este foarte greu de decis
care dintre cele două părți este responsabilă de eroarea apărută. Practic în această etapă se regăsește
orice problemă de comunicare dintre proiectanții software și cei hardware. Există situații în care
ambele părți funcționează corect dacă sunt analizate separat, dar când sunt puse împreună nu
reușesc să stabilească legătura. Practic în această etapă începe procedura de depanare, care trebuie
parcursă de ambele părți concomitent. De cele mai multe ori această etapă necesită cel mai mare
efort și timp dintre toate etapele realizării unui SI.
5. Testarea sistemului. De multe ori și testarea unui SI poate crea probleme foarte dificile. În
funcție de importanta sistemului realizat, se alege și procedura de testare utilizată. Cu cât sistemul
este mai important pentru utilizatorul final, cu atât mai mult timp și resurse se alocă acestei etape.
Totuși unele sisteme încorporate sunt mai puțin testate (este foarte bine cunoscută situația
telefoanelor mobile la care după lansarea pe piață se depistează diverse probleme).
6. Realizarea produsului final. Dacă toate etapele prezentate anterior s-au încheiat cu succes se
poate realiza produsul final care va fi pus la dispoziția beneficiarului.
Chiar și după ce s-a realizat produsul final, există posibilitatea să mai apară erori în
funcționarea SI, erori care sunt descoperite la utilizarea sa în scopul pentru care a fost proiectat. În
plus beneficiarul unui SI poate să diversifice aplicația pe care o realizează, ceea ce conduce la
dorința de dezvoltare a unor funcții proprii. Din acest motiv majoritatea proiectanților de SI
continuă dezvoltarea acestora.
1.2.3. Selectare CPU 
Una dintre problemele de optimizare care apare la proiectarea unui SI este aceea de a alege
soluția corectă din multitudinea de microprocesoare și microcontrolere care poate să preia funcția
de CPU. Spre exemplu ar fi ilogic utilizarea unui procesor de ultimă generație pentru a realiza
funcțiile unei mașini de spălat. În acest sens trebuie rezolvată o problemă de optimizare care să
țină cont de mai multe criterii:
 selectarea circuitelor care pot realiza funcțiile pe care le are SI;
 considerarea costurilor de achiziționare a circuitului;
 considerarea costurilor de dezvoltare a SI cu fiecare tip de circuit;
 analiza timpului necesar pentru realizarea SI cu fiecare tip de circuit în parte;

6
 analiza comportării circuitului în situațiile la care va fi expus (probleme de mediu, de
compatibilitate electromagnetică, rezistență la șocuri mecanice, etc);
 analiza mediilor de dezvoltare software puse la dispoziție de producător;
 compatibilitatea cu diverse sisteme de operare de tip RTOS (Real Time Operating
System).
În afară de cele menționate mai sus, una dintre principalele decizii care trebuie luate în
considerare este aceea de utilizarea a unui microprocesor sau a unui microcontroler. Pentru a
lămurii această problemă se reamintește că microcontrolere sunt circuite integrate care conțin un
microprocesor și diferite alte componente cum ar fi memorii și circuite de interfațare porturi de
I/O, proiectate astfel încât să necesite un număr redus de părți componente externe.
Avantajele unui microcontroler față de un microprocesor sunt următoarele:
 performanțe mai bune deoarece componentele interne sunt astfel realizate încât să se
obțină transferul optim de informație între ele;
 dimensiuni mai reduse, deoarece într-un sigur circuit integrat sunt încapsulate toate
componentele prevăzute;
 costuri mai reduse, atât datorită faptului că există diverse componente încapsulate în
aceiași capsulă ceea ce presupune reducerea costurilor de realizare a capsulelor pentru
fiecare componentă în parte, cât și datorită scăderii costului cablajului, datorită
realizării acestuia în interiorul circuitului integrat;
 viteze de lucru mai mari (la aceiași frecvență de tact) datorită traseelor scurte realizate
în interiorul circuitului integrat.
Din cele prezentate anterior se poate concluziona că în prezent se recomandă utilizarea
microcontrolerelor în defavoarea microprocesoarelor. Selectarea unui microprocesor sau a unui
microcontroler pentru a realiza un SI, este mult mai ușoară deoarece s-au publicat multe teste din
care reiese comportarea diferitelor circuite, în realizarea diferitelor funcții. Astfel acestea au fost
clasificate pe domenii pentru care sunt recomandate, adică pe domenii unde dau rezultate mai
bune.

1.3. Microcontrolere (µC) în sisteme încorporate 
Definiția 1: un microcontroler este un sistem cu microprocesor dezvoltat într-un singur circuit
integrat.
Definiția 2: un microcontroler este un circuit integrat format din un microprocesor împreună cu
memorii și circuite asociate, care poate controla parțial sau total funcțiile unui echipament
electronic (conform Merriam-Webster dictionary).
Diferența dintre un microprocesor și un microcontroler (Fig.1.5) este dată de faptul că
microprocesorul nu are memorii și circuite electronice auxiliare care să îi permită realizarea unei
anumite funcții. Un microprocesor individual (fără circuite auxiliare) nu poate îndeplini nici o
funcție, în timp ce un microcontroler poate fi folosit pentru controlul diverselor echipamente
electronice.
Diferența dintre un sistem cu microprocesor și un microcontroler (Fig.1.6) este dată de
faptul că sistemul cu microprocesor necesită dezvoltarea unei plăci electronice prin intermediul
căreia să se realizeze legăturile electrice dintre microprocesor, memorii și circuitele auxiliare.
Microcontrolerul este complet dezvoltat într-un singur circuit integrat.
7
Fig.1.5. Comparație înter microprocesor și microcontroler

Fig.1.6. Comparație înter sistem cu microprocesor și microcontroler

Avantajul major al sistemului cu microprocesor față de microcontroler este că primul poate


fi dezvoltat în funcție de necesitățile utilizatorului, în schimb al doilea este conceput într-o anumită
configurație care să satisfacă necesitățile mai multor utilizatori. Acest dezavantaj al
microcontrolerului este eliminat prin producerea de microcontrolere într-o gamă foarte largă de
configurații, fiecare configurație fiind adaptată necesităților unui grup definit de utilizatori. În
aceste condiții, singura grijă a utilizatorului este aceea de a selecta corect microcontrolerul necesar.
Clasificarea microcontrolerelor se poate realiza după mai multe criterii, dintre care cele
mai importante sunt:
 mărimea magistralei de date (lungimea cuvântului de date sau numărul de biți ai
magistralei de date): 8 biți, 16 biți, 32 biți;
 arhitectura de comunicație cu memoria: Von Neumann, Harvard;
 setul de instrucțiuni: set complex de intrucțiuni (CISC – Complex Intruction Set
Computer), set redus de instrucțiuni (RISC – Reduced Intruction Set Computer).

1.4. Facilitățile microcontrolerelor (față de microprocesoare) 
Microcontrolerele prezintă o serie de funcții generale, care pot fi considerate ca și facilități
pe care le oferă microcontrolerele. Se precizează că nu toate microcontrolerele conţin toate funțiile
ce vor fi prezentate, în același timp există şi o serie de funcţii speciale ce nu vor fi prezentate.
Tensiunea de alimentare. Un sistem cu microprocesor este format din mai multe circuitele
electronice (microprocesor, memorii, circuite auxiliare) care pot funcționa la valori diferite ale
tensiunii de alimentare, motiv pentru care placa de bază pe care se montează aceste componente
poate avea implementate mai multe nivele de tensiune (12 V, 5 V, 3.3 V, etc). Pentru
microcontrolerele tensiune de alimentare are o valoare standard (de obicei 5 V), iar ea este o

8
facilitate pentru că toate componentele interne ale microcontrolerului vor funcționa la această
tensiune.
Oscilatorul are rol de a furniza microprocesorului sau microcontrolerului impulsul necesar
(semnalul de tact) pentru a executa o operaţie. Acesta stabileşte frecvenţa de lucru a
microprocesorului/microcontrolerului. Oscilatorul este utilizat și pentru generarea secvenţelor de
tact utilizate de temporizatoare, transmisii seriale şi circuite de conversie analog-numerică. Un
sistem cu microprocesor poate avea nevoie pentru funcționare de unul sau mai multe semnale de
tact pentru a asigura funcționarea tuturor circuitelor electronice care au nevoie de un astfel de
semnal periodic. La microcontrolere se folosește un singur oscilator care va asigura semnalul de
tact pentru toate circuitele interne ale acestuia. Semnalul de tact este dat de un oscilator care din
punct de vedere constructiv poate fi format din:
 Rezistor + Condensator – o soluţie ieftină dar nu prea folosită în sistemele cu
microcontrolere;
 oscilator cu cuarţ standard;
 oscilator cu cristale High-Speed.
Intrări/ieșiri de uz general (portul paralel) sunt notate în general GPIO (General-Purpose
Input/Output) și se mai utilizează în limba română cu denumirea de pinii portului parale. Mai
multe GPIO, în general 8, formează un port paralel. Un microcontroler conţine unul sau mai multe
porturi paralele. Pinii porturilor paralele pot fi accesate la nivel de port (octet) sau la nivel de pin
(bit). Fiecare pin în parte poate fi configurat ca şi pin de intrare sau ieşire. De asemenea, există
posibilitatea ca un port să fie configurat ca şi port de intrare sau ieşire ceea ce înseamnă că toți
pinii acelui port au aceiași direcție.
Generator de modulație a lățimii impulsurilor foarte cunoscut cu denumirea de PWM (Pulse-
Width Modulation) este o funcție prin intermediul căreia pe un GPIO se poate genera un semnal
dreptunghiular periodic care are ca și scop reducerea puterii electrice transmise unui circuit sau
echipament electronic.
Sistem de întreruperi (Interrupt) este una dintre cele mai importante funcții implementate în
arhitectura microcontrolerelor. Sistemul de întreruperi are rol în oprirea rulării normale a
programului, urmată de executarea unei funcții speciale denumită subrutină de servire a
întreruperii. După terminarea executării acestei funcții speciale microcontrolerul reia programul
de unde a rămas iniţial. Un microcontroler are mai multe întreruperi, unele interne iar altele
externe, unele hardware și altele software. Pentru fiecare întrerupere se poate seta un nivel de
prioritate, iar sistemul de întreruperi va trata prima dată întreruperea cu prioritatea cea mai mare.
Intrare de reset este una dintre întreruperile externe ale microcontrolerului care rol de a permite
utilizatorului ca printr-o simplă activare a unui contact să repornească programul din
microcontroler de la adresa 0 din memoria de program.
Temporizatorul/numărător cunoscut în limba engleza cu denumirea Timer/Counter este una
dintre cele mai importante facilități ale unui microcontroler și au rol de a adapta viteza de lucra a
unui microcontroler la viteza de lucru a proceselor fizice. Temporizatorul este o componentă
electronică din interiorul microcontrolerului care măsoară timpul dintre două procese. El poate fi
pornit/oprit din program şi depinde de frecvenţa oscilatorului. În general un temporizator este
astfel realizat încât să poată fi pornit la un moment dat de către program, urmând ca la terminarea

9
duratei setate să genereze un semnal de întrerupere. Majoritatea microcontrolerelor au mai multe
astfel de circuite implementate.
Watchdog este un temporizator care se folosește ca și măsură de protecție pentru diversele erori
software care pot apărea în timpul funcționării unui sistem cu microcontroler. Un temporizator de
tip Watchdog se setează la o anumită valoare stabilită de programator, iar apoi este activat periodic
în cadrul aplicației software care rulează pe microcontroler. La finalizarea duratei de timp setate
se va considera că microcontrolerul este într-o stare de funcționare necorespunzătoare și se va
genera un semnal de resetare a microcontrolerului. Pentru utilizarea corectă a acestui temporizator,
programatorul trebuie să calculeze corect durata de executare a codului sursă dintre două activări
consecutive Cu alte cuvinte putem spune că Watchdog este un sistem de protecţie pentru ca
programul încărcat în microcontroler să nu rămână blocat (cum ar fi să intre într-o buclă infinită).
În general această opţiune este utilizată la aplicaţii care necesită verificare periodică a executării
funcţiilor pentru care a fost programat microcontrolerul.
Brown-out Detector este o altă funcție de protecție a microcontrolerului care are rol rol în
resetarea acestuia în cazul în care tensiunea de alimentare scade sub o valoare prestabilită. Această
funcție este foarte importantă în protejarea funcţionării la tensiuni scăzute, lucru care ar putea
conduce la deteriorarea informaţiilor.
Convertor analog-numeric cunoscut cu prescurtarea ADC (Analog to Digital Coverter) este un
sistem de conversie a unei mărimi analogice într-o mărime numerică care poate fi procesată de
către microcontroler. Se recomandă utilizarea prescurtării din limba engleză (ADC), deoarece
prescurtarea din limba română are o altă semnificaţie în limba enegleză (CAN = Controller Area
Network) În general se utilizează ADC pe 8 sau 10 biţi, iar majoritatea microcontrolerelor care
încorporează astfel de echipamente, multiplexează intrările pentru a oferii posibilitatea de urmărire
a mai multor intrări analogice utilizând un singur ADC. În general pentru realizarea unei conversie,
trebuie pornită conversia de către program, iar la finalizarea ei ADC generează o întrerupere pentru
ca microcontrolerul să preia informaţia. Convertoarele analog-numerice sunt foarte utilizate în
sisteme reale, în special pentru conversia mărimilor analogice generate de diferiți senzori.
Comparator analogic este un circuit care realizează comparaţia între două mărimi analogice,
generând la ieșire o valoare digitală binară. Această funcţie se poate implementa şi software prin
citirea celor două valori cu ajutorul ADC şi ulterior compararea lor numerică. Totuşi aceasta
soluţie necesită un timp de execuţie mai mare şi un consum de energie mai ridicat datorită faptului
că trebuie realizată conversia analog-numerică pentru două mărimi analogice.
Porturi de comunicaţii seriale implementate pe orice microcontroler are rol în asigurarea
schimbului de date dintre microcontroler și alte circuite electronice. Cele mai frecvent utilizate
sunt:
 comunicaţie serială asincronă UART (Universal asynchronous receiver/transmitter);
 comunicaţie serială I2C (Inter-Integrated Circuit);
 comunicaţie serială sincronă SPI (Serial Peripheral Interface);
 CAN bus (Controller Area Network) – interfaţă pentru comunicare între mai multe
microcontrolere dezvoltată pentru industria auto.
Toate funcțiile de mai sus se pot regăsi în cadrul unui sistem cu microprocesor, fiecare
dintre ele fiind implementată în cadrul unui circuit integrat specializat care poate fi atașat
sistemului din faza de proiectare.

10
2. Descrierea generală a microcontrolerelor 

2.1. Arhitectura microcontrolerelor 
Definirea arhitecturii interne a unui microcontroler pornește de la structura de conectare a
memoriilor de date și de program la microprocesor. Se disting două tipuri de arhitecturi:
 arhitectura Von Neumann (Fig.2.1.a);
 arhitectura Harvard (Fig.2.1.b).

a) Arhitectură Von Neumann b) Arhitectură Harvard


Fig.2.1. Arhitecturi ale microcontrolerelor

Arhitectura Von Neumann conţine o singură magistrală de date și o singură magistrală de


adrese care comunică atât cu memoria de program cât şi cu memoria de date. Ea are avantajul unei
realizări rapide şi uşoare, cu costuri reduse.
Arhitectura Harvard este o arhitectură de generaţie mai nouă şi ea utilizează câte două
magistrale de date și de adrese pe un set de magistrale comunicându-se cu memoria de program,
iar pe al doilea set de magistrale comunicându-se cu memoria de date. Această arhitectură este
puţin mai scumpă dar asigură viteze de transfer mai ridicate.
Din punct de vedere al programării, denumite și arhitectura setului de instrucțiuni (ISA –
Instruction Set Architecture), microcontrolerele s-au dezvoltat pe două direcții:
 CISC – Complex Intruction Set Computer:
o conţine un număr ridicat de instrucţiuni dintre care o parte sunt rar folosite;
o structură mai mare a unității aritmetice și logice;
o utilizează mai puțini regiștrii;
o dimensiunea mică a programului;
o instrucțiunile se execută în număr de cicluri diferite;
o se utilizează în general cu microcontrolere în arhitectură Von Neumann;
 RISC– Reduced Intruction Set Computer:
o conţine un număr scăzut de instrucţiuni;
o utilizează mai mulți regiștrii;
o nu necesită regiştrii speciali;
o complexitate mai mare a programului;
o intrucțiunile se execută într-un singur ciclu;
o se utilizează în general cu microcontrolere în arhitectură Harvard.
Structura internă a unui microcontroler depinde de arhitectura hardware care stă la baza
dezvoltării respectivului microcontroler. Pentru un microcontroler creat în arhitectură Harvard,
11
structura internă arată ca și în Fig.2.2. În Fig.2.2 se observă că microcontrolerul are un nucleu
denumit Unitate Centrală de Procesare (CPU – Central Processing Unit) la care se conectează
prin intermediul magistralelor celelalte circuite electronice: memoriile, GPIO, sistemul de
întreruperi, temporizatoarele, comunicațiile seriale, convertoarele și comparatoarele.

Fig.2.2. Structura internă a unui microcontroler în arhitectură Harvard

2.2. Unitate Centrală de Procesare 
Unitatea centrală de procesare reprezintă creierul oricărui sistem cu microcontroler.
Aceasta este o structură asemănătoare cu structura internă a unu microprocesor. Este formată din
mai multe componente, după cum urmează:
 Unitatea Aritmetică și Logică (ALU - Arithmetic Logic Unit);
 Regiștrii interni: Regiștrii generali de date (GPR – General Purpose Registers) și
regiștrii cu funcții speciale (SFR – Special Function Registers);
 Unitatea de control (Control Unit) formată din:
o Contorul de program (Program Counter);
o Registrul de instrucțiuni (Instruction Register);
o Decodor de instrucțiuni (Instruction Decoder);
o Depanare/testare în cip (OCP – On Chip Debug).
2.2.1. Unitatea aritmetică și logică 
Un circuit electronic digital poate efectua o operație aritmetică sau logică dacă se
îndeplinesc mai multe condiții simultan:
 circuitul digital are implementat cu ajutorul porților logice funcția aritmetică sau logică
care urmează a fi calculată;
 circuitul digital are două intrări digitale prin intermediul cărora se introduc cei doi
operanzi care urmează să fie calculați;
 circuitul digital are o ieșire digitală prin intermediul căruia se obține rezultatul operației
aritmetice sau logice;

12
 cele două intrări digitale pentru operanzi și ieșirea digitală pentru rezultat trebuie să
utilizeze aceiași lungime a cuvântului de date (același număr de biți);
 circuitul digital are o ieșire digitală prin intermediul căruia se pot oferi diverse
informații suplimentare referitoare la rezultatul operației efectuate.
Informațiile suplimentare pe care le poate furniza un circuit electronic digital folosit pentru
a efectua o operație aritmetică sau logică sunt marcate prin intermediul unor biți care poartă
denumirea de FANION (FLAG), iar cele mai utilizate sunt:
 rezultatul operației aritmetice a depășit (inferior sau superior) intervalul care poate fi
exprimat de lungimea cuvântului de date. Acest lucru se semnalizează prin intermediul
unui bit care se numește DEPLASARE (CARRY FLAG – C);
o C=1 – s-a efectuat o depășire a intervalului (1001+1011=> 0100 și C=1);
o C=0 – nu s-a efectuat o depășire a intervalului (1001+0011=> 1100 și C=0);
 rezultatul operației aritmetice sau logice are rezultatul egal cu 0, acest lucru se
semnalizează prin intermediul unui bit care se numește ZERO (ZERO FLAG – Z);
o Z=1 – rezultatul ultimei operații este 0;
o Z=0 – rezultatul ultimei operații este diferit de 0;
 rezultatul operației aritmetice sau logice are cuvântul format dintr-un anumit număr de
biți 0, respectiv 1 numere care pot fi pare sau impare. Această informație este foarte
utilă în anumite procese și se semnalizează prin intermediul unui bit care se numește
PARITATE (PARITY FLAG – P);
o P=1 – rezultatul ultimei operații are paritate pară ceea ce înseamnă număr par
de biți 0 și număr par de biți 1 (1001+0001 => 1010, iar P=1);
o P=0 – rezultatul ultimei operații are paritate impară ceea ce înseamnă număr
impar de biți 0 și număr impar de biți 1 (1001+0010 => 1011, iar P=0);
 în situația în care se efectuează operații aritmetice cu semn, rezultatul acestora poate fi
pozitiv sau negativ, lucru care se semnalizează prin intermediul unui bit care se
numește SEMN (SIGN FLAG – S);
o S=1 – rezultatul operației aritmetice este negativ;
o S=0 – rezultatul operației aritmetice este pozitiv;
 în situația în care se efectuează operații aritmetice cu semn, cel mai semnificativ bit al
rezultatului este folosit pentru a exprima semnul. În această situație intervalul de calcul
este redus cu un bit de unde rezultă că depășirea intervalului de calcul se realizează la
o valoare mai mică. Din punct de vedere al bitului CARRY, situația nu poate reprezenta
o depășire de interval. Se poate ajunge la situații în care rezultatul adunării a două
numere să fie considerat un număr negativ. Pentru semnalizarea acestei situații se
folosește un bit care se numește OVERFLOW FLAG – O);
o O=1 – rezultatul operației aritmetice cu semn a depășit intervalul de calcul
(0110+0001 => 1010, iar O=1). Al patrulea bit se folosește pentru semn (0 –
număr pozitiv, 1 – negativ);
o O=0 – rezultatul operației aritmetice cu semn nu a depășit intervalul de calcul
(0110+0001 => 0111, iar O=0) . Al patrulea bit se folosește pentru semn (0 –
număr pozitiv, 1 – negativ).
Cele mai implementate funcții logice sunt: NU (NOT), ȘI (AND), SAU (OR), SAU
EXCLUSIV (XOR), Deplasare stânga/dreapta (SHIFT LEFT/RIGHT), Rotire stânga/dreapta
(ROTATE LEFT/RIGHT).

13
Funcțiile aritmetice sunt implementate tot cu ajutorul porților logice, cu precizarea că
implementarea acestora este mai complexă. În Fig.2.3 se prezintă o funcție aritmetică creată cu
porți logice care are rol de a aduna două numere, fiecare număr fiind exprimat pe 1 bit. Fig.2.3.a
prezintă adunarea cu ajutorul a două porți logice, o poartă de tip SAU EXCLUSIV care oferă
rezultatul sumei, respectiv o poartă de tip ȘI cu rol de a oferii informații suplimentare, în cazul de
față informația fiind faptul că rezultatul operației nu poate fi exprimat pe un bit. Astfel la bitul
SUM se obține partea care poate fi exprimată pe un bit, iar la CARRY se prezintă dacă rezultatul
operației depășește intervalul de calcul. Acest tip de adunare poartă denumirea de „adunare pe
jumătate” (HALF ADDER). Simbolul unui HALF ADDER este prezentat în Fig.2.3.c
Dacă se dorește adunarea a două numere exprimate pe doi sau mai mulți biți, există
posibilitatea ca să apară câte o deplasare (bitul CARRY) la fiecare pereche de biți. O funcție de
adunare implementată electronic trebuie să țină cont, pentru fiecare pereche de biți pe care îi adună,
de bitul CARRY rezultat în operația de adunare a perechii de biți anterioare. În aceste condiții,
circuitul de adunare va avea 3 intrări pentru fiecare pereche de biți, 2 intrări pentru perechea de
biți corespunzători celor două numere și a treia intrare pentru bitul CARRY rezultat în operația de
adunare a perechii de biți anterioare. Acest tip de adunare se numește „adunare completă” (FULL
ADDER) și este prezentată în Fig.2.3.b. FULL ADDER folosește un set de două porți logice de
tip SAU EXCLUSIV, 2 porți logice de tip ȘI și o poartă logică de tip SAU. Simbolul unui FULL
ADDER se prezintă în Fig.2.3.e. În Fig.2.3.d se poate observa cum se construiește un FULL
ADDER din două HALF ADDER și o poartă logică de tip SAU.

a) b)

c) d)
Fig.2.3. Structura celulei de adunare a două numere de câte 1 bit: a) structură Half Adder; b) structură
Full Adder; c) simbol Half Adder; d) simbol Full Adder

Din celule de tip FULL ADDER se poate construi circuite de adunare care poate aduna
numere care au diferite lungimi ale cuvântului de date. De exemplu, în Fig.2.4 se prezintă structura
unui circuit care adună două numere, fiecare fiind exprimat pe 4 biți.

14
Fig.2.4. Structura circuitului de adunare a două numere, fiecare fiind exprimat pe 4 biți

Unitatea aritmetică și logică este un circuit electronic digital cu rol de efectuare a


operațiilor aritmetice și logice cu numere întregi, la nivelul unui CPU. În Fig.2.5 se prezintă modul
de funcționare a unității aritmetice și logice din care se observă că aceasta respectă criteriile
necesare pentru ca un circuit digital să poată efectua o operație aritmetică sau logică. ALU permite
realizarea mai multor operații aritmetice și logice motiv pentru care ea mai are nevoie de o intrare
digitală prin intermediul căreia să se selecteze funcția aritmetică sau logică care urmează a fi
calculată.

Fig.2.5. Funcționarea ALU

În exemplul din Fig.2.5 se prezintă modul de efectuare a unei adunări din care se observă
cei doi operanzi (intrări), rezultatul (ieșire), funcția de selecție (adunare) și informația suplimentară
referitoare la rezultatul operației efectuate (Carry).
Așa cum s-a precizat anterior, ALU are implementate la nivelul său mai multe funcții
aritmetice și logice. O exemplificare a unei astfel de structuri se poate observa în Fig.2.6.

Fig.2.6. Structura internă ALU


15
Din punct de vedere constructiv, dimensiunea fizică a ALU depinde de arhitectura ISA în
care a fost creat microcontrolerul. Dacă arhitectura folosită este de tip CISC, rezultă că există un
număr mare de funcții aritmetice și logice implementate la nivel de ALU, motiv pentru care acesta
ocupă un spațiu fizic mai mare în interiorul microcontrolerului. În cazul arhitecturii de tip RISC,
numărul de funcții implementate este mai redus, de asemenea și dimensiunea ALU este mai redusă.
2.2.2. Regiștrii interni ai microcontrolerului 
Un registru intern al microcontrolerului reprezintă o locație de memorie din memoria
internă a microcontrolerului. Regiștrii interni au rol de a asigura memorarea datelor de intrare și
de ieșire cu care lucrează electronica internă a microcontrolerului la fiecare operație pe care acesta
o execută. Trebuie precizat că informația stocată în regiștii se pierde în momentul în care tensiunea
de alimentare a microcontrolerului este întreruptă.
Din punct de vedere constructiv, structura unui registru este prezentată în Fig.2.7 în care
se observă că acesta are 3 semnale de control:
 Semnalul CLOCK se folosește pentru a selecta când se dorește a se citi sau scrie o dată
în registru;
 Semnalul ENABLE se activează pe ”0” logic și este un semnal care stabilește dacă
registrul respectiv este activ la un anumit moment de timp;
 Semnalul READ/WRITE se pune pe ”0” logic când se dorește activarea citirii din
registru sau pe ”1” logic când se dorește scrierea unei informații în registru.

Fig.2.7. Structura unui registru intern

Regiștrii interni ai microcontrolerului se împart în două categorii:


 regiștrii generali de date (GPR – General Purpose Registers) au rol în manipularea
internă a datelor necesare operării microcontrolerului. În general se folosesc pentru a
furniza operanzii pentru ALU;
 regiștrii cu funcții speciale (SFR – Special Function Registers) sunt regiștrii folosiți
pentru a controla electronica internă a microcontrolerului sau pentru ca electronica
internă a microcontrolerului să salveze anumite informații sau stări.
Regișitrii cu funcții speciale sunt foarte importanți pentru funcționarea corectă a
electronicii interne a microcontrolerului. Dintre aceștia cei mai cunoscuți sunt:
 regiștrii cu funcții speciale utilizați de ALU:
o registrul acumulator (A) se folosește pentru a aduce un operand la ALU,
respectiv tot în el se va regăsii rezultatul operației efectuate;
o registrul de fanioane (Flag Register – F sau Program Status Word PSW) se
folosește pentru a memora informațiile suplimentare referitoare la ultima
operație aritmetică sau logică;

16
 regiștrii cu funcții speciale de control sunt utilizați pentru controlul diverselor operații
pe care le execută microcontrolerul. În această categorie se încadrează regiștrii destinați
pentru:
o controlul puterii;
o controlul temporizatoarelor (modul de funcționare, activare, dezactivare, setare
durată temporizator, etc);
o controlul sistemului de întreruperi (activarea întreruperilor, setarea priorităților,
etc);
o controlul porturilor seriale;
o controlul convertorului analog-numeric;
 regiștrii cu funcții speciale pentru porturi de intrare-ieșire se folosesc pentru a stoca
datele de intrare sau ieșire în procesul de comunicație cu circuitele electronice externe.
2.2.3. Unitatea de control 
Unitatea de control are rol de a gestiona toate circuitele electronice ale microcontrolerului
în funcție de instrucțiunea care trebuie executată și este formată din contorul de program (Program
Counter), registrul de instrucțiuni (Instruction Register), decodorul de instrucțiuni (Instruction
Decoder) și circuitul de depanare/testare în cip (OCP – On Chip Debug).
Program Counter este un registru utilizat pentru a transmite memoriei de program adresa
următoarei instrucțiuni care trebuie executată. La diferite microcontrolere el poate fi întâlnit și cu
denumirile: Instruction pointer, Instruction Address Register. Acest registrul este unul de tip
incremental, adică la fiecare pas valoarea memorată în acesta crește cu 1 de unde rezultă că
instrucțiunile se execută pe rând începând cu prima instrucțiune. Există și situații în care valoarea
acestuia se modifică prin adunarea sau scăderea unui număr oarecare. Aceste situații sunt generate
de utilizarea în program a funcțiilor (subrutine), a buclelor și a ramurilor. De asemenea valoare
Program Counter se modifică cu o valoare mai mare în momentul în care apare o întrerupere
generată de sistemul de întreruperi. La fiecare resetare a microcontrolerului valoarea scrisă în
Program Counter va fi 0.
Registrul de Instrucțiuni este un registu care stochează instrucțiunea curentă. Informația
ajunge în acest registru din memoria de program. Acest registrul este important pentru că el
menține informația referitoare la instrucțiunea curentă până aceasta este decodată.
Decodorul de Instrucțiuni este cel mai important circuit din unitatea de control. El este un
circuit combinațional care interpretează informația regăsită în Registrul de Instrucțiuni și
generează un set de semnale electrice de activare a tuturor circuitelor electronice interne sau
externe microcontrolerului care vor participa pentru executarea instrucțiunii (Fig.2.8).

Fig.2.8. Decodorul de instrucțiuni

17
2.2.4. Cum se execută o instrucțiune? 
La alimentarea cu tensiune a microcontrolerului Program Counter se inițializează pe
valoarea 0, ceea ce va conduce la activarea adresei 0 din memoria de program a microcontrolerului.
La această adresă se găsește prima linie de cod al programului pe care trebuie să îl execute
microcontrolerului sau o instrucțiune de salt la adresa la care a fost memorat programul. Saltul la
o nouă adresă conduce la actualizarea Program Counter cu valoarea aferentă noii adrese.
În momentul în care se identifică prima instrucțiune de program în memoria de program,
aceasta este transferată în Registrul de Instrucțiuni. Instrucțiunea memorată în acest registru este
preluată de Decodorul de Instrucțiuni care interpretează instrucțiunea primită. De la Decodorul de
Instrucțiuni se transmit semnale de activare către toate circuitele care vor fi implicate în executarea
instrucțiunii respective. De exemplu, dacă se dorește realizarea unei operații de adunare între o
locație de memorie și un registru general de date, Decodorul de Instrucțiuni va activa locația de
memorie și registrul general de date care urmează a fi utilizate. Ulterior va selecta operația activa
partea din ALU care se ocupă de adunare.
Dacă instrucțiunea executată nu conține un salt (buclă, ramură, subrutină, resetare)
Decodorul de Instrucțiuni comandă incrementarea (creșterea cu o unitate) a Program Counter. În
caz contrar în Program Counter se va scrie valoarea aferentă a adresei la care se dorește efectuarea
saltului.

2.3. Blocul de memorii 
Un microcontroler conține un bloc de memorii interne care pot fi clasificate după mai multe
criterii, astfel:
 din punct de vedere al rolului funcțional:
o regiștrii interni ai microcontrolerului (vezi Cap. 2.2.2);
o memoriile de program sunt folosite în cadrul unui microcontroler pentru a se
stoca codul sursă ce urmează a fi executat;
o memoriile de date se folosesc pentru a memora pentru scurtă durată sau lungă
durată, diverse informații necesare procesului automatizat.
 din punct de vedere al vitezei de acces și volatilității:
o memoriile primare sunt memorii cu o viteză mare de acces dar care își pierd
informația în momentul în care tensiunea de alimentare dispare. Aceste
memorii se folosesc în partea de rulare a programului;
o memoriile secundare au viteză de acces mai mică în schimb își păstrează
informația și în situația în care dispare tensiunea de alimentare. Acestea se
folosesc pentru a stoca diverse informații care pot fi utilizate la un moment dat
de către microcontroler;
 Din punct de vedere al tipului de acces:
o memorii cu acces aleatoriu la care orice informație din memorie poate fi
accesată în orice moment de timp (stocare în memorii de tip RAM – Random
access Memory);
o memorii cu acces secvențial care pot fi accesate doar locație cu locație (banda
magnetică).
În Fig.2.9 se prezintă principalele opt tipuri de memorii care se folosesc într-un
microcontroler clasificate în funcție de din punct de vedere al vitezei de acces și a volatilității.
18
Fig.2.9. Tipuri de memorii

Memoriile de tip RAM – Random access Memory sunt memorii de mare viteză care pot
fi accesate aleatoriu. Aceste se folosesc pentru toate memoriile care intervin în rularea programului
înscris în microcontroler. Din această categorie fac parte atât regiștrii interni ai microcontrolerului
cât și memoria în care se păstrează diverse informații necesare ce urmează a fi utilizate de către
electronica internă a microcontrolerului. Din punct de vedere constructiv acestea se împart în două
categorii:
 SRAM (Static Random-Access Memory) este o memorie RAM construită din
tranzistori (Fig.2.10.a);
 DRAM (Dynamic Random-Access Memory) este o memorie RAM construită pe
bază de condensatoare (Fig.2.10.b). Din cauza pierderilor de energie din condensator
memoriile DRAM au nevoie de un circuit dedicat cu rol de reîmprospătare periodică a
informației din condensatoare (la câteva milisecunde).
În Tabelul 2.1 se prezintă o comparație între cele două categorii de memorii RAM.

Tabelul 2.1. Comparație între cele două categorii de memorii RAM


Criteriu de
comparație SRAM DRAM
Construcție utilizează până la 6 tranzistori pe Utilizează un condensator și un
celulă tranzistor pe celulă
Dimensiune mică mare
Viteză mare mică
Cost mare mic
Consum energie mic mare
Circuite adiționale nu Da (circuit reîmprospătare)
Utilizare Regiștrii interni, memorii cache Memoria principală

19
a) b)
Fig.2.10. Tipuri de memorii: a) SRAM; b) DRAM

Memoriile nevolatile fac parte din categoria memoriilor secundare. Aici se întâlnesc mai
multe tipuri constructive dintre care se amintesc:
 Masked ROM este o memorie de tip ROM (Read Only Memory) în care informația
este scrisă în procesul de fabricație și nu mai poate fi modificată ulterior. O astfel de
memorie are avantajul că este foarte ieftină și se utilizează în sisteme cu
microcontrolere a căror funcționalitate nu mai poate fi îmbunătățită sau modificată
ulterior. Utilizarea acestui tip de memorie este rentabilă în situația în care se folosește
în echipamente produse în cantități mari;
 PROM (Programmable Read-Only Memory) este de asemenea o memorie ieftină
care poate fi programată o singură dată. Diferența față de Masked ROM este dată de
faptul că această memorie poate fi programată o singură dată de către utilizator
(programator). În situația în care informația scrisă în memoria PROM este eronată,
această memorie nu mai poate fi folosită. Utilizarea acestui tip de memorie este
rentabilă în situația în care se folosește în echipamente produse în cantități mari dar a
căror durată de viață este relativ redusă;
 EPROM (Erasable Programmable Read-Only Memory) este o memorie care poate
fi ștearsă cu ajutorul luminii ultraviolete. Din punct de vedere constructiv această
memorie conține o suprafață de sticlă prin care poate intra razele ultraviolete. După
programare, suprafața de sticlă trebuie acoperită pentru a nu pătrunde lumina. Acest tip
de memorie se folosește în etapa de dezvoltare a aplicațiilor;
 EEPROM (Electrically Erasable Programmable Read-Only Memory) este o
memorie care poate fi ștearsă și reprogramată cu ajutorul unui semnal electric.
Funcțional este asemănătoare cu EPROM. Se folosește atât în etapa de dezvoltare a
aplicațiilor cât și ulterior pentru a stoca constante care pot fi parametrizate sau pot stoca
codul sursă pentru aplicațiile care suportă actualizări de cod sursă;
 FLASH este o memorie asemănătoare cu memoria EEPROM, diferența fiind dată de
faptul că memoria EEPROM este reprogramată bit cu bit în timp ce memoria FLASH
este reprogramată bloc cu bloc (un bloc este format din mai mulți biți). Este cea mai
utilizată memorie în microcontrolerele moderne deoarece costul de producție per celulă
este mai mic decât la EEPROM. La majoritatea microcontrolerelor moderne în
memoria FLASH se stochează codul sursă al aplicației;
 NVRAM (Non Volatile Random Access Memory) este o memorie de tip RAM care
are atașată o baterie pentru a menține informația după întreruperea tensiunii de
alimentare. Fiind o memorie de tip RAM, timpul de acces la informație este foarte

20
scăzut. Este cea mai scumpă memorie dintre memoriile secundare. Acest tip de
memorie se folosește în aplicațiile în care timpul de pornire (de la zero sau după o
resetare) este foarte important. Dacă energia din baterie scade prea mult, aceasta trebuie
schimbată, dar cu precizarea că trebuie copiate datele în altă memorie înaintea
schimbării bateriei.

2.4. Intrări/ieșiri de uz general (GPIO ‐ General‐Purpose Input/Output). Portul paralel.  
Intrări/ieșiri de uz general reprezintă cel mai simplu mod prin care un microcontroler poate
comunica cu informația binară (digitală) din exterior. Construcția unui pin de uz general este
realizată astfel încât să poată îndeplini ambele funcții, atât cea de intrare cât și cea de ieșire.
O construcție tipică a unui pin de uz general este prezentată în Fig.2.11.a în care se poate
observa că între magistrala internă și pin există două trasee distincte. Un traseu pornește de la
magistrala internă intrând într-un bistabil de tip DQ denumit în continuare LATCH. De la ieșirea
bistabilului este alimentată borna GRILĂ (POARTĂ) a unui tranzistor cu efect te câmp a cărui
bornă denumită DRENĂ este legată la potențialul pozitiv prin intermediul unui rezistor, iar borna
SURSĂ este conectată la potențialul nul (MASĂ). Borna PIN la care se leagă dispozitivul extern
este legată în circuit între rezistor și borna DRENĂ a tranzistorului. Această schemă formează
funcția de ieșire a GPIO care funcționează astfel:
 dacă pe magistrala de date se pune bitul pe valoarea ”1” și se activează borna WP
(WRITE PORT), această valoarea va fi memorată în interiorul bistabilului DQ. La
borna de ieșire Q se va regăsi valoarea ”0” care blochează trecerea curentului prin
tranzistor. În aceste condiții la PIN va ajunge valoarea ”1” dată de tensiunea de
alimentare prin intermediul bornei VCC;
 dacă pe magistrala de date se pune bitul pe valoarea ”0” și se activează borna WP,
această valoarea va fi memorată în interiorul bistabilului DQ. La borna de ieșire Q se
va regăsi valoarea ”1” care va activa trecerea curentului prin tranzistor. În aceste
condiții la PIN va ajunge valoarea ”0” potențial obținut prin borna SURSĂ a
tranzistorului.
Al doilea traseu pornește de la PIN și ajunge la intrarea unui amplificator de intrare
denumit în continuare Buffer. De la ieșirea acestuia semnalul ajunge direct pe magistrala internă
a microcontrolerului. Această schemă formează funcția de intrare a GPIO care funcționează astfel:
 la activarea bornei RP (READ PORT), indiferent de valoarea care este la un moment
dat pe borna PIN, aceasta va apărea direct pe magistrala de date.
În Fig.2.11.b se prezintă varianta de pin bidirecțional dotat cu LATCH de direcție. În cadrul
acestui LATCH se poate memora direcția dorită pentru pinul respectiv, astfel:
 dacă la ieșirea LATCH va fi valoarea ”0” atunci portul este de intrare;
 dacă la ieșirea LATCH va fi valoarea ”1” atunci portul este de ieșire.
În practică, mai mulți pini (de obicei 8) formează un port. Un microcontroler poate avea
unul sau mai multe porturi. Pentru fiecare port al microcontrolerului se folosesc doi regiștrii cu
funcții speciale:
 registrul de direcție (DDRx – Data Direction Register) este utilizat pentru setarea
direcției fiecărui pin al portului respectiv. Pentru majoritatea aplicațiilor, pinii digitali

21
de date au o singură direcție, indiferent dacă aceasta este de ieșire sau de intrare, motiv
pentru care registrul de direcție DDR a fiecărui port digital se setează o singură dată la
începutul codului sursă;
 registrul de port (PORTx – PORT register) reprezintă un registru cu funții speciale
utilizat pentru memorarea datelor în timpul transferului către/dinspre port.
Se precizează că în funcție de producător x poate fi o cifră sau o literă prin care se
numerotează porturile.

a) b)
Fig.2.11. Structura internă a GPIO: a) bidirecțional simplu; b) bidirecțional cu LATCH de direcție

De asemenea trebuie precizat că structurile prezentate în Fig.2.11 nu sunt schemele finale


ale unui pin al microcontrolerului. Electronica acestor pini este mult mai complexă pentru că
fiecare pin în parte poate avea atașate și alte funcții speciale ale microcontrolerului cum ar fi:
PWM, comunicații seriale, intrări analogice, pini de întrerupere externă, etc.

2.5. Comunicația serială la nivel de microcontroler 
Comunicația serială reprezintă transmiterea bit cu bit a unei informații codificate pe mai
mulți biți (de obicei 8) utilizând o linie de transmisie. Comunicația serială la nivel de
microcontroler reprezintă comunicația serială care are loc la nivelul logic al microcontrolerului
(de obicei 5V) și care se folosește ca și comunicație internă a unui sistem cu microcontroler.
Comunicația serială la nivel de microcontroler este de două tipuri:
 Asincronă (datele se transmit fără ajutorul unei linii de sincronizare / Clock): UART;
 Sincronă (datele se transmit utilizând o liniei de sincronizare / Clock): I2C, SPI.
2.5.1. UART – Universal Asynchronous Receiver‐Transmitter 
UART este o transmisie asincronă care nu folosește linie de sincronizare. Șirul de biți care
compun o transmisie UART sunt (Fig.2.12):
 Biți de date (5-9 biți)
 Biți de sincronizare (START bit, STOP bit)
 Biți de paritate

Fig.2.12. Structura binară a comunicației UART

22
Protocolul are la bază noțiunea de BAUD RATE – folosit pentru stabilirea vitezei de
comunicație care se măsoară în baud. Valori standard pentru viteza de comunicație sunt: 1200,
2400, 4800, 9600, 19200, 38400, 57600, 115200 (baud)
Structura de transmisie din Fig.2.12 trebuie respectată pentru fiecare octet ce se transmite.
Pentru exemplificare, în Fig.2.13 se prezintă modul de transmisie a doi octeți consecutivi.

Fig.2.13. Exemplu de transmisie a doi octeți prin intermediul comunicației UART

Comunicația serială asincronă are un dezavantaj major în ceea ce privește verificarea


corectitudinii transmiterii datelor. Pentru ca aceasta să funcționeze corect, cele două dispozitive
care comunică prin intermediul UART trebuie să aibă setați aceiași parametrii de comunicație:
 același număr de biți ai cuvântului de date (5, 6, 7, 8 sau 9);
 aceeași viteză de comunicație (BAUD RATE);
 același protocol de paritate (fără – NONE; paritate pară – EVEN, paritate impară –
ODD);
Comunicația serială UART utilizează unul sau două fire de comunicație. În situația în care
se utilizează un singur fir de comunicație sistemul poate comunica unidirecțional, un dispozitiv
numit receptor având firul conectat la borna RX (recepție), iar al doilea dispozitiv numit
transmițător având firul conectat la borna TX (transmisie). Acest tip de comunicație se numește
comunicație simplex (unidirecțională). În situația în care se folosesc două fire de comunicație
conectate ca și în Fig.2.14 se poate spune că este vorba de o comunicație duplex (bidirecțională).

Fig.2.14. Conectarea firelor într-o comunicație UART duplex

Structura internă a portului de comunicație UART (Fig.2.15) este formată din:


 generator de Baud Rate este folosit pentru generarea frecvenței de comunicație;
 unitate de control logic al transmisie se folosește pentru a controla transmisia și
recepția în ceea ce privește:
o acțiunea: setează transmisia sau recepția în funcție de direcția datelor;
o formarea protocolului de transmisie: inserează biții suplimentari de START,
PARITATE, STOP;
o interpretarea recepției: verifică corectitudinea comunicației prin interpretarea
bitului de paritate;
 regiștrii cu funcții speciale:
o registrul pentru Baud Rate (UBRR) este folosit pentru setarea vitezei de
comunicație;
o registrul de date (UDR) este folosit pentru stocarea informației care va fi
transmisă, respectiv a informației care a fost recepționate. Acest registru se va
23
scrie în momentul în care se transmit date, respectiv se va citi când se
recepționează date;
o registrii de control sunt folosiți pentru stabilirea protocolului de comunicație
(număr de biți, paritate, utilizarea sistemului de întreruperi, etc);
 regiștrii de conversie sunt folosiți pentru conversia datelor din paralel în serie pentru
transmisie și din serie în paralel pentru recepție. Ei poartă denumirea de regiștrii de
deplasare (Shift Registers), iar structura lor poate fi observată în Fig.2.16.

Fig.2.15. Structura internă a portului de comunicație UART

Fig.2.16. Registru de deplasare pentru comunicație UART

2.5.2. I2C – Inter‐Integrated Circuit 
I2C este un protocol de comunicație sincronă, de tip master/slave, de tip Half Duplex (la
un moment de timp poate comunica doar într-o direcție), care folosește două fire (Fig.2.17) notate:
 SCL – Serial CLock line se folosește pentru a transmite semnalul de tact pentru
sincronizarea dispozitivelor;
 SDA – Serial DAta line se folosește pentru transmiterea serială a datelor.

Fig.2.17. Structura protocolului de comunicație I2C

24
Firele magistralei I2C trebuie să fie conectate la tensiunea de alimentare a circuitului prin
intermediul a două rezistoare. I2C permite comunicarea dintre mai multe dispozitive electronice,
dintre care unele pot fi master și altele slave care trebuie să aibă adrese diferite.
Protocoul I2C a apărut în 1982, iar de atunci au fost modificat de mai multe ori din punct
de vedere al dispozitivelor care pot fi conectate respectiv a vitezei de comunicare. În prezent există
mai multe variante:
 1982 – 100 kHz și adrese pe 7 biți (112 slave);
 1992 – 400 kHz (fast mode) și adrese pe 10 biți (1008 Slave);
 Anii 2000:
o 1 MHz - fast-mode plus;
o 3.4 MHz high-speed mode;
o 5MHz ultra-fast mode.
Șirul de biți folosiți pentru o comunicație I2C care se va regăsii pe firul SDA este format
din (Fig.2.18):
 Biți de adrese (7 sau 10 biți);
 Biți de date (8 biți);
 Biți de control (START, READ/WRITE, ACK/NACK, STOP).

Fig.2.18. Structura binară a comunicație I2C

Comunicația decurge astfel:


 dispozitivul master transmite:
o bitul de START – toate dispozitivele slave vor fi atente la magistrala SDA;
o 7 sau 10 biți care reprezintă adresa pentru slave (Fig.2.19) – doar dispozitivul
cu adresa corectă va continua comunicarea;
o Bitul pentru selecția operației dorite:
 READ/WRITE = 0 pentru a scrie date în slave;
 READ/WRITE = 1 pentru a citi date de la slave;
 slave a cărui adresă a fost scrisă răspunde:
 ACK/NACK = 0 pentru a preciza că nu mai are de comunicat;
 ACK/NACK = 1 pentru a preciza că este pregătit pentru comunicație;
 pe SDA se vor pune datele de către master sau slave în funcție de valoarea pe care a
avut-o READ/WRITE;
 semnalul ACK/NACK = 0 urmat de punerea datelor pe SDA se poate repeta de mai
multe ori în funcție de câte date se vor transmite între cele două dispozitive;
 la final, semnalul ACK/NACK = 1, iar dispozitivul master transmite bitul de STOP.

25
a) adrese pe 7 biți

a) adrese pe 10 biți
Fig.2.19. Exemplu de comunicație I2C

Portul de comunicație I2C folosește mai mulți regiștrii dintre care cei mai utilizați sunt:
registrul de date, registrul de configurare, registrul stare, registrul de întreruperi.
O particularitate aparte a acestui protocol apare când un master dorește să citească date de
la un slave, iar acesta nu le are pregătite. În această situație slave transmite semnalul ACK prin
care confirmă că dorește să comunice, după care va pune magistrala SCL la masă pentru a anunța
dispozitivul master că datele nu sunt pregătite, iar dispozitivul master nu va mai citi magistrala
SDA. La eliberarea magistralei SCL, dispozitivul master va începe să citească datele.
2.5.3. SPI – Serial Peripheral Interface 
SPI este o interfață de comunicație sincronă, de tip master/slave, de tip Full Duplex (în
orice moment de timp poate comunica în ambele direcții), care folosește patru fire (Fig.2.20)
notate:
 MOSI (Master Output Slave Input) este folosit pentru ca dispozitivul master să
transmită date către dispozitivul slave;
 MISO (Master Input Slave Output) este folosit pentru ca dispozitivul master să
recepționeze date la dispozitivul slave;
 SCK (Serial ClocK) este folosit pentru a se transmite frecvența de comunicație;
 SS (Slave Select) este folosit pentru selecția dispozitivului slave. Trebuie reținut că
există câte un fir SS pentru fiecare dispozitiv slave care este conectat în rețea.

Fig.2.20. Structura protocolului de comunicație SPI


26
Spre deosebire de I2C, SPI acceptă un singur master. În același timp este cel mai rapid
protocol de comunicație. Viteza ridicată de comunicație este dată și de faptul că acesta comunică
în ambele direcții în același timp așa cum se poate observa în Fig.2.21.

Fig.2.21. Exemplificare comunciație Full Duplex protocol SPI

Din punct de vedere al semnalului de clock (SCK) protocolul de comunicație SPI suportă
patru moduri de lucru. Cele patru moduri sunt controlate de doi parametrii, Clock POLarity
(CPOL) și Clock PHAse (CPHA) și pot fi identificate în Fig.2.22.

Fig.2.22. Modurile de lucru a generatorului de frecvență

Dacă se dorește reducerea numărului de linii de selecție care se folosesc pentru selectarea
mai multor dispozitive slave, se poate utiliza schema din Fig.2.23.

Fig.2.23. Conectarea mai multor dispozitive slave utilizând un singur fir de selecție

În Fig.2.23 se observă că pinul MISO de la primul slave se conectează cu MOSI de la al


doilea slave. Acest lucru se continuă până la ultimul slave. Dispozitivul master se conectează cu
pinul MOSI la pinul MOSI al primul slave, iar cu pinul MISO la pinul MISO al ultimului slave.
În cadrul acestui mod de conectare datele sunt transmise astfel: de la master la primul slave, de la
primul slave la al doilea slave și așa mai departe până la ultimul slave. De la ultimul slave datele
sunt transmise la master. Din această formă de comunicație rezultă că la fiecare comunicație
27
efectuată, trebuie trimis un șir de date a cărui lungime este egală cu numărul de dispozitive slave
conectate.

2.6. Sistemul de întreruperi 
Definiția 1: Întreruperea este o soluție de a rula un program înainte de a se aștepta
terminarea programului de bază.
Definiția 2: Întreruperea reprezintă utilizarea asincronă a două programe, unul de bază și
unul secundar bazat pe evenimente.
Întreruperile sunt generate de evenimente aleatorii în timp. Problema evenimentelor
aleatorii este dată de faptul că nu se știe în ce moment de timp vor apărea. Din această cauză, un
eveniment aleatoriu poate consuma resursele microcontrolerului fără a produce efecte pentru o
perioadă lungă de timp. În Fig.2.24 se prezintă o comparație între modul de funcționare a unui
program fără sistem de întreruperi respectiv cu sistem de întreruperi.

Fig.2.24. Funcționarea programului fără și cu sistem de întreruperi

Un exemplu pun pentru a descrie modul de funcționare a unei întreruperi este dat de
urmărirea unei intrări digitale la care este conectat un contact utilizat pentru activarea iluminatului
într-o încăpere. Este clar că acest eveniment este aleatoriu și depinde de gradul de utilizare a
spațiului iluminat. Presupunând că acel contact este acționat o singură dată într-o zi,
comportamentul microcontrolerului va fi:
 fără sistemul de întreruperi, programul scris în microcontroler trebuie să conțină o
buclă periodică prin intermediul căreia să citească intrarea digitală la un interval de
timp relativ scurt (recomandat ar fi 0.5 s), procedură care poarte denumirea de
INTEROGARE (POLLING). Acest lucru înseamnă că microcontrolerul execută
instrucțiunea de citire a contactului de 172800 de ori într-o zi în condițiile în care
contactul va fi acționat o singură dată;
 cu sistem de întreruperi, programul scris în microcontroler rulează fără a urmării
intrarea digitală la care este conectat contactul, procedură care poartă numele de
Eveniment Asincron. În momentul acționării contactului, pe intrarea digitală respectivă
se va genera o întrerupere care va oprii funcționarea programului de bază și se va activa
28
o funcție secundară care are rol de a citi intrarea digitală și/sau de a genera comanda de
activare a iluminatului din încăpere. În aceste condiții codul sursă aferent acestui
eveniment va fi rulat doar în momentul în care este necesar.
Din exemplul anterior se poate deduce faptul că pentru anumite tipuri de aplicații, utilizarea
sistemului de întreruperi reduce considerabil uzura microcontrolerului.
Utilizarea sistemului de întreruperi a unui microcontroler se poate realiza doar în momentul
în care se cunoaște terminologia utilizată în cadrul acestuia prezentată În Tabelul 2.2.

Tabelul 2.2. Terminologie asociată sistemului de întreruperi


Terminologie Descriere
ISR (Interrupt Service Routine) Subrutină de servire a întreruperii
Interrupt vector Adresa în care se trece locația subrutinei de întrerupere
Interrupt mask Se folosește pentru a selecta care întrerupere este activă
NMI (Non Maskable Interrupt) Întrerupere permanent activă (nu poate fi dezactivată)
Asynchronous event Eveniment care se poate întâmpla în orice moment
Context switching Salvarea/restaurarea datelor înainte/după executarea ISR

Un microcontroler are mai multe surse de întreruperi grupate într-un sistem de întreruperi.
Aceste surse de întreruperi se clasifică astfel:
 întreruperi hardware:
o întreruperi interne generate de: comunicația serială, temporizatoare, ADC,
comparatoare, etc;
o întreruperi externe generate de evenimente externe prin intermediul unor pini
GPIO care au atașat și funcția de întreruperi;
 întreruperi software: sunt generate de evenimente software, cel mai cunoscut fiind
operația de împărțire a unui număr la 0.
Din punct de vedere al tratării întreruperilor acestea se clasifică în două categorii:
 întreruperi nemascabile sunt acele întreruperi care nu pot fi ignorate de către unitatea
centrală de procesare;
 întreruperile mascabile sunt acele întreruperi care pot fi ignorate de către unitatea
centrală de procesare. Aceste întreruperi trebuie activate înainte ca ele să fie luate în
considerare. Activarea lor se realizează prin setarea unui fanion alocat.
Pentru a înțelege întreruperile mascabile În Fig.2.25 se prezintă structura internă a
întreruperilor hardware a sistemului de întreruperi în care se observă că o întrerupere va genera un
semnal care va ajunge la doi regiștrii cu funcții speciale: Interrupt Mask și Interrupt Flag.
Interrupt Mask este un registru în care se poate parametriza individual sau general dacă
o întrerupere va fi tratată de sistemul de întreruperi. În primul rând se poate parametriza general
dacă toate întreruperile sunt tratate sau nu. Acest lucru se realizează prin intermediul unui fanion
denumit Global Interrupt Flag. În al doilea rând se poate parametriza individual dacă o anumită
întrerupere este tratată sau nu. În situația în care pentru o anumită întrerupere bitul aferent din
Interrupt Mask va fi pus pe ”0”, acea întrerupere nu va fi tratată de sistemul de întreruperi. Dacă
bitul aferent din Interrupt Mask va fi pus pe ”1”, acea întrerupere va fi tratată de către sistemul
de întreruperi.

29
Interrupt Flag este un registru în care se setează care dispozitiv a generat întreruperea
respectivă. De exemplu, pentru situația în care microcontrolerului conține trei porturi de
comunicație SPI, acesta va utiliza un singur canal de întrerupere pentru cele trei porturi (un singur
bit în registrul Interrupt Mask), dar va avea alocat câte un bit în registrul Interrupt Flag prin
intermediul căruia microcontrolerul va ști care dintre cele trei porturi SPI a generat întreruperea.

Fig.2.25. Structura internă a părții de întreruperi hardware a sistemului de întreruperi

Cum funcționează în general o întrerupere.


În momentul apariției unui eveniment asincron (Asynchronous event) aceasta va ajunge
genera un semnal care va ajunge la cei doi regiștrii amintiți mai sus (Interrupt Mask și Interrupt
Flag). Dacă întreruperea este blocată (Masked) în Interrupt Mask procesul se finalizează fără ca
aceasta să fie tratată. Dacă aceasta nu este mascată ea va activa sistemul de întreruperi, care:
 va oprii funcționarea programului de bază;
 va salva toate datele importante (regiștrii interni) în stivă – Context switching;
 va apela tabela vectorilor de întreruperi care reprezintă o zonă de memorie în care
pentru fiecare tip de întrerupere este asociat câte un spațiu de stocare, a cărui
dimensiune depinde de producătorul microcontrolerului (în general se folosesc 4-8
octeți pentru fiecare întrerupere);
 deoarece spațiul de stocare alocat în tabela vectorului de întreruperi este prea mic, în
aceste locații se va scrie vectorul de întreruperi (Interrupt vector) care reprezintă o
adresă din memorie în care se va regăsi subrutina de tratare a întreruperii (ISR –
Interrupt Service Routine);
 microcontrolerul va rula instrucțiunile aferente ISR;
 la final, toate datele salvate anterior vor fi restaurate din stivă – Context switching;
 programul principal continua din locul în care a rămas când a apărut întreruperea.
Întreruperile externe sunt foarte importante pentru utilizator. Din acest motiv, în continuare
se va prezenta mecanismul de funcționare a acestor întreruperi.
Cum se generează o întrerupere hardware externă în funcție de registrul Interrupt Mask.

30
La modificarea stării pinului GPIO, se va activa fanionul aferent acelui GPIO (GPIO pin
flag), care la rândul său va activa fanionul de întreruperi aferent pinului respectiv (GPIO interrupt
controller flag). Din acest moment procedura depinde de setările efectuate în registrul Interrupt
Mask:
 dacă în Interrupt Mask nu este blocată nici întreruperea în sine și nici tot sistemul de
întreruperi (Fig.2.26.a), întreruperea va fi generată și se va activa ISR aferent;
 dacă în Interrupt Mask nu este blocată întreruperea în sine dar este blocat tot sistemul
de întreruperi (Fig.2.26.b), întreruperea va fi generată dar ea va fi ignorată de către
unitatea centrală de procesare. Nici o întrerupere nu va fi tratată de către unitatea
centrală de procesare;
 dacă în Interrupt Mask este blocată întreruperea în sine și nu este blocat tot sistemul
de întreruperi (Fig.2.26.c), întreruperea nu va fi generată către unitatea centrală de
procesare. Dacă fanionul aferent acelui GPIO (GPIO pin flag) nu este resetat, iar
ulterior blocarea este anulată, acest lucru va conduce la declanșarea întreruperii
(Fig.2.26.d). Acest procedeu se numește ”Întrerupere în așteptare”. Unitatea centrală
de procesare va putea trata toate celelalte întreruperi neblocate.

a) întreruperea nu este blocată b) se blochează toate întreruperile

c) se blochează doar întreruperea curentă d) se blochează întreruperea curentă pentru o perioadă


Fig.2.26. Funcționarea întreruperilor hardware externe

O altă caracteristică a sistemului de întreruperi este aceea că se pot stabili diverse nivele
de prioritate pentru fiecare întrerupere. În Fig.2.27 se prezintă modul de comportare a două
întreruperi cu nivel diferit de prioritate.
31
 dacă două întreruperi care au nivel de prioritate diferit se generează în același moment,
se va trata întreruperea cu prioritate maximă;
 dacă dintre cele două întreruperi, cea cu prioritate mai mică este generată mai repede
aceasta va fi tratată. Dar dacă între timp se generează întreruperea cu prioritate mai
mare, aceasta va întrerupe chiar și întreruperea cu prioritate mai mică;
 dacă dintre cele două întreruperi, cea cu prioritate mai mare este generată mai repede
aceasta va fi tratată. Dacă între timp se generează întreruperea cu prioritate mai mică,
aceasta va aștepta finalizarea ISR întrerupere cu prioritate mai mare.

Fig.2.27. Tratarea întreruperilor cu niveluri de prioritate diferit

Partea software a unei întreruperi externe trebuie realizată corect atât din punct de vedere
al configurării cât și a realizării funcției dorite. Din punct de vedere a configurării trebuie respectați
următori pași:
 se creează subrutina de servire a întreruperii în care:
o se setează sau resetează fanioanele care pot influența funcționarea subrutinei;
o se răspunde la întrerupere cu acțiunea dorită;
 subrutina de servire a întreruperii se asociază vectorului de întrerupere;
 se configurează ce acțiune a GPIO va genera întreruperea. Acțiunile posibile sunt:
o rissing (frontul crescător de la 0 la 1);
o falling (frontul descrescător de la 1 la 0);
o change (frontul crescător de la 0 to 1 sau frontul descrescător de la 1 to 0);
o high (când intrarea este pe 1);
o low (când intrarea este pe 0);
 se activează întreruperea pentru GPIO utilizat;
 se activează întreruperile generale.
Din punct de vedere al realizării funcției dorite există două posibilități:
 fie se folosește subrutina de servire a întreruperii doar pentru setarea unui fanion, iar
codul sursă al funcției dorite se va scrie în programul de bază (Fig.2.28.a). În această
situație întreruperea va avea o durată scurtă, în schimb funcția dorită va fi tratată cu o
anumită întârziere care depinde de rulajul normal a programului de bază;
 fie se scrie codul sursă aferent funcției dorite direct în subrutina de servire a întreruperii
(Fig.2.28.b). În această situație întreruperea va avea o durată mai lungă, codul sursă al
funcție dorite va fi executat cu prioritate.

32
a) b)
Fig.2.28. Modul de implementarea a funcției dorite ca răspuns la generarea unei întreruperi: a) codul
sursă al funcției scris în programul de bază; b) codul sursă al funcției scris în ISR

Un caz particular de întrerupere nemascabilă – Funcția RESET


Această funcție poate fi considerată o întrerupere nemascabilă, adică tratarea ei este
obligatorie. Scopul funcției este aceea de a restabilii funcționarea corectă a microcontrolerului prin
ștergerea informațiilor din majoritatea regiștrilor interni.
Din punct de vedere al activării funcției RESET, există două posibilități:
 activare internă generată de electronica internă a microcontrolerului:
o pornirea sistemului denumită și cold reset;
o circuite de supraveghere a funcționării electronice (brownout detector);
o circuite de supraveghere a componentei software (watchdog);
 activare externă generată de utilizator printr-un buton de resetare, denumită și warm
reset.

2.7. Temporizatoarele/Numărătoare 
Temporizatorul (TIMER) este un circuit electronic specializat care contorizează timpul
prin utilizarea frecvenței interne a microcontrolerului.
Numărătorul (COUNTER) este un circuit electronic specializat care contorizează
numărul de apariție a unui eveniment generat prin intermediul unui pin GPIO.
Temporizatoarele și numărătoarele nu pot fi tratate diferit pentru că ele utilizează aceiași
structură electronică (Fig.2.29). Din punct de vedere electronic, diferența dintre ele este dată doar
de către intrarea care generează semnalul de tact necesar contorizării.

Fig.2.29. Structura internă a ciruitului de temporizare/numărare


33
În Fig.2.29 se observă că semnalul de la un generator de frecvență sa de la un pin de intrare
este trecut printr-un multiplexor cu rol de a selecta sursa de semnal care va fi folosită. Dacă se
selectează un generator de tact atunci sistemul va funcționa ca și un temporizator, iar dacă se
selectează semnalul de la pinul de intrare atunci sistemul va funcționa ca și numărător.
Semnalul trecut prin multiplexor ajunge la un circuit de divizare a frecvenței. Acest lucru
este util pentru a se putea implementa cât mai multe valori pentru temporizatoare. De la circuitul
de divizare a frecvenței, semnalul ajunge la contorul principal care în realizate este un circuit
numărător incremental sau decremental. Dacă microcontrolerul folosește un numărător
incremental, acesta va crește valoarea stocată în registrul de parametrizare a temporizatorului până
acesta va depăși valoarea maximă care poate fi scrisă în funcție de numărul de biți utilizați. Dacă
numărătorul folosește un numărător decremental, acesta va scădea până la valoarea 0. Indiferent
de tipul de numărător folosit, când se va atinge maximul pentru numărătorul incremental sau
minimul pentru numărătorul decremental, circuitul de control va genera o întrerupere prin care va
anunța unitatea centrală de procesare că durata setată a trecut.
Un temporizator poate fi folosit în mai multe moduri:
 realizarea unei întârzieri pentru un proces fizic (Fig.2.30.a). În momentul apariției
evenimentului A se va executa o întârziere până la declanșarea funcției B;
 realizarea unei întârzieri periodice (Fig.2.30.b). După activarea unui temporizator, la
intervale constante de timp se întrerupe programul de bază și se rulează o subrutină se
servire a întreruperii. Acest tip de funcționare se realizează când temporizatorul se
configurează în modul autoreload (autopornire);
 realizarea unei întârzieri periodice pentru controlul circuitelor electronice interne care
au nevoie de semnal de tact. În Fig.2.31 se prezintă modul de utilizarea a unui
temporizator ca și generator de timp pentru un circuit de achiziție analog-numerică.
Astfel de scheme sunt implementate pentru alte circuite electronice: porturile seriale;
 realizarea generatului de tact pentru generarea semnalului PWM (Pulse-width
Modulation).

a) b)
Fig.2.30. Mod de utilizare a temporizatoarelor: a) o întrziere unică; b) o întârziere periodică

Fig.2.31. Utilizare temporizator pentru control ADC

34
Fig.2.32. Diagrama de funcționare a unui temporizator pentru PWM (Pulse-Width Modulation)

Un caz particular de temporizator – WATCHDOG


Temporizatorul Watchdog este folosit ca și o funcție de protecție a codului sursă din
microcontroler. Acest temporizator are rolul de a împiedica funcționarea eronată a codului sursă
cum ar fi intrarea într-o buclă infinită.
Principiul de funcționare a Watchdog este unul simplu de tipul ”Procesorul restartează
Watchdog Sau Watchdog restartează procesorul” și poate fi descris grafic ca și în Fig.2.33.
Funcția de protecție funcționează astfel:
 programatorul stabilește o durată de timp pentru Watchdog;
 programatorul scrie instrucțiunea de activare Watchdog după care scrie linii de cod
din programul de bază. Programatorul trebuie să calculeze cât mai exact durata de
execuție a liniilor de cod scrise;
 programatorul rescrie periodic instrucțiunea de activare Watchdog având grijă ca
liniile de cod din programul de bază, scrise între două activări succesive ale Watchdog,
să aibă o durată de execuție mai mică decât durata stabilită pentru Watchdog. O mare
atenție trebuie acordată buclelor, ramificațiilor și funcțiilor a căror durată de execuție
nu poate fi calculate exact. Pentru acestea se recomandă reactivarea Watchdog în
interiorul lor;
 dacă la un moment dat durata setată pentru Watchdog este depășită, aceasta va genera
automat resetarea microcontrolerului.

Fig.2.33. Principiu de funcționare Watchdog

2.8. Convertorul analog‐numeric 
Convertorul analog-numeric (ADC – Analog to Digital Converter) este un circuit
electronic care are rolul de a converti o mărime analogică într-o mărime digitală:

35
 mărime analogică este o mărime electrică variabilă în timp. În orice moment de timp
valoarea măsurată a mărimii analogice va fi diferită de valoarea măsurată anterior;
 mărime binară este o mărime electrică care are doar două stări: 0 V care înseamnă 0
logic și Vcc care înseamnă 1 logic. În funcție de tipul electronici folosite, Vcc poate
avea diverse valori, cea mai utilizată în microcontrolere fiind Vcc=5 V;
 mărime numerică este un număr binar format din mai mulți biți (8, 16, 32) prin care
se poate exprima orice valoare numerică cuprinsă între 0 și un număr maxim care
depinde de numărul de biți folosiți (255 – 8 biți; 65535 – 16 biți; 4,294,967,295 – 32
biți).
Conversia unei mărimi analogice într-o mărime digitală înseamnă exprimarea valorii
momentane a valorii analogice prin intermediul unei mărimi digitale. Caracterizarea semnalului
analogic se realizează prin intermediul unei mărimi numerice pentru fiecare achiziție efectuată
(Fig.2.34).

Fig.2.34. Principiu de funcționare ADC

Convertorul analog-numeric poate fi realizat ca și un circuit integrat independent sau poate


fi inclus în structura internă a microcontrolerului. În continuare se va discuta doar despre ADC
inclus în microcontroler.
Majoritatea microcontrolerelor au un număr oarecare de intrări analogice ceea ce
înseamnă faptul că microcontrolerul suportă aplicarea pe acele borne de intrare, a unei tensiuni
variabile în timp cuprinsă în intervalul -Vcc – +Vcc. Existența intrărilor analogice este posibilă
doar dacă în structura internă a microcontrolerului se regăsește cel puțin un circuit de conversie
analog-numerică. În majoritatea cazurilor, din punct de vedere constructiv, în interiorul
microcontrolerului există un singur ADC. Pentru a se putea utiliza mai multe intrări analogice este
nevoie de utilizarea unui multiplexor analogic care poate aduce pe rând fiecare intrare analogică
la bornele ADC (Fig.2.35).

Fig.2.35. Structura unui port de intrări analogice

Achiziția analog-numerică este caracterizată de doi parametrii de bază:

36
 rata de eșantionare determină viteza de achiziție și reprezintă numărul achiziții
realizate într-o secundă. Se măsoară în samples/second. Rata de eșantionare trebuie să
fie mai mare pentru semnalele analogice care au o viteză de variație în timp mai mare
(semnalele periodice cu frecvențe mai mari);
 rezoluția reprezintă un parametru care depinde de numărul de biți folosiți pentru partea
numerică a conversiei. Aceasta determină calitatea achiziției. Rezoluția trebuie să fie
mai mare pentru situația în care se cere o precizie mai ridicată a valorii numerice.

3. Dispozitive de intrare/ieșire folosite în sisteme încorporate 

3.1. Dispozitive de intrare/ieșire digitale utilizate în sistemele încorporate 
În categoria dispozitivelor de intrare/ieșire digitale se încadrează toate dispozitivele care
pot fi conectate la microcontroler prin intermediul pinilor GPIO sau prin intermediul porturilor de
comunicații seriale.
3.1.1. Utilizarea dispozitivelor binare de intrare 
Intrările binare sunt folosite de dispozitivele care pot avea doar două stări. Aceste
dispozitive pot fi caracterizate printr-un singur bit, astfel încât o stare este caracterizată de 1 logic
iar a doua stare este caracterizată de 0 logic. În această categorie se încadrează toate contactele cu
două stări (închis/deschis) indiferent de forma lor constructivă: contact cu revenire (Push Button),
contact electric, tranzistor (utilizat ca și contact electronic de intrare).
În situația în care un GPIO se folosește ca și pin de intrare, pentru determinarea valorii
logice a semnalului de la intrare acesta este obligatoriu să aibă o valoare bine definită indiferent
că este 0 logic sau 1 logic. Schema de conectare a unui contact trebuie construită astfel încât să
asigure cele două nivele logice. Conectarea contactelor la un GPIO a unui microcontroler se poate
realiza astfel:
 cu rezistor de Pull up (Fig.3.1.a) – între GND și Vcc se conectează contactul cu o
legătură directă la GND și un rezistor cu o legătură directă la Vcc. Semnalul spre
microcontroler se colectează de la intersecția contactului cu rezistorul;
 cu rezistor de Pull down (Fig.3.1.b) între GND și Vcc se conectează rezistorul cu o
legătură directă la GND și un contactul cu o legătură directă la Vcc. Semnalul spre
microcontroler se colectează de la intersecția contactului cu rezistorul.

a) b)
Fig.3.5. Scheme de conectare a contactelor la un GPIO a unui microcontroler: a) cu rezistor de pull up;
b) cu rezistor de pull down

37
Schema de conectare cu rezistor de pull up se numește schemă în logică negativă pentru
că un contact normal deschis va genera spre microcontroler un semnal de 1 logic pinul
microcontrolerului fiind pus la Vcc prin intermediul rezistorului. În momentul în care se închide
contactul, pinul microcontrolerului este tras spre GND având un semnal de 0 logic. Această
conectare se numește logică negativă pentru că acționarea contactului generează 0 logic, iar
eliberarea lui generează 1 logic.
Schema de conectare cu rezistor de pull down se numește schemă în logică pozitivă pentru
că un contact normal deschis va genera spre microcontroler un semnal de 0 logic pinul
microcontrolerului fiind pus la GND prin intermediul rezistorului. În momentul în care se închide
contactul, pinul microcontrolerului este tras spre Vcc având un semnal de 1 logic. Această
conectare se numește logică pozitivă pentru că acționarea contactului generează 1 logic, iar
eliberarea lui generează 0 logic.
În cazul utilizării contactelor mecanice (cu armături metalice) acestea pot produce vibrații
în procesul de conectare. Vibrațiile sunt văzute de către microcontroler ca închideri și deschideri
repetate ale contactului ceea ce poate conduce la funcționarea eronată a programului din
microcontroler. Pentru tratarea acestei probleme se utilizează tehnici de deboucing. Aceste tehnici
pot fi implementate software sau hardware. În situația în care tehnicile sunt implementate hardware
procedeul se numește filtrare. Cea mai simplă soluție de filtrare a vibrațiilor contactelor este dată
de punerea unui condensator în paralel cu contactul (Fig.3.2).

Fig.3.2. Scheme electronică de filtrare a vibrațiilor contactului

3.1.2. Utilizarea dispozitivelor binare de ieșire 
Ieșirile binare sunt folosite de dispozitivele care pot avea doar două stări. Aceste
dispozitive pot fi caracterizate printr-un singur bit, astfel încât o stare este caracterizată de 1 logic
iar a doua stare este caracterizată de 0 logic.
În această categorie se încadrează ledul, tranzistorul (utilizat ca și contact de ieșire) și toate
dispozitivele electronice care se încadrează în limita de putere pe care o poate genera
microcontrolerul prin intermediul GPIO (aproximativ 5 V și 10 mA curent continuu).
Ca și în cadrul dispozitivelor de intrare, ledurile pot funcționa în două moduri:
 logică pozitivă, când anodul ledului este conectat la GPIO, iar catodul este legat la
GND (Fig.3.3.a). Pentru aprinderea ledului se va genera pe GPIO 1 logic, iar pentru
stingerea lui se va genera 0 logic;

38
 logică negativă, când catodul ledului este conectat la GPIO, iar anodul este legat la
GND (Fig.3.3.b). Pentru aprinderea ledului se va genera pe GPIO 0 logic, iar pentru
stingerea lui se va genera 1 logic.

a) b)
Fig.3.3. Scheme de conectare a ledurilor la un GPIO a unui microcontroler: a) logică pozitivă; b) logică
negativă

În schemele din Fig.3.3 se poate observa prezența unui rezistor. Rolul acestuia este de a
limita curentul prin led, iar valoarea lui se calculează în funcție de tensiunea de alimentare a ledului
și de tipul de led folosit (culoare și curent nominal).
Conectarea tranzistorului (utilizat ca și contact de ieșire) nu poate fi realizată decât în logică
pozitivă. Semnalul electric generat de GPIO este conectat în baza (grila) tranzistorului, aceasta
fiind și principala diferență față de situația în care tranzistorul este utilizat ca și contact de intrare.
Când pe GPIO se va genera 1 logic tranzistorul va intra în conducție și consumatorul va fi
alimentat. Când pe GPIO se va genera 0 logic tranzistorul va fi blocat și consumatorul va întrerupt.
Din punct de vedere constructiv, schema este afectată de tipul consumatorului. Dacă consumatorul
este rezistiv acesta se conectează direct în circuitul tranzistorului (Fig.3.4.a). Dacă consumatorul
este inductiv acesta are nevoie de un circuit de protecție a tranzistorului format dintr-o diodă
conectată în contra-paralel cu consumatorul ca în Fig.3.4.b (cu rol de a descărca energia magnetică
înmagazinată în bobină).

a) b)
Fig.3.4. Scheme de conectare a tranzistoarelor la un GPIO a unui microcontroler: a) consumator
rezistiv; b) consumator inductiv

Deoarece tensiunea de alimentare a tranzistorului poate fi diferită de tensiune aplicată


microcontrolerului, puterea consumatorului conectat la tranzistor depinde doar de puterea sursei
de alimentare și de puterea de comutație a tranzistorului. Dacă puterea necesară consumatorului
39
este mai mare, se pot folosi circuite de amplificare a puterii. Cea mai simplă soluție este utilizarea
releelor electromagnetice (Fig.3.5).

Fig.3.5. Conectarea unui releu la pinul GPIO a unui microcontroler

În Fig.3.5 se poate observa că releul este un consumator inductiv pentru tranzistorul utilizat
pentru conectarea la GPIO.
3.1.3. Utilizarea dispozitivelor multi‐binare de ieșire 
Dispozitivele multi-binare de ieșire sunt acele dispozitive care au nevoie să recepționeze
mai mulți biți pentru a putea funcționa. Aceste dispozitive folosesc mai multe GPIO pentru a
recepționa informația binară sau codificată binar. Din această categorie fac parte mai multe
dispozitive, cele mai cunoscute fiind: afișajul șapte segmente (Seven-Segment Display), matricea
de leduri (Dot Matrix Display), afișajul LCD (LCD Display).
Pentru exemplificarea funcționării dispozitivelor multi-binare de ieșire, în continuare se va
prezenta afișajul șapte segmente (ASS)
ASS-ul este un dispozitiv electronic format din 8 leduri (inițial au fost doar 7) dintre care
7 sunt poziționate astfel încât prin aprinderea convenabilă a unor leduri, pe afișaj să se vadă
anumite cifre, al 8-lea fiind mai nou introdus și folosit pentru reprezentarea unui punct (Fig.3.6).

Fig.3.6. Structura unui afișaj șapte segmente

40
Constructiv, afișajele șapte segmente pot fi:
 în conexiune anod comun ceea ce înseamnă că cele opt leduri au anodul legat în comun
spre Vcc. Catodurile ledurilor vor fi conectate la 8 pini GPIO ai microcontrolerului.
Acest mod de utilizare se numește în logică negativă, pentru că GPIO va genera 0 logic
pentru ledul care trebuie aprins și 1 logic pentru ledul care trebuie stins;
 în conexiune catod comun ceea ce înseamnă că cele opt leduri au catodul legat în
comun spre GND. Anodurile ledurilor vor fi conectate la 8 pini GPIO ai
microcontrolerului. Acest mod de utilizare se numește în logică pozitivă, pentru că
GPIO va genera 1 logic pentru ledul care trebuie aprins și 0 logic pentru ledul care
trebuie stins.
Afișarea cifrelor se realizează prin aprinderea corespunzătoare a ledurilor conform imaginii
din Fig.3.7.

Fig.3.7. Reprezentarea cifrelor pe un afișaj șapte segmente

3.1.4. Utilizarea dispozitivelor multi‐binare de intrare/ieșire 
Dispozitivele multi-binare de intrare/ieșire sunt acele dispozitive care au nevoie să
recepționeze și să transmită mai mulți biți pentru a putea funcționa. Cele mai cunoscute
echipamente din această categorie sunt matricele de butoane sau tastaturile.
Din schema electronică a unei matrice de butoane (Fig.3.8) se observă că aceasta este
împărțită într-un număr de rânduri și un număr de coloane.

Fig.3.8. Reprezentarea cifrelor pe un afișaj șapte segmente


41
Funcționarea matricei de butoane este următoarea:
 pe coloane se transmite de la microcontroler 0 logic sau 1 logic (coloanele sunt ieșiri
digitale);
 pe rânduri se recepționează la microcontroler 0 logic sau 1 logic (rândurile sunt intrări
digitale);
 rândurile sunt trase la Vcc prin intermediul rezistorilor de pull up sau la GND prin
intermediul rezistorilor de pull down pentru a asigura ambele potențiale pentru intrări.
Dacă se folosește schema cu rezistoare de pull up, scanarea matricei se face astfel:
 coloanele vor fi puse pe rând pe 0 logic în timp ce celelalte coloane sunt pe 1 logic;
 se citesc rândurile, iar pe rândul pe care se găsește 0 logic se identifică un buton apăsat
identificat prin coloana pe care s-a transmis 0 logic și rândul pe care s-a recepționat 0
logic.

3.2. Interfațarea motoarelor de curent continuu 
Motoarele de curent continuu folosite în SI se împart în trei categorii din punct de vedere
al modului constructiv și al rolului acestora în aplicații:
 motoare de curent continuu propriu zise (DC motor);
 motoare pas cu pas (Stepper motor);
 servomotoare (Servo motor).
3.2.1. Motoare de curent continuu propriu zise (DC motor) 
Motorul de curent continuu este un motor de uz general care poate fi folosit în orice tip de
acționare electrică la care precizia de rotație nu reprezintă un factor important. Aceste motoare se
folosesc în aplicații clasice de acționări a echipamentelor putând asigura schimbarea sensului de
rotație și modificare turației de rotație.
DC motor este un motor de curent continuu clasic compus din mai multe părți (Fig.3.9):
 statorul este compus dintr-un magnet permanent;
 rotorul conține o înfășurare de cupru care poate fi alimentată în curent continuu prin
intermediul unor perii;
 două borne care fac legătura între sursa de alimentare și periile respective.
Din punct de vedere funcțional, utilizatorului unui motorul de curent continuu este interesat
puterea și cuplul acestuia, direcția de rotație și controlul turației. Astfel că:
 motorul de curent continuu se alimentează de la o sursă de curent continuu,
dimensionată conform datelor de catalog ale motorului, de unde rezultă puterea și
cuplul acestuia;
 în funcție de conectarea a bornelor + și – la cele două borne ale motorului se va stabili
direcția de rotație; dacă utilizatorul dorește să schimbe sensul de rotație al motorului
trebuie să inverseze semnalul de alimentare între cele două borne;
 turația motoarelor de curent continuu depinde de tensiunea de alimentare. Pentru
controlul turației unui motor de curent continuu este necesar un circuit de control al
valorii tensiunii de alimentare de la bornele motorului.

42
Fig.3.9. Structura constructivă a unui motor de curent continuu

Conectarea la microcontroler a unui motor continuu depinde de rolul său funcțional. Dacă
motorul de curent continuu se folosește într-o aplicație în care direcția de rotație nu trebuie
schimbată, motorul se poate conecta ca și orice consumator prin intermediul unui tranzistor
(Fig.3.10). Controlul turației motorului utilizând schema din Fig.3.10 se poate realiza cu ajutorul
semnalelor PWM.

Fig.3.10. Conectarea simplă la microcontroler a unui motor de curent continuu

În situația în care se dorește realizarea unei scheme mai complexe, care permite atât
controlul turației cât și controlul direcției de rotație a motorului, se apelează la un circuit electronic
denumit punte H (H bridge) așa cum se observă în Fig.3.11. Puntea H este formată din 4
tranzistoare care în funcție de cum sunt comandate, pot alimenta motorul:
 cu borna + a sursei la borna A a motorului și borna – a sursei la borna B a motorului
situație în care motorul se va învârti într-o direcție (de exemplu invers sensului acelor
de ceasornic);
 cu borna – a sursei la borna A a motorului și borna + a sursei la borna B a motorului
situație în care motorul se va învârti în cealaltă direcție (de exemplu în sensului acelor
de ceasornic).

Fig.3.11. Punte H pentru controlul unui motor de curent continuu


43
Ca și în cazul anterior, modificarea turației motorului de curent continuu alimentat prin
intermediul punții H se realizează comandând tranzistorii în bază cu semnal PWM.
3.2.2. Motoare pas cu pas (Stepper motor) 
Motorul pas cu pas este un motor de construcție specială care poate să se execute o rotație
completă într-un număr exact de pași. Controlul exact al numărului de pași de rotație face ca acest
motor să poată fi folosit în aplicații de poziționare, de cele mai multe ori mișcarea de rotație fiind
transformată în mișcare de translație (CNC, imprimante 3D, etc).
Motorul pas cu pas are o construcție mai specială față de motorul de curent continuu
clasic. El este format din (Fig.3.12.a):
 un rotor magnetic;
 un stator pe care se montează:
o 2 bobine perpendiculare situație în care motorul are 4 fire de alimentare
(capetele bobinelor)
o 4 bobine amplasate fix la 90° una față de cealaltă situație în care motorul are 5
fire de alimentare (4 pentru câte un capăt al bobinelor și 1 comun pentru celelate
capete ale bobinelor).

a) b)
Fig.3.12. Structura constructivă a unui motor pas cu pas: a) structura electrică; b) reductor de turație

Analizând schema constructivă din Fig.3.12.a se poate constata că un motor pas cu pas se
va rotii în 4 poziții fiecare pas reprezentând o rotație cu 90° (Fig.3.13.a) sau în 8 poziții fiecare pas
reprezentând o rotație cu 45° (Fig.3.13.b). Rotațiile depind de borna sau bornele care sunt
alimentate cu + de la sursa de alimentare. Cele 4 sau 8 poziții de rotație nu pot fi date aleatoriu.
Trecerea dintr-o poziție în cealaltă se poate realiza doar dacă se trece prin toate pozițiile
intermediare.

a) b)
Fig.3.13. Pozițiile de rotație a unui motor pas cu pas: a) rotație cu 4 pași; b) rotație cu 8 pași
44
Sensul de rotație se stabilește în funcție de ordinea în care se trece dintr-o poziție în alta.
În Fig.3.13.b s-a marcat cu linie roșie ordinea de executare a pașilor pentru ca motorul pas cu pas
să se rotească în sensul acelor de ceasornic, și cu linie albastră ordinea de executare a pașilor pentru
ca motorul pas cu pas să se rotească invers sensului acelor de ceasornic.
Controlul poziționării în aplicațiile de poziționare se poate realiza doar dacă unghiul de
rotație a rotorului motorului este cât mai mic. În acest sens, motorul pas cu pas este dotat cu un
reductor de turație de precizie (Fig.3.12.b) care poate avea diverse rapoarte de transformare. Cel
mai cunoscut raport de transformare este 1ː64 rezultând că motorul pas cu pas va face o rotație
completă în 256 pași.
Comanda motorului pas cu pas se poate realiza prin intermediul unui circuit amplificator
(Fig.3.14.a) sau cu ajutorul unui driver electronic specializat (Fig.3.14.b).

a) b)
Fig.3.14. Comanda unui motor pas cu pas: a) direct de la GPIO prin amplificatoare; b) prin intermeidul
unui driver specializat

Utilizarea unui driver specializat aduce mai multe avantaje:


 reduce numărul de pini GPIO utilizați pentru controlul motorului;
 îndeplinește și rolul de amplificator;
 scade complexitatea programului. În loc să se genereze codurile binare pentru
executarea pașilor, se va genera doar un impuls prin intermediul driverul va genera
execuția unui pas.
3.4.3. Servomotoare (Servo motor) 
Servomotorul este un motor cu construcție mai specială care poate să execute o mișcare de
rotație într-un interval dat ca și dată de catalog (de obicei 180°). Controlul exact al unghiului de
rotație face ca acest motor să poată fi utilizat în aplicații de poziționări rapide în intervalul de unghi
acceptat de servomotor. Printre cele mai cunoscute aplicații sunt: indicatoarele de bord ale
automobilelor electrice și partea de rotație a brațelor robotice.
Servomotorul are o construcție mai specială, el fiind format din (Fig.3.15):
 un motor de curent continuu;
 un reductor de turație dimensionat astfel încât pentru o rotație completă a arborelui
extern al servomotorului să fie necesar un număr cât mai ridicat de turații al motorului
de curent continuu;
 un senzor de poziție utilizat pentru determinarea precisă a poziției arborelui extern;
 un circuit de control care asigură funcționarea corectă a servomotorului.
45
Fig.3.15. Structura constructivă a unui servomotor

Servomotorul folosește trei fire electrice dintre care două sunt pentru alimentarea cu
tensiune (Vcc și GND), iar unul de comandă.
Principiul de funcționare al servomotorului este următorul:
 prin intermediul firului de comandă, servomotorul primește de la microcontroler
unghiul de poziționare. Acest lucru se realizează prin generarea de către microcontroler
a tren de impulsuri, care de obicei este un semnal PWM (Fig.3.16);
 circuitul de comandă activează alimentarea motorului de curent continuu, stabilind și
direcția în care acesta se va roti;
 circuitul de comandă va citii periodic senzorul de poziție, iar în momentul în care se
atinge poziția dorită, se oprește alimentarea motorului de curent continuu.

Fig.3.16. Comanda servomotorului prin intermediul trenului de impulsuri

Servomotorul nu necesită circuite speciale sau drivere electronice dedicate pentru


conectarea la microcontroler.

3.5. Senzorii și utilizarea lor în sisteme încorporate 
Senzorii sunt dispozitive a căror scop este de a detecta sau măsura diverse mărimi fizice și
de a transforma informația în semnale electrice care pot fi interpretate de diferite dispozitive
electronice cum ar fi microcontrolerul. Structura generală a unui senzor este prezentată în Fig.3.17.
Clasificarea senzorilor se poate face după mai multe criterii. Pentru a putea folosi senzorii
într-un sistem încorporat este necesar să se cunoască două criterii de clasificare:
 din punct de vedere al modului de detecție:

46
o senzori pasivi care pot detecta mărimea fizică fără a efectua vreo acțiune asupra
acesteia. Din punct de vedere al microcontrolerului, acești senzori sunt
interfațați ca și intrări analogice sau digitale;
o senzori activi care detectează sau măsoară o mărime fizică prin acționarea cu
un anumit tip de semnal asupra acesteia (senzor ultrasonic). Din punct de vedere
al microcontrolerului, acești senzori sunt considerați bidirecționali, adică
utilizează atât ieșiri cât și intrări;
 din punct de vedere al semnalului electric de la ieșirea senzorului aceștia pot fi:
o senzori digitali a căror semnal electric este unul digital și care pot fi împărțiți
în trei categorii:
 senzori digitali binari care se conectează la o intrare GPIO având doar
două stări. Acești senzori se utilizează pentru a determina:
 dacă o mărime fizică este mai mică sau mai mare decât un prag;
 dacă o mărime fizică a fost detectată sau nu;
 senzori digitali cu tren de impulsuri care se conectează la o intrare
GPIO, iar semnalul de intrare va fi un tren de impulsuri;
 senzori digitali cu temporizare care se conectează la o intrare GPIO,
și se contorizează timpul cât semnalul este activ;
o senzori analogici a căror semnal electric este variabil în timp și se folosește
pentru a determina valoarea unei mărimi fizice în fiecare moment de timp.

Fig.3.17. Structura generală a unui senzor

Pentru a înțelege mai bine diferența dintre senzorii analogici și cei digitali, în Fig.3.18 se
prezintă diferența dintre un semnal analogic și unul digital

Fig.3.18. Diferența dintre un semnal analogic și un semnal digital

Majoritatea mărimilor fizice pot fi monitorizate atât cu un senzor analogic cât și cu un


senzor digital binar. Pentru a înțelege mai bine diferența dintre cele două categorii de senzori
prezintă două soluții distincte de monitorizare a temperaturii:
 monitorizarea cu un senzor analogic de temperatură (termistor, senzori rezistivi) are
ca scop determinarea valorii temperaturii la anumite momente de timp;
47
 monitorizarea cu un senzor digital de temperatură (bimetalul) are ca scop determinarea
momentului în care temperatura crește sau scade peste o valoare setată (denumită
valoare de prag).
Un senzor ultrasonic este un senzor activ care face parte din categoria senzorilor digitali
cu temporizare. Principiul de funcționare a unui senzor ultrasonic este următorul (Fig.3.19):
 microcontrolerul generează un semnal prin care comandă senzorul ultrasonic să
genereze la rândul său o undă radio cu o anumită frecvență (în general 40 KHz);
 unda radio ciocnește obiectul aflat la o anumită distanță de senzor și se va reflecta spre
senzor, care la rândul lui va genera un semnal către microcontroler;
 microcontrolerul măsoară durata de timp dintre momentul generării undei radio,
respectiv momentul recepționării acesteia;
 pe baza duratei de timp și a parametrilor undei radio se poate calcula distanța de la
senzor până la obiectul detectat.

Fig.3.19. Principiu funcționare senzor ultrasonic

Deoarece senzorul ultrasonic trimite o undă radio, iar apoi recepționează întoarcerea sa,
senzorul se numește senzor activ. Deoarece microcontrolerul măsoară durata dinte momentul
trimiterii semnalului și momentul întoarcerii semnalului, senzorul se numește categoria senzor
digital cu temporizare.
Un senzor de culoare (senzor RGB) este un senzor digital cu tren de impulsuri. Principiu
de funcționare al acestuia este (Fig.3.20):
 cu ajutorul fotodiodelor și a filtrelor de culoare se identifică intensitatea unei culori;
 se convertește semnalul din curent în impuls;
 se transmite trenul de impulsuri către microcontroler, iar în funcție de frecvența
impulsului se va determina culoarea obiectului.

Fig.3.20. Principiu funcționare senzor de culoare (RGB)

În Anexa 1 se prezintă o schemă cu utilizarea diverselor categorii de senzori în diverse


domenii ale naturii pentru a crea o lume inteligentă.

48
4. Limbaje de programare utilizate în sisteme încorporate 

Programarea sistemelor încorporate se poate efectua în mai multe limbaje de programare.


Din punct de vedere al nivelului de abstractizare acestea se împart în 5 categorii denumite și
generații (Fig.4.1):
 generația 1 – limbajul cod mașină este primul limbaj de programare, un limbaj foarte
abstract greu de utilizat. Se mai numește și limbajul vorbit de ”mașină”:
 generația a 2-a – limbajul de asamblare este tot un limbaj dezvoltat din limbajul cod
mașină prin atribuirea fiecărei instrucțiuni o expresie text;
 generația a 3-a – limbaje procedurale sunt limbaje de nivel înalt, care au o structură
mai apropiată de vorbirea curentă a oamenilor;
 generația a 4-a – limbaje orientate pe obiecte se renunță la separarea datelor de
program. Obiectele conțin atât date cât și funcții;
 generația a 5-a – limbajele de modelare sunt cele mai apropiate de nivelul de
înțelegere a omului. Aceste limbaje devin tot mai folosite, programatorul nemaifiind
obligat să aibă cunoștințe avansate de microcontrolere.

Fig.4.1. Clasificarea limbajelor de programare

Limbajul cod mașină și limbajul de asamblare sunt cele două limbaje de nivel scăzut care
funcționează mai aproape de logica utilizată la nivel electronic.
Limbajul cod mașină este format doar din 0 și 1, motiv pentru care singurul limbaj de
programare care nu are nevoie de o conversie a codului pentru a fi încărcat în microcontroler.
Acesta este dependent de tipul microcontrolerului utilizat, un programator trebuind să învețe
limbajul de programare de fiecare dată când schimba microcontrolerul.
Limbajul de asamblare este un limbaj derivat din codul mașină. La fiecare instrucțiune
care poate fi scrisă în cod mașină i s-a atribuit o expresie textuala destul de abstractă, denumită
mnemonică. Codul sursă scris în limbaj de asamblare trebuie ulterior convertit în cod mașină prin
intermediul unu asamblor Fig.4.2. La fel ca limbajul cod mașină, limbajul de asamblare este
dependent de tipul de microcontroler utilizat, motiv pentru care un utilizator trebuie să cunoască
în detaliu atât arhitectura internă a microcontrolerului cât și instrucțiunile pe care le are la
49
dispoziție. Dacă se ține cont de arhitectura setului de instrucțiuni a fiecărui microcontroler se poate
spune că programatorul în limbaj de asamblare va depune un efort mai mare pentru realizarea unui
cod sursă pentru un microcontroler care folosește arhitectura RISC decât pentru realizarea unui
cod sursă pentru un microcontroler care folosește arhitectura CISC.

Fig.4.2. Exemplu de cod sursă scris în limbaj de asamblarare și convertirea în cod cod mașină

Limbajele de programare de tip C și Embedded C fac parte din grupa limbajelor


procedurale. Embedded C este derivat din C prin introducerea unor instrucțiuni și funcții care
permit manipularea ușoară a resurselor unui microcontroler. Aceste limbaje de programare trec
peste necesitatea cunoașterii în detaliu a arhitecturii interne a microcontrolerului, respectiv a
instrucțiunilor acestuia.
Atât pentru C cât și pentru Embedded C, codul sursă scris se poate scrie într-un editor de
text cum ar fi Notepad++ (Fig.4.3), după care trebuie compilat pentru a fi transformat în cod
mașină cu un compilator special creat pentru fiecare familie de microcontrolere.

Fig.4.3. Editor text pentru scrierea codului sursă în C sau Embedded C


50
În Fig.4.4 se prezintă o aplicație care conține un compilator pentru microcontrolerele din
gama familia AVR care sunt utilizate pe platformele Arduino.

Fig.4.4. Aplicație care conține compilator pentru familia de microcontrolere AVR

Ultima etapă este aceea de a descărca fișierul rezultat în urma compilării în memoria
microcontrolerului, etapă care se realizează cu un program de descărcare. De obicei programul de
descărcare utilizează protocolul ICSP (In Circuit Serial Programming) cum se observă în
Fig.4.5.

Fig.4.5. Utilizarea protocolului ICSP pentru programarea unui microcontroler

Următorul nivel în programarea unui sistem încorporat este dată de utilizarea unui Mediu
de Dezvoltare Integrat (IDE - Integrated Development Environment). IDE este o facilitate
pusă la dispoziție de producătorul microcontrolerului pentru ușurarea etapei de programare. IDE
pune la dispoziția programatorului mai multe facilități cum ar fi: editor de cod sursă, compilator,
funcție de descărcare a codului sursă, management de librării și funcții, instrumente de depanare a
codului sursă, etc. Un exemplu de IDE este cel pus la dispoziție de producător pentru programarea
platformelor Arduino (Fig.4.6).

51
Fig.4.6. Mediu de Dezvoltare Integrat (IDE) pentru Arduino

Limbajele grafice moderne sunt din ce în ce mai folosite pentru programarea


microcontrolerelor. Un limbaj de programare este din ce în ce mai utilizat este limbajul BLOCKS
(Fig.4.7). Acest limbaj de programare este creat în așa fel încât programarea să fie realizată
aproape integral cu ajutorul unui mouse cu care se poziționează diferite blocuri în diferite poziții.
Tastatura se folosește strict pentru introducerea valorilor numerice și a denumirilor variabilelor.
Acest limbaj de programare poate fi utilizat cu mare ușurință și pe un telefon mobil cu ecran tactil,
motiv pentru care limbajul are un succes ridicat în rândul tinerilor.

Fig.4.7. Exemplu de programre în Blocks

Pentru programatorii de automate programabile s-a creat LADDER pentru


microcontrolere. Ladder este un limbaj de programare grafic utilizat aproape exclusiv pentru
automatele programabile. În Fig.4.8 se prezintă o variată de adaptare a limbajului Ladder pentru
52
programarea microcontrolerelor din familia PIC. Programarea în Ladder este o programare de tip
proces, adică se verifică una sau mai multe intrări, opțional se pot executa ceva calcule, iar la final
se execută o comandă de ieșire.

Fig.4.8. Programarea microcontrolerelor în Ladder

Existența tot mai multor utilizator de LabView a condus la adaptarea acestui soft creat
pentru instrumentație virtuală să fie adaptat pentru a putea fi folosit în programarea
microcontrolerelor. Un exemplu de implementare a unei funcții în LabView și conectarea acestuia
la un microcontroler de tip Arduino Uno, poate fi observat în Fig.4.9.
În general LabView se folosește pentru dezvoltarea unor funcții complexe, iar
microcontrolerul se folosește ca și o placă de achiziții date. Modul de funcționare este următorul:
 placa cu microcontroler achiziționează semnalele analogice și digitale, le împachetează
și le trimite prin portul serial către LabView;
 în Labview se fac analizează datele, se iau decizii, se împachetează comenzile și se
trimit prin portul serial către Arduino;
 microcontrolerul trimite datele mai departe către pinii de ieșire.

53
Fig.4.9. Programarea microcontrolerelor în LabView

Organizația IEEE Spectrum a realizat un studiu pentru a determina care sunt cele mai
folosite limbaje de programare. În Fig.4.10 se prezintă rezultatele privind gradul de utilizare a
diverselor limbaje de programare pentru sisteme încorporate.

Fig.4.10. Clasamentul limbajelor de programare utilizate în sisteme încorporate

54
5. Comunitatea Arduino 

Utilizarea microcontrolerelor moderne în monitorizarea, controlul și comanda diverselor


aplicații în general, dar și a celor din domeniul energetic, a devenit o adevărată necesitate.
Dezvoltatorii de sisteme cu microcontrolere încearcă să creeze pachete cât mai compacte și mai
ușor de utilizat, astfel încât acestea să poată fi utilizate de câți mai mulți utilizatori.
La ora actuală, există o întreagă industrie a microcontrolerelor, la care participă tot mai
mulți producători de produse electronice, fiind dificil să se realizeze o prezentare completă a
tuturor tipurilor de microcontrolere existente. Mai mult, producătorii de microcontrolere au
început să adapteze producția la necesitățile clienților, realizând astfel o gamă largă de produse,
pentru aceiași structură de bază de microcontroler.
Dezvoltarea acestei industrii se datorează în primul rând evoluției tehnologice care a
permis realizarea unor microcontrolere sau platforme cu microcontrolere la prețuri scăzute. În al
doilea rând, utilizarea microcontrolerelor s-a dezvoltat pe baza unui trend de scoatere pe piață a
unor platforme cu microcontrolere foarte ușor de utilizat atât din punct de vedere hardware cât și
software. Un exemplu de sistem cu microcontrolere foarte ieftine și care asigură posibilitatea de
dezvoltare a unor aplicații fără prea multe cunoștințe de programare sunt platformele puse la
dispoziție sub brandul Arduino.
Arduino reprezintă o structură formată din cele două componente de bază a oricărui sistem
cu microcontroler: partea hardware și partea software. În primul rând, Arduino reprezintă structura
hardware formată dintr-o placă de dezvoltare care conține un microcontroler, o sursă de alimentare,
sistem de comunicații utilizabil inclusiv pentru programare, precum și o structură de mufe prin
intermediul cărora se facilitează accesul la pinii microcontrolerului. În al doilea rând, Arduino
reprezintă o structură software formată dintr-un mediu de programare dedicat, ușor de utilizat, care
pune la dispoziție o întreagă gamă de librării și drivere pentru diverse categorii de echipamente
electronice sau de acționare electrică.
Arduino reprezintă o întreagă comunitate de specialiști în domeniul programării
microcontrolerelor și începători în domeniu, toți având în comun această capacitate de a împărții
rezultatele obținute și celorlalte persoane interesate să dezvolte aplicații asemănătoare, ceea ce
conduce în mod direct la creșterea vitezei de dezvoltare a diverselor aplicații. Un începător poate
găsi cu ușurință diverse aplicații gata realizate, pe care să le testeze și eventual să le modifice în
scopul de a învăța tainele utilizării și programării microcontrolerelor. O persoană care este inițiată
în utilizarea și programarea microcontrolerelor, poate găsi diverse aplicații gata realizate,
funcționale pe care să le poată îngloba în proiectele personale, iar acest lucru conducând la
scăderea timpului de dezvoltare a unei aplicații complexe.
Tot pentru creșterea capacității de dezvoltare a persoanelor mai puțin inițiate în utilizarea
microcontrolerelor s-au creat și structuri hardware (cu diverse componente electronice sau de
acționare electrică) compatibile cu plăcile de dezvoltare Arduino, denumite Shield. Dacă un
utilizator dorește să utilizeze un modul de conectare la internet, nu trebuie să aibă cunoștințe
ridicate despre acest lucru, ci este suficient să achiziționeze un shield de Ethernet și să îl utilizeze
conform instrucțiunilor primite.

55
Un dezavantaj al acestor platforme este dat de faptul că pentru testarea funcționării unei
aplicații este nevoie de întreaga structură hardware pentru care aceasta a fost creată. În aceste
condiții, dacă un utilizator dorește să testeze dacă o aplicație poate fi utilă pentru el, trebuie să
achiziționeze echipamentele electronice necesare, să realizeze cablajul electronic (dezvoltare pe
breadbord) şi apoi să scrie codul sursă aferent.
Structurând informațiile se poate spune că comunitatea Arduino este formată din:
 Plăci de dezvoltare 8 biți: Uno, Mega , Leonard, Nano, Micro
 Plăci de dezvoltare 32 biți: ZERO, Nano 33 BLE, MKR Zero, Due
 Plăci comunicație (IoT): Nano 33 IOT, MKR Fox, MKR WiFi, MKR Wan, MKR
GSM, MKR Vidor, MKR Eth, UNO WiFi
 Plăci adaptoare (SHIELD):
o Plăci adaptoare pentru prototipare
o Plăci adaptoare cu echipamente electronice
 Programarea:
o Arduino IDE;
o Arduino Create: Web Editor, IoT Cloud
o Embedde C;
o Processing.
 Comunitate online: Forum, Project HUB, Discord
 Simulatoare: TinkerCad, Proteus, ....

5.1. Plăci de dezvoltare Arduino 
Majoritatea plăcilor de dezvoltare pe 8 biți au anumite caracteristici comune. De exemplu,
plăcile cu dimensiuni normale au aceiași structură pe partea de alimentare, comunicare și
programare.
Alimentare. Alimentarea se poate efectua atât prin cablu USB cât și prin mufa de putere.
Sursa de alimentare este selectată automat. Prin mufa jack se poate utiliza o sursă externă cu o
tensiune cuprinsă între 6 și 20 de volți. Se recomandă utilizarea unui transformator de tensiune de
7 – 12 V, cu un curent maxim de 800 mA. Dacă se folosește o sursă de tensiune cu o tensiune mai
mică de 7 V, pinul de 5V poate avea mai puțin de cinci volți și anumite comenzi pot fi transmise
eronat. Dacă se utilizează mai mult de 12V, regulator de tensiune se poate supraîncălzi și ca efect
imediat va deteriora placa.
Pinii de alimentare.
VIN – reprezintă pinul de tensiune de intrare prin intermediul căruia se poate introduce pe placă o
tensiune externă conform precizărilor de mai sus. Această tensiune va trece prin regulatorul de
tensiune de pe placa Arduino;
5V – este un pin care furnizează spre exterior o tensiune de 5V rezultată ca și ieșire de la
stabilizatorul de tensiune. Se recomandă ca tensiune de alimentare să nu treacă prin intermediul
acestui pin pentru că se poate deteriora placa;

56
3V3 – este un pin care furnizează spre exterior o tensiune de 3.3 V care este generată de
stabilizatorul de tensiune de pe placă. Curentul maxim suportat prin acest pin este de 50 mA.
GND – este pinul de legătură la masă. De obicei pe plăcuțele Arduino există mai mulți pini cu
funcție GND.
RESET – este pinul care generează o întrerupere a funcționării microcontrolerului. Această
întrerupere este urmată de o repornire a programului de la zero.
Comunicarea. Arduino poate comunica cu un calculator, altă plăcută Arduino sau alte
tipuri de microcontrolere. Din punct de vedere al comunicării cu calculatorul, în mediul de
programare există inclus un Monitor Serial prin intermediul căruia se poate comunica cu plăcuțele
Arduino. Comunicația serială este semnalizată cu ajutorul a două leduri, câte unul pentru RX și
TX, și care vor clipi când datele vor fi transmise prin conexiunea USB.
Programarea. Plăcuțele de dezvoltare Arduino se pot programa cu Arduino Software.
Comunicarea se face folosind protocolul original.
Protecție USB la supracurent. Arduino are un o siguranță fuzibilă resetabilă care
protejează USB-urile calculatoarelor. Majoritatea calculatoarelor au propria lor protecție internă.
Dacă se aplică mai mult de 500 mA pe portul USB, siguranță întrerupe automat conexiunea până
când scurtcircuitul sau supratensiunea este îndepărtată.
În continuare se vor prezenta particularitățile celor mai utilizate dintre plăcuțele de
dezvoltare Arduino.
5.1.1. Arduino UNO 
Prezentare generală. Arduino Uno este o placă cu microcontroler de tip ATmega328. Placa are
14 intrări/ieșiri digitale dintre care șase au și funcții de ieșiri PWM, 6 intrări analogice pe 10 biți,
un oscilator cu cristal de 16 MHz, o conexiune USB, un jack de putere care se poate folosi pentru
alimentare și un buton de resetare. În Fig.4.1 se prezintă o imagine a acestui model de plăcută
împreună cu rolul funcțional al fiecărui pin pe care aceasta îl conține. Aranjarea pinilor din Fig.5.1
reprezintă forma de bază care va fi respectată pentru toate plăcuțele de dezvoltare Ardunino cu
structură standard.
Memorie. Microcontrolerul utilizat de această plăcută (ATmega328) are 32 KB memorie dintre
care 0.5 KB sunt utilizați pentru bootloader. Acest microcontroler mai are: 2 KB de memorie
SRAM şi 1 KB de memorie EEPROM care poate fi utilizată cu biblioteca EEPROM.
Intrări şi ieșiri. Pini digitali ai plăcuței de dezvoltare pot fi utilizați ca intrări cu funcția
digitalRead() sau ca ieșiri cu funcția digitalWrite(). Înainte de utilizarea acestor două funcții,
direcția de transfer a datelor prin pinul respectiv trebuie setată cu instrucțiunea pinMode(). Toţi
pinii digitali funcționează la 5V și suportă un curent maxim de 40mA. Pinii digitali sunt dotați cu
un rezistor intern de tip pull-up, de 20-50 kOhms, care este deconectat în modul implicit. O parte
din pini au și alte funcții atribuite, după cum urmează:
 Serial. Pentru serial se folosesc pinii 0 (RX) și 1 (TX). Datele transmise prin
intermediul acestor pini funcționează la nivel logic TTL;

57
 Întreruperile externe sunt în număr de două şi folosesc pinii 2 și 3. Declanșarea
întreruperii se poate realiza în mai multe condiții: nivel LOW, nivel HIGH, tranziție de
la LOW la HIGH (RISING) sau tranziție inversă (FOLLING);
 PWM. Semnalul PWM se poate genera prin intermediul pinilor 3, 5, 6, 9, 10 şi 11.
Semnalul PWM este generat de o variabilă pe 8 biți utilizând funcția analogWrite();
 SPI reprezintă comunicația serială sincronă și utilizează pinii 10 (SS), 11 (MOSI), 12
(MISO), 13 (SCK). Acești pini comunică folosind biblioteca SPI.
 LED este un led conectat la pinul 13 şi care are rolul de a permite testarea diverselor
funcții.

Fig.5.1. Diagrama pinilor pentru Arduino Uno

Arduino Uno are 6 intrări analogice numerotate cu A0 până la A5 care pot fi citite cu
funcția analogRead(). Intrările analogice sunt conectate la un convertor analog-numeric pe 10 biți.
Intervalul de măsură este 0-5V dar acesta poate fi modificat prin utilizarea pinului aferent tensiunii
de referință Aref.
5.1.2. Arduino Mega 
Prezentare generală. Placa de dezvoltare Arduino Mega 2560 (Fig.5.2) este o placă de dezvoltare
bazată pe un pe un microcontroler ATmega2560. Placă de dezvoltare are un număr de 54 pini
digitali care pot fi de intrare sau ieșire. Dintre aceștia, un număr de 14 pini pot fi folosiți ca și ieșiri

58
PWM. Placa mai conține un număr de 14 intrări analogice, 4 porturi seriale hardware (UART), un
oscilator de 16 MHz, o conexiune USB, un jack de alimentare și un buton de resetare.

Fig.5.2. Diagrama pinilor pentru Arduino Mega

Memoria microcontrolerului Atmega2560 folosită pentru stocarea codului este de 256 KB. Din
aceasta o cantitate de 8 KB este rezervată pentru bootloader. Microcontrolerul conține 8 KB de
memorie SRAM și 4 KB de memorie EEPROM.
Intrări și ieșiri. Caracteristicile pinilor digitali sunt identice cu cele prezentate la Arduino Uno.
Totuși, existând mai mulți pini digitali, există și mai mulți pini cu funcții speciale, după cum
urmează:
 Serial. Pentru serial se folosesc pinii: Serial 0: 0 (RX) și 1 (TX); Serial 1: 19 (RX) şi
18 (TX); Serial 2: 17 (RX) și 16 (TX); Serial 3: 15 (RX) și 14 (TX). Datele transmise
prin intermediul acestor pini funcționează la nivel logic TTL;
 Întreruperile externe sunt în număr de șase și folosesc pinii 2 (întrerupe 0), 3 (întrerupe
1), 18 (întrerupe 5), 19 (întrerupe 4), 20 (întrerupe 3) şi 21 (întrerupe 2). Declanșarea
întreruperii se poate realiza în mai multe condiții: nivel LOW, nivel HIGH, tranziție de
la LOW la HIGH (RISING) sau tranziție inversă (FOLLING);
 PWM. Semnalul PWM se poate genera prin intermediul tuturor pinilor cuprinși între 0
și 13. Semnalul PWM este generat de o variabilă pe 8 biți utilizând funcția
analogWrite();

59
 SPI reprezintă comunicația serială sincronă şi utilizează pinii 53 (SS), 51 (Mosi), 50
(MISO), 52 (SCK). Acești pini comunică folosind biblioteca SPI.
 I2C este o comunicare serială realizată prin intermediul pinilor 20 (SDA) și 21 (SCL).
Această comunicare se realizează cu ajutorul librăriei Wire.
Arduino Mega 2560 are 16 intrări analogice numerotate cu A0 până la A5 și citite cu
funcția analogRead(). Intrările analogice sunt conectate la un convertor analog-numeric pe 10 biți.
Intervalul de măsură este 0-5V dar acesta poate fi modificat prin utilizarea pinului aferent tensiunii
de referință Aref.

5.2. Shield‐uri Arduino 
Shield-uri Arduino sunt structuri hardware special create pentru plăcuțele de dezvoltare
Arduino. Așa cum se observă în paragrafele precedente, modelele de plăcuțe de dezvoltare au
respectat în dezvoltarea lor o regulă prin intermediul cărora toate modelele care au formă standard,
folosesc structura pinilor de pe Arduino UNO. Prin urmare fiecare model de plăcută de dezvoltare
standard are un set de pini aranjați identic cu cei de la Uno, urmând ca pinii suplimentari să fie
dispuși în alte poziții. Această decizie a fost luată pentru a permite compatibilitatea acestora cu
shield-urile special create.
Un shield Arduino pornește de la o configurație standard a aranjării pinilor, urmată de
dezvoltarea diverselor aplicații electronice. Limitarea acestor shield-uri este dată chiar de numărul
redus de pini pe care aceasta le are. Realizarea unui shield pornește de la o plăcută de test, cum
este cea din Fig.5.3, care are o structură creată și pusă la dispoziție de către producătorii brandului
Arduino. Varianta prezentată în Fig.5.3 este creată pentru structura de bază a plăcuței Arduino
UNO.

Fig.5.3. Plăcuţă de test pentru realizarea shield-urilor

Shield-urile dezvoltate pentru plăcuțele Arduino au devenit o adevărată afacere. Astfel, pe


un site dedicat acestui lucru sunt înregistrate până în prezent 317 modele de shield-uri produse de
către 125 de producători. Mai există şi un număr de 525 de shield-uri pentru care s-a cerut evaluare
și adăugarea în lista oficială. Shield-urile dezvoltate pentru platformele Arduino au diverse roluri
funcționale, așa cum se prezintă în continuare.
Un rol funcțional este cel de comunicație. În această categorie se include shield-urile de
Ethernet și WiFi (Fig.5.4) utilizat pentru a asigura legătura cablată sau wireless cu rețelele ethernet

60
sau cu internetul. Există și alte categorii de shielduri de comunicații cum ar fi: Bluetooth, Infraroșu,
RS485, GSM, GPS etc.

a) b)
Fig.5.4. Shield-uri de comunicare: a) Ethernet; b) WiFi

Există shild-uri cu rol de interfață om-mașină. Din această categorie fac parte: afișaj
alfanumeric sau grafic (Fig.5.5), butoane de comandă sau matrice de butoane, tastaturi capacitive
de tip Touch, leduri normale sau RGB, matrice de leduri, etc.

a) b)
Fig.5.5. Shield-uri HMI: a) afişaj LCD; b) afişaj grafic

Datalogging este o altă categorie de shield-uri. Acestea sunt plăcuțe care au carduri de
memorie și diverse funcționalități cum ar fi senzori de temperatură sau sisteme GPS.
Shild-urile de comandă sunt acele categorii de shield-uri care conțin elemente care
amplifică sau adaptează semnalul de comandă pentru a se pune în funcțiune echipamente care au
diverse principii de funcționare sau care funcționează la diverse nivele de tensiune. Dintre
elementele amplificare sau adaptare semnale se enumeră: relee, tranzistoare bipolare sau MOS-
FET, circuite integrate cu funcții speciale de conducere a diverselor categorii de motoare. Spre
exemplificare, în Fig.5.6 se prezintă un shield cu driver de motor de curent continuu și un shield
care poate comanda trei motoare pas cu pas.

61
a) b)
Fig.5.6. Shield-uri comandă: a) comandă motor curent continuu; b) comandă motor pas cu pas

5.3. Software Arduino 
Software-ul Arduino a fost creat special pentru a asigura o dezvoltare rapidă și sigură a
aplicațiilor bazate pe plăcuțele de dezvoltare Arduino. Acest software a fost dezvoltat odată cu
platforma electronică în Italia în anul 2005. Scopul principal al acestui software a fost acela de a
permite utilizatorilor mai puțin experimentați să dezvolte aplicații simple fără a fi necesar să aibă
cunoștințe avansate de programare și electronică. În același timp un scop secundar a fost acela de
a putea fi pus la dispoziția utilizatorilor fără taxă de utilizare.
Prima versiune a acestui soft a fost finalizată și notată ca și versiunea 1.0 în anul 2010. Din
acel an, au fost dezvoltate noi structuri hardware care au condus implicit la evoluția
funcționalităților pe care le are mediul de programare.
Software Arduino este disponibil pentru cele mai importante sisteme de operare actuale
(Windows, Mac OS X, Linux). El este dezvoltat în structură open-source, versiunea compilată dar
și sursele fiind disponibile gratuit pe pagina web a dezvoltatorului. Mai mult, mediul de dezvoltare
este însoțit de sumedenie de exemple care permite utilizatorilor să-și dezvolte în primul rând
cunoștințele de electronică, iar ulterior să dezvolte aplicații într-un timp cât mai scurt.
Interfața mediului de dezvoltare software este foarte simplă (poate fi văzută în Fig.4.6).
Aceasta este împărțită în patru zone, astfel: zona de meniuri, zona de pictograme pentru comenzi
rapide, zona de editare a programului și zona de mesaje a procesului de compilare și transfer.

62
ANEXA 1. Senzori inteligenți pentru o lume inteligentă 

63

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