Programarea microcontrolerelor se realizeaz de obicei n limbaj de asamblare sau n C (dei au aprut deja variante de programare n alte limbaje - BASIC fiind un exemplu demn de luat n considerare). Programarea n limbaj de asamblare const n instruciuni (codificate prin mnemonice scurte) i operanzi corespunztori operaiilor elementare oferite de controler. Asambloarele sunt oferite de obicei gratis de productorii controlerelor, pe cnd compilatoarele C variaz de la gratis (cnd este posibil s fie incomplete sau pline de bug-uri) pn la preuri prohibitive de mii de dolari (cu un numr modest de bug-uri). Pn n prezent nu exist medii C similare cu cele de pe PC la capitolul faciliti, dar tendina clar este o apropiere de acestea.
Monitorul (Programul monitor) Programul monitor este o aplicaie rulat de controler care comunic cu un PC de obicei prin intermediul interfeei seriale. Capabilitile unui asemenea program sunt n general reduse. Un program monitor tipic este o aplicaie DOS sau o aplicaie care ruleaz ntr-o fereastr de tip DOS. Dei caracteristicile variaz de la un program la altul, un monitor poate n general transmite mesaje text i numere ctre utilizator, folosind un port serial al microcontrolerului, care nu va mai putea fi utilizat n alte scopuri. De cele mai multe ori este posibil oprirea execuiei programului testat i inspectarea sau chiar modificarea memoriei RAM, respectiv a registrelor. Importana i rspndirea acestui instrument este n continu scdere, tinzndu-se la nlocuirea lui cu medii de programare integrate, dezvoltate sub Windows.
Mediul integrat de dezvoltare (IDE - Integrated Development Environment) Aplicaiile Windows au devenit un standard care nlocuiete vechile programe DOS asociate microcontrolerelor. Mai mult, n prezent un singur mediu integrat ofer posibilitatea: 1. asamblrii (uneori i compilrii!); 2. simulrii; 3. editrii de legturi; 4. lucrului cu biblioteci; 5. testrii (n mod debugger sau emulator); 6. generrii codului obiect fmal n format hexazecimal sau binar; 7. conectrii la programator i programrii circuitului. Pentru Microchip; mediul integrat se numete MPLAB i este gratuit, iar ultima versiune se poate descrca de la adresa Internet a firmei: www.microchip.com.
Asamblorul Asamblorul este programul care prelucreaz instruciunile scrise ntr-un limbaj simbolic pentru calculator, traducndu-le n coduri ale limbajului main. Codul scris n limbaj de asamblare este de obicei mai scurt i mai performant (ca durat de execuie) comparat cu cel elaborat n C. O serie de alte avantaje determin ns tot mai multe companii s aleag programarea n C (i n viitorul apropiat probabil n Visual C!): uurina elaborrii codului surs; reutilizarea codului prin portarea extrem de simpl pe alte platforme; standardizarea uoar; posibilitatea elaborrii i managementului unor programe laborioase i a unor structuri de date dinamice greu sau imposibil de obinut n asamblare; eliberarea uoar a memoriei RAM nefolosite pentru alte variabile. n urma asamblrii se poate genera: un cod absolut, la adresele fixe stabilite de utilizator; un cod relocabil, la care adresele sunt n principiu alocate de editorul de legturi. Dei asambloarele au o sarcin relativ simpl, nu exist un standard ANSI pentru ele, de aceea sintaxa variaz de la un asamblor la altul. n plus limbajul de asamblare este specific fiecrei familii de microcontrolere. Un asamblor puternic ofer capabiliti de macroinstruciuni imbricate (adic grup de instruciuni suprapuse) cu etichete locale, bucle imbricate de asamblare condiionat i mesaje de eroare clare i explicite. Pentru Microchip, asamblorul oferit se numete MPASMWIN, face parte din pachetul MPLAB i este gratuit.
Editorul de legturi concateneaz diversele module rezultate n urma asamblrii i aloc adrese pentru aceste module, dar i pentru variabile din memoria RAM. Editarea de legturi permite ntre altele lucrul n echip, reutilizarea codului, faciliti care se aplic n cadrul proiectelor de dimensiuni mari. Pentru Microchip, editorul de legturi se numete MPLINK, face parte din pachetul MPLAB i este gratuit.
Bibliotecarul O dat testate, diferitele subrutine asamblate/compilate pot fi colecionate" n biblioteci. Aceast funcie este ndeplinit de un program specializat, numit bibliotecar. Pentru Microchip, bibliotecarul se numete MPLIB, face parte din pachetul MPLAB i este gratuit.
Simulatorul Simulatorul este un instrument software care ctig tot mai mult teren datorit creterii performanelor i a costului sczut sau nul. Dup cum i sugereaz numele, acesta este un program care simuleaz comportarea microcontrolerului pe un PC, permind rularea pas cu pas, examinarea i/sau modificarea registrelor, a memoriei, etc. Simulatoarele performante ofer faciliti suplimentare, cum ar fi: stimulare asincron; fiiere de stimuli care permit modificri controlate pentru I/O; simulare de periferice complexe: timere, PWM, ADC, etc. simularea evenimentelor complexe: ntreruperi, WDT, etc. Cu toate c reprezint un instrument deosebit de valoros de dezvoltare i testare, simulatoarele nu pot rezolva o serie de probleme legate de comportarea n timp real a controlerului. Nici un simulator nu se apropie mcar de viteza de operare a controlerului simulat. Pentru Microchip, simulatorul se numete MPSIM, face parte din pachetul MPLAB i este gratuit. Este evident c pentru funcionare, simulatorul nu are nevoie de nici un fel de hardware.
EXEMPLU: Simulatorul Proteus Dei prea greu de crezut, realizatorii pachetului Proteus au reuit performana remarcabil de a simula funcionarea hardware a unui procesor ntr-un mediu tipic de circuite electronice. Cu o interfa grafic intuitiv (dar cu butoanele de mouse inversate) se pot simula o serie de familii de procesoare (Intel 8031 i o serie de derivate, Motorola 68000, Zilog Z80 i perifericele sale, Intel 8255, controlere din familia AVR Atmel, Motorola HC11, Microchip PIC12C508, PIC16F84A, PIC16F877 i multe altele). Sunt oferite faciliti de animaie, simulri analogice Spice, simulri digitale dar mai ales posibilitatea ncrcrii codului compilat n procesor, rularea pas cu pas, inspectarea registrelor. n anumite situaii este posibil chiar verificarea codului surs scris n limbaj de asamblare sau C. Pentru scopuri didactice i dezvoltarea de proiecte mici-medii nu exist o variant mai bun (poate mai ieftin). Generatorul de fiier executabil n final, mediul software trebuie s produc un fiier care se va ncrca n memoria program a controlerului (ntr-un EPROM extern sau intern - n memoria FLASH). Cele mai uzuale formate pentru aceste fiiere sunt Intel hexa (.nex), Motorola S19 (.s19) i binar. Exist o serie de utilitare gratuite de conversie ntre aceste formate.
B. Instrumente de dezvoltare hardware
Debugger-ul Debugger-ul este un instrument hardware asistat de un software corespunztor prin care se testeaz n anumite limite funcionarea aplicaiei dezvoltate. Debugger-ul folosete chiar microcontrolerul din aplicaie pentru rulare pas cu pas, interogare de registre, afiare de stri, etc. De cele mai multe ori facilitatea de debug este combinat cu cea de programare (care se realizeaz uzual serial pe 2-4 fire). n concluzie, cu preul a ctorva locaii folosite din memoria RAM i cteva zeci din cea ROM, a 2-4 pini folosii pentru comunicare, se poate executa un program n regim pas cu pas, se pot seta puncte de ntrerupere, se pot vizualiza i modifica registrele procesorului, etc. n acest mod se poate verifica funcionarea aplicaiei foarte aproape de situaia real i se pot corecta o serie de greeli care au scpat simulrii. Nu se pot totui depista corelaiile din timp real (comunicaia cu debugger-ul consum timp). Un debugger reprezint o alegere corect pentru o firm mic, care nu-i poate permite un emulator.
Emulatorul Un emulator este un instrument hardware asistat de un software corespunztor care permite explorarea total a controlerului i rularea pas cu pas a programului. Un emulator este un echipament extern care comunic cu PC-ul prin interfaa serial sau paralel, i este ataat prin intermediul unui dispozitiv conectat n locul microcontrolerului emulat; acest ansamblu se comport identic cu microcontrolerul emulat. Emulatorul va fi ntotdeauna un circuit n timp real (la fel de rapid ca procesorul martor) i ofer toate facilitile acestuia. Altfel spus el se conecteaz n locul microcontrolerului n sistemul pentru care se dezvolt aplicaia, permind un control total al sistemului int, n timp real, fr a folosi nimic din resursele acestuia. Emulatoarele sunt specifice fiecrei familii de controlere. Emulatoarele sunt extrem de scumpe, de la 2.000 USD la 20.000 USD. Au aprut pe pia o serie de echipamente ieftine, sub 1.000 USD, denumite comercial "emulatoare", care sunt debugger-e mai mult sau mai puin performante - acestea vor folosi o parte din resursele procesorului martor (unele locaii RAM, memorie RAM i minim dou linii I/O). Asemenea echipamente nu pot funciona n timp real i nu pot testa integral comportarea microcontrolerului emulat n circuit. Chiar un emulator "cinstit" difer ca i caracteristici electrice de controlerele emulate (cureni de intrare/ieire, temporizri), iar de cele mai multe ori nu pot opera la tensiuni i frecvene de tact reduse.
Programatorul Dup asamblarea i/sau compilarea codului surs, fiierul hexazecimal generat trebuie "introdus" n microcontroler. Acest lucru se poate realiza: 1. prin intermediul unui programator de memorii EPROM n cazul variantelor de controlere fr memorie program. Circuitul EPROM astfel programat se va introduce ntr-un soclu pe placa microsistemului. Orice reprogramare a memoriei presupune o tergere prin expunerea memoriei EPROM la radiaii ultraviolete timp de circa 30 de minute i apoi reprogramarea n programator. 2. prin intermediul unui emulator de EPROM, realizat de obicei cu ajutorul unei memorii SRAM. Emulatorul se conecteaz la soclul memoriei EPROM i se comport ca o memorie EPROM, pclind microsistemul c ar fi o memorie EPROM. Reprogramarea este extrem de rapid n acest caz, emulatorul fiind legat de obicei la un PC prin intermediul portului paralel sau mai rar serial. Din pcate un emulator de EPROM este o pies relativ costisitoare iar dezvoltarea soluiilor FLASH a fcut aceast opiune mai puin atractiv. 3. pentru variantele OTP i FLASH, utilizarea unui programator specific familiei de controlere este obligatorie, deoarece specificaiile de programare pentru fiecare tip de controlere sunt clare i publice, pe Internet se gsesc o serie de scheme de programatoare simple i uor de construit. Asemenea programatoare se conecteaz la PC cel mai adesea pe portul paralel, dar i portul serial este uneori folosit. Un microcontroler FLASH cu un programator simplu (de pe Internet) i un mediu IDE gratuit reprezint cu siguran cea mai ieftin combinaie prin intermediul creia se poate dezvolta un proiect cu microcontroler astzi.
C. Caracteristicile microcontrolerelor
Tensiunea de alimentare Dei majoritatea microcontrolerelor sunt proiectate s funcioneze la tensiunea standard de alimentare de 5 V, exist tot mai multe variante care opereaz la tensiuni reduse de 3 sau 3.3 V sau chiar n domenii de tensiune 2 - 6 V, cu meniunea c o tensiune de alimentare redus afecteaz de obicei negativ frecvena maxim de operare. Funcionarea la tensiune de alimentare redus apropiat de cea limit din catalog (furnizat de o baterie sau un condensator de back-up) poate fi uneori nsoit de erori, i de aceea utilizarea unui WDT (atent testat n aplicaie!) este o protecie necesar n acest caz.
Oscilatorul/generatorul de tact Ca orice sistem sincron, microcontrolerul dispune fie de un oscilator extern cu cuar, fie de un cristal cu cuar asociat unui oscilator intern, fie de varianta mai ieftin dar mai puin precis - utilizarea unui rezonator ceramic. Exist modele care ofer un oscilator RC intern (economisind deci 1-2 pini din capsul, aspect deosebit de important mai ales la capsulele mici de 8 pini) sau extern, dar la care frecvena de operare variaz pronunat cu tensiunea de alimentare, temperatura, abaterile tehnologice, valoarea nominal a R i C. Asemenea aplicaii sunt recomandate doar acolo unde o variaie serioas a frecvenei de operare nu deranjeaz performanele. Frecvenele de tact tipice variaz n prezent ntre 4 i 50 MHz. Spre deosebire de PC-uri, aceast frecven de operare nu ofer msura absolut a capacitii de procesare a controlerului, exprimat n MIPS (millions of instructions per second), deoarece numrul de perioade necesar executrii unei instruciuni variaz de la o familie de controlere la alta, iar unele instruciuni necesit mai multe cicluri dect altele. O exprimare realist este MIPS/MHz, care indic cte instruciuni se execut la fiecare MHz al tactului. Frecvene de tact mari implic evident att consum de putere mai ridicat ct i o emisie mai pronunate de unde electromagnetice.
Intrarea de RESET\Activarea RESET iniializeaz controlerul, acesta relund execuia ca la o nou punere sub tensiune. Majoritatea noilor microcontrolere vor porni la punerea sub tensiune cu pinul RESET conectat la alimentare (VDD), dar unele modele mai vechi necesit un circuit RC de pornire sigur. Exist microcontrolere care nu au un pin de RESET (n cazul capsulelor cu numr redus de pini), elibernd un pin suplimentar I/O. Acestea nu pot fi resetate nard n timpul funcionrii (cu excepia bineneles a tierii tensiunii de alimentare), aspect care poate fi depit prin prezena i utilizarea unui WDT (timer watchdog).
Porturi I/O (I/O Ports) Reprezint cea mai comun facilitate hardware a controlerelor. Un port este de obicei un grup de 8 linii, care pot fi utilizate individual ca intrare sau ca ieire i care este adresat ca un singur octet. Fiecare linie poate fi configurat independent ca intrare sau ieire, pot fi configurate rezistene de pull-up pe intrri i uneori pe ieiri (o rezisten de valoare ridicat conectat la tensiunea de alimentare VDD).
Este uzual pentru microcontrolerele moderne s multiplexeze mai multe funcii pentru acelai pin (nu este neobinuit s existe chiar 6 asemenea funcii asociate aceluiai pin). Pe lng funcia fundamental de intrare-ieire digital, celelalte funcii sunt legate de periferice digitale (ntreruperi, timere, USART, SPI, l2C, etc) sau analogice (ADC, Comparator, DAC, etc). n cadrul unui microcontroler pot exista pini care pot debita sau consuma un curent sporit (10-40 mA) fa de 2-5 mA la pinii obinuii. Este important de consultat foaia de catalog a microcontrolerului pentru a nu depi curentul de alimentare total maxim admis pentru microcontroler.
Protecia la scderea tensiunii de alimentare Acest modul BOD = Brown-Out Detector reseteaz controlerul dac tensiunea de alimentare a sczut sub o anumit valoare, prestabilit (i uneori programabil) i menine starea de Reset pn la revenirea tensiunii de alimentare la valoarea nominal; Se obine astfel o protecie eficient mpotriva comportrii cu erori la tensiuni reduse de alimentare (inclusiv la funcionarea defectuoas a memoriei EEPROM, acesta fiind cel mai puternic motiv pentru a utiliza aceast facilitate). Exist o serie de circuite externe cu 3 pini care efectueaz aceast funcie sau regulatoare liniare integrate care au o ieire de Reset destinat a fi conectat la pinul omonim al microcontrolerului. La microcontrolerele moderne exist i un alt modul numit LVD (Low Voltage Detector - detectarea tensiunii sczute), format dintr-un convertor digital analog, un multiplexor i un comparator. Odat activat, modulul LVD va monitoriza tensiunea la un pin, comparnd-o permanent cu o valoare programabil, stabilit prin DAC (uzual ntre 1 i 4 V). La scderea sub aceast valoare se va genera o ntrerupere sau un RESET.
WDT (Watchdog Timer) Orice microcontroler ar trebui sa aib un WDT, iar n caz c nu are poate fi folosit oricnd unul extern (de exemplu Dallas 1232). WDT este un timer special folosit pentru revenirea din situaii dificile, cum ar fi: probleme de software, ca de exemplu bucle infinite probleme de hardware care blocheaz funcionarea corect a programului. Acest timer verific c anumite poriuni din program sunt atinse ntr-un timp predeterminat. Acest timer are propriul oscilator intern cu ceas i de aceea nu este afectat n funcionare de modurile tip SLEEP n care ceasul sistem este oprit. WDT este utilizat pentru monitorizarea funcionrii corecte a sistemului: O dat ce este activat el ncepe decrementarea coninutului su, ncepnd cu o valoare programat (timp programat n registrul su de control); Dac ajunge la zero va activa intrarea de RESET a MC pentru iniializare i repornirea programului; Pentru a bloca aciunea de RESET, programul rulat trebuie s restarteze circuitul watchdog timer nainte ca acesta s ajung la zero; Este util n cazul erorilor nepermanente ale sistemului. Un controler bun ofer i facilitatea de a diferenia un RESET produs de punerea iniial sub tensiune de unul datorat unui WDT.
ntreruperile (Interrupts) Dei execuia unui program este n general liniar, anumite condiii interne sau externe controlerului pot determina execuia unei rutine de ntrerupere la ncheierea creia unitatea central i reia operaia curent de unde ea a fost ntrerupt. O ntrerupere permite controlerului s rspund rapid la evenimente fr ca aciunea de verificare a apariiei acestor evenimente s consume timp n unitatea central. O rutin de tratare a ntreruperii trebuie s fie ct mai scurt pentru a nu introduce ntrzieri n execuia codului i a mpiedica execuia altor rutine de tratare a celorlalte ntreruperi de prioritate mai sczut. De obicei sursa ntreruperii este indicat de un bit setat ntr-un registru. Rutina de tratare a ntreruperii trebuie s salveze acumulatorul i/sau locaiile de memorie asupra crora acioneaz, n caz contrar funcionarea programului principal este compromis. Stiva este utilizat de obicei pentru salvarea temporar a strii i coninutului registrelor. Multe controlere permit ntreruperi imbricate (nested interrupts) - o ntrerupere i tratarea ei putnd surveni n cadrul altei ntreruperi, ceea ce conduce la mrirea gradului de utilizare a stivei. La pornirea iniial a programului ntreruperile sunt inhibate i trebuie activate prin cod. Figura 1.11.a descrie execuia unui program fr ntreruperi. Dup ncheierea Procesului 1, este ateptat un eveniment (de exemplu apsarea unei taste). Controlerul ateapt ntr-o bucl att ct este necesar ca operatorul uman s apese un buton. n acest interval controlerul nu execut nimic altceva i nici nu poate executa altceva. La o vitez de 1 MIPS i chiar pentru un operator uman rapid, la o caden de 200 ms la apsarea tastelor, controlerul ar putea executa ntre dou apsri 200.000 instruciuni. O asemenea abordare numit polling - prin interogare, este acceptabil doar pentru aplicaiile simple i n exemplele demonstrative din aceast carte. O abordare mult mai elegant este utilizarea ntreruperilor (figura 1.11 b). n acest caz procesorul execut liniar o secven de cod pn la apariia unui eveniment care determin o ntrerupere i tratarea sa. Starea curent este salvat i respectiv restaurat la sfritul tratrii ntreruperii, astfel nct controlerul poate relua execuia programului principal din poziia n care a fost ntrerupt ca i cnd nimic nu s-ar fi petrecut.
Exist ntreruperi externe, care n cazul cel mai simplu pot fi generate de schimbarea strii unui pin i ntreruperi interne asociate diferitelor periferice. Exist ntreruperi mascabile, care pot fi inhibate sau ignorate prin program, respectiv nemascabile - care nu pot fi ignorate. Microcontrolerele pe 8 bii nu au implementat nici o ntrerupere nemascabil. Cderea tensiunii de alimentare este exemplul tipic de ntrerupere nemascabil din lumea microprocesoarelor x86, iar n cazul microcontrolerelor ea este suplinit ns de Brown-Out Detector, respectiv LVD. Pentru microcontrolerele evoluate ntreruperile sunt ierarhizate pe prioriti-o ntrerupere de prioritate mai ridicat putnd ntrerupe o tratare a unei ntreruperi mai puin prioritare. La PIC18F452 exist doar dou niveluri de prioritate (Low i High), dar la alte controlere pot exista 8 sau chiar mai multe niveluri, caz n care se folosesc vectori de ntrerupere. Timere Un timer este n cel mai simplu caz un numrtor programabil. Semnalul de tact este obinut de la oscilatorul controlerului sau poate fi un semnal aplicat unui pin. Unui timer i se poate asocia un circuit de prescalare (i uneori un circuit de postscalare) pentru a mri capacitatea de numrare. n prezent timerele sunt pe 8 sau 16 bii; numrarea poate avea loc n sens cresctor sau descresctor, dar este prestabilit pentru un tip de controler. Un timer poate genera o ntrerupere la depire (atunci cnd coninutul su devine zero). De obicei timer-ul poate fi citit i scris n timpul funcionrii, facilitate care permite generarea unor intervale de timp extrem de precise. Timer-ele moderne ofer n plus faciliti de comparare i sau captur. Prin captur (capture) se stocheaz valoarea timer-ului n momentul n care apare o tranziie activ la unul din pinii controlerului, iar opional se poate genera o ntrerupere (figura 1.12). Prin comparare (compare) se genereaz o ntrerupere cnd timer-ul ajunge la o valoare prestabilit (figura 1.12).
PWM - Modulatorul n durat Modulatorul n durat PWM (Pulse Width Modulation) produce un tren de impulsuri cu durata programabil a strii SUS i JOS, prin aceasta permindu-se modificarea factorului de umplere (duty cycle). Semnalul PWM se poate utiliza direct (de exemplu pentru comanda unei diafragme piezoelectrice sau intensitii luminoase a unui LED sau bec) sau se poate filtra i amplifica (atunci poate comanda un motor de curent continuu, un difuzor sau o alt sarcin (figura 1.14)).
Chiar la microcontrolerele de 8 bii, factorul de umplere poate avea o rezoluie bun - de exemplu de 10 bii la PIC18F452. Aceasta nseamn c un PWM urmat de un filtru RC trece-jos se poate folosi ca o alternativ ieftin i destul de precis pentru a nlocui un DAC. n cazul alimentrii la +5V, un asemenea semnal PWM filtrat poate lua orice valoare ntre 0 i 5 V cu o rezoluie de 5 / 1024 = 4.88 mV (unde 1024= 2 n , n=10 bii).