elemente+specifice+programarii+microcontrolerelor-+p1.pdf

32
1. CE TREBUIE PROGRAMĂM 1.1. Introducere Înainte de a ne apuca să scriem programe pentru aplicaţii cu microcontrolere, trebuie să avem o imagine completă a produsului în care va ajunge să fi inclus programul scris şi apoi o imagine completă a paşilor pe care trebuie să-i străbatem pentru ca proiectul să ajungă din faza de idee în aceea de aplicaţie funcţională. 1.1.1. Ce este produsul final? De regulă produsul final în care va fi inclus programul este un circuit cu microcontroler care este încorporat într-un sistem gazdă (mecanic, electric, hidraulic, etc.), aşa cum este sugerat în figura 1.1. Din acest motiv sistemele cu microcontroler mai sunt cunoscute sub denumirea generică de sisteme încorporate (embedded systems). Un exemplu intuitiv de astfel de sistem încorporat este sistemul de frânare ABS de la autovehicule. Acesta controlează procesul de frânare în aşa fel încât roţile să nu se blocheze (să nu patineze) niciodată, indiferent de cât de puternic se apasă pe pedala de frână şi de starea suprafeţei drumului. În astfel de ipostaze, circuitul (sistemul) cu microcontroler trebuie să: preia prin intrările sale informaţii de la sistemul gazdă. Informaţiile sunt furnizate de senzori și traductoare care furnizează semnale electrice despre: viteză, poziţie, forţă, presiune, temperatură, starea unor contacte (închis / deschis), etc. controleze prin ieşirile sale diferite elemente ale sistemului gazdă, precum: motoare de curent continuu, motoare pas cu pas, electrovalve, bobinele unor relee, etc, conform cu programul înscris în memoria sa.

Upload: ovidiu-righeriu

Post on 08-Nov-2015

25 views

Category:

Documents


5 download

