CURSUL 01

Introducere în Sistemele cu Microcontrolere

Durată: 117 min de predare Nivel: licență, anul II - fără cerințe prealabile din acest curs Disciplină: Microcontrollere și Microprocesoare Laborator asociat: Laboratorul 01 PDF: descarcă suportul EN English version

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

Ce se presupune cunoscut

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

DomeniuCe 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
Automobilzeci 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 electrocasniceciteș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țiamă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ă
Concluzia care organizează tot restul cărții Microcontrolerul nu e interesant prin puterea lui de calcul, care e modestă, ci prin faptul că e singura componentă care leagă lumea fizică (tensiuni, curenți, timpi, mișcări) de lumea logică a unui program.

3Ce este un microcontroler10 min

Microcontroler
Un microcircuit care încorporează, în aceeași capsulă și pe același cip de siliciu, o unitate centrală de prelucrare, memorie și un set de resurse care îi permit să interacționeze direct cu mediul exterior. Cuvântul cheie e „încorporează": nu e un procesor căruia i se adaugă memorie și periferice, ci un circuit care le conține deja pe toate.

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:

  1. 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.
  2. 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.
  3. Sistem de întreruperi - fără el, microcontrolerul ar fi obligat să interogheze permanent toate sursele de evenimente, consumând tot timpul procesorului.
  4. Linii de intrare și ieșire numerice, grupate în porturi paralele.
  5. 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.

CriteriuMicroprocesorMicrocontrolerSistem pe cip
Memorieexternă, extensibilăinternă, fixată la fabricațiecontroler intern, DRAM externă
Perifericecircuite separatepe același siliciupe același siliciu, dar complexe
Programîncărcat de pe disc, se schimbă desfix, scris o dată în Flashsistem de operare complet
Consummarefoarte micmediu spre mare
Cost pe bucatămediu spre marefoarte micmare
Pornirelentăimediatălentă
Un microcontroler nu „pornește" ca un calculator

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

Alegeți platforma potrivită pentru fiecare scenariu

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.

Bucla unui sistem încorporat
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ă?

Sistem determinist
Un sistem e determinist dacă putem indica, pentru fiecare reacție a lui, o limită superioară a întârzierii, garantată în orice condiții.

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.

De ce lipsa cache-ului e aici un avantaj, nu un dezavantaj Un microcontroler mic are avantajul, aparent paradoxal, că e simplu: fără cache, fără predicție de salt, fără sistem de operare care să comute contexte, durata unei secvențe de instrucțiuni poate fi calculată exact, numărând ciclii de ceas din foaia de catalog.
Exercițiu rezolvat - bugetul de instrucțiuni al unei bucle de control

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.

Timp real strict vs. timp real relaxat

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.

Puterea dinamică a unui circuit CMOS
O poartă CMOS consumă energie în principal când comută (se încarcă/descarcă o capacitate parazită). Puterea dinamică e proporțională cu frecvența de comutare și cu pătratul tensiunii de alimentare.
Trei pârghii, dintre care una e mult mai eficientă Coborârea frecvenței de ceas, coborârea tensiunii de alimentare, și oprirea ceasului acolo unde nu e nevoie de el. Ultima e cea mai eficientă: un bloc al cărui ceas e oprit nu comută deloc, deci nu consumă putere dinamică - îi rămâne doar curentul de scurgere, mult mai mic. Toate regimurile de repaus ale microcontrolerelor sunt, în fond, combinații de opriri selective de ceas.

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.

Temporizatorul de gardă (watchdog)
Un numărător independent, care merge pe ceasul lui și care, dacă ajunge la capăt, generează un reset al microcontrolerului. Programul corect îl reinițializează periodic, la momente bine alese din bucla principală.
Watchdog-ul nu repară nimic, doar limitează durata unei defecțiuni

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

Curentul absorbit de un ATmega328P, pe regimuri de functionare
Economie, nu abundență Un calculator de birou se proiectează adăugând resurse până când performanța e mulțumitoare; un sistem încorporat se proiectează scoțând resurse până când sistemul abia mai reușește să își respecte termenele - pentru că fiecare resursă rămasă costă bani, curent și o posibilă defecțiune în plus.
Cât ține bateria? Bugetul de consum al unui nod încorporat

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-1972Intel lansează 4004 (4 biți) și 8008 (8 biți) - primele microprocesoare comerciale
1974-1980Trecerea la microcontroler: TI TMS1000 (1974), Intel 8048 (1976) și 8051 (1980, nuclee compatibile se mai produc și azi); apare și linia PIC
Anii 1980Se consacră microcontrolerele de 8 biți; apar integrate pe cip temporizatoarele, interfețele seriale și primele ADC-uri
Anii 1990Arhitecturi pe 16 și 32 biți; Atmel introduce AVR (proiectat pentru C eficient, 32 registre generale); se generalizează memoria Flash în locul EPROM
Anii 2000Integrare USB și periferice de comunicație complexe; apare arhitectura ARM Cortex-M, licențiată de zeci de producători
~2010Microcontrolerele pe 32 biți devin dominante în aplicații noi de complexitate medie
După 2015IoT î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
Microcontrolerele de 8 biți nu au fost înlocuite

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.

Schema-bloc a unui microcontroler
În aceeași capsulă: memorie program (Flash), memorie date (SRAM), memorie nevolatilă de date (EEPROM), nucleu CPU, periferice, porturi I/O, oscilator, circuit de alimentare/reset - toate legate printr-o magistrală internă.

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

