Documente Academic
Documente Profesional
Documente Cultură
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.
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
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.
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.
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
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).
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
Î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.
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).
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.
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
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
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.
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.
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).
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.
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.
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
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.
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.
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.
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.
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.
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
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.
a) b)
Fig.2.30. Mod de utilizare a temporizatoarelor: a) o întrziere unică; b) o întârziere periodică
34
Fig.2.32. Diagrama de funcționare a unui temporizator pentru PWM (Pulse-Width Modulation)
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).
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).
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
Î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).
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.
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.
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.
Î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).
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
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.
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.
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
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.
48
4. Limbaje de programare utilizate în sisteme încorporate
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ă
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.
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
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.
54
5. Comunitatea Arduino
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.
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.
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.
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