TRANSCRIPT

  • 1. CE TREBUIE S PROGRAMM

    1.1. Introducere

    nainte de a ne apuca s scriem programe pentru aplicaii cu microcontrolere, trebuie s avem o imagine complet a produsului n care va ajunge s fi inclus programul scris i apoi o imagine complet a pailor pe care trebuie s-i strbatem pentru ca proiectul s ajung din faza de idee n aceea de aplicaie funcional.

    1.1.1. Ce este produsul final?

    De regul produsul final n care va fi inclus programul este un circuit cu microcontroler care este ncorporat ntr-un sistem gazd (mecanic, electric, hidraulic, etc.), aa cum este sugerat n figura 1.1. Din acest motiv sistemele cu microcontroler mai sunt cunoscute sub

    denumirea generic de sisteme ncorporate (embedded systems). Un exemplu intuitiv de astfel de sistem ncorporat este sistemul de frnare ABS de la autovehicule. Acesta

    controleaz procesul de frnare n aa fel nct roile s nu se blocheze (s nu patineze) niciodat, indiferent de ct de puternic se apas pe pedala de frn i de starea suprafeei drumului. n astfel de ipostaze, circuitul (sistemul) cu microcontroler trebuie s:

    preia prin intrrile sale informaii de la sistemul gazd. Informaiile sunt furnizate

    de senzori i traductoare care furnizeaz semnale electrice despre: vitez, poziie, for, presiune, temperatur, starea unor contacte (nchis / deschis), etc.

    controleze prin ieirile sale diferite elemente ale sistemului gazd, precum: motoare de curent continuu, motoare pas cu pas, electrovalve, bobinele unor relee,

    etc, conform cu programul nscris n memoria sa.

  • 2 Ioan P. MIHU

    Figura 1.1. Microcontrolerul privit n contextul sistemului controlat

    1.1.2. Etapele realizrii unei aplicaii cu microcontroler

    Foarte sintetic etapele realizrii unei aplicaii cu microcontroler, sunt cele din figura 1.2.

    Sistem cu

    microcontroler Intrri Ieiri

    Sistem controlat

  • ANSI-C pentru microcontrolere 3

    Hardware

    Software

    Idee

    /

    Comand

    - Caiet sarcini

    - Echip dezvoltare

    - Planificare dezvoltare

    - Costuri

    Programator

    Proiectare

    structur program

    Scriere program n C

    Compilare

    Specificaii software

    Fiier .hex

    Specificaii

    tehnice

    Sistem funcional

    cu

    microcontroler

    Feedback

    - Punere n funciune

    - Cerine noi

    - Scdere costuri

    Proiectare scheme

    electrice i electronice

    Proiectare cablaj

    PCB

    Realizare cablaj

    (PCB)

    Montare piese

    Alegere furnizori

    Circuit electronic

    cu

    microcontroler

    Embedded system

    funcional

    i vndut !

    TESTE

    Alegere

    microcontroler

    Figura 1.2. Etapele realizrii unei aplicaii cu microcontroler

    Ideea realizrii unei aplicaii cu microcontroler se nate fie din pasiune (n cazul studenilor) fie ca cerin a unui beneficiar. n ambele cazuri, trebuie formulate foarte clar obiectivele care urmeaz a fi realizate. n cazul n care produsul se realizeaz ca urmare a cererii unui beneficiar, obiectivele se prezint sub forma unui caiet de sarcini care va face parte integrant din contractul de realizare al produsului.

    Din acest moment coordonatorul proiectului va trebui s elaboreze o strategie n care trebuie s aib n vedere: componena echipei de realizare a proiectului, termene pentru fiecare etap, colaborri cu teri atunci cnd este cazul, evaluare soluii tehnice, alegerea furnizorilor pentru piesele electronice, etc. O alt misiune important este aceea de a extrage din caietul de sarcini transmis de beneficiar, specificaiile tehnice necesare proiectrii inginereti.

    Dezvoltarea produsului ncepe cu componenta de hardware. Este firesc s fie aa, fiindc programul trebuie s fie conceput pentru a rula pe acest circuit, deci abia dup ce se cunosc detaliile hardware importante ale plcii electronice, se poate trece la proiectarea programului.

  • 4 Ioan P. MIHU

    Prima etap a realizrii circuitului electronic este proiectarea schemei electrice i electronice. Placa va trebui s conin pe lng microcontroler i alte circuite precum: circuite alimentare, circuite de adaptare a tensiunilor de intrare la posibilitile microcontrolerului, circuite driver pentru amplificarea / adaptarea semnalelor de ieire ale microcontrolerului la necesitile elementelor comandate (motoare pas cu pas, motoare de curent continuu, etc). Dup proiectarea schemei electrice se trece la proiectare circuitului imprimat, iar apoi la popularea sa cu componente electronice.

    Tehnologia de realizarea a circuitului se alege n funcie de volumul de producie ce urmeaz a fi realizat. Astfel dac trebuie realizate produse unicat sau serii foarte mici, atunci circuitul se va realiza n tehnologii ct mai simple, inclusiv cele manuale. Dac n schimb trebuie realizate produse de serie mare i foarte mare se vor alege tehnologii automatizate, linii de fabricaie. Dac resursele companiei sunt limitate, sau experiena n realizarea unor produse complexe este redus, atunci se poate apela la companii specializate pentru realizarea circuitului electronic.

    Echipa de software trebuie s intre n scen dup ce este conturat proiectul hardware, deoarece abia acum se pot face specificaiile necesare pentru programatori: care pini ai microcontrolerului sunt intrri, care sunt ieiri, parametri mrimilor de intrare, parametri mrimilor de ieire, etc. Dup ce se proiecteaz o structur a programului, se scrie apoi programul n limbaj C i apoi se compileaz. Finalitatea muncii de programare este fiierul ce conine codul executabil. Acesta trebuie ncrcat n memoria microcontrolerului, lucru ce se realizeaz cu ajutorul unui circuit de programare, numit programator.

    Principial exist dou mari opiuni de programare: alegerea de a programa n limbaj de asamblare sau n limbaj C. Un proiect care i ia o sptmn s l programezi n C, i va lua cu siguran o lun dac vrei s-l programezi n asamblare. Orice program care n limbaj de asamblare depete 2k devine un comar. Apar att de multe variabile crora trebuie s le urmreti evoluia, att de multe efecte colaterale ale apelului fiecrei subrutine, nct este imposibil s finalizezi proiecte mari n limbaj de asamblare. n contextul realizrii de proiecte ample, decizia de a programa n C sau de a programa n limbaj de asamblare nu este greu de luat: pentru eficientizare trebuie programat n C.

    Compilatoarele de C au ns dou dezavantaje: cost i n plus genereaz cod executabil mult mai mare dect compilatoarele pentru limbaj de asamblare, de aproximativ 3 ori mai

    mare pentru aplicaii simple i aproximativ dublu pentru aplicaiile mari. De aceea programarea n limbaj de asamblare mai are un cuvnt de spus. De exemplu, o soluie de optimizare a programelor scrise n C, este folosirea unor poriuni scrise n asamblare.

    Am ajuns n alt punct n care trebuie luat o decizie i anume ce compilator vom folosi. Criteriul esenial n alegerea compilatorului rmne costul. Din nefericire, datorit arhitecturii diferite a fiecrei familii de microcontrolere PIC, exist puine compilatoare gratuite sau cu pre foarte sczut, aa cum au spre exemplu microcontrolerele ATMEL (GNU C Compiler dezvoltat pe sourceforge.net). Principalele compilatoare aflate n

    discuie sunt: Microchip, Hi_Tech i CCS. Iat n sintez cteva elemente care ne pot ajuta la luarea deciziei:

    a) Compilatoare pe 8 bii, pentru familiile PIC12/16. Compania Microchip ofer gratuit compilatorul pentru limbajul de asamblare, dar nu ofer compilatoare pentru C. Se folosesc compilatoarele unor firme partenere:

    Compilatoare free sau student version. De regul acestea limiteaz codul

    rezultat la 2K i nu permit dect folosirea primelor 2 bank-uri de memorie

  • ANSI-C pentru microcontrolere 5

    RAM. Au avantajul mare c permit dezvoltarea de aplicaii educative. Dintre acestea menionez: Hi-Tech-Lite (cu foarte puine restrngeri fa de

    versiunea profesional), Micro C, BoostC, WIZ C. Compilatoare profesionale, nu au constrngeri privind mrimea codului, ba

    dimpotriv au faciliti de optimizare a codului. Sunt cele recomandate pentru realizarea aplicaiilor comerciale mari. Dintre acestea menionez: Hi-Tech, CSS, IAR, BoostC, Micro C, WIZ C.

    b) Compilator pe 8 bii, pentru familia PIC18.

    Microchip ofer compilatorul C18, care are o versiune free (student edition).

    Hi-Tech ofer compilatorul pentru PIC18, i n versiunea Lite.

    c) Compilatoare pe 16 bii, pentru familiile PIC24/dsPIC30/ dsPIC33.

    Microchip ofer compilatorul C30, care are o versiune free (student edition).

    Hi-Tech ofer compilatorul pentru familia PIC18.

    d) Compilatoare pe 32 bii, pentru familiile PIC32.

    Microchip ofer compilatorul C32, care are o versiune free (student edition).

    Hi-Tech ofer compilatorul pentru PIC32 i n versiunea Lite.

    Compilatoarele Microchip i Hi-Tech sunt complet compatibile ANSI C, pe cnd compilatoarele CCS avnd incluse funcii ce simplific programarea anumitor pri hardware, nu sunt complet compatibile. Aceasta face ca funcii scrise pentru CCS, s nu fie portabile n proiecte ce folosesc compilatoarele C18, C30 sau Hi-Tech.

    Toate compilatoarele menionate mai sus pot fi instalate gratis, pentru o perioad limitat, perioad n care compilatorul poate fi testat. Exceptnd situaiile n care se fac alte precizri, toate detaliile pe care le vom prezenta pe parcursul acestei lucrri, se refer la compilatorul Hi-Tech Lite.

    Una dintre cele mai importante etape ale realizrii produsului o constituie cea de testare. Testarea trebuie s aib n vedere att partea de hardware ct mai ales cea de software. Exist domenii de activitate n care volumul de munc i de fonduri alocate testrii l depete cu mult pe cel dedicat proiectrii, ca de exemplu n astronomie, aviaie, etc. Specificaiile de testare trebuie s acopere toate situaiile n care produsul ar putea ajunge. Echipa de testare trebuie s dovedeasc extrem de mult imaginaie, pentru a acoperi i cele mai greu de imaginat situaii n care poate ajunge un produs. Aplicaiile n care sunt

    implicai un numr foarte mare de parametri de intrare i de ieire, necesit eforturi deosebit de mari pentru a putea acoperi toate combinaiile posibile. n aceste situaii, n multe cazuri se realizeaz echipamente de testare automat.

    Nu trebuie s minimizm interesul pentru costul produsului. n condiiile economiei de pia, una dintre cele mai apstoare cerine pe care trebuie s o aib n fa cel ce realizeaz produsul este cea legat de costul final al acestuia. Orict de bun ar fi un produs, dac nu se vinde, el nu servete la nimic din punct de vedere economic. Pe bncile colii, studentul nu trebuie s gndeasc prioritar la acest lucru, dar trebuie s fie contient de el.

    1.2. Realizarea aplicaiei n mediul MPLAB

    Fiecare firm productoare de microcontrolere pune la dispoziie sau recomand folosirea unor medii integrate de dezvoltare a aplicaiilor (Integrated Development Environment) i a

  • 6 Ioan P. MIHU

    unor compilatoare specifice. Astfel firma Microchip pune la dispoziie mediul MPLAB IDE. Acest mediu este un set de instrumente dedicate programrii microcontrolerelor de tip

    PIC i DSPIC folosite n realizarea de aplicaii de tip embedded systems. MPLAB este gratis i poate fi uor utilizat de studeni. Exist de asemenea i o bibliotec impresionant de exemple care ofer numeroase soluii pentru o mare diversitate de aplicaii. Interfaa MPLAB este cea din figura 1.3.

    Figura 1.3. Mediul de programare MPLAB

    Instalarea MPLAB se face simplu dup ce aducem fiierul de instalare de pe pagina de Internet a firmei Microchip. MPLAB ofer numeroase faciliti pentru programarea

    microcontrolerelor. Vom prezenta succint elementele i paii ce trebuie fcui pentru realizarea unui proiect prin care s reuim programarea microcontrolerului.

    1.2.1. Crearea proiectului.

    Conceptul de proiect este folosit n multe medii de programare de nivel nalt i este foarte util fiindc nglobeaz ntr-un singur fiier .mpc adresele tuturor resurselor (fiierelor), compilatorul ales, setrile compilatorului i generrii fiierelor proiectului (output). Pentru

    Breackpoint

  • ANSI-C pentru microcontrolere 7

    a crea un nou proiect cea mai simpl cale este folosirea meniului Project / Project Wizard, unde sunt indicai toi paii necesari. Un nou proiect se poate crea i astfel:

    Figura 1.4. Structura de directoare a proiectului

    a) Creai mai nti un director n care vei plasa noul proiect. Acest director va conine grupate eficient toate fiierele care vor fi implicate n proiect. Trebuie s realizm structura de fiiere din figura 1.4 dac dorim ca proiectul s fie portabil, adic directorul proiectului s poat fi mutat n oricare alt parte, sau pe alt calculator. Popularea directoarelor cu fiiere este urmtoarea:

    n directorul source se introduc fiierele surs (.c) i fiierele header (.h) aferente fiierelor .c. Dac se dorete crearea unui director pentru fiierele header aferente fiierelor surs .c, acesta trebuie s fie n directorul source!

    n directorul output ajung toate fiiere generate de compilare i de construcia proiectului Project / Build:

    fiierele .cof, .hex rezultatele finale ale compilrii. Fiierul .hex conine codul executabil, cel care va ajunge n memoria flash a

    microcontrolerului.

    fiierul .lst care conine translatarea codului surs .c n limbaj de asamblare.

    fiierul .map care conine modul n care va fi plasat codul executabil

    n directorul include se pot introduce:

    fiiere care conin definiii de configurare a biilor i porturilor microcontrolerului (exemplu: pic.h)

    fiiere cu funcii standard, numite i fiiere antet. (exemplu: stdio.h) Ambele tipuri de fiiere se gsesc n zone standard de includere ale compilatorului C (stdio.h), sau ale mediului MPLAB (pic.h). Le putem copia

    n directorul include, pentru a face programul nostru portabil, independent de

    locul n care se gsesc aceste programe pe alte calculatoare. Fiierele header (.h) aferente fiierelor surs (c.) nu se introduc aici, ci n directorul source.

    n directorul lib se introduc fiiere librrii (.lib) dac este cazul.

    n directorul lkr se introduc fiiere obiect (.obj) rezultate n urma compilrii altor resurse, dac este cazul.

  • 8 Ioan P. MIHU

    n directorul temp se pun fiiere auxiliare (documentaii, date catalog, ciorne, etc.). Acestea nu fac parte din proiect dar dac sunt plasate aici sunt rapid accesibile din fereastra proiect.mcw.

    b) Dup construirea structurii directoarelor, trebuie ntiinat mediul MPLAB unde sunt aceste directoare (trebuie setat calea de cutare a fiierelor). Acest lucru se realizeaz din fereastra Directories din meniul Project / Buit options / Project. n figura 1.5, este artat un exemplu de introducere a cii relative la directorul proiectului. Se poate introduce i calea absolut, ns doar folosind calea relativ

    proiectul va deveni portabil. Tot din aceast fereastr se alege i calea pentru directorul output, selectnd-l din Shw directories for:

    Figura 1.5. Setarea locaiilor directoarelor proiectului

    Figura 1.6. Crearea unui nou proiect

    c) Folosii apoi, fie meniul Project / New, fie iconia din bar, ca n figura 1.6.

    Numele proiectului poate fi acelai cu al directorului care l gzduiete. Este recomandat s dai nume ct mai sugestive dar care s nu fie prea lungi.

    d) Acionnd iconia Save Workspace se va genera un fiier .mcw care ine minte toate setrile: microcontrolerul selectat, biii de configurare, programatorul

    Save Workspace

  • ANSI-C pentru microcontrolere 9

    selectat, ferestrele active, programul debug ales, breackpoint, etc. n acest fel

    putem relua lucrul exact acolo unde a fost ntrerupt.

    e) Dup crearea proiectului apare fereastra Project.mcw, care ne propune includerea de fiiere n proiect (figura 1.7). Aceast fereastr este accesibil din View / project. Primul fiier pe care l vom include este fiierul surs .c care conine funcia main(). n prealabil fiierul se creeaz cu editorul MPLAB din meniul File

    / New i se salveaz n directorul proiectului. f) Includerea fiierului .c n proiect se face cu click dreapta pe Source File din

    fereastra Projec.mcwt. Din acest moment, fiierul face parte din proiect.

    Figura 1.7. Project Window - includerea de fiiere n proiect

    g) Vor fi incluse apoi n proiect i alte fiiere: header (.h), object (.obj), library (.lib) dac este cazul. n seciunea Other File se pot aduga fiierele de documentaie (.doc, .pdf, etc). Ele nu sunt incluse n proiect dar sunt utile pe durata dezvoltrii, fiind extrem de uor accesibile prin simplul click pe numele acestuia.

    1.2.2. Meniuri principale MPLAB

    Aceste meniuri reprezint faciliti care servesc la dezvoltarea proiectului. Acestea se selecteaz din meniurile afiate n bara superioar. Iat cteva dintre ele:

    a) Configure. Permite selectarea microcontrolerului care se gsete pe placa electronic, i pentru care scriu programul n fereastra Select Device, figura 1.8. Tot aici sunt indicate cu buline verzi i principalele instrumente existente pentru microcontrolerul ales. Alte detalii despre configurarea microcontrolerului

    (Configuration bits) vor fi prezentate n capitolul 13.

  • 10 Ioan P. MIHU

    Figura 1.8. Selectarea microcontrolerului

    b) Project. Cel mai important element al mediului de dezvoltare rmne compilatorul de limbaj C. Despre alegerea compilatorului, am vorbit deja. Dup ce se instaleaz, compilatorul devine un plug-in al mediului MPLAB, adic un accesoriu care-i extinde funcionalitatea. Pot fi instalate mai multe compilatoare. Pentru un proiect, va trebui selectat doar un singur compilator.

    Alegerea compilatorului dintre compilatoarele instalate se face n fereastra de dialog Project / Select Language Toolsuite, ca n figura 1.9. Lista

    compilatoarelor instalate este accesibil n Active Toolsuite. Dup alegere compilatorul devine integrat n MPLAB.

    Figura 1.9. Selectarea compilatorului

  • ANSI-C pentru microcontrolere 11

    Opiunile de compilare sunt accesibile din meniul Project / Build Option / Project. Pentru nceput este bine s pstrai opiunile implicite (defalut).

    Compilarea programului i generarea fiierelor proiectului se face din meniul Project / Build . Ci mai rapide de compilare sunt iconia Build (figura 1.10) din bara principal sau tasta F10.

    Figura 1.10. Compilarea programului.

    Rezultatul compilrii este prezentat sintetic n dou moduri:

    n fereastra View / Output, sunt prezentate n cifre volumul ocupat n memoria RAM, volumul ocupat n memoria flash de fiierul executabil.

    n fereastra View / Memory Usage Gauge este prezentat n mod grafic volumul de memorie folosit de date i de program.

    Meniul Project ofer i alte faciliti dintre care o parte vor fi prezentate n urmtoarele capitole ale acestei lucrri. Pentru detalii i pentru exploatarea resurselor oferite de MPLAB, consultai informaiile oferite n Help, sau n paginile de Internet aferente.

    c) View. Permite alegerea ferestrelor pe care le dorim vizibile. Ferestrele permit interfaa propriu-zis cu programul. Cele mai importante ferestre sunt View /

    Project i View / Output care sunt vizibile implicit. O alt fereastra important este fereastra Editor, cea n care se editeaz fiierele surs. Se deschide cu dublu click n fereastra Project.mcw, pe numele fiierului dorit. Celelalte ferestre sunt utile n procesul de depanare i de testare a programului. n ideea de a nu ncrca ecranul cu prea mult informaie, este bine s nchidem ferestrele pe care nu le utilizm.

    1.2.3. Controlul i depanarea programului

    a) Debuger. Permite selectarea modului de depanare a programului. Este o fereastr foarte mult utilizat de programatori, fiindc dezvoltarea unui proiect (programarea) presupune un volum mare de lucru pentru depanare, testare i punere la punct a programului. Din submeniul Debuger / Select Tool, se poate

    alege soluia dorit. Recomandate sunt:

    MPLAB SIM (figura 1.11). Acesta este simulatorul de baz al mediului MPLAB. El permite testarea i depanarea programului fr ca acesta s fie introdus n memoria microcontrolerului. Practic se simuleaz funcionarea microcontrolerului pe PC-ul pe care avem instalat MPLAB. Dac programul folosete i porturi de intrare atunci este posibil generarea unor semnale virtuale de intrare. Acestea se creeaz n fereastra Debuger / Stimulus;

    Project / Build compileaz fiierele surs;

    construiete proiectul.

  • 12 Ioan P. MIHU

    ICD2, ICD3, PICkit2, sunt circuite de programare i depanare n circuit.

    Aceste se conecteaz ntre PC i microcontrolerul montat (lipit) pe placa electronic. Acest mod de depanare se efectueaz n condiii reale, cnd aplicaia funcioneaz n sistemul pentru care a fost proiectat.

    Figura 1.11. Selectarea simulatorului MPLAB SIM

    Dup selectarea MPLAB SIM, n bara de meniuri apar iconiele din figura 1.12 cu care putem controla fluxul programului n regim de simulare.

    Simularea are ca scop vizualizarea evoluiei variabilelor programului, n ferestrele Watch, Disassembly Listing, File Registers, sau Program

    Memory.

    Figura 1.12. Controlul fluxului programului, n regim de simulare

    b) Breackpoints. Permite vizualizarea i managementul punctelor de oprire n program (breackpoint). Introducerea punctelor de oprire se face mai simplu cu

    dublu click n editorul fiierului surs .c, n faa liniei la care dorim s oprim rularea.

    c) Watch. Este fereastra n care sunt afiate variabilele programului. Este extrem de util n procesul de depanare (debug) a programului. Variabilele pe care dorim s le afim se selecteaz din lista de variabile a ferestrei. Putem inspecta valorile variabilelor n diferite formate (binar, decimal, hexa). Pentru a profita de aceast facilitate, trebuie:

    s fie selectat Debuger / Select Tool / MPLAB SIM;

    Run

    Ruleaz pn la primul breackpoint

    Animate

    Ruleaz lent, linie cu linie

    Breackpoints

    Vizualizarea tuturor

    punctelor de oprire

    Reset

    Oprete rularea

    linie cu

    linie

    Step

    Ruleaz linie cu linie la click stnga pe icon

  • ANSI-C pentru microcontrolere 13

    s fie folosite puncte breackpoint n codul surs. Simularea programului se va opri la linia din program la care a fost ataat breackpoint. Din acest moment, putem folosi butoanele destinate rulrii pas cu pas aflate n meniul

    din bara superioar sau tastele F7 i F8.

    d) Disassembly Listing, File Registers, Program Memory, sunt alte ferestre care permit urmrirea (spionarea) evoluiei variabilelor pe parcursul pailor din program.

    e) Output window. Aici sunt afiate informaii importante n urma procesului de

    compilare. Dac nu avem greeli n program i compilarea este reuit, atunci aici vor fi afiate informaii sintetice legate de resursele de memorie utilizate de program. Dac compilarea este nereuit, atunci aici sunt afiate informaii legate de locul i tipul greelii din program.

    1.2.4. Programarea microcontrolerului

    a) Dup compilare, programul executabil rezultat (fiierul .hex) trebuie transferat n

    memoria microcontrolerului aflat pe placa aplicaiei proiectate. Pentru aceasta trebuie selectat aparatul cu care vom face transferul. Acesta se numete programator. Selecia programatorului se face din fereastra Programmer. Dup selecie n meniul principal apar iconiele din figura 1.13.

    b) Cele mai utilizate programatoare sunt: ICD2, ICD3, PICkit 1, PICkit 2, PICkit 3,

    PICSTART Plus. c) nainte de selectarea programatorului, trebuie:

    S conectm fizic programatorul ntre PC i placa cu microcontroler. S precizm dac placa are propria surs de alimentare sau este alimentat

    doar de programator, alimentat la rndul su la +5V prin USB de la calculator.

    S fie corect conectarea la placa cu microcontroler. Selectai 'Alt tensiune' n meniul de dialog, atunci cnd microcontrolerul este alimentat la 3,3V (alta

    dect 5V), deoarece tensiunea de la plac ajunge la programator i invers.

    d) Dup programare, pentru ca aplicaia s ruleze exist dou soluii: fie se apas

    butonul 'Relese from reset', fie se deconecteaz placa de la programator. e) Programatoarele menionate permit i depanarea n circuit a programului, dup ce

    acesta a fost ncrcat n microcontroler. Pentru aceasta, se urmeaz procedura descris la 1.2.3, doar c se va selecta programatorul folosit.

    Figura 1.13. Programare n circuit.

    Read flash

    ncarc .hex din flash memory

    Verify program

    Programarea

    este OK ?

    Hold in Reset

    Oprete rularea

    Release from

    reset

    Ruleaz !

    Erase

    flash

    memory

    Write flash

    Transfer .hex n flash memory

    Reset and

    Conect

    to ICD2

    Verify

    erase flash

    memory.

  • 14 Ioan P. MIHU

    2. UN PIC DESPRE STRUCTURA MICROCONTROLERULUI

    2.1. Structura unui microcontroler

    Obiectivul declarat al acestei cri este acela de a prezenta limbajul de programare C n contextul folosirii lui pentru realizarea de sisteme ncorporate (sisteme cu microcontrolere).

    Fiindc acest capitol are un coninut hardware este firesc ca studentul, care de regul dorete s devin programator, s-i pun astfel de ntrebri:

    Chiar trebuie s cunoatem elemente de hardware, precum memorie, porturi,

    regitri, etc, ca s putem programa un microcontroler ? Nu putem programa n C un microcontroler fr s tim i cum este acesta fcut?

    Rspunsul este unul singur: nu putem programa un microcontroler fr a-i cunoate elementele eseniale ale structurii ! Este foarte important cunoaterea microcontrolerului,

    i n special a felului n care este organizat memoria sa, pentru a nelege corect modul de lucru cu variabile, cu pointeri.

    Microcontrolerele din familia PIC au o arhitectur Harward, avnd zona de date separat de zona de program, fiecare din aceste zone fiind deservite de cte o magistral. Pentru a prezenta elementele structurii, ne vom referi n continuare la microcontrolerul PIC16F877,

    a crui structur este prezentat n figura 2.1. Primul lucru pe care l remarcm este prezena a 3 zone de memorie, toate aflate n interiorul chip-ului:

    memoria RAM (RAM file register) organizat n cuvinte de cte 8 bii;

    memoria EEPROM (Data EEPROM) organizat n cuvinte de cte 8 bii;

    memoria PROGRAM (FLASH Program Memory) organizat n cuvinte de 14 bii

    Mai trebuie s mai reinem i prezena mai multor periferice printre care:

    5 porturi de intrare ieire (I/O), conectate fizic la pinii capsulei microcontrolerului;

    convertor analog - numeric (A/D);

    3 circuite de temporizare (Timer);

    port de comunicaie serial sincron.

    Toate perifericele au cte o adres fizic i pot fi accesate (citite sau scrise) de ctre unitatea central, pe durata rulrii programului nscris n FLASH Program Memory.

    Legtura dintre periferice, memoria RAM i unitatea central ALU, se face prin magistrala de date, care la PIC16F877 are 8 bii, deci proceseaz date pe 8 bii. n funcie de mrimea magistralei de date, microcontrolerele pot prelucra date pe mai muli bii astfel:

    Microcontrolere pe 8 bii familiile PIC12, PIC16, PIC18;

    Microcontrolere pe 16 bii familiile PIC24, dsPIC30, dsPIC33;

  • ANSI-C pentru microcontrolere 15

    Microcontrolere pe 32 bii familiile PIC32. Pentru a nu avea un numr mare de pini, acelai pin poate fi programat la un moment dat:

    s fie: intrare (digital sau analogic), ieire digital sau n stare de nalt impedan;

    s ndeplineasc o anume funcie: I/E, clock.

    Figura 2.1. Structura general a microcontrolerului PIC16F877

    2.2. Memoria RAM

    Memoria RAM (RAM file register) este cea n care se afl variabilele programului pe care-l vom scrie. Organizarea acestei zone de memorie (harta memoriei) este prezentat n figura 2.2. Constatm existena a dou categorii:

  • 16 Ioan P. MIHU

    Zona Regitrilor Speciali (Special Function Registers). Acetia sunt folosii de ctre unitatea central i de ctre periferice, pentru a controla activitatea hardware (electric) a microcontrolerului.

    Zona variabilelor alocate prin program. Variabilele de orice tip pe care le vom declara pe parcursul scrierii programului, vor fi plasate n zonele ncercuite

    (General purpose registers) din memoria RAM a microcontrolerului. Nu exist alte zone n care se pot afla variabile.

    Figura 2.2. Organizarea memoriei RAM, pentru PIC16F877

    Din analiza informaiilor prezentate n figura 2.2, rezult cteva concluzii legate de numrul

    i dimensiunea variabilelor pe care le vom declara: Din totalul de 512 (1FFh) octei existeni n RAM, spaiul total pe care-l putem

    aloca variabilelor alocate prin program este de 96+80+96+96 = 368 octei, restul fiind destinai regitrilor speciali. Altfel spus am putea crea un program n care s avem cel mult 368 variabile de tip char.

  • ANSI-C pentru microcontrolere 17

    n fiecare din bank-urile 2 i 3, exist cte 16 octei care pot fi accesai numai prin pointeri.

    Dac avem variabile de tip tablou, dimensiunea maxim a acestora nu poate depi dimensiunea permis a bank-ului n care o declarm. Spre exemplu am putea crea un program n care s avem patru variabile tablou, ale cror dimensiuni maxime vor putea fi:

    unsigned char x[96];

    unsigned bank1 char y[80];

    unsigned bank2 char z[96];

    unsigned bank3 char w[96];

    Atunci cnd crem un program, trebuie s gestionm cu mare atenie dimensiunea i locul n care plasm variabilele.

    Pe parcursul scrierii programului, variabilele se apeleaz numai prin numele lor

    fr a mai preciza i bank-ul i adresa la care se afl. Acest lucru este un mare avantaj fa de programele scrise n limbaj de asamblare unde trebuie s fim foarte ateni ca de fiecare dat cnd utilizm o variabil s precizm n ce bank se gsete.

    Nu scpm ns de problema accesului la variabile din bank-uri diferite atunci cnd acestea sunt apelate prin pointeri. Pentru a apela prin adres o variabil din bank0 sau bank1 avem nevoie de un singur octet, fiindc aa cum se observ din figura 2.2, aceste dou bank-uri ocup zona de la 00h, pn la FFh adic 256 locaii. n schimb, pentru a apela prin adres variabile din bank2 sau bank3, un singur octet nu ajunge. Probabil c soluia pe care o sugerai imediat este aceea ca orice variabil de tip pointer s aib rezervai doi octei. Nu s-a fcut aa, probabil din motive ce in de istoria dezvoltrii microcontrolerelor, la primele fiind suficient un octet, deoarece nu aveau dect un singur bank de RAM.

    Pentru rezolvarea problemei exist dou soluii.

    Folosirea pointerilor de tip 'const'. Acetia au alocai doi octei i pot accesa orice bank. Dezavantajul este c nu pot fi folosii dect pentru a citi variabile aflate la adresele pe care le pointeaz.

    Folosirea pointerilor de tip 'far'. Acetia pot accesa adrese din orice bank, i pot fi folosii att pentru a citi ct i pentru a scrie la adresa respectiv.

    Dac la compilarea programului apar mesaje de eroare sau de atenionare trebuie citit cu atenie documentaia de programare a microcontrolerului cu care se lucreaz.

    2.3. Memoria EEPROM

    Memoria EEPROM este cea n care se afl toate constantele programului pe care-l vom scrie. Constantele de orice tip pe care le vom declara pe parcursul scrierii programului, se

    vor afla numai n EEPROM, neexistnd alte zone n care acestea se pot afla. De aici cteva

    concluzii legate de numrul i dimensiunea constantelor pe care le vom declara.

    Memoria EEPROM a unui PIC 16F877 are dimensiunea de 256 octei. n concluzie nu putem avea mai mult de 256 constante a cte un octet.

    Memoria EEPROM este nevolatil. Valorile nscrise n ea nu se terg la ntreruperea tensiunii, la resetarea sau la reprogramarea microcontrolerului.

  • 18 Ioan P. MIHU

    Aa cum am mai precizat, gestiunea variabilelor alocate prin program i care se gsesc n memoria RAM, este foarte uoar: att pentru citire ct i pentru scriere, variabilele se

    apeleaz numai prin numele lor fr a mai preciza i adresa la care se afl. Nu acelai lucru se ntmpl cu datele pe care le vom scrie i citi din memoria EEPROM a microcontrolerului. Pentru citire trebuie folosii urmtorii regitri:

    EEADR Registrul n care trebuie specificat adresa de la care vom citi data EEPGD Registrul care specific adresa de nceput a zonei EEPROM EEDATA Registrul n care se citete valoarea RD Bit care la setare va iniia ciclul de citire

    Iat un exemplu de funcie care returneaz un octet de la o adres EEPROM specificat

    unsigned char ReadByteFromEEPROM(const unsigned char address)

    {

    unsigned char read_value; // Variabil pentru a reine valoarea citita EEADR = address; // Citete de la adresa aceasta EEPGD = 0; // Pointeaz la nceputul EEPROM memory RD = 1; // Iniiaz un ciclu de citire read_value = EEDATA; // Preia octetul din registrul de date

    return read_value; // Returneaz octetul read byte }

    Scrierea unui octet este i mai laborioas. Iat regitri i biii folosii la scriere: EEADR Registrul n care trebuie specificat adresa la care vom scrie data; EEPGD Registrul care specific adresa de nceput a zonei EEPROM; EEDATA Registrul n care se depune octetul ce se va nscrie apoi n EEPROM;

    WREN Bit pentru validarea scrierii n EEPROM;

    WR Bit care la setare va iniia ciclul de scriere n EEPROM; EECON2 Registru de control al scrierii n EEPROM

    EEIF Bit care semnalizeaz terminarea unui ciclu de scriere. Pe durata scrierii:

    trebuie blocate alte ntreruperi pentru a nu fi perturbat procesul de scriere;

    trebuie ateptat pn la terminarea complet a procesului de scriere. Iat un exemplu de funcie care scrie un octet la o adres EEPROM specificat

    void WriteByteToEEPROM(unsigned char data, const unsigned char address)

    {

    EEADR = address; // Adresa la care se scrie

    EEDATA = data; // Data care se scrie

    WREN = 1; // Valideaz scrierea n EEPROM GIE = 0; // Invalideaz ntreruperile pe durata scrierii EECON2 = 0x55; // Configureaz EECON2 pentru scriere EECON2 = 0xAA; // Configureaz EECON2 pentru scriere

    WR = 1; // Iniiaz ciclul de scriere while(!EEIF); // Ateapt pn se termina scrierea

    WREN = 0; // tergere soft a bitului WREN (validare scriere) EEIF = 0; // tergere soft a bitului EEIF (terminare scriere) }

    n concluzie:

  • ANSI-C pentru microcontrolere 19

    Zona de memorie EEPROM a unui microcontroler fiind nevolatil, poate fi folosit pentru memorarea unor date importante. Pentru a putea utiliza ulterior aceste date,

    trebuie s reinem adresa la care le-am scris.

    Tot ntr-o zon de memorie EEPROM sunt nscrise i valori care nu pot fi modificate, precum: data fabricaiei, etc.

    Memoria de tip EEPROM se poate extinde n afara chip-ului microcontrolerului, cu aa numite "chip-uri de memorie". Acestea au de regul memorie nevolatil de tip EEPROM i se folosesc atunci cnd trebuie salvate un volum mare de date eseniale.

    2.4. Memoria PROGRAM

    Memoria PROGRAM este o memorie de tip ROM (Read Only Memory), n care se nscrie

    codul executabil, cel rezultat dup compilare. Acest cod este de regul un fiier cu extensia '.hex'. Acesta se nscrie n microcontroler o singur dat la nceput, cu ajutorul unui circuit de programare, numit programator. Dup ce acest cod executabil este nscris n memoria program, se zice c "microcontrolerul este programat". Termenul folosit pentru soft-ul aflat n memoria program a unui microcontroler este de firmware. Nici un bit din coninutul aceste memorii nu se modific pe durata rulrii aplicaiei. Dup ce microcontrolerul este programat i este montat n circuitul electronic dedicat aplicaiei, atunci cnd este rulat aplicaia, din memoria program sunt citite una dup alta cuvintele ce reprezint pentru microcontroler instruciuni de efectuat. Memoria program nu este organizat "pe octei", ci pe cuvinte a cror lungime depinde de tipul microcontrolerului. n funcie de acest criteriu, microcontrolerele avnd magistrala de date pe 8 bii, se clasific n:

    Baseline processor - au instruciunile pe 12 bii. Sunt microcontrolerele din familia PIC12.

    Midrange processor - au instruciunile pe 14 bii. Sunt microcontrolerele din familia PIC16. (Exemplu PIC16F877)

    High-end processor - au instruciunile pe 16 bii. Sunt microcontrolerele din familia PIC18.

    Evident, cu ct este mai lung cuvntul (instruciunea) din memoria program, el poate

    gestiona activiti mai complexe la nivelul unitii centrale a microcontrolerului, i implicit la nivel hard. Consecina imediat este aceea c microcontrolerele avnd instruciuni lungi, au performane superioare. Ca dovad, microcontrolerele din seria PIC12 au un set de 36 de instruciuni, pe cnd cele din seria PIC18 au un set de 80 de instruciuni. Din punct de vedere al caracterului ROM al memoriei program, exist dou categorii de microcontrolere PIC:

    cu memorie de tip PROM. Acestea pot fi programate o singur dat, dup care urmeaz s fie montate pe placa pe care vor rula aplicaia pentru care au fost programate. Ele nu se mai pot reprograma, n ipoteza c la un moment dat aplicaia ar trebui modificat. Fiind microcontrolere ieftine, acestea sunt recomandate pentru realizarea de produse de serie mare. n aceast categorie sunt incluse microcontrolerele care conin litera 'C' n denumire, ca de exemplu: PIC16C84, etc.

  • 20 Ioan P. MIHU

    cu memorie de tip EEPROM. Acestea pot fi reprogramate de mai multe ori, fiind indicate pentru experimente sau dezvoltri de aplicaii. n aceast categorie sunt incluse microcontrolerele care conin litera 'F' n denumire, ca de exemplu: PIC16F84, PIC16F877, etc. La acestea se folosete termenul de memorie FLASH pentru memoria program.

    Alte observaii utile legate de memoria program

    Dimensiunea memoriei FLASH la PIC 16F877 este de 8k (1FFF). Deci nu avem voie s scriem un fiier .c dup a crui compilare fiierul .hex rezultat, s fie mai

    mare de 8k. Este o limitare care nu trebuie s ne sperie, fiindc chiar i aplicaiilor "serioase", le sunt suficieni cei 8k de memorie FLASH. La alte tipuri de microcontrolere dimensiunea memoriei FLASH este mult mai mare, ca de

    exemplu PIC 18Fxx, care are 256K de memorie program, care permite crearea de

    aplicaii "foarte serioase". Oricum dimensiunea limitat a memoriei program, oblig programatorul s aib n vedere dimensiunea codului .hex rezultat. O alt msur pentru generarea de fiiere .hex de lungime minim este compilarea fiierelor .c, cu opiunea: 'Global optimisation level=9'.

    Aa cum se observ n figura 2.3, memoria program este organizat pe mai multe pagini, 4 n cazul lui PIC 16F877. Acest lucru este transparent pe durata scrierii

    programului.

    Figura 2.3. Organizarea memoriei program (FLASH) la PIC 16F877

  • ANSI-C pentru microcontrolere 21

    Merit s mai revenim puin asupra modului n care se programeaz un microcontroler. nscrierea fizic (electric) a fiierului executabil '.hex' n memoria program se face cu ajutorul unui circuit de programare numit programator. Acesta este un montaj electronic

    conectat pe USB sau pe interfaa serial a calculatorului n care se afl fiierului '.hex'. Acestea pot fi:

    Programatoare care au un soclu, n care se introduce microcontrolerul cruia urmeaz s-i fie nscris programul n memoria program. Dup nscriere, microcontrolerul se scoate din soclu iar apoi se monteaz pe placa pentru care a fost proiectat aplicaia nscris n el. Dezavantajul unui astfel de procedeu este acela c dac se lucreaz la dezvoltarea unui program cu un grad de complexitate

    mai mare, care trebuie modificat de multe ori, aceasta oblig la montarea i demontarea de multe ori a microcontrolerului n programator, operaii prin care se pot distruge pinii acestuia.

    Programatoare 'n circuit'. Acestea sunt recomandate dezvoltrii aplicaiilor care

    necesit multe modificri i ncercri pe durata realizrii lor. n acest caz, se realizeaz placa (circuitul) pe care microcontrolerul este montat definitiv prin lipire. Programatorul se conecteaz prin intermediul unui conector montat pe plac

    la doi pini (SDA i SCL) ai microcontrolerului, dedicai pentru comunicaii seriale I2C i care pot fi folosii pentru programare. Programarea 'n circuit' se poate face la rndul ei pe una din urmtoarele dou ci:

    nscrierea serial direct conectnd programatorul la pinii SDA (Serial Clock)i SCL (Serial Data) ai microcontrolerului.

    nscrierea serial folosind pinii Tx i Rx protocolului serial RS232. Pentru aceasta este ns nevoie de un program ajuttor, numit bootloader. Acesta se ncarc iniial n microcontroler, folosind un programator clasic. Dup aceea microcontrolerul se monteaz definitiv prin lipire pe plac iar nscrierea n continuare a programului se face fr programator, folosind interfaa serial a calculatorului, i un program de transmisie serial, precum utilitarul Hiperterminal. Dei se gsete n memoria program, bootloader-ul nu influeneaz deloc aplicaia, fiindc el este ncrcat la sfritul memoriei FLASH, iar dimensiunea sa este mic, de aproximativ 250 cuvinte.

    2.5. Programarea porturilor unui microcontroler

    Din ntreaga structur a microcontrolerului, am prezentat pn acum cteva elemente legate de memorie, fiindc sunt indisolubil legate de programarea propriu-zis.

  • 22 Ioan P. MIHU

    Figura 2.4. Microcontrolerul privit n contextul sistemului controlat

    Consider c este nu doar util, ci obligatoriu ca nainte de a-l programa s facem cunotin

    i cu porturile microcontrolerului. Porturile unui microcontroler reprezint acele terminale (pini) cu care acesta intr n legtur, direct sau prin intermediul unor circuite electronice (circuite de adaptare, circuite drivere, etc), cu sistemul pe care-l controleaz.

    Figura 2.5. Cum poate fi programat orice pin al portului A

    Aa cum este prezentat n figura 2.5, orice pin al unui port poate fi programat / setat s se comporte fie ca intrare fie ca ieire. Pinii portului vor fi setai intrri/ieiri n funcie de necesitile conectrii microcontrolerului la sistemul controlat. Pentru a ti dac un pin trebuie setat intrare sau ieire, este bine s cunoatem comportamentul electric al pinului fa de circuitul extern la care este conectat, atunci cnd acesta este setat intrare sau ieire.

    PA0

    PA1

    PA2

    Portul A

    PA3

    PA4

    PA5

    PA6

    PA7

    Ieire Digital

    Intrare

    Analogic

    Digital

    Fiecare pin al unui port

    poate fi programat:

    Sistem controlat Plac electronic

    C

    Out

    Out

    In

    In

    Senzor Tens. Analogic

    Tens. Discret

  • ANSI-C pentru microcontrolere 23

    Figura 2.6. Comportamentul electric al unor pini setai s fie intrri Aa cum rezult din figura 2.6, atunci cnd un pin este setat s fie intrare, microcontrolerul se comport ca avnd o rezisten de intrare foarte mare. Din acest motiv, curentul absorbit de microcontroler de la circuitul la care este conectat este foarte mic. Ideal ar fi ca acest

    curent absorbit s fie nul. Aceasta ar nsemna c dac privim microcontrolerul ca pe un instrument care citete / msoar tensiuni din circuitul la care este conectat, prezena sa nu afecteaz (nu deranjeaz) funcionarea electric a circuitului msurat.

    Figura 2.7. Comportamentul electric al unui pin setat s fie ieire

    n figura 2.7, este analizat cazul n care un pin este setat ca ieire. n acest caz vom denumi circuitul la care este conectat ca fiind sarcin. Se observ c microcontrolerul are la ieire un circuit de tip push-pull care-i permite fie s injecteze curent n sarcin, fie s absoarb

    R2

    LED2

    +5V

    PA1

    +Vcc

    +5V

    Gnd

    K1

    K2

    R4

    LED4

    R1

    LED

    +5V

    +5V

    PA2

    PA0

    Btn1

    +Vcc

    +5V

    Gnd

    Btn2

    R3

    RIN

    RIN

    I ~ 0

    I ~ 0

  • 24 Ioan P. MIHU

    curent, dup cum este nchis comutatorul K1 sau K2 i dup cum sarcina este conectat la mas sau la potenialul Vcc.

    Figura 2.8. Exemplu de conexiuni electrice ale microcontrolerului

    n figura 2.8 este prezentat un exemplu de conectare a unui microcontroler la un sistem de

    circuite electrice simple. Natura acestor circuite, ne oblig s alegem pentru fiecare pin, statutul de pin de intrare sau pin de ieire. Un criteriu simplu de a decide este acela al transferului / consumului de energie: dac un pin controleaz / dicteaz consumul de energie al circuitului la care este conectat, atunci acel pin va fi unul de ieire. Dac consumul energetic al circuitului conectat nu este influenat de pinul la care este conectat atunci pinul va fi unul de intrare. Detaliind situaia pinilor din figura 2.8, constatm c:

    pinul PA0 trebuie setat ca intrare digital deoarece el trebuie s citeasc una din cele dou stri ale butonului Btn2 (apsat /eliberat),

    pinul PA1 trebuie setat ca i ieire deoarece la el se gsete conectat o diod LED, care va trebui s poat fi aprins / stins.

    pinul PA2 trebuie setat ca i intrare digital fiindc el trebuie s citeasc una din cele dou stri ale butonului Btn1 (apsat /eliberat),.

    +Vcc

    +5V

    Gnd

    R1 R2

    LED

    +5

    V

    PA2

    PA1

    PA0

    Btn1

    +5

    V

    Btn2

    R3

  • ANSI-C pentru microcontrolere 25

    Figura 2.9. Posibiliti de programare a pinilor portului A.

    Din figura 2.9 se vede c:

    statutul de intrare / ieire al unui pin este setat de bitul corespunztor lui din registrului TRISA. Pentru exemplul dat trebuie s avem o linie n program ca cea de mai jos:

    TRISA = xxxxx101b; // cu '0' pinul devine ieire, cu '1' devine intrare // deci: PA0 i PA2 au devenit intrri; // PA1 a devenit ieire;

    Convenia 1 = intrare / 0 = ieire este uor de memorat dac asociem pe '0' cu

    litera 'o' din cuvntul output i pe '1' cu litera 'i' din cuvntul input. n exemplul dat, primii 5 bii din PORTA nu sunt folosii. n acest caz primii 5 bii

    din TRISA nu conteaz ce valoare iau i de aceea sunt notai cu 'x'. O dat stabilit caracterul de intrare / ieire al unui pin acesta va putea fi folosit

    conform funciei pe care o are, prin intermediul registrului PORTA.

    n ipoteza c am setat pinul PA1 ca fiind ieire, atunci: - dac dorim s aprindem LED-ul, trebuie ca bitul corespunztor pinului

    PA1 s fie setat pe '1'. Exemplu: RA1 = 1; // Echivalent cu PORTA=xxxx xx1xb; LED-ul se va aprinde

    - dac dorim s stingem LED-ul, bitul va trebui setat pe '0'. Exemplu: RA1 = 0; // Echivalent cu PORTA=xxxx xx0xb; LED-ul se va stinge

    Nu este obligatoriu ca scriind '0' la un pin de ieire LED-ul s fie stins, iar dac scriem '1' LED-ul s fie aprins. Ceea ce trebuie reinut este c dac scriem '1' atunci pinul respectiv va ajunge conectat la potenialul +Vcc, iar dac scriem '0' atunci pinul respectiv va ajunge conectat la potenial nul (la mas) aa cum rezult din figura 2.7. innd cont de aceste precizri vom stabili apoi care este starea LED-ului, n funcie de configuraia circuitului electric n care se afl.

    PORTA

    R1 R2

    LED

    +5V

    TRISA

    x x x x x 0 1 1 x x x x x Y 0 1

    PA2

    PA1

    PA0

    Btn1

    +5V

    Btn2

    R3

  • 26 Ioan P. MIHU

    Dac pinul este intrare digital atunci n bitul corespunztor din registrul PORTA se va gsi '0' sau '1' n funcie de tensiunea ce ajunge la pin, prin circuitul electric exterior microcontrolerului. Dac avem de citit stri ale unor butoane, atunci valoarea citit depinde de configuraia circuitului n care este inclus butonul. Pentru circuitul din figura 2.9, vom avea:

    TRISA = xxxxx1x1b; // PA0 i PA2 au devenit intrri Bit Xbtn; // declarm o variabil Xbtn de un bit. Xbtn = RA0; // Citim primul bit al portului PORTA. Variabila Xbtn devine:

    // '0' dac butonul Btn2 este apsat, sau // '1' dac butonul Btn2 este eliberat. Xbtn = RA2; // Citim al treilea bit al portului PORTA. Variabila Xbtn devine:

    // '1' dac butonul Btn1 este apsat, sau // '0' dac butonul Btn1 este eliberat.

    Citirea valorii dintr-un port n linia ce urmeaz imediat dup setarea acestuia, poate fi afectat de impedana conectat ca sarcin la pinul aferent portului.

    Char Var1; // declarm o variabil Var1 de un octet. TRISA = xxxxx1x1b; // Setm pinii RA0 i RA2 ca intrri Var1 = PORTA; // poate citi portul A cu erori

    Char Var1; // declarm o variabil Var1 de un octet. TRISA = xxxxx1x1b; // Setm pinii RA0 i RA2 ca intrri nop; // comanda 'nop' ntrzie derularea programului,

    // cu un ciclu, ceea ce face ca statutul pinilor

    // declarai intrri s se stabilizeze Var1 = PORTA; // se va citi corect

    Aa cum am menionat anterior, un pin declarat ca intrare poate fi setat fie intrare digital, fie intrare analogic. Un exemplu detaliat al folosirii intrrilor analogice este prezentat n capitolul 12.

    2.6. Alegerea microcontrolerului

    2.6.1. Criterii legate de arhitectura microcontrolerului

    Problema poate fi formulat astfel: ce tip de microcontroler se potrivete cel mai bine aplicaiei mele? Cele mai obiective criterii sunt legate de cerinele tehnice ale aplicaiei. Iat cteva dintre acestea: numrul de pini, tipul capsulei, tensiunea de alimentare, volumul de memorie flash, volumul de memorie RAM, porturi specifice: I2C, UART, ADC, etc,

  • ANSI-C pentru microcontrolere 27

    Figura 2.10. Instrument soft pentru alegerea C adecvat

    Cutarea microcontrolerului optim nu este un lucru tocmai uor, mai ales dac suntem la nceput de drum n utilizarea acestora. Compania Microchip vine n ajutor cu un instrument

    software extrem de util pentru alegerea microcontrolerului optim. Acesta este accesibil pe

    pagina de Internet a companiei [4xa]. O parte din interfaa acestuia este prezentat n figura 2.10. Se observ c putem selecta aria de cutare, cu ajutorul unor poteniometre grafice (slider). Putem ngusta mereu aria de cutare pn la momentul n care ajungem la microcontrolerul dorit din punct de vedere tehnic.

    Iat n continuare n sintez principalele caracteristici ale familiilor de C Microchip.

  • 28 Ioan P. MIHU

    Figura 2.11. Imagine de ansamblu a familiilor Microchip [yy]

    Magistrala

    Date

    Lungime

    Instruciune Familie /

    Tip reprezentativ Performanele

    familiei

    8 bit

    12 bit PIC12 /

    PIC12F675

    0,064k RAM, 1 kB Flash; 20 MHz; 6 I/O pin; 2 Timers;

    7 Interrupt sources;10 bit ADC/4 ch; 32 Base Instructions

    14 bit

    PIC16

    /

    PIC16F877

    0,368k RAM, 8 kB Flash; 20 MHz;

    14 Interrupt sources; 3 Timers; 2 PWM channels;

    1 USART; 10 bit ADC/8 ch; 35 Base Instructions,

    16 bit

    PIC18

    /

    PIC18F452

    1,6k RAM, 32 kB Flash; 40 MHz; 2 PWM channels;

    18 Interrupt sources; 4 Timers;1 USART; 10 bit ADC/8 ch;

    75 Base Instructions, 8x8 hardware multiplier;

    16 bit 24 bit

    PIC24

    /

    PIC24FJ128-

    GA006

    16k RAM, 256 kB Flash; 40 MIPS; 35 I/O pin; 2 UART;

    2 SPI; 2 I2C; 10 bit ADC/13 ch; 5 PWM channels;

    43 Interrupt sources; 5 Timers; 76 Base Instructions, 17x17

    hardware multiplier;

    dsPIC30

    /

    dsPIC30F4012

    16k RAM, 256 kB Flash3 30 MIPS; 35 I/O pin;

    2 UART; 2 SPI; 2 I2C; 10 bit ADC/13 ch; CAN bus;

    45 Interrupt sources; 5 Timers; 8 PWM channels; 76 Base

    Instructions, 17x17 single cycle fractional/ integer multiplier; dsPIC33

    /

    dsPIC33FJ256-

    GP506

    30k RAM, 256 kB Flash; 40 MIPS; 85 I/O pin; 2 UART; 2 SPI; 2 I2C; 10 bit 2ADC/32 ch; CAN bus;

    117 Interrupt sources; 5 Timers; 8 PWM channels; 83 Base

    Instructions, 16x16 single cycle fractional/ integer multiplier;

    32 bit 128 bit

    PIC32

    /

    PIC32MX360-

    F512L

    128k RAM; 512 kB Flash; 80 MHz / 1,65MIPS/MHz

    O instruciune / ciclu; Cache memory 16ch DMA; Ethernet; 2CAN buss; Full speed USB;

    Multitasking embedded control;

    Free MPLAB XC Compiler

    Tabelul 2.1. Sintez a performanelor familiilor PIC

  • ANSI-C pentru microcontrolere 29

    2.6.2. Criterii legate de viteza de calcul

    Aplicaiile cele mai incitante ale microcontrolerelor sunt cele numite n timp real. Este vorba de acele aplicaii, la care reacia / rspunsul sistemului trebuie s fie suficient de rapid, pentru a fi util cerinelor aplicaiei. Spre exemplu dac sistemul cu microcontroler echipeaz sistemul de direcie al unei rachete de croazier, care ntr-o secund parcurge 400 m, este vital ca din momentul n care microcontrolerul primete informaiile despre poziia

    i direcia actual a unui obstacol, el s ia i s transmit decizia de a schimba direcia, n cel mai scurt timp posibil, n timp real. Decizia se ia n urma parcurgerii unui algoritm de

    calcul, deci n urma unor calcule. Este vital ca aceste calcule s fie efectuate ct mai rapid. La fel dac avem un sistem de recunoatere a vorbirii, la care eantioanele se citesc cu o frecven de eantionare de 8kHz, atunci n intervalul dintre dou eantioane (Te= 1/8000 s= 0,125ms) trebuie efectuate toate calculele cerute de algoritm.

    De regul, algoritmii sunt liniari, calculele implicate fiind adunri i nmuliri. Cunoscnd algoritmul, tim cte nmuliri i cte adunri trebuie efectuate. Este firesc deci s avem o imagine de ansamblu a timpului de calcul alocat unei adunri i unei nmuliri, de ctre fiecare familie de microcontrolere. Acest lucru este prezentat sintetic n tabelul 2.1.

    Tabelul 2.2. Referitor la viteza de calcul

    Vom analiza pentru nceput timpii de calcul la adunare. Toate familiile de microcontrolere

    au n setul de instruciuni, pe cea de adunare: ADDWF = adunarea a dou variabile, sau ADDWFC = adunarea unei variabile cu o constant. Aceasta nseamn c dac numerele sunt pe cte un octet, iar magistrala de date este de 8 bit, adunarea se execut hardware de ctre unitatea central ntr-un ciclu de instruciune. n schimb dac avem de adunat numere pe doi octei, iar magistrala de date este de 8 bii, atunci adunarea lor va necesita

    evident mai muli cicli instruciune. Dac magistrala de date este de 16 bii atunci adunarea a dou numere de 16 bii se va face tot ntr-o singur instruciune.

    Magistrala

    Date

    Lungime

    Instruciune

    Familie

    /

    Nr. Instruciuni

    Timpul de calcul

    (cicli instruciune)

    Adunare nmulire

    8 bit +

    8 bit

    16 bit +

    16 bit

    float +

    float

    8 bit x

    8 bit

    16 bit x

    16 bit

    float x

    float

    8 bit

    12 bit PIC12

    32 Instructions 1

    3

    soft

    130

    soft

    2

    soft

    4

    soft

    526

    soft

    14 bit PIC16

    35 Instructions 1

    3

    soft

    130

    Soft

    2

    soft

    4

    soft

    526

    soft

    16 bit PIC18

    75 Instructions 1

    3

    soft

    115

    soft 1

    4

    soft

    451

    soft

    16 bit 24 bit

    PIC24

    76 Instructions 1 1

    88

    soft 1 1

    90

    soft

    dsPIC30

    76 Instructions 1 1

    84

    soft 1 1

    90

    soft

    dsPIC33

    83 Instructions 1 1

    84

    soft 1 1

    90

    soft

    32 bit 128 bit

    PIC32

    124 Instructions

    Multitasking 1 1

    64

    soft 1 1

    49

    soft

  • 30 Ioan P. MIHU

    S continum analiza datelor din tabelul 2.2 cu operaia de adunare. Familia PIC18 este prima care are nglobat un multiplicator hardware de 8x8 bit. Aceasta nseamn c efectueaz nmulirea ntr-un singur ciclu instruciune (exist instruciunea MUL, n setul de instruciuni). Familiile PIC24 i dsPIC30, PIC32 au multiplicatoare hardware 17x17, care le permit nmulirea a dou numere de 16 bii ntr-un singur ciclu instruciune.

    Figura 2.12. Secven de program folosit pentru tabelul 2.2

    Datele din tabelul 2.2. au fost colectate rulnd poriunea de cod din figura 12.12 i folosind apoi simulatorul MPLAB SIM. Dup setarea acestui simulator n meniul Debug, pentru analiz vom folosi fereastra Disassembly Listing (figura 2.14), sau mai detaliat fereastra Program Memory (figura 2.13), din care putem afla numrul de instruciuni parcurse folosind butonul Step Into pentru pirea nainte n program. n figura 2.14 se observ c la PIC24, nmulirea numerelor pe 2 octei se face ntr-un singur ciclu.

    Figura 2.13. Program Memory Window

    Figura 2.14. Fereastra Diassembly Listing

  • ANSI-C pentru microcontrolere 31

    Din cele dou ferestre menionate putem afla numrul de instruciuni al unor rutine. Nu este corect s judecm viteza de calcul dup numrul de instruciuni pe care la are o rutin de multiplicare, deoarece ea cuprinde i bucle care se repet, durata de execuie a rutinei fiind dependent de numerele cu care se opereaz. Cel mai bun mod de a judeca lucrurile este analiza timpului de calcul a codului executabil rezultat, cu ajutorul simulatorului MPLAB

    SIM n fereastra Simulator Trace, ca n figura 2.15. Acesta are avantajul c aici sunt

    contorizai cu exactitate numrul de cicli instruciune.

    Figura 2.15. Simulator Trace Window

    Aa dup cum se observ din tabelul 2.2, familiile PIC12 i PIC 16, nu au o instruciune de nmulire, deci nu pot efectua nmulirea dect prin rutine software, adic prin artificii n care nmulirea este fcut prin adunri repetate. De exemplu un microcontroler PIC16 efectueaz nmulirea a dou numere reprezentate pe cte 2 octei n 4 cicli instruciune. Acolo unde n tabelul 2.2 exist meniunea 'soft', nseamn c operaia respectiv nu este efectuat ntr-o singur instruciune, ci este executat de o rutin.

    O problem i mai mare o reprezint adunarea i nmulirea numerelor n virgul flotant. Dei acestea ofer precizii mari, timpul de efectuare a unei adunri sau a unei nmuliri este foarte mare. Toate operaiile cu variabilele de tip float se efectueaz cu rutine soft foarte lungi, din dou motive:

    La data realizrii acestui volum, nici o familie de microcontrolere Microchip nu are nglobat FPU (Floating Point Unit), deci operaiile cu numere n virgul flotant nu pot fi realizate hardware, ci doar prin emulare software.

    Numerele n format floating point dup standardul IEEE754 trebuie mai nti despachetate pentru a fi aduse la o reprezentare n format de numere ntregi, singurele pe care ALU le tie efectua, iar apoi dup terminarea calculelor, ele trebuie mpachetate din nou n respectivul format.

    Numrul de cicluri instruciune menionat n tabel poate varia fiindc este dependent de valorile operanzilor (mai ales cnd acestea sunt valori particulare precum 0, 1, NaN, etc.),

    precum i de tipul compilatorului. O alt msur a performanelor compilatorului de a opera cu numere n virgul flotant este numrul de cicli instruciune n care se calculeaz valoarea unor funcii matematice precum: sin(x), tg(x), ln(x), etc, chiar dac acestea nu sunt folosite n algoritmii n timp real.

    n concluzie, revenind la imaginea de ansamblu oferit de tabelul 2.2, observm c aici sunt

    menionate operaii efectuate pe diverse tipuri de date: 8 bii, 16 bii sau float, care pot fi efectuate ntr-un singur ciclu instruciune sau n foarte multe. Devine clar, c trebuie

  • 32 Ioan P. MIHU

    accentuat responsabilitatea programatorului de a alege tipul potrivit de variabile, pentru ca viteza de calcul s fie ct mai mare posibil. Astfel dac dorete s lucreze cu variabile pe

    8 bii, atunci va alege un microcontroler cu o magistral de 8 bii, i n program va declara variabilele de tip char sau unsign char. Dac este obligat s lucreze cu precizii mai mari i trebuie s foloseasc variabile pe 16 bii, atunci este recomandat s aleag un

    microcontroler cu o magistral de date de 16 bii (PIC24) i n program s-i declare variabilele de tip int. Dac dorete precizii foarte mari, este firesc s se gndeasc la folosirea variabilelor de tip float. Aa cum se vede din tabel, folosirea lor trebuie fcut cu mari rezerve atunci cnd apar constrngeri legate de timpul de calcul. Criteriile care stau la

    baza alegerii tipului de variabil nu sunt doar acestea, de aceea le vom relua n capitolul 4.7

    Necesitatea de a efectua calcule rapide este de fapt motorul care a mpins productorii de microcontrolere s realizeze familii de circuite cu arhitecturi noi, cu performane tot mai ridicate.

    2.6.3. Criterii economice

    Alturi de criteriile tehnice, exist i altele, cel puin la fel de importante: costul microcontrolerului, costul compilatorului, experiena n utilizare, etc. Aceste criterii sunt importante att pentru studentul care realizeaz proiecte didactice sau ca hobby din propriul

    buget, ct i pentru proiectele industriale, realizate de companii specializate n producerea de sisteme ncorporate cu microcontrolere.

    n concluzie, alegerea microcontrolerului potrivit, este un pas important i nu foarte uor de fcut atunci cnd trebuie realizate aplicaii competitive, de mare complexitate i cu

    performane ridicate.