von Neumann vs. Harvard - de ce contează aici În arhitectura von Neumann, programul și datele stau în același spațiu de adrese, pe aceeași magistrală - nucleul nu poate aduce simultan o instrucțiune și un operand. În arhitectura Harvard, memoria de program și cea de date sunt separate fizic, cu magistrale proprii, astfel încât o instrucțiune poate fi adusă în timp ce se citește/scrie un operand al instrucțiunii precedente. Majoritatea microcontrolerelor mici, inclusiv cel din acest curs, sunt Harvard, tocmai pentru un debit de o instrucțiune pe ciclu. Prețul: datele constante din memoria de program nu se citesc cu aceleași instrucțiuni ca variabilele din memoria de date.

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.

Depășirea SRAM nu se manifestă la compilare

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

Ideea centrală a întregii cărți Un periferic nu e o funcție de bibliotecă, ci un circuit real, care funcționează și atunci când procesorul face altceva. Programul nu îi cere să numere impulsuri; îi scrie într-un registru configurația dorită, iar din acel moment perifericul numără singur, pe ceasul lui, până când programul se întoarce să îi citească rezultatul sau până când perifericul însuși cere atenție printr-o întrerupere.

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.

Multiplexarea pinilor - verificați înainte de a desena cablajul

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

Drumul semnalului printr-un sistem încorporat: puneți etapele în ordine

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.

De ce tocmai acest circuit ATmega328P e suficient de simplu pentru a fi înțeles în întregime: foaia lui de catalog are câteva sute de pagini, de zece ori mai puțin decât manualul unui microcontroler modern pe 32 de biți. Nu are memorie cache, nu are unitate de gestiune a memoriei, nu are magistrale interne multiple cu arbitraj. Un student poate parcurge, într-un semestru, drumul complet de la un bit dintr-un registru până la o aplicație funcțională - iar deprinderile formate astfel se transferă aproape neschimbate la orice alt microcontroler: registrele au alte nume, dar mecanismul e același.
ResursăValoare
ArhitecturăAVR, RISC, Harvard, cuvânt de date de 8 biți
Frecvență de lucru16 MHz pe placa Arduino Uno, dată de un cristal de cuarț
Memorie de program32 KB Flash, din care o parte e ocupată de încărcător (bootloader)
Memorie de date2 KB SRAM
Memorie nevolatilă de date1 KB EEPROM
Registre generale32, de câte 8 biți, accesibile direct de ALU
Linii de intrare-ieșire23, grupate în trei porturi
Temporizatoaredouă 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 serialeuna asincronă USART, una sincronă SPI, una de tip două fire (I²C)
Alimentare5 V pe placa Arduino Uno
Cei doi kilooctet de SRAM sunt adevărata constrângere

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.

Exercițiu rezolvat - alegerea tipului de date

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

  1. Cursul 02 - arhitectura internă AVR: memorii, cele 32 de registre generale, ciclul de instrucțiune.
  2. Cursul 03 - programarea microcontrolerului: lanțul de compilare, structura unui program fără sistem de operare, cum ajunge programul din calculator în Flash.
  3. Cursul 04 - porturile de intrare-ieșire: structura electrică a unui pin, cele trei registre care îl guvernează, rezistențele de pull-up.
  4. Cursul 05 - sistemul de întreruperi: schimbă modul de gândire - de la „un singur lucru pe rând" la „evenimentele pot interveni oricând".
  5. Cursul 06 - temporizatoarele: cum se măsoară și se generează timpul fără a ocupa procesorul.
  6. Cursul 07 - convertorul analog-numeric: de la traductor la valoare numerică.
  7. Cursurile 08-09 - comunicații seriale, asincronă (USART) și sincronă (SPI, I²C).
  8. Cursul 10 - metoda de proiectare și dezvoltare a unei aplicații, cu accent pe depanare.
  9. Cursul 11 - studiu de caz complet: robotul mobil GT, unde toate perifericele lucrează împreună.
Recomandarea de studiu

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

Determinism
proprietatea unui sistem de a avea o limită superioară garantată a întârzierii, pentru orice reacție.
Arhitectură Harvard
memorie de program și de date separate fizic, cu magistrale proprii.
SRAM
memoria de date volatilă, rapidă, dar de obicei de zece-douăzeci de ori mai mică decât Flash-ul.
Watchdog
temporizator de gardă care repornește sistemul dacă nu e reinițializat periodic de programul principal.
Multiplexare de pini
același pin fizic poate îndeplini mai multe funcții, în funcție de configurația din registre.
Bootloader
încărcătorul rezident în Flash, care primește programul nou pe interfața serială.

13Întrebări de verificare7 min

  1. 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.
  2. Ce înseamnă că un sistem e determinist, și de ce absența cache-ului devine aici un avantaj?
  3. Distingeți între timp real strict și timp real relaxat, cu câte un exemplu din automobil.
  4. Deduceți din formula puterii dinamice CMOS trei metode de reducere a consumului.
  5. Explicați rolul temporizatorului de gardă și de ce reinițializarea lui dintr-o întrerupere periodică îi anulează utilitatea.
  6. Care e deosebirea dintre arhitectura von Neumann și Harvard, și ce avantaj practic aduce a doua?
  7. 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.