Sunteți pe pagina 1din 32

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.

Ioan P. MIHU

Sistem controlat

Intrri

Sistem cu
microcontroler

Ieiri

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.

ANSI-C pentru microcontrolere


- Caiet sarcini
- Echip dezvoltare
- Planificare dezvoltare
- Costuri

Idee
/
Comand

Specificaii
tehnice

Alegere
microcontroler

Proiectare scheme
electrice i electronice

Specificaii software

Alegere furnizori
Proiectare
structur program

Proiectare cablaj
PCB
Realizare cablaj
(PCB)

Scriere program n C

Montare piese

Compilare
Fiier .hex

Software

Feedback
- Punere n funciune
- Cerine noi
- Scdere costuri

Programator

Circuit electronic
cu
microcontroler
Hardware

Sistem funcional
cu
microcontroler

TESTE

Embedded system
funcional
i vndut !

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.

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

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: HiTech, 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

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.

Breackpoint

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

ANSI-C pentru microcontrolere

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.

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

Save Workspace

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

ANSI-C pentru microcontrolere

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.
Project / Build
compileaz fiierele surs;
construiete proiectul.

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;

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.

Breackpoints
Reset
Oprete Vizualizarea tuturor
punctelor de oprire
rularea
linie cu
liniede simulare
Figura 1.12. Controlul fluxului programului, n regim

Run
Ruleaz pn la
primul breackpoint

Animate
Ruleaz lent,
linie cu linie

Step
Ruleaz linie cu linie
la click stnga pe icon

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;

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.
Reset and
Conect
to ICD2

Write flash
Transfer .hex n
flash memory

Read flash
ncarc .hex din
flash memory

Verify program
Programarea
este OK ?

Erase
flash
memory

Verify
erase flash
memory.

Release from
reset
Ruleaz !

Figura 1.13. Programare n circuit.

Hold in Reset
Oprete rularea

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

Sistem controlat

Senzor

Plac electronic

Tens. Analogic

In

Tens. Discret

In

Out

Out

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.
PA0
PA1
PA2
Ieire Digital

PA3
Portul A

PA4
PA5

Fiecare pin al unui port


poate fi programat:

Analogic
Intrare

PA6

Digital

PA7

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.

ANSI-C pentru microcontrolere

23

+5V

+5V

+5V

R3
+Vcc

Btn1

PA2
I~0

I~0

RIN

PA0

RIN

R1
Btn2
LED

Gnd

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.
+5V

+5V

R4
+Vcc
LED4

K1
PA1
K2
R2

Gnd

LED2

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

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.
+5
V

+5V

R3
+Vcc

+5
V
Btn1

PA2

PA1

PA0

Btn2

R2

R1

LED

Gnd

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

ANSI-C pentru microcontrolere

25
+5V
R3

+5V
Btn1

PA2

PA1

PA0

Btn2

x x x x x 0 Y 1

x x x x x 1 0 1

PORTA

TRISA

R2

R1

LED

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:
// 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
TRISA = xxxxx101b;

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 LEDului, n funcie de configuraia circuitului electric n care se afl.

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 Lungime
Familie /
Performanele
Date Instruciune Tip reprezentativ
familiei
PIC12 /
0,064k RAM, 1 kB Flash; 20 MHz; 6 I/O pin; 2 Timers;
12 bit
PIC12F675 7 Interrupt sources;10 bit ADC/4 ch; 32 Base Instructions
PIC16
0,368k RAM, 8 kB Flash; 20 MHz;
14 bit
/
14 Interrupt sources; 3 Timers; 2 PWM channels;
8 bit
PIC16F877 1 USART; 10 bit ADC/8 ch; 35 Base Instructions,
PIC18
1,6k RAM, 32 kB Flash; 40 MHz; 2 PWM channels;
16 bit
/
18 Interrupt sources; 4 Timers;1 USART; 10 bit ADC/8 ch;
PIC18F452 75 Base Instructions, 8x8 hardware multiplier;
PIC24
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;
PIC24FJ128- 43 Interrupt sources; 5 Timers; 76 Base Instructions, 17x17
GA006
hardware multiplier;
16k RAM, 256 kB Flash3 30 MIPS; 35 I/O pin;
dsPIC30
2 UART; 2 SPI; 2 I2C; 10 bit ADC/13 ch; CAN bus;
16 bit
24 bit
/
45 Interrupt sources; 5 Timers; 8 PWM channels; 76 Base
dsPIC30F4012
Instructions, 17x17 single cycle fractional/ integer multiplier;
dsPIC33
30k RAM, 256 kB Flash; 40 MIPS; 85 I/O pin;
/
2 UART; 2 SPI; 2 I2C; 10 bit 2ADC/32 ch; CAN bus;
dsPIC33FJ256- 117 Interrupt sources; 5 Timers; 8 PWM channels; 83 Base
GP506
Instructions, 16x16 single cycle fractional/ integer multiplier;
128k RAM; 512 kB Flash; 80 MHz / 1,65MIPS/MHz
PIC32
O instruciune / ciclu; Cache memory
/
32 bit
128 bit
16ch DMA; Ethernet; 2CAN buss; Full speed USB;
PIC32MX360Multitasking embedded control;
F512L
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.
Timpul de calcul
(cicli instruciune)
Familie
Magistrala Lungime
/
Adunare
nmulire
Date Instruciune
Nr. Instruciuni 8 bit + 16 bit + float + 8 bit x 16 bit x float x
8 bit
16 bit
float
8 bit 16 bit float
PIC12
3
130
2
4
526
12 bit
1
32 Instructions
soft
soft
soft
soft
soft
PIC16
3
130
2
4
526
8 bit
14 bit
1
35 Instructions
soft
Soft
soft
soft
soft
PIC18
3
115
4
451
16 bit
1
1
75 Instructions
soft
soft
soft
soft
PIC24
88
90
1
1
1
1
76 Instructions
soft
soft
dsPIC30
84
90
16 bit
24 bit
1
1
1
1
76 Instructions
soft
soft
dsPIC33
84
90
1
1
1
1
83 Instructions
soft
soft
PIC32
64
49
32 bit
128 bit 124 Instructions
1
1
1
1
soft
soft
Multitasking

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.

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.

S-ar putea să vă placă și