Un obiect pe care aproape nimeni nu îl vede, deși fiecare dintre noi îl folosește de zeci de ori pe zi: mașina de spălat, telecomanda, cheia de contact, termostatul de pe perete conțin fiecare cel puțin un calculator complet, care nu se prezintă niciodată ca atare. Acest curs deschide seria: ce este un microcontroler, prin ce se deosebește de procesorul unui calculator obișnuit, de ce un sistem încorporat se proiectează după cu totul alte criterii decât unul de birou, și de ce vom învăța toate acestea folosind un microcontroler de opt biți vechi de peste cincisprezece ani.
1Obiectul și structura cursului6 min
Un calculator de birou sau un telefon sunt recunoscute imediat drept calculatoare: au un ecran, o tastatură, un sistem de operare. În schimb, mașina de spălat din baie, telecomanda televizorului, cheia de contact a automobilului, termostatul de pe perete, cântarul din bucătărie și frâna antiblocare a mașinii conțin, fiecare, cel puțin un calculator complet, cu procesor, memorie și program - numai că acest calculator nu se prezintă niciodată ca atare. Nu are ecran propriu, nu rulează aplicații, nu poate fi reprogramat de utilizator și, în mod normal, nu este observat decât atunci când se strică.
Obiectul acesta se numește microcontroler, iar sistemele construite în jurul lui se numesc sisteme încorporate (embedded systems) - pentru că partea de calcul este încorporată într-un produs care, din punctul de vedere al cumpărătorului, nu este un calculator, ci o mașină de spălat, o bormașină sau o pompă de insulină.
Nu e nevoie de nicio experiență anterioară cu microcontrolere. Se presupun cunoscute doar noțiunile elementare de electronică digitală (nivel logic, registru, bit) și noțiunile de bază de programare în C.
Rezultate ale învățării
- Să explicați diferența dintre microprocesor, microcontroler și sistem pe cip, și consecințele ei practice asupra costului și consumului
- Să distingeți determinismul de viteză, și să explicați de ce absența cache-ului e un avantaj aici
- Să enumerați cele cinci criterii de proiectare ale unui sistem încorporat (determinism, timp de răspuns, consum, cost, fiabilitate)
- Să descrieți blocurile componente ale unui microcontroler și rolul fiecăruia
- Să argumentați alegerea tipului de date pe baza resurselor de memorie disponibile
2La ce servesc microcontrolerele10 min
De câteva decenii, aproape orice produs care se mișcă, se încălzește, măsoară ceva sau interacționează cu un om conține un microcontroler, iar comportamentul produsului - ceea ce clientul percepe drept calitatea lui - e dat în bună măsură de programul care rulează în acel microcontroler. Un reductor prost proiectat se aude; un algoritm de comandă prost proiectat se simte la fel de tare, doar că nimeni nu îl poate deschide cu șurubelnița pentru a-l vedea.
Trecem prin câteva domenii, nu pentru a face un inventar, ci pentru a observa că cerințele tehnice diferă mult de la un domeniu la altul - și că, tocmai de aceea, există sute de familii de microcontrolere în loc de una singură.
| Domeniu | Ce face microcontrolerul acolo |
|---|---|
| Robotică și mecatronică | închide bucla senzor→comandă→actuator, cu pas de eșantionare constant, cerut de regulatorul PID; face fuziunea datelor de la mai mulți senzori cu zgomot și întârzieri diferite |
| Automobil | zeci de unități electronice de comandă; comanda aprinderii trebuie livrată cu eroare de câteva grade de rotație a arborelui cotit - nu e suficient să fie rapid în medie, trebuie să fie punctual de fiecare dată |
| Electronică de consum și electrocasnice | citește tastele, aprinde afișajul, ține minte setările; a înlocuit programatorul electromecanic cu came ale mașinilor de spălat din anii 1970 |
| Controlul mediului și instrumentația | măsoară corect și acționează rar; contează stabilitatea măsurătorii pe termen lung, nu puterea de calcul; a apărut conceptul de senzor inteligent, cu calibrarea proprie inclusă |
3Ce este un microcontroler10 min
De aici vine și numele: un microprocesor procesează date care îi sunt aduse din exterior; un microcontroler controlează un proces, ceea ce presupune pini prin care măsoară și comandă. Un microcontroler căruia i-am lua perifericele nu ar mai avea niciun rost, pentru că nu ar mai avea cu ce să atingă lumea.
Resursele minime
Pentru ca un circuit să merite numele de microcontroler, trebuie să conțină un set minim de blocuri:
- Unitate centrală de prelucrare - ALU, registre de lucru, logica de decodificare a instrucțiunilor, plus un oscilator care generează ceasul, de regulă fără niciun component extern.
- Memorie locală, de două feluri - o memorie nevolatilă (Flash, azi aproape universal) pentru program, și o memorie volatilă (RAM) pentru variabile, stivă și zone de lucru.
- Sistem de întreruperi - fără el, microcontrolerul ar fi obligat să interogheze permanent toate sursele de evenimente, consumând tot timpul procesorului.
- Linii de intrare și ieșire numerice, grupate în porturi paralele.
- Temporizatoare și numărătoare programabile - singurul mod prin care un program poate măsura timpul cu precizie, fără să irosească procesorul în bucle de așteptare.
Resursele opționale
Peste acest nucleu, fiecare familie adaugă periferice care o fac potrivită pentru un anumit tip de aplicație: conversie analog-numerică, porturi seriale sincrone și asincrone, ieșiri cu modulare în durată (PWM), comparator analogic, memorie EEPROM pentru parametri de calibrare, captare/comparare pentru temporizatoare, temporizator de gardă (watchdog), și regimuri de repaus pentru reducerea consumului. Această listă nu trebuie memorată acum - e harta perifericelor pe care le vom studia, pe rând, în capitolele următoare.
4Microprocesor, microcontroler și sistem pe cip10 min
Cele trei denumiri - microprocesor, microcontroler, sistem pe cip - sunt adesea folosite una în locul alteia, dar desemnează trei moduri diferite de a împărți un sistem de calcul în circuite integrate. Distincția nu e academică: ea decide câte componente are placa, cât costă produsul, cât consumă și cât de repede răspunde.
Un microprocesor conține practic numai unitatea centrală - memoria și perifericele sunt circuite separate, legate prin magistrale care ies pe placă. Un microcontroler aduce pe același siliciu procesorul, memoria de program, memoria de date și perifericele - sistemul minim se reduce, în cazuri fericite, la circuit, un condensator de decuplare și alimentare. Un sistem pe cip (SoC) duce ideea mai departe, dar în altă direcție: integrează unul sau mai multe nuclee de mare putere, procesor grafic, controlere de memorie externă - însă nu își poartă, de regulă, memoria principală în interior, ci folosește DRAM extern, și rulează aproape întotdeauna un sistem de operare complet.
| Criteriu | Microprocesor | Microcontroler | Sistem pe cip |
|---|---|---|---|
| Memorie | externă, extensibilă | internă, fixată la fabricație | controler intern, DRAM externă |
| Periferice | circuite separate | pe același siliciu | pe același siliciu, dar complexe |
| Program | încărcat de pe disc, se schimbă des | fix, scris o dată în Flash | sistem de operare complet |
| Consum | mare | foarte mic | mediu spre mare |
| Cost pe bucată | mediu spre mare | foarte mic | mare |
| Pornire | lentă | imediată | lentă |
Din momentul în care tensiunea de alimentare a atins pragul, după o scurtă temporizare de stabilizare, nucleul începe să execute instrucțiunea de la adresa zero. Nu există sistem de operare care să se încarce, nu există dispozitiv de pornire de ales. De aceea un aparat construit în jurul unui microcontroler e gata de lucru în câteva milisecunde, iar unul construit în jurul unui SoC are nevoie de zeci de secunde.
Consecința cea mai importantă privește programul: într-un calculator de birou, programele se schimbă permanent; într-un microcontroler, programul e scris o singură dată, la fabricarea produsului, și rămâne același toată viața acestuia. De aici decurg consecințe la care revenim la tot pasul: nu există alocare dinamică a memoriei în sensul obișnuit, nu există sistem de fișiere, nu există un sistem de operare care să separe programele între ele - programul nostru e singurul stăpân al mașinii și, tocmai de aceea, e și singurul responsabil de tot ce se întâmplă.
5Determinismul și timpul de răspuns12 min
Un microcontroler nu se folosește niciodată singur - e miezul unui sistem încorporat, adică al unui ansamblu în care partea de calcul servește o funcție bine definită, fixată la proiectare, într-un produs care nu se prezintă drept calculator.
proces fizic → senzori și condiționare → microcontroler → elemente de
execuție → acțiune asupra procesului. Timpul de parcurgere a acestei bucle, de la apariția
unei modificări în proces până la efectul comenzii, e mărimea care decide dacă sistemul
funcționează sau nu.Odată desenată această buclă, devine limpede de ce criteriile după care se alege și se programează un microcontroler nu seamănă cu cele după care se alege un calculator de birou.
Determinismul
La un calculator de birou, singura întrebare e cât durează o operație în medie. Într-un sistem încorporat, întrebarea relevantă e cu totul alta: care e durata cea mai mare posibilă?
Un declanșator de airbag care răspunde de obicei în cinci milisecunde, dar uneori în cincizeci, e inutilizabil - cele patruzeci și cinci de milisecunde suplimentare se consumă în timp ce ocupantul se deplasează spre volan. Determinismul se pierde ușor din motive care par nevinovate: o funcție de bibliotecă a cărei durată depinde de valoarea datelor, o buclă de așteptare a unui periferic, o rutină de întrerupere lungă care întârzie una mai urgentă, o memorie cache care uneori conține instrucțiunea căutată și alteori nu.
Nucleul ATmega328P execută majoritatea instrucțiunilor într-un singur ciclu de ceas. La frecvența de 16 MHz a plăcii Arduino Uno, câte instrucțiuni avem la dispoziție dacă bucla de reglare a unui motor trebuie parcursă la fiecare milisecundă?
Vezi rezolvarea
O milisecundă înseamnă 16 000 000 × 0,001 = 16 000 cicli de ceas, deci aproximativ
16 000 de instrucțiuni simple.
Pare mult, dar trebuie scăzut ce se consumă în afara calculului propriu-zis: o conversie analog-numerică pe acest circuit durează în jur de 100 µs (deja o zecime din perioadă), iar transmiterea unui caracter pe interfața serială la 9600 bit/s durează aproximativ o milisecundă - adică o perioadă întreagă. Concluzia practică, la care revenim de mai multe ori în acest curs: depășirea termenului nu vine din calcule, ci din așteptarea perifericelor. De aceea vom învăța să nu așteptăm niciodată un periferic într-o buclă, ci să lucrăm cu întreruperi (Cursul 05).
Timpul de răspuns
Strâns legat de determinism, dar distinct de el: intervalul dintre apariția unui eveniment fizic și momentul în care sistemul a produs efectul cerut - se compune din întârzierea senzorului, întârzierea de detecție, durata calculului și inerția elementului de execuție.
Un sistem se numește „de timp real" nu pentru că e rapid, ci pentru că un răspuns corect livrat prea târziu e considerat greșit. În timp real strict, depășirea termenului înseamnă avarie sau accident (comanda injecției). În timp real relaxat, depășirea ocazională degradează calitatea, dar nu compromite funcția (actualizarea afișajului cu temperatura). Aceeași aplicație conține de obicei sarcini din ambele categorii, iar arta proiectării constă în a le da prioritățile potrivite.
6Consum, cost unitar și fiabilitate13 min
Consumul
Un sistem încorporat e adesea alimentat de la o baterie care trebuie să țină luni sau ani. Un senzor fără fir care raportează o temperatură din zece în zece minute petrece peste 99% din timp în repaus - energia consumată în acele momente de inactivitate, înmulțită cu durata lor, depășește cu mult energia consumată în timpul măsurării.
Costul unitar
Într-un produs fabricat în serie mare, o diferență de un leu între două circuite înseamnă un milion de lei la un milion de bucăți - sumă din care se poate plăti o echipă de proiectanți un an întreg. De aceea, în sistemele încorporate se alege în mod curent circuitul cel mai mic care face treaba, chiar dacă asta înseamnă efort de programare mai mare - exact opus față de un calculator de birou, unde se cumpără mai multă memorie decât e nevoie, ca să nu se piardă timp cu optimizări. Costul nu se reduce la prețul circuitului: un microcontroler cu mai multe periferice integrate poate fi mai scump individual, dar dacă elimină de pe placă un ADC extern și un stabilizator, costul total al produsului scade.
Fiabilitatea
Un microcontroler dintr-un contor de energie montat pe stâlp sau dintr-un implant medical nu are lângă el pe cineva care să apese un buton de repornire. Sistemul trebuie să fie capabil să își detecteze singur starea anormală și să iasă din ea.
Dacă programul s-a blocat într-o buclă infinită, reinițializarea nu mai are loc, iar sistemul repornește. Folosit greșit - reinițializat dintr-o rutină de întrerupere periodică ce merge indiferent de starea programului principal - își pierde complet rostul, pentru că va continua să fie „hrănit" și după ce programul principal a murit.
Contribuie la fiabilitate și lucruri mai simple: comportarea corectă la scăderea tensiunii de alimentare (sub prag, microcontrolerul poate executa instrucțiuni greșite și poate corupe memoria EEPROM), robustețea la perturbații electromagnetice (condensatorul de decuplare de lângă pinii de alimentare nu e o formalitate), și verificarea integrității datelor din memoria nevolatilă.
7Scurt istoric al microcontrolerelor8 min
Istoria microcontrolerului începe cu istoria microprocesorului. La sfârșitul anilor 1960, compania japoneză Busicom avea nevoie de circuite specializate pentru o nouă gamă de calculatoare de birou. Ideea care a schimbat lucrurile, atribuită lui Marcian „Ted" Hoff (inginer de origine română la Intel), a fost să nu se mai proiecteze un circuit pentru fiecare funcție, ci un singur circuit capabil să execute o secvență de instrucțiuni memorate - funcția produsului urma să fie dată de conținutul memoriei de program, nu de topologia siliciului.
| Perioadă | Ce s-a întâmplat |
|---|---|
| 1971-1972 | Intel lansează 4004 (4 biți) și 8008 (8 biți) - primele microprocesoare comerciale |
| 1974-1980 | Trecerea la microcontroler: TI TMS1000 (1974), Intel 8048 (1976) și 8051 (1980, nuclee compatibile se mai produc și azi); apare și linia PIC |
| Anii 1980 | Se consacră microcontrolerele de 8 biți; apar integrate pe cip temporizatoarele, interfețele seriale și primele ADC-uri |
| Anii 1990 | Arhitecturi pe 16 și 32 biți; Atmel introduce AVR (proiectat pentru C eficient, 32 registre generale); se generalizează memoria Flash în locul EPROM |
| Anii 2000 | Integrare USB și periferice de comunicație complexe; apare arhitectura ARM Cortex-M, licențiată de zeci de producători |
| ~2010 | Microcontrolerele pe 32 biți devin dominante în aplicații noi de complexitate medie |
| După 2015 | IoT împinge integrarea interfețelor radio (Wi-Fi, LPWAN); apar RISC-V (fără licență pentru setul de instrucțiuni) și inferența de modele reduse de învățare automată direct pe dispozitiv |
Se produc și se vând în continuare în cantități uriașe, pentru că într-o telecomandă, o periuță electrică sau un termostat, un nucleu pe 32 de biți nu aduce niciun folos, dar aduce cost și consum în plus. Evoluția a adăugat categorii noi în vârf, nu le-a șters pe cele de la bază - motivul pentru care acest curs folosește tot un microcontroler de 8 biți.
8Anatomia unui microcontroler13 min
Trecem acum de la ce face un microcontroler la cum e construit, la nivel de bloc - felul în care circuitul arată din punctul de vedere al programatorului, nu al proiectantului de siliciu.
Nucleul
Conține ALU (adunări, comparații, operații pe biți), registrele de lucru, contorul de program, indicatorul de stivă și registrul de stare (fanioane: zero, negativ, transport). Nucleele de microcontroler sunt, de regulă, de tip RISC: set de instrucțiuni mic, lungime uniformă, majoritatea executate într-un singur ciclu de ceas - alegere care înseamnă unitate de comandă mică (cost mic) și durată calculabilă exact (esențial pentru determinism).
Memoria de program și memoria de date
Memoria de program e nevolatilă (Flash, azi aproape universal) - păstrează codul și constantele. Numărul limitat de cicluri de ștergere (mii până la zeci de mii) e o proprietate fizică: fiecare celulă memorează sarcina pe o poartă flotantă izolată, iar ștergerea degradează treptat izolatorul. Nu deranjează pentru memoria de program (reprogramată de zeci-sute de ori doar în dezvoltare), dar devine o problemă reală pentru memoria de date nevolatilă, dacă programul scrie în ea prea des.
Memoria de date (SRAM) e rapidă, scrisă/citită de un număr nelimitat de ori, dar volatilă - conține variabilele globale, zona de lucru a funcțiilor și stiva. E resursa cea mai des subestimată de începători, pentru că e tipic de zece-douăzeci de ori mai mică decât memoria de program.
Stiva crește de la o extremitate a memoriei către cealaltă, în timp ce variabilele ocupă zona de la capătul opus. Când adâncimea de apel a funcțiilor crește suficient, stiva ajunge peste variabile și le suprascrie - programul continuă să ruleze, dar cu valori schimbate, iar la revenirea dintr-o funcție poate ajunge, prin adresa de revenire coruptă, oriunde în memoria de program. Simptomul tipic: un sistem care merge corect ore întregi și apoi se repornește fără motiv aparent, de obicei exact atunci când e arătat clientului. De aici regulile: fără alocare dinamică, buffere dimensionate explicit, atenție la variabilele locale mari și la apelurile în cascadă.
Multe microcontrolere au și o a treia memorie, EEPROM, nevolatilă dar scrisă cuvânt cu cuvânt, pentru date care trebuie să supraviețuiască opririi (constante de calibrare, ultima setare a utilizatorului) - mult mai lentă la scriere decât SRAM, cu număr limitat de scrieri pe celulă.
Perifericele
Consecința practică: a programa un microcontroler înseamnă, în cea mai mare parte, a scrie și a citi registre, bit cu bit, fără să atingă biții vecini:
DDRB |= (1 << PB5); /* bitul 5 al portului B devine iesire */
PORTB |= (1 << PB5); /* linia e pusa in 1 logic */
PORTB &= ~(1 << PB5); /* linia e pusa in 0 logic */
Oscilatorul, alimentarea și pinii
Frecvența oscilatorului determină direct viteza de execuție, rezoluția de măsurare a timpului și consumul. Un oscilator RC integrat nu cere componente externe și pornește repede, dar variază cu temperatura și tensiunea (câteva procente) - potrivit pentru a citi un buton, nepotrivit pentru comunicație serială asincronă. Un cristal de cuarț dă o precizie cu ordine de mărime mai bună, la prețul a două componente suplimentare - motivul pentru care placa Arduino Uno are un cristal montat pe ea.
Condensatorul de decuplare de lângă pinii de alimentare are un rost fizic: la fiecare front de ceas, mii de porți comută simultan și cer un vârf de curent pe care firele de alimentare nu îl pot livra instantaneu - condensatorul joacă rolul unui rezervor local. Fără el, tensiunea are căderi scurte la fiecare comutare, iar circuitul funcționează imprevizibil, cu erori greu de diagnosticat.
Aproape întotdeauna, același pin fizic poate fi linie numerică obișnuită, intrare ADC, ieșire de temporizator sau linie de interfață serială, în funcție de configurația din registre. Multiplexarea e consecința economiei (pinii sunt scumpi), dar are o consecință practică directă: două funcții care au nevoie de același pin nu pot fi folosite simultan, iar acest lucru trebuie verificat în tabelul de multiplexare înainte de a desena cablajul, nu după.
9Microcontrolerul acestui curs: ATmega328P și Arduino12 min
Pentru a învăța ceva concret, în această carte lucrăm cu ATmega328P, un microcontroler de 8 biți din familia AVR, montat pe placa Arduino Uno - nu pentru că ar fi cel mai performant, ci pentru că e cel mai potrivit pentru învățat.
| Resursă | Valoare |
|---|---|
| Arhitectură | AVR, RISC, Harvard, cuvânt de date de 8 biți |
| Frecvență de lucru | 16 MHz pe placa Arduino Uno, dată de un cristal de cuarț |
| Memorie de program | 32 KB Flash, din care o parte e ocupată de încărcător (bootloader) |
| Memorie de date | 2 KB SRAM |
| Memorie nevolatilă de date | 1 KB EEPROM |
| Registre generale | 32, de câte 8 biți, accesibile direct de ALU |
| Linii de intrare-ieșire | 23, grupate în trei porturi |
| Temporizatoare | două de 8 biți și unul de 16 biți, cu moduri de captare/comparare/PWM |
| Conversie analog-numerică | aproximații succesive, rezoluție de 10 biți, cu multiplexor de intrare |
| Interfețe seriale | una asincronă USART, una sincronă SPI, una de tip două fire (I²C) |
| Alimentare | 5 V pe placa Arduino Uno |
Tot ce înseamnă variabile, buffere și stivă trebuie să încapă în 2048 de octeți - de zece-douăzeci de ori mai puțin decât memoria Flash de 32 KB.
Un program trebuie să păstreze ultimele 100 de valori măsurate de la ADC, pentru o medie
alunecătoare, și programatorul le declară inițial ca float. Cât din SRAM ocupă acest
buffer, și ce se poate face?
Vezi rezolvarea
Pe această arhitectură, un float ocupă 4 octeți, deci bufferul cere
100 × 4 = 400 octeți, adică aproape 20% din cei 2048 disponibili.
ADC-ul acestui circuit are însă doar 10 biți de rezoluție, deci valorile încap într-un
uint16_t (2 octeți). Cu această schimbare, bufferul scade la 200 de octeți - iar suma
valorilor, care poate ajunge la 100 × 1023 = 102 300, se păstrează într-un
uint32_t. Se câștigă 200 de octeți și, în plus, calculul devine mai rapid, pentru că
nucleul nu are unitate de calcul în virgulă mobilă - operațiile cu float sunt realizate
prin rutine de bibliotecă, de zeci de ori mai lente decât operațiile cu întregi.
Alegerea tipului de date nu mai e o chestiune de comoditate, ci una de resurse - o temă care revine constant în acest curs.
Funcții Arduino vs. registre directe
Mediul Arduino oferă funcții simple (precum pinMode, digitalWrite),
utile pentru a verifica repede o idee - dar nu sunt magie: fiecare se traduce, în cele din urmă, în
scrieri în aceleași registre, plus un cost în timp de execuție și memorie.
/* varianta cu functii Arduino */
void setup() { pinMode(13, OUTPUT); }
void loop() {
digitalWrite(13, HIGH); delay(500);
digitalWrite(13, LOW); delay(500);
}
/* aceeasi actiune, direct pe registre */
void setup() { DDRB |= (1 << PB5); } /* pinul 13 este PB5 */
void loop() {
PORTB |= (1 << PB5); _delay_ms(500);
PORTB &= ~(1 << PB5); _delay_ms(500);
}
Varianta cu funcții e mai lizibilă pentru un începător; varianta cu registre e mai scurtă, mai rapidă și, mai important pentru noi, arată exact ce se întâmplă în circuit. În acest curs vom folosi ambele, dar explicația va porni întotdeauna de la registre, pentru că numai acolo se vede mecanismul.
10Harta cursului4 min
Restul cursului urmează o ordine care nu e întâmplătoare: fiecare capitol folosește ce s-a construit în cele dinainte, iar la capăt toate se întâlnesc într-o aplicație completă - un robot mobil (Curs 11).
- Cursul 02 - arhitectura internă AVR: memorii, cele 32 de registre generale, ciclul de instrucțiune.
- Cursul 03 - programarea microcontrolerului: lanțul de compilare, structura unui program fără sistem de operare, cum ajunge programul din calculator în Flash.
- Cursul 04 - porturile de intrare-ieșire: structura electrică a unui pin, cele trei registre care îl guvernează, rezistențele de pull-up.
- Cursul 05 - sistemul de întreruperi: schimbă modul de gândire - de la „un singur lucru pe rând" la „evenimentele pot interveni oricând".
- Cursul 06 - temporizatoarele: cum se măsoară și se generează timpul fără a ocupa procesorul.
- Cursul 07 - convertorul analog-numeric: de la traductor la valoare numerică.
- Cursurile 08-09 - comunicații seriale, asincronă (USART) și sincronă (SPI, I²C).
- Cursul 10 - metoda de proiectare și dezvoltare a unei aplicații, cu accent pe depanare.
- Cursul 11 - studiu de caz complet: robotul mobil GT, unde toate perifericele lucrează împreună.
Fiecare capitol trebuie citit cu foaia de catalog alături și cu placa pe masă. Un microcontroler nu se învață citind despre el, la fel cum nu se învață înotul citind despre apă. Explicațiile lămuresc mecanismul; certitudinea că l-ați înțeles vine abia atunci când montajul face ce ați prevăzut că va face.
11Erori frecvente5 min
- „Un microcontroler mai puternic rezolvă orice problemă de determinism." Fals - determinismul nu vine din viteză, ci din capacitatea de a calcula o limită superioară garantată. Un procesor rapid, dar cu cache și predicție de salt imprevizibile, poate fi mai puțin determinist decât unul lent și simplu. Analizați cazul cel mai nefavorabil (worst-case), nu timpul mediu de execuție.
- „Ceva ce funcționează pe placa de test va funcționa la fel în produsul final." Nu neapărat - depășirea SRAM, de exemplu, poate rămâne latentă multă vreme și apărea exact la adâncimea de apel nefavorabilă, ani mai târziu, în teren. Dimensionați explicit buffere și stivă, nu presupuneți că „a mers pe masă" e suficient.
- „Folosirea tipului float e mereu mai simplă și costă doar puțină memorie în plus."
Costul nu e doar de memorie - operațiile cu virgulă mobilă pe un nucleu fără unitate FPU
dedicată sunt realizate prin rutine de bibliotecă, de zeci de ori mai lente decât operațiile cu
întregi.
Alegeți tipul de date cel mai mic care acoperă domeniul real de valori (de
exemplu
uint16_tpentru un ADC de 10 biți).
12Rezumat și glosar5 min
Un microcontroler încorporează procesor, memorie și periferice pe același siliciu - spre deosebire de un microprocesor (memorie și periferice externe) sau un sistem pe cip (memorie principală externă, sistem de operare complet). Un sistem încorporat se proiectează după cinci criterii care nu seamănă cu cele ale unui calculator de birou: determinism (limita superioară garantată a întârzierii, nu media), timp de răspuns (cu distincția timp real strict/relaxat), consum (puterea dinamică depinde de frecvență și de pătratul tensiunii - oprirea ceasului e cea mai eficientă pârghie), cost unitar (contează la scară de milioane de bucăți), și fiabilitate (temporizatorul de gardă limitează durata unei defecțiuni, nu o repară). La nivel de bloc, un microcontroler conține nucleu (de regulă RISC, Harvard), memorie de program (Flash), memorie de date (SRAM - resursa cea mai des subestimată), memorie nevolatilă opțională (EEPROM), periferice (circuite reale, care lucrează independent de nucleu), oscilator și circuit de alimentare/reset. Cursul folosește ATmega328P pe placa Arduino Uno, ales pentru simplitatea care permite înțelegerea completă a mecanismului, transferabilă apoi la orice alt microcontroler.
13Întrebări de verificare7 min
- Explicați, pornind de la partiționarea în circuite integrate, de ce un sistem cu microprocesor are pe placă mai multe capsule decât unul cu microcontroler.
- Ce înseamnă că un sistem e determinist, și de ce absența cache-ului devine aici un avantaj?
- Distingeți între timp real strict și timp real relaxat, cu câte un exemplu din automobil.
- Deduceți din formula puterii dinamice CMOS trei metode de reducere a consumului.
- Explicați rolul temporizatorului de gardă și de ce reinițializarea lui dintr-o întrerupere periodică îi anulează utilitatea.
- Care e deosebirea dintre arhitectura von Neumann și Harvard, și ce avantaj practic aduce a doua?
- Descrieți mecanismul prin care depășirea SRAM produce un comportament aparent aleatoriu.
14Direcții de aprofundare2 min
Cursul următor transformă schema-bloc din acest capitol într-o hartă concretă de adrese: cum sunt organizate memoriile microcontrolerului AVR, ce fac cele 32 de registre generale, cum se execută o instrucțiune și cum se citesc, în foaia de catalog, informațiile de care avem nevoie.
Conceptele din acest curs - registre, biți, bootloader, structura plăcii Arduino - devin montaj real în Laboratorul 01, unde instalați mediul de dezvoltare și comandați primul LED.