Programarea microcontrollerelor

Ce este un microcontroller?


Un microcontroller este un tip de circuit care integrează un microprocesor şi alte dispozitive periferice într-un singur chip punandu-se accent pe un cost redus de producţie şi consum redus de energie electrică. Principala diferenţă dintre un microcontroller (µC) şi un microprocesor (µP) o constituie faptul că un µC integrează memoria de program, memoria de date şi alte interfeţe de intrare-ieşire sau periferice.
Din cauza integrării unui număr mare de periferice şi a costului redus de producţie, un µC operează la frecvenţe reduse, în general la zeci sau sute de MHz. Cu toate acestea, microcontrollerele se pretează la o gamă variată de aplicaţii fiind folosite atât în mediul industrial cât şi în produse de larg consum, de la sisteme din industria aerospaţială până la telefoane mobile, cuptoare cu microunde şi jucării. Spre deosebire de µP microcontroller-ul execută un program încărcat pe acesta şi dedicat unei singure funcţionalităţi.
Majoritatea µC nu au un bus extern de adrese sau date deoarece toate memoriile de date sunt interne, ducând la integrarea acestora în capsule cu un număr mic de pini şi reduse ca dimensiuni, ceea ce reduce costurile de producţie.




Cele mai întâlnite structuri din circuitul integrat al unui µC sunt următoarele:
  • Unitatea centrală de procesare (µP core) cu o arhitectură care poate fi pe 8, 16, 32 sau 64 de biţi.
  • Memorie de date volatilă (RAM) sau nevolatilă pentru date sau program (Flash sau EEPROM)
  • Porturi digitale de intrare-ieşire
  • Interfeţe seriale (RS232, SPI, I2C, CAN, RS485)
  • Timere, generatoare de PWM sau watchdog
  • Convertoare analog-digitale
  • Suport pentru programare şi debugging
Unele microcontrollere au o arhitectură Harvard, cu magistrale separate de date şi instrucţiuni, permiţând astfel un acces concurent. În cazul folosirii acestei arhitecturi, instrucţiunile pot avea o lungime diferită faţa de registrele şi memoria internă. De exemplu, pentru familia AVR de la Atmel instrucţiunile au lungimea de 16 biţi iar registrele interne sunt de 8 biţi.
Costul unui µC depinde în mare măsură de numărul de periferice integrate. Cu cât numărul acestora este mai mare cu atât nivelul de integrare crește ducând la un cost de producţie mai mare. Din această cauză, arhitecturile de µC pe piaţă la ora actuală variază în limite destul de largi, de la chipuri cu doar 6 pini de I/O până la procesoare digitale de semnal (DSP) sau procesoare cu arhitecturi pe 32 de biţi cum sunt ARM, AVR32.
La momentul actual sunt câteva zeci de firme producătoare în lume ce oferă o gamă variată de µC din punct de vedere al arhitecturii, dotărilor sau vitezei de execuţie. Principalele concurente în piaţa de 8 biţi sunt companiile Atmel şi Microchip, cu familiile de µC AVR, respectiv PIC. Pt aplicaţii care necesită mai multă putere de procesare, se folosesc arhitecturi pe 16 sau 32 de biţi, acestea putând rula sisteme de operare şi aplicaţii “general-purpose”.

Microcontrollerul este un circuit integrat ce conține un procesor, memorie program, memorie de date și periferice. Un microcontroller execută un program din memoria ROM astfel : programul este stocat în memorie iar unitatea aritmetico-logică(ALU) citește o instrucțiune din memorie, decodează instrucțiunea citită și o execută. După terminarea instrucțiunii curente, o altă instrucțiune este luată din memorie pentru a fi procesată. Acest procedeu se va execută până la finalizarea instrucțiunilor din memorie. Programul este scris într-un limbaj de programare care poate să difere de la un microcontroller la altul. După nivelul de abstractizare există mai multe categorii de limbaje care vor fi utilizate în programarea memoriei unui microcontroller :
  • limbaje de generația I : limbaje cod-mașină.
  • limbaje de generația a II-a : limbaje de asamblare.
  • limbaje de generația a III-a : limbaje de nivel înalt.
Pentru executarea unui program scris într-un limbaj oarecare, există, în principiu, două abordări: compilare sau interpretare. La compilare, compilatorul transformă programul-sursă în totalitate într-un program echivalent scris în limbaj mașină, care apoi este executat. La interpretare interpretorul ia prima instrucțiune din programul-sursă, o transformă în limbaj mașină și o execută; apoi trece la instrucțiunea două și repetă aceleași acțiuni ș.a.m.d.

Limbajul cod-mașină

Limbajul cod mașină este un sistem de instrucțiuni și date executate direct de unitatea centrală de procesare. Acest limbaj poate fi privit că un limbaj de programare primitiv sau că cel mai mic nivel de reprezentare a unui program. Limbajul cod-mașină se bazează pe sistemul binar de enumerații și diferă de la un microprocesor la altul. Fiecare familie de procesoare are propriul set de instrucțiuni cod-mașină. Instrucțiunile sunt modele de biți, care prin reprezentarea lor fizică, corespund diferitelor comenzi ale mașinii. Setul de instrucțiuni este astfel este specific unei clase de microprocesoare care folosesc aceeași arhitectură. Modele ulterioare sau derivate ale aceleiași arhitecturi de microprocesor includ toate instrucțiunile predecesorului microcprocesor plus un set additional de instrucțiuni. Ocazional, un model ulterior apărut poate să modifice sensul instrucțiunilor de cod(în general pentru că au nevoie de o noua întrebuințare), afectând astfel compatibiliatea codului pe modele de microprocesoare derivate. Setul de instrucțiuni al unui microprocesor poate avea instrucțiuni de lungime egale sau poate avea instrucțiuni de lungime variabila.

Un limbaj de programare de nivel înalt este un limbaj cu o abstractizare puternică față de instrucțiunile unui microcontroller. În comparative cu limbajele de programare de nivel scăzut, limbajele de nivel înalt manipulează concept apropiate de limbajul natural care îl fac mai ușor de înțeles, de utilizat și oferă o portabilitate pe mai multe platforme. În anumite cazuri, o singură linie de program scrisă într-un astfel de limbaj poate echivala cu sute de linii de program scrise în cod mașină. Un alt avantaj îl reprezintă reducerea timpului necesar realizării unui program prceum și depănarea acestuia. Însă, pe măsură ce limbajul are un nivel mai înalt, execuția programului de către microcontroller va fi mai lentă. În general programarea în limbaje de nivel înalt nu este folosită în situațiile în care resursele microcontrolerului sunt limitate. Acest limbaj are nevoie de un spațiu de memorie mai mare și fișiere de cod intermediare care care duc la îngreunarea execuție programului. Cu toate acestea, datorită complexității crescânde a microcontrollerelor, a optimizării compilatoarelor pentru limbaje de nivel înalt care produc fișiere de cod comparabile în eficientă cu cele scrise în limbaje de nivel scăzut, limbajele de nivel înalt oferă rezultate mai bine decât restul limbajelor în anumite situațiiLimbajul C, deși este un limbaj de nivel înalt, păstrează contactul cu partea hardware a unui microcontroller. Printre facilitățile pe care le oferă limbajul C putem enumera : facilitate pentru manipularea biților, a câmpurilor de biți, manipularea funcțiilor cu pointeri la funcții precum și adresarea directă a memorie.