Sunteți pe pagina 1din 138

MINISTERUL EDUCAIEI, CERCETRII, TINERETULUI I SPORTULUI

DUKA Adrian-Vasile

JOVREA Titus

Sisteme cu microprocesoare.
Microcontrolerul PIC18F4455
ndrumtor de laborator

2010

Universitatea Petru Maior din Tg. Mure


Facultatea de inginerie

DUKA Adrian-Vasile

JOVREA Titus

Sisteme cu microprocesoare.
Microcontrolerul PIC18F4455
ndrumtor de laborator

2010

Refereni tiinifici: Conf. dr. ing. Piroska HALLER


ef lucr. dr. ing. Stelian Emilian OLTEAN

Reproducerea integral sau parial a textului sau ilustraiilor din aceast


lucrare este posibil numai cu acordul scris al autorului.

Tehnoredactare computerizat: autorii


Grafica: autorii
Corectura: autorii
Multiplicare: Petru Pop
Legtorie: Lenua Pop
Bun de tipar: 17.11.2010
CZU 004.31:62-181.4
Tiparul executat la Universitatea Petru Maior din Trgu Mure

Cuprins

Prefa

Lucrarea 1

Mediul de dezvoltare MPLAB IDE

Lucrarea 2

Adresarea direct a memoriei

19

Lucrarea 3

Adresarea indirect a memoriei

26

Lucrarea 4

Structuri de program

30

Lucrarea 5

Porturi de intrare-ieire

37

Lucrarea 6

Temporizri software

47

Lucrarea 7

Temporizri hardware

52

Lucrarea 8

PWM

61

Lucrarea 9

Convertorul analog-digital

68

Lucrarea 10

ntreruperi

79

Lucrarea 11

Comunicaii seriale asincrone

84

Lucrarea 12

Captura

97

Lucrarea 13

Comunicaii prin portul serial virtual

104

Anexa 1

Setul de instruciuni pentru microcontrolerul PIC18F4455

111

Anexa 2

Template de cod surs n asamblare

124

Anexa 3

Schema electronic a plcii de dezvoltare utilizat n cadrul

127

laboratorului
Anexa 4

ncrcarea programului compilat n microcontroler

128

Anexa 5

Indicaii privind programarea microcontrolerului PIC18F4455 folosind

131

limbajul de programare C
Anexa 6

18f4455.lkr

135

Anexa 7

Utilizarea aplicaiei HyperTerminal

136

Bibliografie

138

Prefa

Lucrarea de fa, cu titlul Sisteme cu microprocesoare. Microcontrolerul


PIC18F4455, se adreseaz studenilor facultii de inginerie, specializrile Calculatoare,
Automatic, Electroenergetic i Mecatronic, n curricula crora se gsete disciplina
Sisteme cu microprocesoare, dar i celor care doresc s se familiarizeze cu o parte din
problemele specifice dezvoltrii sistemelor de calcul bazate pe microcontrolerul PIC18F4455.
Alegerea pentru studiu a microcontrolerului PIC18F4455, produs de compania
Microchip, este motivat de versatilitatea de care acest circuit d dovad, costul su sczut i
numeroasele faciliti pe care le pune la dispoziie. Aceste avantaje fac din acest
microcontroler o soluie viabil i consacrat deja printre dezvoltatorii de microsisteme i l
recomand pentru utilizarea sa la realizarea lucrrilor practice din cadrul laboratorului.
ndrumtorul de laborator, utilizat la disciplina Sisteme cu microprocesoare, cuprinde
13 lucrri de laborator distincte care includ printre altele: prezentarea mediului de dezvoltare
MPLAB, tehnicile de programare i detaliile arhitecturii necesare realizrii aplicaiilor
propuse. Prin parcugerea aspectelor referitoare la organizarea memoriei, modurile de adresare,
utilizarea porturilor de intrare/ieire, a perifericelor existente i a realizrii comunicaiei se
pun bazele pentru dezvoltarea aplicaiilor industriale cu ajutorul microcontrolerului
PIC18F4455.
Lucrrile propuse conin consideraiile teoretice necesare, modalitile specifice de
dezvoltare a aplicaiilor, numeroase exemple de programare, att n limbaj de asamblare, ct
i n limbaj C, precum i o serie de probleme suplimentare. Cele 7 anexe, completeaz
informaiile prezentate n cadrul lucrrilor i faciliteaz realizarea aplicaiilor propuse.
Autorii i exprim sperana c aceast lucrare corespunde exigenelor actuale care se
impun n pregtirea studenilor, i va putea fi util n pregtirea aplicaiilor dezvoltate de
acetia.
Autorii

Lucrarea 1. Mediul de dezvoltare MPLAB IDE


1. Obiectivul lucrrii
Obiectivul lucrrii const n familiarizarea cititorilor cu mediul MPLAB utilizat n
dezvoltarea aplicaiilor ncorporate care utilizeaz microcontrolerele PIC i dsPIC produse de
compania Microchip.
2. Prezentarea mediului de dezvoltare integrat (IDE)
MPLAB IDE1 este o aplicaie software care ruleaz pe PC-uri cu sisteme de operare
Windows utilizat n vederea dezvoltrii de programe pentru microcontrolere Microchip. Cu
alte cuvinte, MPLAB este un mediu de dezvoltare integrat pentru aplicaii ncorporate pe
microcontroler, oferind un ansamblu de unelte menite s faciliteze scrierea, editarea,
simularea i depanarea programelor pentru microcontrolere.
Dezvoltarea unei aplicaii pentru microcontroler presupune urmtoarele etape:
1. Realizarea unei proiectri de nivel nalt. Pornind de la specificaiile dorite se va alege
microcontrolerul potrivit pentru aplicaie, iar apoi se va proiecta structura hardware a
sistemului digital. Dup determinarea perifericelor utilizate i a pinilor care
interfaeaz sistemul se va scrie aplicaia pentru microcontroler. n acest sens, se va
folosi un limbaj de asamblare, care poate fi transpus direct in cod main, sau un
compilator care permite utilizarea unui limbaj de nivel nalt (de exemplu C) pentru
crearea i editarea programelor. Assembler-ele i compilatoarele fac programul scris
pentru microcontroler mai uor de neles, prin utilizarea de etichete care identific
poriuni de cod, variabile sau diferite structuri de cod care permit organizarea mai
eficient a aplicaiei.
2. Transformarea programului scris n cod main pentru microcontrolerul PIC prin
utilizarea de assemblere i/sau compilatoare. Acest cod main va fi ulterior ncrcat
n microcontroler.
3. Testarea codului. De obicei, aplicaiile complexe vor necesita o etap de depanare a
diferitelor erori de programare n vederea obinerii funcionrii dorite. Debugger-ul
permite urmrirea modului de execuie al programului scris prin vizualizarea
variabilelor n diferite puncte ale programului, modificarea valorilor variabilelor sau
execuia pas cu pas a rutinelor etc.
4. ncrcarea codului rezultat n microcontroler i verificarea funcionrii corecte n
aplicaia final.
MPLAB IDE intervine n toate etapele mai sus menionate. Editorul su de programe
ajut la scrierea corect, din punct de vedere sintactic, a codului, prin utilizarea limbajului de
programare ales (limbaj de asamblare sau limbaj de nivel nalt). Astfel, diferitele structuri
specifice acestor limbaje de programare sunt recunoscute automat, iar textul codului surs se
coloreaz n funcie de sintaxa utilizat. Manager-ul de proiecte permite organizarea i
accesarea facil a diferitelor fiiere utilizate de aplicaie: fiiere cod surs, fiiere de tip
header, biblioteci etc. Identificarea rapid a erorilor de programare permite depanarea
aplicaiilor permind un mod de dezvoltare al programelor de tipul codare-compilaredepanare. Deseori, n cazul aplicaiilor complexe, acest mod de lucru este frecvent utilizat pe
msur ce diferitele seciuni ale codului sunt scrise, iar apoi testate.
Odat obinut un cod fr erori, acesta va necesita o testare. MPLAB IDE dispune de
componente specifice, denumite debuggers, care permit testarea aplicaiilor. De asemenea,
sunt disponibile i o serie de simulatoare software pentru toat gama de mictrocontrolere PIC
sau dsPIC. Aceste unelte permit simularea aplicaiilor nainte ca acestea s fie ncorporate n
structura unui sistem hardware. Utilizarea intrrilor simulate (stimulus) permite modelarea
1

MPLAB IDE este disponibil gratuit pentru descrcare pe pagina de web a productorului www.microchip.com

rspunsului aplicaiei la semnale externe, care ar putea proveni din arhitectura hardware a
sistemului final.
3. Dezvoltarea aplicaiilor
n MPLAB, manager-ul de proiecte controleaz ntregul proces de dezvoltare al
aplicaiilor. Pentru a crea cod executabil pe microcontrolere PIC, diferitele fiiere de tip cod
surs trebuie adugate unui proiect. Codul executabil va fi obinut utiliznd diferitele unelte
de limbaj disponibile n mediul de dezvoltare (assemblere, compilatoare, linkere etc.).
n general, toate proiectele vor parcurge urmtorii pai:
1. Selectarea dispozitivului utilizat.
Capacitile oferite de mediul MPLAB variaz n funcie de dispozitivul selectat.
Selectarea dispozitivului pentru care va fi dezvoltat aplicaia ar trebui realizat nainte
de nceperea proiectului.
2. Crearea proiectului.
Un utilitar denumit Project Wizard va coordona crearea proiectului.
3. Selectarea uneltelor de limbaj utilizate.
Project Wizard intervine i n procesul de selecie al uneltelor de limbaj. Pentru acest
tutorial se va considera assambler-ul i linker-ul integrat n mediul de dezvoltare. n
cazul altor proiecte se pot utiliza diferite compilatoare Microchip sau alte unelte
produse de teri.
4. Adugarea fiierelor n proiect.
Dou fiiere vor fi adugate n proiect: un fiier ablon (template) i un unificator
(linker script). Ambele fiiere exist ntr-un sub-director din cadrul directorului
MPLAB.
5. Crearea i editarea codului surs folosind editorul integrat.
6. Construirea proiectului. (build)
Prin asamblarea i linkeditarea fiierelor surs, proiectul va fi transformat n cod
main care va rula ulterior pe microcontrolerul selectat.
7. Testarea codului cu ajutorul unui simulator.
Utilitarul Project Wizard intervine n parcurgerea acestor pai.
Not:

Anumite aspecte ale interfeei utilizator se pot schimba ca urmare a lansrii de noi
versiuni ale acestui produs. Astfel unele capturi de ecran care apar n aceast lucrare
s-ar putea s nu fie identice n cazul noilor versiuni ale mediului de dezvoltare
MPLAB. Noi faciliti vor fi adugate pe msur ce componente adiionale vor fi
lansate pe pia, dar niciunul din aspectele descrise n aceast lucrare nu vor fi
nlturate. Asistena on-line este cea mai actualizat referin pentru versiunea
curent de MPLAB IDE

3.1 Selectarea dispozitivului utilizat


Alegei din meniu Configure>Select Device. n fereastra deschis, selectai
PIC18F4455. Acesta este tipul de microcontroler care st la baza acestei lucrri i care va fi
utilizat pe larg i n capitolele urmtoare.
Luminiele de pe interfa marcheaz componentele MPLAB care sunt compatibile
cu (suportate de) dispozitivul selectat (Verde indic suport complet; Galben indic suport
preliminar, disponibil de obicei n faza de testare; Rou indic lipsa suportului pentru
dispozitivul selectat)

Figura 1.1. Fereastra pentru selectarea dispozitivului (microcontroler-ului)


3.2 Crearea proiectului
Urmtorul pas presupune crearea unui proiect nou cu ajutorul utilitarului Project
Wizard. Proiectul creat va asigura organizarea i gestiunea fiierelor care vor fi ulterior
compilate sau asamblate. n continuare se va folosi un singur fiier de asamblare pentru acest
proiect i un script de legtur.
Pentru a crea un nou proiect se va selecta din meniu Project > Project Wizard.
De la fereastra de ntmpinare se trece la etapa urmtoare prin apsarea pe butonul
Next >.

Figura 1.2. Project Wizard. Fereastra de ntmpinare

Urmtoarea fereastr de dialog (Step One) permite selecterea dispozitivului utilizat,


lucru deja realizat. Asigurai-v c este selectat microcontrolerul PIC18F4455. Dac nu apare,
va trebui selectat din list.
Apsai butonul Next >.

Figura 1.3. Project Wizard. Fereastra de selectare a dispozitivului


3.3 Configurarea uneltelor de limbaj
Pasul doi din Project Wizard configureaz uneltele de limbaj care sunt utilizate n
acest proiect. Selectai Microchip MPASM Toolsuite n list-boxul Active Toolsuite, iar apoi
n fereastra Toolsuite Contents ar trebui s fie vizibile MPASM, MPLINK i MPLIB.
Selectai-le pe rnd pentru a v asigura c acestea exist, iar calea lor este indicat corect.
Dac mediul de dezvoltare MPLAB IDE a fost instalat n directorul implicit, atunci calea
pentru executabilul de asamblare (assembler) MPASM va fi:
C:\Program Files\Microchip\MPASM Suite\mpasmwin.exe
pentru executabilul de legatur (linker-ul) MPLINK:
C:\Program Files\Microchip\MPASM Suite\mplink.exe
iar executabilul bibiliotecii (library) MPLIB:
C:\Program Files\Microchip\MPASM Suite\mplib.exe
Dac exist erori n cazul acestor unelte de limbaj, acestea vor fi marcate printr-un X
de culoare roie. n aceast situaie, utilizai butonul Browse pentru a fixa corect calea ctre
cele trei componente.
Odat ncheiat aceast etap, apsai butonul Next >.

Figura 1.4. Project Wizard. Selectarea uneletelor de limbaj


3.4 Denumirea proiectului
Pasul trei ofer posibilitatea de a da un nume proiectului creat i de a-l salva ntr-un
director pe disc. n continuare, pentru exemplificare, se va considera un proiect de test cu
numele C:\Projects\MyProject.
Introducei acest text i apsai Next >. Se va cere s creai un nou director, din
moment ce acesta nu exist. Apsai OK.

Figura 1.5. Project Wizard. Denumirea proiectului

3.5 Adugarea de fiiere la proiect


Pasul patru permite selectarea de fiiere pentru proiectul creat. Se pot aduga fiiere
cod surs existente sau fiiere ablon (template) pentru codul surs.
Fiierele ablon sunt fiiere simple care pot fi utilizate pentru a ncepe un nou proiect.
Acestea cuprind seciunile eseniale ale oricrui fiier cod surs i conin informaii ajuttoare
pentru editarea i organizarea codului. Pentru a putea accesa fiierele ablon se poate utiliza
calea C:\Program Files\Microchip\MPASM Suite\Template\. De aici se va
putea selecta fiierul ablon corespunztor microcontrolerului utilizat.
n Anexa 2 se gsete codul surs al unui fiier ablon asociat microcontrolerului
PIC18F4455 care poate fi utilizat ca punct de pornire n dezvoltarea aplicaiilor viitoare.
Dac se dorete realizarea codului surs de la zero, far a se utiliza fiierele ablon, se
poate trece la pasul urmtor prin apsarea butonului Next >. Astfel, nu se va aduga nici un
fiier n proiectul creat

Figura 1.6. Project Wizard. Adugarea fiierelor n proiect


Ultima fereastr din Project Wizard prezint un rezumat al proiectului n care se
evideniaz dispozitivul, numele proiectului i pachetul de unelte de limbaj utilizat.

Figura 1.7. Project Wizard. Rezumatul proiectului


10

Dup apsarea butonului Finish, fereastra proiectului este vizibil n spaiul de lucru al
mediului MPLAB IDE. Dac fereastra care conine structura proiectului nu este deschis,
selectai afiarea acesteia din bara de meniu View>Project.

Figura 1.8. Fereastra proiectului


Momentan este constituit doar structura proiectului, dar acesta nu dispune nc de
fiiere cod surs. Astfel, pentru a aduga un nou fiier cod surs va trebui creat un document
nou, care va fi salvat cu extensia *.asm.

Figura 1.9. Crearea unui fiier cod surs denumit test.asm


Dac fiierul creat nu se va regsi n fereastra proiectului, la categoria Source Files,
acesta se poate aduga manual prin click dreapta pe Source Files>Add Files.

11

Figura 1.10. Adugarea de fiiere noi n proiect


n continuare, prin intermediul ferestrei de editare se va putea scrie programul.
Deschiderea oricrui fiier cod surs va determina deschiderea acestuia n fereastra de editare.

Figura 1.11. Fereastra de editare


Pentru o urmrire facil a codului surs se poate selecta numerotarea liniilor de cod.
Acest lucru este posibil prin click dreapta n fereastra de editare, selectarea opiunii
Properties, iar apoi bifarea opiunii Line Numbers n ferestra Editor Properties.
3.6 Compilarea proiectului
Pentru a realiza construirea proiectului avem la dispoziie mai multe posibiliti, toate
conducnd la acelai rezultat final: asamblarea i interconectarea fiierelor curente n vederea
generrii codului main pentru microcontroler.
Pentru a construi proiectul se poate alege una din urmtoarele variante:
- Project>Build All
- Click dreapta pe numele proiectului n fereastra proiectului i selectarea opiunii Build
All
-

Apsarea butonului Build All


din bara de unelte
Utilizarea shortcut-ului de taste Ctrl + F10
12

Rezultatul construirii proiectului este afiat n fereastra de ieire. n cazul proiectului


simplu creat n aceast lucrare, compilarea nu ar trebui sa genereze nici o eroare.

Figura 1.12. Fereastra de ieire


n cazul apariiei unor erori de compilare, acestea vor fi marcate n fereastra de ieire.
Pentru remedierea erorilor se recomand verificarea urmtoarelor aspecte, iar apoi reluarea
procesului de compilare.
- Dac s-au raportat erori n fereastra de ieire, la dublu click pe eroare mediul MPLAB
IDE v direcioneaz ctre linia de cod care a generat acea eroare.
- Verificai sintaxa i formatul codului introdus n fereastra de editare. Asigurai-v c
numele regitrilor speciali utilizai n program sunt scrii cu majuscule.
- Verificai utilizarea asablorului potrivit (asamblorul MPASM) pentru microcontrolerul
vizat, precum i a legturii pentru dispozitive (linkerul MPLINK). n aceste sens
selectai Project>Set Language Tool Locations i verificai utilizarea corect a
uneletelor de limbaj i urmarii dac sunt corecte cile de acces la aceste unelte. Dac
este nevoie schimbai aceste ci.
O construcie reuit a proiectului va genera fiierul (cu extensia *.hex) care conine
codul main ce poate fi ncrcat n microcontrolerul PIC, precum i informaii privind
depanarea programului astfel nct variabilele din codul surs s poat fi urmrite dup
numele lor simbolic.
Puterea real a proiectelor este evident atunci cnd exist multe fiiere de compilat /
asamblat i legat pentru a forma aplicaia executabil final. Proiectele supervizeaz toate
acestea. Opiunile de construcie pot fi setate individual pentru fiecare fiier n parte n funcie
de diferitele caracteristici ale uneltelor de limbaj care sunt accesate, cum ar fi ieirile de
rapoarte sau optimizrile compilatorului.

13

4. Utilizarea Simulatorului pentru testarea aplicaiilor


4.1 Pornirea simulatorului MPLAB SIM
Pentru a putea realiza testarea codului scris sunt necesare echipamente hardware2 sau
unelte software care s aib capacitatea de a executa instruciunile scrise pentru
microcontrolerul PIC. O unealt de depanare (debugger) este o unealt hardware sau software
care permite inspectarea codului n timpul execuiei unui program. Unelte hardware, precum
MPLAB REAL ICE au posibilitatea de a executa codul din dispozitivele reale. Dac aceste
unelte hardware sunt indisponibile, se poate utiliza simulatorul MPLAB SIM pentru a testa
codul. n aceast lucrare se va face apel pe larg la acest simulator.
Simulatorul este o aplicaie care ruleaz pe PC i care simuleaz instruciunile
microcontrolerelor PIC. Aceast aplicaie nu ruleaz codul n timp real, fiind dependent de
viteza PC-ului, de complexitatea codului testat, de sistemul de operare, precum i de celelalte
task-uri care ruleaz. Totui, simulatorul permite, printre altele, msurtori exacte ale timpului
de execuie al codului pentru situaia n care acesta ar rula n cadrul aplicaiilor n timp real de
pe microcontroler.
Pentru a selecta simulatorul MPLAB SIM ca unealt de depanare a aplicaiei se va
selecta din meniu Debugger>Select Tool> MPLAB SIM. Selectarea simulatorului conduce la
urmtoarele modificri n aspectul spaiului de lucru: apar butoane noi n bara de unelte a
mediului MPLAB, apar elemente adiionale n meniul Debugger, meniul View va permite
activarea de ferestre noi specifice simulatorului etc.

Figura 1.13. Spaiul de lucru cu MPLAB SIM activat


n figura 1.13 s-au marcat modificrile spaiului de lucru al mediului MPLAB ca
urmare a selectrii simulatorului MPLAB SIM.
1 bara de stare aflat n partea de jos a feresterei MPLAB va indica selecia
simulatorului MPLAB SIM;
2 meniul View va permite deschiderea de noi ferestre, specifice simulatorului;
2

Uneltele de debug precum MPLAB ICE sau MPLAB ICD 2 permit executarea codului pe dispozitive reale.
Aceste unelte hardware folosite la testarea codului ofer aceleai faciliti cu ale simulatorului MPLAB SIM, dar
permit rularea aplicaiilor la viteza lor real, lucru care nu este posibil n cazul simulatorului acesta fiind
dependent de: viteza procesorului, sistemul de operare, complexitatea codului, numarul de procese active etc.

14

3 n bara de unelte apare un set de butoane noi, utilizate n controlul simulrilor3;


4 meniul Debugger va conine opiuni suplimentare;
5 fereastra Output va conine un nou tab corespunztor simulrii.
4.2 Rularea aplicaiei / simulrilor
Simulatorul permite execuia pas cu pas a codului surs, introducerea de Breakpoints,
urmrirea varibilelor sau a coninutului regitrilor etc. Cele mai des utilizate comenzi pentru
controlul simulrii sunt disponibile n meniul Debugger (vezi 2), sau sub forma unor butoane
de shortcut pe bara de unelte (vezi 3)
Tabelul 1.1. Butoane de comand pentru debugger
Meniu Debugger
Buton
Tast shortcut
Run
F9
Halt
F5
Animate
Step Into
F7
Step Over
F8
Step Out
Reset
F6
Exist mai multe posibiliti de a rula o aplicaie n vederea simulrii (testrii sau
depanrii):
Rularea pas cu pas (en. Step Into) F7: permite execuia pas cu pas a fiecrei linii de
cod. Prin corelarea cu alte unelte de urmrire a execuiei se poate cunoate starea
variabilelor program sau a regitrilor dispozitivului selectat n fiecare punct din
program.
Modul animaie.
Rularea continu (en. Run) F9: va determina execuia programului pn la apsarea
butonului de oprire (en. Halt) F5 sau pn la ntlnirea unui punct de ntrerupere a
programului (Breakpoint).
4.3 Introducerea i gestiunea breakpoint-urilor
Breakpoint-urile reprezint puncte introduse intenionat n cadrul unei aplicaii, care
odat atinse vor determina ntreruperea execuiei programului n vederea realizrii procesului
de depanare sau simulare. Pe durata ntreruperilor programatorul poate inspecta elementele
supuse testrii (variabile, regitri speciali, memorie etc.) pentru a determina dac aplicaia
funcioneaz corect.
Pentru a aduga un Breakpoint n cadrul aplicaiei testate se va face dublu click n
fereastra de editare, n zona gri, n dreptul liniei de cod unde se dorete ntreruperea execuiei.
teregerea breakpoint-ului se face n mod asemntor, n dreptul inconiei care marcheaz
breakpoint-ul de pe o anumit linie de cod.

Poziionai cursorul deasupra butoanelor pentru a vedea o scurt descriere a funciilor acestora.

15

Figura 1.14. Adugarea unui Breakpoint


Gestiunea breakpoint-urilor se poate realiza i din fereastra Breakpoints care poate fi
accesat din meniu Debugger>Breakpoints sau cu ajutorul tastei F2.

Figura 1.15. Gestiunea Breakpoint-urilor


4.4 Urmrirea aplicaiei
Simulatorul MPLAB SIM ofer mai multe posibiliti de a urmri execuia aplicaiei
prin intermediul unor ferestre suplimentare.
Pentru a putea vedea dac programul funioneaz n modul dorit se va selecta
View>Watch pentru a deschide i a configura o noua fereastr de urmrire. Lista din stnga va
permite selectarea registrului special care se dorete a fi urmrit. Acesta se aduga la fereastra
de urmrire prin apsarea butonului Add SFR. Lista din dreapta permite selectarea unor
variabile de program pentru a fi urmrite.
Prin execuia pas cu pas a programului se va putea urmri modificarea valorii
registrului special adugat n fereastra de urmrire.

16

Figura 1.16. Utilizarea ferestrelor de urmrire


Se poate alege o alt modalitate de vizualizare a coninutul memoriei (regitrii) prin
selectarea din meniu a ferestrei de vizualizare a regitrilor de uz general View>File Registers
sau a ferestrei de vizualizare a regitrilor speciali View>Special Function Registers.

Figura 1.17. Special Function Registers.


Fereastra de vizualizare a coninutului regitrilor speciali

Figura 1.18. File Registers. Fereastra de vizualizare a


coninutului regitrilor de uz general
Aceste ferestre vor conine practic o hart a memoriei i vor permite vizualizarea
coninutului sub mai multe forme (binar, zecimal, hexa, nume simbolice, adrese etc).
Cu ajutorul ferestrei Program Memory, accesibil selectnd View>Program Memory
se poate urmri evoluia registrului PC (Program Counter = Numrtor de program) n timpul

17

rulrii. De asemenea, se poate observa programul, dar i linia curent unde s-a ajuns cu
execuia.
Pentru vizualizarea stivei se poate folosi opiunea View>Hardware Stack.
4.5 Monitorizarea timpului de execuie
O alt facilitate de care dispune simulatorul MPLAB SIM permite monitorizarea
timpului de execuie al unei instruciuni, a timpului de execuie necesar execuiei unei rutine
sau chiar al programului. Debuggerul din MPLAB pune la dispoziie un modul denumit Stop
Watch (Figura 1.19) care se poate selecta din meniul Debugger>StopWatch.

Figura 1.19. Fereastra Stopwatch de vizualizare a timpului de execuie


Dup activarea ferestrei Stopwatch, utilizatorul poate parcurge programul pas cu pas, n
fereastr fiind afiate:
numrul de cicluri de instruciune;
timpul de execuie.
Informaiile afiate reprezint un total al timpului scurs de la nceputul execuiei
programului (n coloana Total Simulated) i un total de la deschiderea ferestrei Stopwatch sau
de la ultima resetare realizat prin apsarea butonului Zero (coloana Stopwatch). Prin
apsarea butonului Sync, informaiile din cele dou coloane sunt sincronizate.
5. Concluzii
n cadrul acestei lucrri s-au parcurs paii cei mai importani n conceperea,
construirea i testarea proiectelor pentru microcontrolerele Microchip PIC18F4455. Aspectele
care au fost tratate cuprind:
Selectarea dispozitivului;
Folosirea utilitarului Project Wizard pentru crearea unui proiect i utilizarea ghidului
pentru:
o Adugarea asamblorului MPASM, a unificatorului MPLINK i a librriilor de
program MPLIB (dac este cazul aceast etap poate fi folosit pentru
configurarea compilatorului C18 pentru limbajl de programare C);
o Adugarea de fiiere la proiect;
Scrierea i editarea codului surs;
Construirea proiectului;
Testarea codului cu ajutorul simulatorului MPLAB SIM;
Depanarea programului cu ajutorul Breakpoint-urilor i a ferestrelor de urmrire.

18

Lucrarea 2. Adresarea direct a memoriei


1. Scopul lucrrii
Obiectivul lucrrii const n familiarizarea cititorului cu metodele de adresare direct a
memoriei RAM. n acest sens, n aceast lucrare se va studia accesul la memoria de date a
microcontrolerului PIC18F4455 prin dou modaliti: prin intermediul Access Bank-ului,
respectiv prin utilizarea Bank-urilor i a registrului de selecie a Bank-urilor (BSR Bank
Select Register)
2. Consideraii teoretice
Buna nelegere a organizrii memoriei permite realizarea unor programe care
utilizeaz eficient memoria. n cazrul microcontrolerelor, aceast problem este mult mai
acut din cauza limitrilor impuse de resursele fizice.
Microcontrolerele cuprind de regul n arhitectura lor trei tipuri de memorii:
memoria program;
memoria de date RAM;
memoria de date EEPROM.
Lucrarea vizeaz adresarea direct a memoriei de date RAM a microcontrolerului
PIC18F4455. Acest tip de memorie este utilizat de regul pentru stocarea datelor temporare
necesare rulrii programelor (ex. variabile i constante de program). Adresarea direct se
caracterizeaz prin faptul c instruciunile conin adresa registrului accesat.
Organizarea memoriei
Memoria RAM este organizat pe octet, fiecare octet purtnd denumirea de registru.
Aceti regitri pot fi mprii n dou categorii: regitri destinai stocrii datelor
denumii Regitri de Uz General (en. General Purpose Registers, GPR), respectiv regitri cu
anumite funcii de configurare / monitorizare cunoscui sub denumirea de Regitri Speciali
(en. Special Function Registers, SFR). Maparea regitrilor GPR i SFR n acelai spaiu de
adrese permite accesarea lor prin intermediul unui singur set de instruciuni1.
Capacitatea total de adresare a memoriei RAM pentru microcontrolerele din familia
18F este de 4096 de octei. Acest lucru conduce la faptul c fiecare registru din memoria de
date RAM are o adres de 12 bii (4096 Bytes = 212 Bytes 12 linii de adres).
O schem de adresare eficient a memoriei de date presupune accesul rapid la orice
adres din memorie. O soluie pentru a face accesul mai rapid const n faptul c nu este
necesar specificarea ntregii adrese (de 12 bii) pentru fiecare operaie de scriere sau citire a
memoriei, ci doar a unei pri a acesteia (8 bii din cei 12). Acest lucru conduce la
posibilitatea de a utiliza instruciuni mai scurte, care se pot executa mai rapid. n cazul
microcontrolerelor PIC18 aceast soluie este implementat prin mprirea memoriei de date
n Bank-uri.
Numrul de bank-uri pentru seria 18F este de 16, fiecare bank coninnd 256 de octei
(4096 Bytes = 16 Banks x 256 Bytes). Microcontrolerul PIC18F4455 implementeaz un total
de 2048 de octei / regitri. Astfel, din aceste 16 bank-uri, PIC18F4455 implementeaz doar 8.
Regitrii SFR se gsesc partea superioar a bank-ului 15 (ultimii 160 de octei), iar restul
memoriei conine regitri de uz general. Dac se utilizeaz comunicaia prin USB, bank-urile
4-7 sunt utilizate pentru transferul de date.

Vezi Anexa 1 Setul de instruciuni pentru microcontrolerul PIC18F4455

19

Figura 2.1. Structura memoriei RAM la microcontrolerul PIC18F4455


Modalitatea de formare a adresei depinde de instruciunea utilizat. Astfel, fiecare
locaie poate fi accesat
- utiliznd o adres complet de 12 bii2 sau
- printr-un octet care specific adresa n cadrul bank-ului (cei 8 bii inferiori ai
adresei complete) i 4 bii reprezentnd numrul bank-ului accesat (restul de 4
bii ai adresei complete).
Majoritatea instruciunilor3 din familia 18F utilizeaz cei 4 bii pentru selecia bankului, acetia fiind accesibili prin intermediul registrului special BSR (en. Bank Select
2

Instruciunea MOVFF are ca operanzi dou adrese de 12 bii. La execuia acestei instruciuni se ignor registrul
BSR.
3
Este vorba mai ales despre instruciunile scurte (reprezentate pe 16 bii)

20

Register). Acest registru conine biii cei mai semnificativi ai adresei de 12 bii (BSR<3:0>),
ceilali 8 bii ai adresei fiind specificai n cadrul instruciunii.
Utilizarea registrului BSR mpreun cu adresa de 8 bii specificat prin intermediul
instruciunilor permite adresarea ntregii memorii, dar ridic i anumite inconveniente pe care
utilizatorul trebuie s le ia n considerare. Acesta trebuie s se asigure ntotdeauna c este
selectat bank-ul de lucru corect, pentru a se accesa datele din zona dorit de memorie. Aceste
inconveniente sunt mai evidente atunci cnd se dorete accesul la regitri speciali (care se
gsesc n Bank 15) pentru anumite configurri, lucru care presupune schimbarea bank-ului de
lucru, iar apoi revenirea la bank-ul curent de lucru n vederea utilizrii regitrilor de uz
general. Astfel, verificarea i/sau modificarea coninutului registrului BSR pentru fiecare
operaie de scriere sau citire a memoriei poate deveni foarte ineficient din cauza creterii
numrului de instruciuni i implicit al timpului de execuie al programului.
Aceast problem a fost rezolvat prin introducerea unei zone virtuale de memorie
denumit Access Bank, accesibil fr modificarea bank-ului. Aceast zon de memorie
mapeaz primii 96 de regitri GPR (din Bank 0) i cei 160 de regitri SFR (din Bank 15).
Accesarea memoriei RAM prin Bank-uri
Selectarea unui anumit bank se face utiliznd registrul special BSR. Pentru
modificarea coninutului acestui registru este disponibil o instruciune special: MOVLB (en.
Move Literal to BSR).
De exemplu, selectarea bank-ului 2 se poate realiza cu urmtoarea instruciune:
MOVLB
0x02
sau, lund n considerare c BSR este un simplu registru ca oricare altul, valoarea sa se poate
modifica i pe baza urmtoarei secvene de instruciuni:
MOVLW
0x02
MOVWF
BSR
Trebuie menionat faptul c toate instruciunile de lucru cu regitrii se aplic i asupra
registrului BSR.
Pentru a modifica valoarea primului registru din bank-ul 2 se poate utiliza urmtoarea
secven de cod:
;selectare Bank 2 (BSR = 2)
MOVLB
0x02
;accesare registrul 0x00 din Bank 2. Se utilizeaz BSR
CLRF
0x00, BANKED
BSF
0x00, 1, BANKED
Dup cum se poate observa din secvena anterioar de instruciuni, pentru a avea acces
la un registru din bank-ul 2, mai nti se ncarc BSR cu valoarea 2. Urmtoarele instruciuni
includ ca valoare a parametrului a4 flag-ul BANKED (a=1) care specific utilizarea adresrii
prin bank-uri a memoriei RAM i implicit formarea adresei locaiei accesate folosind cei 4
bii din BSR mpreun cu cei 8 bii din instruciune. n exemplul de mai sus 0x00 reprezint
adresa primului registru din bank-ul selectat.

Exemplu: instruciunea MOVWF h21,BANKED unde valoarea h21 reprezint cei 8 bii inferiori ai
adresei complete, ceilali 4 bii fiind specificai prin intermediul registrului BSR
4
RAM access bit. Bit din codul instruciunii cu urmtoarea funcionalitate
a = 0 (ACCESS): locaia de memorie RAM accesat se gsete n Access Bank (registrul BSR este
ignorat)
a = 1 (BANKED): se acceseaz o locaie de memorie din bank-ul specificat prin intermediul registrului BSR

21

Avnd n vedere c pn la 16 regitri pot avea aceeai adres inferioar, utilizatorul


trebuie s se asigure c a selectat bank-ul de lucru potrivit nainte de a realiza operaii de
scriere sau citire. Aceast situaie este exemplificat n continuare:
;selectare Bank 2 (BSR = 2)
MOVLB
0x02
;accesare registrul 0x00 din Bank 2. Se utilizeaz BSR
CLRF
0x00, BANKED
;selectare Bank 3 (BSR = 3)
MOVLB
0x03
;accesare registrul 0x00 din Bank 3. Se utilizeaz BSR
INCF
0x00, BANKED
n exemplul anterior se observ faptul c cei doi regitri accesai, unul din bank-ul 2 i
cellalt din bank-ul 3, dispun de aceeai adres inferioar (0x00) introdus prin intermediul
instruciunilor.
n Figura 2.2 se prezint modul de formare a adresei n cazul accesrii directe a
memoriei prin intermediul bank-urilor i a registrului BSR.

Figura 2.2. Accesarea memoriei RAM prin Bank-uri


Accesarea memoriei prin Access Bank
Utilizarea Access Bank-ului ofer posibilitatea manipulrii a 96 de regitri de uz
general din bank-ul 0 i a celor 160 de regitri speciali din bank-ul 15.
Pentru a accesa zona de memorie mapat n Access Bank, utilizatorul va fi nevoit s
reseteze bitul de acces (a=0) existent n cadrul fiecrei instruciuni. De exemplu, pentru a
accesa registrul special TRISA, utiliznd aceast zon, instruciunile vor avea urmtoarea
form:
CLRF
TRISA, ACCESS
BSF
TRISA, 4, ACCESS
Pentru a nu utiliza registrul de selecie a bank-urilor aceste instruciuni includ ca
valoare a parametrului a flag-ul ACCESS (a=0). Dac nu se specific nici o valoare pentru
22

acest parametru, varianta implicit este reprezentat de utilizarea Access Bank-ului. Astfel,
instruciunile anterioare scrise n forma urmtoare au acelai efect.
CLRF
TRISA
BSF
TRISA, 4
Utilizarea numelor simbolice
Noiunea de variabil de program presupune n varianta cea mai simpl o zon de
memorie care i poate modifica valoarea pe parcursul execuiei programului. Spre deosebire
de limbajele de nivel superior (cum ar fi limbajul C), unde localizarea exact n memorie nu
era cunoscut, n domeniul microcontrolerelor, utilizatorul are control total asupra
implementrii noiunii de variabil.
Astfel, manipularea variabilei se poate realiza fie utiliznd adresa ei fizic, fie prin
ataarea unui nume simbolic5 adresei respective. De exemplu, dac se consider o variabil
aflat n bank-ul 0, la adresa 2, pentru a iniializa variabila, se va utiliza secvena urmtoare
de program:
MOVLW
b10001100
MOVWF
0x02
Ataarea unui nume simbolic unei valori se face utiliznd cuvntul cheie EQU.
Valoarea respectiv reprezint doar un numr, care poate fi interpretat ca o variabil sau ca o
constant. De fapt, acest EQU este asemntor directivei #define din limbajul de
programare C, ceea ce nseamn c la compilare numele simbolice sunt nlocuite cu valorile
efective. n aceste condiii se recomand o atenie deosebit n utilizarea numelor simbolice
pentru a nu se face ncurcturi ntre numele simbolice care denot constante i cele care
denot variabile.
Prin introducerea numelor simbolice CONST i VAR, exemplul anterior devine:
; seciune constante
CONST
EQU

b10001100

; seciune variabile
VAR
EQU

0x02

; iniializare
MOVLW
CONST
MOVWF
VAR

; CONST WREG
; WREG VAR

De multe ori, apar situaii n care se dorete alocarea unui numr mare de variabile sau
utilizarea unor nume simbolice care au ataate o serie de valori n ordine cresctoare. n acest
context se poate utiliza un bloc de nume simbolice (constante), astfel:
CBLOCK 0x00
VAR1
VAR2
VAR3
VAR4
VAR5
ENDC

;valoare de start
;VAR1=0
;VAR2=1
;VAR3=2
;VAR4=3
;VAR5=4

Regitrii speciali au nume simbolice predefinite (WREG, PORTA etc.). Acestea sunt recunoscute n cadrul
proiectului, dac se include biblioteca asocit dispozitivului utilizat. n cazul microcontrolerului PIC18F4455,
codul surs va conine directiva #include P18F4455.inc

23

Utilizarea unui bloc de simboluri este echivalent cu utilizarea directivei EQU pentru
fiecare nume simbolic n parte.
3. Probleme propuse
P1. S se stocheze n registrul de lucru (WREG) valoarea zecimal 250. S se
decrementeze aceast valoare folosind o instruciune de decrementare. S se seteze bitul 3 i
s se reseteze bitul 5. S se roteasc la stnga de 3 ori biii registrului de lucru, iar apoi s se
incrementeze de o sut de ori rezultatul obinut. S se deplaseze la dreapta de 2 ori valoarea
rezultat, iar rezultatul final s se salveze n memorie la adresa 223h.
P2. S se declare 10 variabile, 5 n bank-ul 0, accesibile prin Access Bank i 5 n
bank-ul 1, accesibile prin BSR. Variabilele vor fi notate cu V0, V1, ..., V9. S se
stocheze n fiecare variabil cte o valoare la alegere. S se implementeze urmtoarele
operaii (n ordinea dat):
V0+V1+V5+V6 V6
V2-(V3+V4)+V7-V8 V8
(V8 XOR V9)* V6 V9
(( V9 >>> 3 ) XOR V0 ) << 2 V7
unde >>> reprezint rotire la dreapta, << reprezint deplasare la stnga, iar
reprezint destinaia rezultatului operaiei.

Indicaii
Pentru crearea proiectului asociat acestor aplicaii, precum i pentru realizarea
depanrii se va consulta Lucrarea 1;
Pentru identificarea instruciunilor necesare la realizarea aplicaiilor propuse se va
consulta Anexa 1 sau documentaia tehnic6 a microcontrolerului PIC18F4455;
n vederea testrii aplicaiilor i pentru a urmri corectitudinea operaiilor se va utiliza
simulatorul MPLAB SIM mpreun cu uneltele / ferestrele de vizualizare a regitrilor
speciali i a regitrilor de uz general. Aceste ferestre pot fi accesate selectnd
View>Special Function Registers, respectiv View>File Registers;
Se va acorda o atenie deosebit implementrii operaiilor de deplasare la stnga i la
dreapta, avnd n vedere faptul c instruciunile disponibile permit rotirea cu sau fr
bit de transport (en. carry), operaii al cror rezultat difer de cel al deplasrii;
Se va identifica rolul bitul de destinaiei al rezultatului (bitul d din codul instruciunii)
i se va folosi ca atare pentru implementarea corect a operaiilor;
Avnd n vedere c numele simbolice caracterizeaz doar nite valori numerice,
programul se va organiza astfel nct s se fac distincia clar ntre variabilele i
constantele utilizate.

Documentaia tehnic poate fi descrcat de pe pagina de web a productorului http://www.microchip.com/

24

Lucrarea 3. Adresarea indirect a memoriei


1. Scopul lucrrii
Obiectivul lucrrii const n familiarizarea cititorului cu metodele de adresare
indirect a memoriei RAM prin utilizarea regitrilor de adresare i accesare a coninutului. De
asemenea, tot n aceast lucrare se va studia implementarea i parcurgerea tablourilor folosind
metodele de adresare indexat specifice microcontrolerului PIC18F4455.
2. Consideraii teoretice
Adresarea indirect permite accesarea locaiilor1 din memoria de date RAM fr a
utiliza o adres fix n instruciuni, spre deosebire de cazul adresrii directe unde
instruciunile conin adresa fizic a registrului accesat (GPR sau SFR).
De fapt, utilizarea adresrii indirecte este asemntoare cu utilizarea pointerilor din
limbajul C, unde exist o notaie pentru referirea adresei (variabila pointer), i o alt notaie
pentru accesarea coninutului (utilizarea operatorului *). n cazul microcontrolerului PIC cele
dou notaii vor fi nlocuite de un set de regitri speciali utilizai pentru referirea adresei (vor
ndeplini rolul variabilelor pointer) i de regitri speciali utilizai pentru accesarea coninutului
spre care indic pointerii.
2.1 Regitri de adresare i accesare coninut
Microcontrolerul PIC18F4455 implementeaz perechi de regitri FSR (en. File Select
Registers) utilizai pentru adresarea memoriei. n total exist trei asemenea perechi: FSR0,
FSR1 i FSR2 avnd funcionaliti identice.
Regitrii FSRn vor fi utilizai pentru a stoca adresele absolute, reprezentate pe 12 bii,
ale locaiilor de memorie accesate. Posibilitatea utilizrii a 12 bii de adres permite accesarea
ntregii memorii RAM, fr a ine cont de existena bank-urilor.
Pentru a putea stoca adresele de 12 bii ale locaiilor de memorie, regitrii FSRn sunt
formai din doi regitri de 8 bii: FSRnH i FSRnL, unde n{0,1,2}
7

Cei 4 biti superiori ai adresei


octetul inferior al adresei
FSR0H
FSR0L
Figura 3.1. Structura FSR0 format din perechea FSR0H:FSR0L

Regitrii FSRnH i FSRnL sunt accesibili prin instruciuni uzuale de manipulare a


regitrilor, dup cum se poate vedea i din secvena de cod urmtoare, care ncarc n
perechea de regitri FSR0 valoarea 0x200, reprezentnd adresa de 12 bii a locaiei 0x200
din memorie.
MOVLW
MOVWF
MOVLW
MOVWF

0x00
FSR0L
0x02
FSR0H

Setul de instruciuni al microcontrolerului PIC18F4455 include o instruciune care


permite modificarea ambilor regitri simultan, ntr-un singur pas. Astfel, instruciunea LFSR
(en. Literal to FSR) stocheaz n perechea FSRnH:FSRnL valoarea dat ca argument.
1

Prin accesarea locaiilor de memorie se nelege realizarea unei operaii de scriere sau citire, n funcie de
instruciunea utilizat, asupra coninutului locaiei de memorie respective

25

De exemplu, instruciunea urmtoare are acelai efect ca i secvena de cod anterioar:


va stoca adresa 0x200 n perechea de regitri FSR0:
LFSR
FSR0, 0x200
Accesarea coninutului de la adresele stocate n FSRn se face prin intermediul
regitrilor INDFn (en. Indirect File Operands). Astfel, fiecrei perechi de regitri FSR i
corespunde un registru INDFn (dat de indexul n{0,1,2})
7

0
Coninutul adresei stocate in FSR0H:FSR0L

INDF0
Figura 3.2. Structura registrului INDF0 corespunztor FSR0(FSR0H:FSR0L)
Regitrii INDFn sunt utilizai n instruciunile uzuale de manipulare a regitrilor, dup
cum se poate vedea i n Figura 3.3.
Utilizarea unei instruciuni avnd
registrul INDF1 ca operand.
Coninutul locaiei ECCh se va
aduna la registrul de lucru, iar
rezultatul va fi stocat la adresa
ECCh
Registrul FSR1 stocheaz adresa de
12 biti ECCh

INDF1 conine iniial data care se


gsete n memorie la adresa ECCh,
iar ulterior rezultatul operaiei
efectuate

Figura 3.3. Adresarea indirect


n exemplul urmtor se realizeaz stocarea adresei 200h n registrul de adres FSR0
prin utilizarea instruciunii LFSR, iar apoi se realizeaz o serie de operaii folosind registrul
INDF0.
; incarc n FSR0 adresa 0x200
LFSR
FSR0, 0x200
; adun coninutul registrului de lucru WREG cu coninutul
; de la adresa 0x200 i stocheaz rezultatul operaiei la
; adresa 0x200
ADDWF
INDF0, F
; incrementeaz coninutul de la adresa 0x200 i stocheaz
; coninutul la adresa 0x200
INCF
INDF0, F
; mut coninutul de la adresa 0x200 la adresa 0x00
MOVFF
INDF0, 0x00
26

2.2 Adresarea indexat


Utilizarea regitrilor FSRn i INDFn pentru parcurgerea unui tablou de date
implementat n memorie necesit instruciuni de incrementare la fiecare pas a regitrilor de
adres FSRnH i FSRnL. n plus, dac aceti regitri sunt incrementai prin instruciuni
uzuale2, un overflow al registrului FSRnL nu duce la incrementarea registrului FSRnH.
Astfel, pentru a rezolva aceast problem, fiecare pereche de regitri FSRn este
prevzut cu patru operanzi adiionali care completeaz funcionalitatea oferit de operandul
INDFn i permit realizarea adresrii indexate. Asemenea lui INDFn, aceti operanzi sunt de
fapt nitre regitri virtuali al cror coninut poate fi accesat doar cu ajutorul perechii FSRn
asociate, i n plus implementeaz o anumite operaie asupra adresei stocate n FSRn-ul
corespunztor.
POSTDECn: acceseaz coninutul de la adresa stocat n FSRn, apoi
decrementeaz automat cu 1 aceast adres
POSTINCn: acceseaz coninutul de la adresa stocat n FSRn, apoi
incrementeaz automat cu 1 aceast adres
PREINCn: incrementeaz cu 1 adresa din FSRn, apoi acceseaz coninutul
noii adrese
PLUSWn: adun valoarea (de la -127 la 128) coninut n registrul de lucru
WREG la valoarea din FSRn, apoi acceseaz coninutul de la adresa nou
obinut
Un exemplu de utilizare al acestor regitri este urmtorul:
;Se stocheaz adresa de nceput: bank-ul 1, octetul 0
LFSR
FSR0, 0x100
;Mem[100] = 03, FSR0++ => FSR0 = 0x101
CLRF
POSTINC0
;Mem[101] = 0xFF, FSR0-- => FSR0 = 0x100
SETF
POSTDEC0, F
;Mem[101] = 0x00 (prin overflow), FSR0++ => FSR0 = 0x101
INCF
PREINC0, F
n general, adresarea indexat este utilizat la implementarea tablourilor, oferind prin
regitrii virtuali un acces secvenial rapid la datele din memoria RAM.
Un exemplu de utilizare a adresrii indexate presupune iniializarea unei zone de
memorie cu anumit valoare. n cazul de fa, bank-ul 2 trebuie iniializat cu valoarea 0x55,
iar secvena urmtoare de program implementeaz aceast cerin:
;Se utilizeaz FSR0, dar se pot folosi i FSR1 sau FSR2
LFSR
FSR0, 0x200
LOOP:
;Se stocheaz valoarea 0x55 la adresa indicat de FSR0, iar
;apoi se incrementeaz adresa (cu POSTINC0)
MOVLW
0x55
MOVWF
POSTINC0
;Iniial FSR0 = 0x200 => FSR0H = 0x02
2
3

De exemplu: INCF FSR0L, F sau ADDWF FSR0L, F


Notaia Mem[100] = 0 se refer la coninutul locaiei de memorie cu adresa 100h

27

;Pentru detectarea atingerii bank-ului 3 se va testa bitul


;0 al FSR0H (Bank-ul 3 are FSR0H = 0x03)
BTFSS
FSR0H, 0
GOTO
LOOP
3. Probleme propuse
S se stocheze n bank-ul 3 numere n ordine cresctoare, pornind de la valoarea 0.
Considernd memoria sub forma unei matrici, unde liniile sunt bank-uri iar coloanele sunt
elementele unui bank, s se calculeze, utiliznd adresarea indirect pentru accesarea
elementelor, urmtoarele:
P1 (Mem[3][10]<<3)^(Mem[3][50]>>2)^(Mem[3][100]>>>2);
P2 Hash-ul (amprenta) bank-ului 3, care se determin pe baza urmtoarei funcii C4:
hash = len; // len = 255, hash un registru de uz general
for (i = 0; i <= len; i++)
{
hash = ((hash << 2)^(hash >> 3))^Mem[3][i];
}
Rezultatul operaiei implementate de problema P1 se va stoca n memorie la adresa
100h, iar valoarea obinut pentru hash-ul bank-ului 3 se va stoca la adresa 200h.

Indicaii
Pentru calculul amprentei tabloului considerat se va realiza un program C, iar valoarea
obinut se va compara cu cea obinut prin intermediul aplicaiei cu microcontroler.
Cele dou valori trebuie s coincid;
Se va testa dac modificarea unui singur bit al Bank-ului 3 va determina modificarea
valorii hash-ului5;
n vederea testrii aplicaiilor i pentru a urmri corectitudinea operaiilor se va utiliza
simulatorul MPLAB SIM mpreun cu uneltele / ferestrele de vizualizare a regitrilor
speciali i a regitrilor de uz general. Aceste ferestre pot fi accesate selectnd
View>Special Function Registers, respectiv View>File Registers.

4
5

Aceast funcie a fost elaborat de Donald E. Knuth


hash = 123

28

Lucrarea 4. Structuri de program


1. Scopul lucrrii
Obiectivul lucrrii const n familiarizarea cititorului cu o serie de metode care permit
structurarea codului i a datelor n vederea realizrii de programe care pot fi citite sau extinse
cu uurin. Astfel, se prezint dou metode care permit structurarea codului prin intermediul
macrourilor i al subrutinelor, iar pentru gruparea datelor se prezint structurile denumite
tablouri.
2. Consideraii teoretice
n vederea realizrii de programe scalabile i lizibile, att codul ct i datele trebuie
grupate. Structurarea codului folosind macrouri i subrutine reprezint o practic bun de
programare, aceste structuri formnd baza unor limbaje consacrate precum C i Pascal. n
limbajele de asamblare, funciile nu sunt att de vizibile precum n limbajele de nivel nalt,
ns prin stpnirea acestor structuri se vor putea dezvolta programe scalabile.
Dac, macrourile i subrutinele joac un rol important n gruparea codului, n ceea ce
privete datele, se pot utiliza tablouri pentru structurarea lor.
2.1 Macrouri
n limbajul C, macrourile (cunoscute i sub denumirea de macrodefiniii sau
macroinstruciuni) sunt definiii care nlocuiesc constante, variabile sau expresii, fiind
declarate cu ajutorul directivei #define. n cadrul asamblorului MPASM, macrourile sunt
secvene de instruciuni caracterizate prin faptul c fiecare apel al acestora este echivalent cu
inserarea setului de instrucini din corpul macroului la adresa de apel.
Sintaxa de definire a unui macro:
etichet macro [arg1, arg2, ]
[instruciune 1]
[instruciune 2]
[]
endm
Pentru a exemplifica utilizarea macrourilor se va defini un macro denumit
Initializare care va realiza stocarea a dou valori parametrice val1 i val2 la dou
locaii de memorie cu adresele 00h respectiv 0Fh.
; Declaraie de nume simbolice asociate adreselor
ram_0
EQU 0x00
ram_15
EQU 0x0f
; Definire macro Initializare cu 2 argumente val1 i val2
Initializare
macro
val1, val2
MOVLW
val1
MOVWF
ram_0
MOVLW
val2
MOVWF
ram_15
endm
...
; Apelul macroului
Initializare

0x25, d128
29

Macrourile ofer o claritate n plus programelor, deoarece chiar i seturi simple de


instruciuni pot fi nlocuite cu expresii familiare programatorului, iar definirea unui macro
pentru seturi de instruciuni care se repet conduce la reducerea dimensiunii codului la
scriere, asigurnd n acelai timp o eficien ridicat a codului, ntruct instruciunile din
macro sunt inserate n cod la compilare, nefiind necesar efecturarea unui salt sau a unui apel.
Folosirea macrourilor se preteaz, de regul, n situaii n care acestea nu conin multe
instruciuni i integrarea altor structuri (cum ar fi cele cu salt) ar duce la o crestere a timpului
de execuie.
2.2 Subrutine
Pentru a executa aceleai instruciuni de mai multe ori fr a recurge la reinserarea
codului, se pot folosi subrutine. n limbajul C echivalentul subrutinelor sunt funciile, care au
un nume, tip returnat i un set de parametrii. n cadrul limbajelor de asamblare, subrutinele
sunt caracterizate de etichete opionale i de instruciunile de revenire din subrutin.
Sintaxa de definire a unei subrutine:
[etichet:]
[instruciune 1]
[instruciune 2]
[]
RETURN | RETLW | RETFIE1
n continuare se prezint un exemplu de utilizare a subrutinelor. Astfel, se va defini o
subrutin care realizeaz iniializarea direciei portului B (PORTB).
GOTO
Setare_directie:
MOVLW
MOVWF
RETURN

Main:

CALL

Main

;salt peste subrutin


;Definire subrutin

0x0F
TRISB

;revenire din subrutin

Setare_directie

;apelul subrutinei

Instruciunea de apel al unei subrutine este CALL, urmat de o etichet reprezentnd


adresa la care se face salt (adresa primei instruciuni din subrutin). Saltul la adresa indicat
de etichet echivaleaz cu ncrcarea adresei respective n numrtorul de program (en.
Program Counter - PC), dar i cu salvarea n stiv (en. stack) a adresei de revenire din
subrutin (adresa urmtoarei instruciuni dup apel).
Subrutina se ncheie cu instruciunea de revenire RETURN, care reface numrtorul de
program cu adresa de revenire salvat n stiv
Implementarea subrutinelor i a rutinelor de tratare a ntreruperilor necesit utilizarea
unei stive pentru salvarea adresei de revenire. Microcontrolerele din seria 18F implementeaz
o stiv cu 31 de nivele, ceea ce nseamn c ntr-un program pot exista maxim 31 de apeluri
de rutine imbricate.
1

RETURN revenire din subrutin


RETLW revenire din subrutin cu o constant (literal) n registrul de lucru WREG (vezi paragraful 2.3.1)
RETFIE revenire din subrutin de tratare a ntreruperii

30

2.3 Tablouri
Pentru gruparea datelor n structuri denumite tablouri, se poate folosi una din metodele
urmtoare: instruciuni microprocesor, adresarea indirect, instruciuni tabelare.
2.3.1 Implementarea tablourilor folosind instruciuni microprocesor
Aceast metod presupune stocarea valorilor tabloului n memoria program, i se
utilizeaz atunci cnd valorile respective nu se modific (tablou de constante). Metoda are
avantajul c permite stocarea unui numr mult mai mare de valori dect ar fi posibil prin
folosirea RAM-ului.
Dei exist mai multe variante de implementare, o metod foarte popular care poate fi
folosit n cazul microcontrolerelor din seria PIC18F, presupune instruciuni de manipulare a
numrtorului de program i instruciunea RETLW.
n continuare se prezint o subrutin care simuleaz un tablou cu 8 elemente. Accesul
la elementele tabloului se va realiza indexat, folosind ca variabil index registrul de lucru
WREG. Instruciunea RETLW face ca elementele tabloului s fie disponibile ulterior tot n
registrul de lucru.
INDEX
Tabel:
MULLW
MOVF
ADDWF
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW

EQU

0x00

D2
PRODL, W
PCL, F
D101
D115
D90
D83
D85
D99
D150
D149

;variabila INDEX
;PRODH:PRODL 2*INDEX
;WREG PRODL
;PCL PCLinstr cur + WREG

;WREG D83

;Accesarea elementului 3 din tabel


MOVLW
D3
MOVWF
INDEX
;INDEX D3
MOVF
INDEX, W
;WREG INDEX
CALL
Tabel
;n acest moment n registrul WREG se afl valoarea D83
n exemplul de mai sus se poate observa c tabloul este implementat printr-un set de
instruciuni, grupate n cadrul unei subrutine, care vor fi stocate n memoria program la
inscripionarea microcontrolerului.
Primele trei instruciuni ale subrutinei au rolul de a modifica numaratorul de program
n concordan cu indexul elementului din tabel care se dorete a fi accesat. Valoarea
indexului este ncrcat n registrul de lucru nainte de apelul subrutinei. Ca urmare a
modificrii numrtorului de program se va executa instruciunea RETLW corespunztoare
indexului respectiv, iar valoarea elementului extras din tablou se va regsi n registrul de
lucru.

31

Astfel, pentru a returna valoarea corespunztoare unui anumit index, mai nti trebuie
nmulit index-ul respectiv cu 22 (rezultatul fiind stocat n PRODH:PRODL) dup care
rezultatul este adunat la numrtorul de program.
Instruciunea care va fi executat dup ADDWF PCL, F va avea adresa:
Adres_Instr_Urmtoare = $ + INDEX * 2,
unde $ reprezint adresa instruciunii curente (ADDWF PCL, F).
2.3.2 Implementarea tablourilor folosind instruciuni dedicate
O alt variant de implementare a tablourilor n memoria program o reprezint
folosirea instruciunilor tabelare. Astfel, pentru a citi i scrie memoria program sunt prevzute
dou operaii care permit procesorului s mute octei ntre memoria program i memoria de
date RAM:
Citirea tabelar: TBLRD
Scrierea tabelar: TBLWT
Operaiile de scriere i citire mut datele ntre cele dou spaii de memorie la nivel de
octet prin intermediul unui registru de 8 bii (TABLAT).
Registrul folosit pentru adresarea octeilor din memoria program este TBLPTR (en.
Table Pointer register). ntruct capacitatea de adresare a memoriei program este de pn la
2MByte pentru a putea forma adresa de 21 de bii necesar adresrii fiecrui octet, TBLPTR
este format din trei regitri speciali: Table Pointer Upper Byte, Table Pointer High Byte,
Table Pointer Low Byte (TBLPTRU:TBLPTRH:TBLPTRL)
Aceti regitri sunt utilizai de instruciunile TBLRD i TBLWT pentru accesarea
datelor din memoria program. Operaiile de citire tabelar extrag datele din memoria program
i le plaseaz n memoria de date RAM (Figura 4.1). n registrul special de 8 bii TABLAT se
transfer un octet din memoria program la execuia unei instruciuni de citire tabelar. Adresa
octetului citit trebuie introdus n prealabil n TBLPTR prin intermediul celor 3 regitri de
adres.

Figura 4.1. Citirea tabelar


Operaia de scriere tabelar realizeaz transferul de date ntre memoria de date RAM i
memoria program prin blocuri de minim de 32 de octei. Aceste operaii sunt folosite intern
pentru a incrca o serie de regitri necesari programrii memoriei Flash. Deoarece, registrul
TABLAT are dimensiunea de un octet, instruciunea TBLWT va trebui executat de 32 de ori
pentru fiecare operaie de programare a memoriei. Avnd n vedere faptul c operaia de
scriere tabelar dispune de un grad mai ridicat de complexitate se recomand cititorului s
2

Prezena instruciunii de multiplicare cu 2 (MULLW D2) este justificat de faptul c instruciunea RETLW
este reprezentat n memoria program prin 2 octei.

32

consulte documentaia tehnic (foaia de catalog) a controlerului PIC18F4455, seciunea 6.5


Writing to Program Flash Memory.
Instruciunile tabelare TBLRD i TBLWT ofer i posibilitatea modificrii automate a
regitrilor de adresare TBLPTR printr-o singur instruciune. Formele acestor instruciuni i
operaiile asociate se prezint n Tabelul 4.1.
Instruciunea
TBLRD*
TBLWT*
TBLRD*+
TBLWT*+
TBLRD*TBLWT*TBLRD+*
TBLWT+*

Tabelul 4.1. Parametrii instruciunilor TBLRD i TBLWT


Operaia executat
Se realizeaz o citire / scriere
TBLPTR nu se modific
TBLPTR se incrementeaz dup fiecare scriere / citire
TBLPTR se decrementeaz dup fiecare scriere / citire
TBLPTR se incrementeaz nainte de fiecare scriere / citire

Pentru stocarea unui ir de valori n memoria program se poate folosi o secven de


octei definii folosind operatorul db.
Exemplul urmtor prezint stocarea unui ir de octei n memoria program i citirea
acestora folosind instruciuni TBLRD.
; stocarea irului de valori
Tablou_valori:
db 0x12, 0x13, 0x90, 0x20, 0x18, 0x23, 0x11, 0x55
;
;
;
;
;
;

Rutin de iniializare a regitrilor de adresare


unde: -low instruciune adresat asamblorului pentru
determinarea prii inferioare a adresei la care se afl
eticheta Tablou_valori (adresa primului element din tablou)
- high determinarea prii superioare ...
- upper - determinarea prii de sus ...
Init_Adresa:
MOVLW
MOVWF
MOVLW
MOVWF
MOVLW
MOVWF
RETURN

low Tablou_valori
TBLPTRL
high Tablou_valori
TBLPTRH
upper Tablou_valori
TBLPTRU

; Apelul rutinei de iniializare


CALL

Init_Adresa

; Accesarea elementelor tabloului folosind postincrementarea


TBLRD*+
MOVF

TABLAT, W

33

; Accesul la elementul de la un anumit index3


MOVLW
ADDWF
TBLRD*
MOVF

D3 ;se va returna elementul cu index-ul 3


TBLPTRL, F
TABLAT, W

2.3.3 Implementarea tablourilor folosind adresarea indirect


Adresarea indirect ofer posibilitatea implementrii tablourilor n memoria de date
RAM. Metoda permite accesarea locaiilor de memorie RAM att pentru operaii de citire, ct
i pentru cele de scriere. Astfel, spre deosebire de celelalte metode prezentate n aceast
lucrare se pot implementa cu uurin tablouri de variabile, ce pot fi modificate pe parcursul
execuiei programului.
Pentru detalii privind adresarea indirect i implementarea tablourilor prin aceasta
metod se va consulta Lucrarea 3 Adresarea indirect a memoriei.
3. Probleme propuse
S se stocheze n memoria program 10 valori distincte ntr-un tablou. S se creeze o
subrutin care copiaz tabloul din memoria program n Bank-ul 1 al memoriei de date RAM,
la adrese consecutive.
P1. S se creeze un macro cu 3 argumente care implementeaz cteva operaii
matematice. Argumentul 1 va indica printr-o valoare numeric operaia efectuat (I logic,
SAU EXCLUSIV, adunare, scdere), iar argumentele 2 i 3 vor conine indexul unor
elemente din tablou care reprezint operanzii. Rezultatul operaiilor va fi stocat n memorie la
adresa 203h.
P2. Se va implementa algoritmul de sortare Bubble Sort, care va ordona cresctor
valorile din tablou.

Indicaii
Sugestie privind implementarea macroului de la problema P1
; zona de definire a constantelor care identific operaiile

SI
SAU_EXC
ADUNARE
SCADERE

EQU
EQU
EQU
EQU

D1
D2
D3
D4

; definitia macroului

My_macro macro operatie, index1, index2


;
;
;
;

dac
dac
dac
dac

operatie
operatie
operatie
operatie

=
=
=
=

SI
SAU_EXC
ADUNARE
SCADERE

Mem[203]
Mem[203]
Mem[203]
Mem[203]

=
=
=
=

Tablou[index1]
Tablou[index1]
Tablou[index1]
Tablou[index1]

&
^
+
-

Tablou[index2]
Tablou[index2]
Tablou[index2]
Tablou[index2]

endm

Dac se modific manual valorile din regitrii de adres trebuie avut grij la depirea valorii 255, cnd
trebuie modificat i registrul imediat superior

34

n vederea testrii aplicaiilor i pentru a urmri corectitudinea operaiilor se va utiliza


simulatorul MPLAB SIM mpreun cu uneltele / ferestrele de vizualizare a regitrilor
speciali i a registrilor de uz general. Aceste ferestre pot fi accesate selectnd
View>Special Function Registers, respectiv View>File Registers.

35

Lucrarea 5. Porturi de intrare-ieire


1. Scopul lucrrii
Porturile de intrare-ieire ale microcontrolerui reprezint legtura sa cu lumea
exterioar, prin care acesta poate s trimit i s primeasc date. Obiectivul acestei lucrri
const n introducerea unor modaliti de interfaare a porturilor i familiarizarea cu tehnicile
de programare i simulare necesare pentru realizarea acestui lucru.
2. Consideraii teoretice
Microcontrolerul PIC18F4455 (Figura 5.1) are 5 porturi bidirecionale (PORTA,
PORTB, PORTC, PORTD, PORTE)1, fiecare pin al acestora fiind multiplexat cu mai
multe funcionaliti2. n general, dac se folosete un periferic, atunci pinii corespunztori
acestuia nu pot fi folosii ca pini de intrare/ieire de uz general.

Figura 5.1. Pinii microcontrolerului PIC18F4455


2.1 Structura general a porturilor
Fiecare port are trei regitri folosii pentru configurarea i manipularea lui:
registrul TRISx (de configurare a direciei pinilor portului);
registrul PORTx (de citire a datelor de pe port);
registrul LATx (de scriere a datelor pe port).
unde x{A,B,C,D,E}.
Prin registrul TRIS corespunztor fiecrui port se poate configura direcia individual
a pinilor. Astfel, un bit = 0 va seta pinul corespunztor pe ieire, iar un bit = 1 va seta pinul
corespunztor pe intrare.
nainte de a utiliza porturile pentru operaii de intrare-ieire acestea trebuie iniializate.
Iniializarea presupune urmtoarele etape:
tergerea regitrilor PORTx i LATx pentru eliminarea datelor reziduale care
s-ar putea gsi acolo;

Nu toate porturile au dimensiunea de 8 bii (vezi Figura 5.1). De exemplu, portul E utilizeaz doar 3 bii
corespunztori pinilor RE0-RE2.
2
De exemplu, pinul 2 (RA0/AN0), care aparine portului A, poate funciona att ca pin digital de intrare / ieire
de uz general (RA0) sau ca pin de intrare analogic (AN0). Prin configurarea / iniializarea adecvat se va alege
funcionalitate potrivit aplicaiei realizate.

36

Configurarea pinilor ca pini digitali de intrare-ieire de uz general n registrul


ADCON1 al convertorului Analog/Digital pentru PORTA, PORTB,
PORTE3;
Oprirea comparatoarelor prin configurarea registrului CMCON pentru PORTA;
Configurarea direciei pinilor, prin intermediul regitrilor TRISx.
n continuare se exemplific iniializarea portului A. ntruct portul A este multiplexat
cu convertorul A/D i cu un comparator, configurarea acestuia implic i dezactivarea acestor
periferice.
CLRF

PORTA

;tergerea registrului PORTA

CLRF

LATA

;tergerea registrului LATA

MOVLW
MOVWF

0x0F
ADCON1

;Configurare convertor A/D pentru


;pini I/O digitali de uz general

MOVLW
MOVWF

07h
CMCON

;Oprire comparatoare

MOVLW
MOVWF

B11111100
TRISA

;Setare pini RA<2:7> ca intrari


;i RA<0:1> ca ieiri

n cele ce urmeaz se va prezenta schema electric de conectare, diagrama de


activitate i implementarea unui simplu program care testeaz apsarea a dou butoane,
conectate pe pinii RD0 i RD1. Dac butoanele sunt apsate, se vor aprinde LED-urile
corespunztoare (pentru butonul de pe RD0 se va aprinde LED-ul conectat pe RD2, iar pentru
de pe RD1 se va aprinde LED-ul conectat pe pinul RD3).

Figura 5.2. Schema electric i diagrama de activitate

Aceste porturi sunt multiplexate cu convertorul Analog/Digital

37

LIST P=18F4455
#include <P18F4455.INC>

;definire tip procesor


;definire variabile procesor

;Adresa de reset
ORG 0x800
;Programul principal
Initializare_port:
CLRF
PORTD
CLRF
LATD
MOVLW
MOVWF

b'00000011'
TRISD

;tergere buffere
;configurare direcie pini
;RD0, RD1 intrri
;RD2, RD3 ieiri

Test_buton1:
BTFSS
GOTO
GOTO

PORTD, 0
;test buton legat pe pinul RD04
Buton1_apasat
Buton1_eliberat

Test_buton2:
BTFSS
GOTO
GOTO

PORTD, 1
;test buton legat pe pinul RD1
Buton2_apasat
Buton2_eliberat

Buton1_apasat:
BSF
LATD, 2
GOTO
Test_buton2

;aprinde LED15

Buton1_eliberat:
BCF
LATD, 2
GOTO
Test_buton2

;stinge LED1

Buton2_apasat:
BSF
LATD, 3
GOTO
Test_buton1

;aprinde LED2

Buton2_eliberat:
BCF
LATD, 3
GOTO
Test_buton1

;stinge LED2

;sfritul programului
END

Conform montajului din Figura 5.2, la apsarea unui buton se va citi valorea 0, iar atunci cnd butonul este
eliberat se citete valoarea 1
5
LED-urile se vor aprinde prin setarea (punerea pe 1) a bitului corespunztor

38

2.2 Detectarea fronturilor


Exist numeroase situaii, n cazul aplicaiilor cu microcontroler, cnd simpla citire a
strii semnalelor de intrare nu este suficient, ci este nevoie de detectarea modificrilor de
stare a acestor semnale. Acest lucru nu este valabil doar n cazul butoanelor, ci i la
recepionarea datelor de la diveri senzori.
Detectarea apsrii unui buton necesit o atenie deosebit deoarece n acest caz o
serie de elemente fizice influeneaz direct semnalul rezultat. ntruct contactele unui buton
(sau releu) nu se nchid perfect instantaneu la fiecare apsare, semnalul rezultat va prezenta
foarte multe zgomote / oscilaii imediat dup apsare, zgomote care sunt percepute de
microcontroler ca apsri succesive ale butonului.
n Figura 5.3 se exemplific acest fenomen.

Figura 5.3. Oscilaii la apsarea / eliberarea butoanelor


Intervalul de stabilizare a semnalului se numete prel. Intervalul de timp alocat prelului poate varia foarte mult n funcie de tipul butonului i caracteristicile apsrii efectuate
(ex. o apsare lent sau una rapid). Tocmai din aceast cauz, nainte de a trece la
implementare, se recomand determinarea prel-ul mediu al butonului implicat cu ajutorul
unui osciloscop.
De regul butoanele uzuale au un prel cuprins ntre 200s i 10ms. n aplicaiile care
vor urma, pentru a ne asigura c prel-ul a fost depit se va considera un interval de
stabilizare cu durata P =10ms.
Eliminarea oscilaiilor din intervalul de stabilizare se face prin program relativ simplu.
Ideea de baz este de a citi periodic (eantiona) semnalul care provine de la buton i de a filtra
zgomotele produse. Exist mai multe abordri privind rezolvarea acestei probleme. Una dintre
ele presupune utilizarea unui contor pentru a determina durata de timp n care semnalul a fost
n stare logic 0. Dac semnalul respectiv a fost 0 continuu o anumit durat de timp,
atunci acel semnal poate fi considerat stabil, iar butonul apsat. Practic, la apariia unui front
de apsare se ateapt un timp P n care alte fronturi nu se iau n considerare. Dup expirarea
acestui interval se poate considera c a avut loc o apsare.
Listingul de mai jos prezint o modalitate de rezolvare a acestei probleme.
1
2
3
4
5
6
7
8
9
10
11
12

Se declar o variabil contor care se iniializeaz cu zero


Se genereaz un eveniment periodic de eantionare6. Se recomand o
perioad de 1ms
La apariia evenimentului de eantionare:
if semnal buton este 1 logic then
Resetare varibil contor pe zero
Stare buton = eliberat
else
Incrementare varibil contor
end if
if contor = 10 then
Stare buton = apsat
end if

Se poate utiliza un timer pentru generarea acestui eveniment sau se pot utiliza temporizri software cuprinse n
cadrul unor bucle de tip for, caz n care listingul de mai sus poate suferi mici modificri.

39

2.3 Conectarea circuitelor externe


Pentru conectarea butoanelor, a LED-uri, dar i a altor componente externe la un
microcontroler, trebuie respectate cu strictee limitele curenilor de intrare i ieire ale
microcontrolerului (Tabelul 5.1) precum i cele asociate componentelor externe.
Nerespectarea limitelor impuse poate conduce la arderea pinilor sau chiar a porturilor precum
i la arderea componentelor externe.
Tabelul 5.1. Caracteristici electrice ale porturilor7
Caracteristica
Valoare [mA]
Curentul maxim de ieire pe Vss
300
Curentul maxim de intrare pe Vdd
250
Curentul maxim de intrare pe pinul oricrui port
25
Curentul maxim de ieire pe pinul oricrui port
25
Curentul maxim de intrare pe toate porturile
200
Curentul maxim de ieire pe toate porturile
200
n cele ce urmeaz se prezint cteva exemple de conectare a unor circuite externe la
microcontroler.

Figura 5.4. Conectarea butoanelor sau a ntreruptoarelor

Figura 5.5. Conectarea LED-urilor cu consum mai mic de 20mA

Valabile pentru PIC18F4455

40

Figura 5.6. Conectarea LED-urilor cu consum mai mare de 20mA

Figura 5.7. Schema de comand a unui releu

Figura 5.8. Afiajul cu apte segmente. Dispunerea segmentelor

41

Figura 5.9. Conectarea afiajelor cu apte segmente cu catod comun8

Figura 5.10. Conectarea afiajelor cu apte segmente cu anod comun9

Figura 5.11. Conectarea unui afiaj multiplexat de 7 segmente cu catod comun de 4 digii

LED-urile acestui tip de afisaj cu 7 segmente sunt active pe 1 logic. Catodul se va conecta la mas.
LED-urile acestui tip de afisaj cu 7 segmente sunt active pe 0 logic. Anodul se va conecta la o surs de
tensiune.
9

42

Figura 5.12. Conectarea unui afiaj multiplexat de 7 segmente cu anod comun de 4 digii
2.4 Simularea aplicaiilor utiliznd modulul Stimulus Controller
Debuggerul din MPLAB IDE permite nu numai simularea comportamentului
programului implementat, ci i simularea modificrii strii pinilor microcontrolerului n care
va rula programul. Acest lucru se realizeaz cu ajutorul modulului integrat din cadrul
debuggerului MPLAB SIM, denumit Stimulus Controller.
Acest modul permite simulatorului s aplice diveri stimuli n timp ce se realizeaz
depanarea codului (debugging). Se permite punerea pinilor pe nivel logic 1 sau 0 i se pot
modifica direct valorile din regitri pentru a putea simula ct mai bine comportamentul real al
sistemului.
Pentru a putea avea acces la modulul Stimulus Controller se alege mai nti din meniu:
Debugger>Select Tool>MPLAB SIM. Dup alegerea simulatorului, n meniul Debugger va
aprea opiunea Stimulus, iar pentru a crea un nou scenariu de simulare se va accesa
Debugger>Stimulus>New Workbook.
Fereastra deschis la selectarea acestei opiuni se prezint n Figura 5.13 i permite
configurarea strii porturilor microcontrolerului cu ajutorul stimulilor.
Stimulii asociai pinilor sunt definii de utilizator i se pot ncadra n dou categorii:
Asincroni10 Vor fi declanai de utilizator prin apsarea butonului Fire
Sincroni Pot aprea la intervale regulate de timp, constnd din succesiuni de
nivele de tensiuni nalte i joase (1, respectiv 0 logic) cu factor de umplere
configurabil
Pentru configurarea diverselor aciuni care pot fi asociate pinilor i nu numai, vor
trebui completate celulele corespunztoare coloanelor ferestrei. Acestea au urmtoarele
funcionaliti:
Fire: apsarea liniei din coloana Fire va duce la execuia aciunii configurate;
Pin/SFR: selectarea pinului sau bitului SFR a crui stare se va modifica;
Action: selectarea aciunii executate asupra pinului selectat:

10

Stimulii asincroni se folosesc de obicei la testarea aplicaiilor care utilizeaz butoane, deoarece apsarea unui
buton poate surveni oricnd n timpul execuiei unui program, fiind astfel un eveniment asincron.

43

Set High: stare logic 1;


Set Low: stare logic 0;
Toggle: negarea strii logice curente;
Pulse High: generarea unui impuls pe 1 pe pinul selectat;
Pulse Low: generarea unui impuls pe 0 pe pinul selectat;
Width: valabil doar pentru Pulse High i Pulse Low lungimea impulsului;
Units: valabil doar pentru Pulse High i Pulse Low unitatea de msur
pentru opiunea Width;
Comments: adugarea de comentarii pentru aciunea configurat.
Stimulus Controller permite pe lng crearea de scenarii i deschiderea sau salvarea
scenariilor create.

Figura 5.13. Stimulus Controller. Fereastra de creare a unui nou scenariu


Dup configurarea stimulilor, prin apsarea liniei Fire corespunztoare aciunii
configurate, aciunea va intra n execuie. n continuare, utilizatorul poate urmri execuia
programului n maniera prezentat n lucrrile anterioare, prin utilizarea de Breakpoint-uri sau
prin urmrirea regitrilor. La apsarea liniei Fire n fereastra Output este vizibil un mesaj prin
care utilizatorul este notificat de activarea aciunii respective.
n Figura 5.14 se poate observa o fereastr Stimulus Controller configurat. S-a ales
pinul RD0, pe care se simuleaz apariia unei stri logice 1. Aceast stare va aprea la
apsarea liniei Fire, iar mesajul de notificare va fi vizibil n ferestra Output.

44

Figura 5.14. Fereastra Output i fereastra Stimulus Controller


cu o aciune configurat i executat
3. Probleme propuse
Se consider dou butoane legate pe PORTD<0:1>, dou LED-uri legate pe
PORTD<2:3> i 8 LED-uri legate pe PORTB<0:7>.
P1. S se implementeze i s se testeze aplicaia prezentat n paragraful 2.1
P2. S se realizeze o aplicaie care va implementa 4 secvene distincte de aprindere a
celor 8 LED-uri de pe portul B la apsarea celor dou butoane.
P3. S se realizeze o aplicaie care va incrementa numrului afiat n binar pe cele 8
LED-uri de pe portul B la apsarea butonului de pe pinul RD0, i va decrementa numrul
respectiv la apsarea celui de-al doilea buton aflat pe pinul RD1.

Indicaii
Pentru implementarea pe microcontroler a aplicaiilor se va consulta Anexa 4.
Se va testa funcionarea corect a aplicaiilor folosind modulul Stimulus Controller.
n cazul problemelor P2 i P3 se vor realiza diagramele de activitate.
Se recomand ca iniializarea porturilor s fie cuprins n cadrul unei subrutine.

45

Lucrarea 6. Temporizri software


1. Scopul lucrrii
Realizarea temporizrilor reprezint un aspect de baz n cadrul oricrui sistem de
calcul. Cea mai simpl modalitate de realizare a temporizrilor presupune utilizarea timpului
de execuie al instruciunilor. Obiectivul acestei lucrri const n generarea unor temporizri
de ordinul milisecundelor, sau chiar al secundelor utiliznd instruciunile microcontrolerului,
al cror timp de execuie individual este cuprins ntre 0.2s i 0.6s
2. Consideraii teoretice
Timpul de execuie al instruciunilor este direct influenat de frecvena de lucru1
conform urmtoarei relaii:
Ti = 4 TOSC =

(6.1)

FOSC

unde: cu Ti s-a notat timpul de execuie al unui ciclu de instruciune, TOSC reprezint durata
unui microciclu instruciune, iar FOSC reprezint frecvena de lucru.
Indiferent de valoarea frecvenei de lucru, se observ c tactul este divizat cu 4 pentru
asigurarea celor 4 microcicluri necesari prelucrrii instruciunilor2.
Majoritatea instruciunilor sunt executate ntr-un ciclu de instruciune cu durata Ti . Acestea
sunt de regul instruciunile scurte (reprezentate n memoria program prin 2 octei = 16bii)
sau instruciunile care nu modific numrtorul de program (nu efectueaz salturi).
Instruciunile lungi (32 de bii) sau cele care modific numrtorul de program vor necesita
pentru execuie 2 sau chiar 3 cicluri de instruciune, n funcie de context3.
De exemplu, instruciuni precum MOVLW, BSF sau CLRF se execut ntr-un timp Ti ,
pe cnd instruciuni cum ar fi CALL sau GOTO se execut ntr-un timp 2 Ti . Pe de alt parte,
o serie de instruciuni de salt condiionat cum ar fi BTFSC, INCFSZ pot ajunge s se execute
chiar i n 3 cicluri de instruciune ( 3 Ti ), dac instruciunea respectiv va realiza salt peste o
instruciune lung.
Avnd n vedere c microcontrolerele suport foarte multe frecvene de lucru, iar
durata unui ciclu de instruciune este strict corelat cu aceast frecven, conform relaiei
(6.1), n continuare se va considera pentru frecvena de lucru o valoare des ntlnit n practic
FOSC = 20MHz.
Astfel, durata unui ciclu de instruciune Ti va fi:
Ti = 4 TOSC =

4
= 0.2 s
20 MHz

(6.2)

n continuare se vor prezenta cteva exemple de implementare a unor temporizri


uzuale. Pentru toate secvenele de cod ce urmeaz a fi prezentate se consider o frecven de
lucru de 20MHz.

Frecvena de lucru poate fi generat fie de un oscilator extern (cristal de cuar) sau de o rezisten i un
condensator, fie de oscilatorul intern.
2
Sunt necesare 4 microcicluri att pentru faza de extracie ct i pentru cea de execuie a instruciunilor.
Arhitectura microcontrolerului bazata pe un pipeline pe 2 nivele pentru execuia instruciunilor asigur c la
fiecare 4 microcicluri se termin de executat o instruciune scurt.
3
Pentru detalii privind timpul de execuie al instruciunilor, recomandm cititorului s consulte documentaia
tehnic a microcontrolerului PIC18F4455, seciunea Instruction Set Summary sau Anexa 1 a acestei lucrri

46

2.1 Temporizare de 1s
Un exemplu de rutin care produce o ntrziere de 1 microsecund este urmtorul:
Delay1us:
NOP
RETURN
...
CALL

;0.2us
;0.4us
Delay1us

;0.4us

n exemplul anterior, timpul necesar execuiei rutinei Delay1us se calculeaz n


felul urmtor:
(Delay1us) = (CALL) + (NOP) + (RETURN) = 0.4s + 0.2s + 0.4s = 1s
n rutina Delay1Micro s-a utilizat instruciunea NOP deoarece aceasta nu afecteaz
nici un registru. Astfel, rutina creat poate fi utilizat n orice context execuie. Desigur, n
locul instruciunii NOP se poate utiliza orice alt instruciune care s se execute n 0.2s, dac
se iau n considerare i efectele posibile ale instruciunii incluse n rutin.
2.2 Temporizare de 1ms
Pentru a obine o temporizare de 1 milisecund se vor utiliza bucle de instruciuni.
Buclele se implementeaz cu ajutorul instruciunilor de salt i al etichetelor. Numrarea
salturilor se realizeaz prin utilizarea variabilelor cu rol de contor.
Prin execuia rutinei urmtoare se atinge o intrziere de exact 1 milisecund:
contor EQU 0x00
Delay1ms:
MOVLW
MOVWF
Loop:
CALL
CALL
CALL
CALL
DECFSZ
GOTO
NOP
NOP
NOP
RETURN
...
CALL

D'217'
V_DELAY

;0.2us
;0.2us

Delay1us
Delay1us
Delay1us
Delay1us
contor,F
Loop

;1us
;1us
;1us
;1us
;0.2us far salt/0.6us daca salt
;0.4us
;0.2us
;0.2us
;0.2us
;0.4us

Delay1ms

;0.4us

Durata ntrzierii atinse se calculeaz n felul urmtor:


(Delay1ms) = (CALL) + (MOVLW) + (MOVWF) + (217 - 1)( 4(Delay1us) +
(DECFSZ)fr salt + (GOTO) ) + 4(Delay1us) + (DECFSZ)cu salt +
3(NOP) + (RETURN) = 0.4s + 0.2s + 0.4s = 0.4s + 0.2s + 0.2s +
(217 - 1)(41s + 0.2s + 0.4s) + 41s + 0.6s + 30.2s + 0.4s
= 1ms

47

2.3 Funcii C pentru ntrzieri


Instalarea compilatorului MPLAB C18 pentru MPLAB IDE pune la dispoziia
utilizatorului o serie de funcii C predefinite, foarte utile pentru realizarea aplicaiilor pentru
microcontroler folosind limbajul de programare C.
Funciile prezentate n Tabelul 6.1 implementeaz ntrzieri software. Aceste funcii
execut cod pe durata unui numr specific de cicluri de instruciune. n aceste condiii durata
ntrzierilor realizate este strns legat de frecvena de lucru a microcontrolerului.
Tabelul 6.1. Funcii C pentru ntrzieri software definite n biblioteca delays.h
Funcia
Descriere
Delay1TCY
ntrziere egal cu durata unui ciclu instruciune
Delay10TCYx
ntrziere egal cu durata a 10 cicluri instruciune argument funcie
Delay100TCYx ntrziere egal cu durata a 100 cicluri instruciune argument funcie
Delay1KTCYx
ntrziere egal cu durata a 1000 cicluri instruciune argument funcie
Delay10KTCYx ntrziere egal cu durata a 10000 cicluri instruciune argument funcie
Descrierea funciilor
Delay1TCY
Funcia:
Include:
Prototip:
Detalii:

ntrziere egal cu durata unui ciclu instruciune (Ti)


delays.h
void Delay1TCY (void);
Aceast funcie este de fapt un #define pentru instruciunea NOP. Practic, n
codul surs, aceast funcie va fi nlocuit la compilare de instruciunea NOP.
Pentru o frecven de lucru FOSC=20MHz, funcia Delay1TCY()realizeaz o
ntrziere de 0.2s

Delay10TCYx
ntrziere egal cu durata a 10 cicluri instruciune argument funcie
Funcia:
delays.h
Include:
void Delay10TCYx (unsigned char unit);
Prototip:
Argumente: unit
Valoare pe 8 bii. O valoare din domeniul [1,255] va determina o ntrziere
egal cu (unit*10)cicluri de instruciune (Ti). Valoarea 0 va determina o
ntrziere egal cu 2560Ti
Aceast funcie implementeaz ntrzieri cu durata egal cu multiplii de 10 a
Detalii:
timpului alocat unui ciclu instruciune.
Delay100TCYx
ntrziere egal cu durata a 100 cicluri instruciune argument funcie
Funcia:
delays.h
Include:
void Delay100TCYx (unsigned char unit);
Prototip:
Argumente: unit
Valoare pe 8 bii. O valoare din domeniul [1,255] va determina o ntrziere
egal cu (unit*100)cicluri de instruciune (Ti). Valoarea 0 va determina o
ntrziere egal cu 25600Ti
Aceast funcie implementeaz ntrzieri cu durata egal cu multiplii de 100 a
Detalii:
timpului alocat unui ciclu instruciune. Funcia se folosete de o variabil
global DelayCounter1. Astfel, dac funcia se utilizeaz att n programul
principal, ct i n rutine de tratare a ntreruperilor se recomand salvarea
variabilei la intrarea n rutina i refacerea ei la revenirea din rutin. Trebuie
48

luat n considerare faptul c variabila DelayCounter1 este o varibil


global utilizat i de alte funcii care implementeaz ntrzieri.
Delay1KTCYx
ntrziere egal cu durata a 1000 cicluri instruciune argument funcie
Funcia:
delays.h
Include:
void Delay1KTCYx (unsigned char unit);
Prototip:
Argumente: unit
Valoare pe 8 bii. O valoare din domeniul [1,255] va determina o ntrziere
egal cu (unit*1000)cicluri de instruciune (Ti). Valoarea 0 va determina o
ntrziere egal cu 256000Ti
Aceast funcie implementeaz ntrzieri cu durata egal cu multiplii de 1000
Detalii:
a timpului alocat unui ciclu instruciune. Funcia se folosete de dou variabile
globale DelayCounter1 i DelayCounter2. Astfel, dac funcia se
utilizeaz att n programul principal, ct i n rutine de tratare a ntreruperilor
se recomand salvarea variabilei la intrarea n rutin i refacerea ei la
revenirea din rutin. Trebuie luat n considerare faptul c variabila
DelayCounter1 este o varibil global utilizat i de alte funcii care
implementeaz ntrzieri.
Delay10KTCYx
ntrziere egal cu durata a 10000 cicluri instruciune argument funcie
Funcia:
delays.h
Include:
void Delay10KTCYx (unsigned char unit);
Prototip:
Argumente: unit
Valoare pe 8 bii. O valoare din domeniul [1,255] va determina o ntrziere
egal cu (unit*1000)cicluri de instruciune (Ti). Valoarea 0 va determina o
ntrziere egal cu 2560000Ti
Aceast funcie implementeaz ntrzieri cu durata egal cu multiplii de 10000
Detalii:
a timpului alocat unui ciclu instruciune. Funcia se folosete de o variabil
global DelayCounter1. Astfel, dac funcia se utilizeaz att n programul
principal, ct i n rutine de tratare a ntreruperilor se recomand salvarea
variabilei la intrarea n rutina i refacerea ei la revenirea din rutin. Trebuie
luat n considerare faptul c variabila DelayCounter1 este o varibil
global utilizat i de alte funcii care implementeaz ntrzieri.
Pentru exemplificarea utilizrii acestor funcii la realizarea temporizrilor se consider
cazul temporizrii de 1ms, realizat n contextul utilizrii unui microcontroler cu frecvena de
lucru FOSC=20MHz
Delay1KTCYx(5);
//sau
Delay100TCYx(50);

// 5*1000*0.2us = 1ms
//50*100*0.2us = 1ms

49

3. Probleme propuse
P1. S se implementeze o rutin de temporizare care s genereze o ntrziere de 250
milisecunde. Se consider dou butoane legate pe PORTD<0:1>, dou LED-uri legate pe
PORTD<2:3> i 8 LED-uri legate pe PORTB. S se implementeze un program cu
urmtoarele funcionaliti:
ct timp nu este apsat nici un buton sau sunt apsate ambele butoane, LEDurile s plpie la intervale de 250 milisecunde;
ct timp butonul D0 este apsat, LED-urile s rmn aprinse;
ct timp butonul D1 este apsat, LED-urile s rmn stinse.
P2. S se implementeze o lumin dinamic (aprinderea succesiv a LED-urilor
conform unei secvene predefinite) pe cele 8 LED-uri conectate la PORTB. Se vor considera
dou temporizri selectabile prin butonul D0 i dou secvene diferite de aprindere a LEDurilor selectabile prin butonul D1.
P3. Folosind o rutin de temporizare care asigur o ntrziere de 250ms s se
incrementeze periodic valoarea afiat (0,1,2...9,0,...) pe un afisaj cu apte segmente conectat
la PORTB.

Indicaii
Pentru implementarea pe microcontroler a aplicaiilor se va consulta Anexa 4.
Temporizrile necesare vor fi realizate folosind rutinele de temporizare de 1s i 1ms
prezentate n cadrul acestei lucrri
n modul de simulare al aplicaiei (MPLAB SIM) se va utiliza unealta Stopwatch
pentru a vizualiza timpul de execuie al rutinelor de ntrziere astfel nct s se asigure
temporizri ct mai precise. Pentru detalii privind utilizarea modulului Stopwatch se
va consulta lucrarea nr. 1.
Se recomand ca n timpul simulrii s se fac apel i la modulul Stimulus Controller
pentru a se asigura o simulare ct mai complet nainte de implementarea pe
microcontroler.
nainte de implementare se va realiza diagrama de stare i de activitate a funcionrii
LED-urilor
Se recomand ca iniializarea porturilor s fie cuprins n cadrul unei subrutine.
n cazul problemei P3 s se identifice codurile corespunztoare cifrelor afiate pe cele
apte segemente.

50

Lucrarea 7. Temporizri hardware


1. Scopul lucrrii
Unul din motivele principale pentru care microcontrolerele sunt utilizate pe scar larg
n cadrul sistemelor ncorporate este acela c au capacitatea de a realiza diverse sarcini
temporizate n timp. Obiectivul acestei lucrri este de a familiariza cititorul cu o serie de
aspecte specifice circuitelor de temporizare, cunoscute sub denumirea de Timere i a
diferitelor moduri de interfaare a acestora
2. Consideraii teoretice
Microcontrolerul PIC18F4455 pune la dispoziia utilizatorului 4 timere denumite
sugestiv Timer0, Timer1, Timer2 i Timer3. n funcie de timerul utilizat pot fi implementate
diferite funcionaliti, pe lng cea de temporizare. Fiind nite periferice foarte versatile, pot
fi implementate temporizri ale tactului intern, numrarea impulsurilor externe, ceasuri de
timp real, divizoare programabile. De asemenea, timerele vor inteveni i n cazul utilizrii
convertorului analog/digital, a modulelor PWM etc.
n general, se recomand urmtoarele domenii de utilizare pentru timere:
Timer0 aplicaii periodice (eantionri)
Timer1 i Timer3 aplicaii cu consum redus de energie, aplicaii care utilizeaz
convertorul A/D sau circuitele de comparare i captur (modulele CCP)
Timer2 generarea de semnale PWM
2.1 Structura intern
n continuare se va analiza Timerul0 i se vor exemplifica modalitile sale de
configurare i utilizare.
Din punct de vedere structural Timer0 dispune de urmtoarele caracteristici:
este un numrtor n sus de 8 sau 16 bii, opiune selectabil din soft;
valoarea numrtorului este stocat n doi regitri (TMR0H:TMR0L) accesibili att
pentru scriere ct i pentru citire;
dispune de un predivizor programabil1 de 8 bii cu rol de divizare a tactului de
incrementare;
poate numra, n funcie de configurare, impulsuri interne sau externe;
n cazul impulsurilor externe se poate selecta frontul de numrare;
genereaz o ntrerupere la depirea capacitii de numrare2.
Simplitatea utilizrii timerului 0 este dat de faptul c toi biii de configurare se
gsesc ntr-un singur registru: T0CON.
bit 7
TMR0ON

T08BIT
T0CS
T0SE
PSA
T0PS2
T0PS1
Figura 7.1. Registrul T0CON: Timer0 Control Register

bit 0
T0PS0

n unele situaii este util ca timerul s nu se incrementeze la fiecare tact, ci doar la fiecare 2, 4, 16, ... 256,
tacturi recepionate. Situaia aceasta apare frecvent la necesitatea implementrii unor temporizri la nivel de
secund.
2
Cnd se face trecerea de la valoarea maxim (65535 cnd este numrtor de 16 bii, respectiv 255 cnd este
numrtor de 8 bii) la 0

51

Bit 7
Bit 6
Bit 5

Bit 4

Bit 3
Biii 2-0

TMR0ON Bit de Pornire / Oprire Timer0


1 = Pornire Timer0
0 = Oprire Timer0
T08BIT Bit selecie numrtor pe 8 / 16 bii
1 = Timer0 este configurat ca numrtor pe 8 bii
0 = Timer0 este configurat ca numrtor pe 16 bii
T0CS Bit selecie surs tact de incrementare
1 = impulsuri externe (tranziii pe pinul T0CKI)
0 = impulsuri interne (tactul de execuie al instruciunilor FOSC/4)
T0SE Bit selecie front de numrare pentru impulsurile externe
1 = front descresctor pe pinul T0CKI
0 = front cresctor pe pinul T0CKI
PSA Bit Utilizare / Dezactivare predivizor
1 = Dezactivare predivizor
0 = Utilizare predivizor
T0PS2:T0PS0 Bii de selecie a valorii de predivizare
111 = Raport de predivizare 1:256
110 = Raport de predivizare 1:128
101 = Raport de predivizare 1:64
100 = Raport de predivizare 1:32
011 = Raport de predivizare 1:16
010 = Raport de predivizare 1:8
001 = Raport de predivizare 1:4
000 = Raport de predivizare 1:2

Accesarea valorii numrtorului se poate face prin instruciuni obinuite att pentru
scriere, ct i pentru citire, prin intermediul regitrilor TMR0L i TMR0H. Accesul la aceti
regitri se face n felul urmtor:
- Cnd Timer0 funcioneaz ca numrtor de 8 bii (T08BIT = 1), valoarea
numrtorului este accesibil n mod direct prin registrul TMR0L. n acest situaie
TMR0H nu se utilizeaz;
- Cnd Timer0 funcioneaz ca numrtor de 16 bii (T08BIT = 0), valoarea
numrtorului este accesibil prin cei doi regitri menionai anterior3. Astfel, TMR0H
va conine octetul superior al valorii, iar TMR0L va conine octetul inferior. La citirea
TMR0L, valoarea octetului superior se transfer n registrul TMR0H. Acest registru este
accesibil direct prin operaii normale de citire/scriere. La scrierea registrului TMR0L,
valoarea stocat n TMR0H se va transfera n octetul superior al timerului. Prin aceast
arhitectur, timerul permite un acces atomic la valoarea numrtorului pe 16 bii pe o
magistral de 8 bii4.
Timerul0 va genera o ntrerupere la depirea capacitii de numrare, atunci cnd
valoarea numrtorului trece de la FFh la 00h, n mod de lucru de 8 bii, sau de la FFFFh la
0000h n mod de lucru de 16 bii. Acest depire va fi semnalat prin setarea bitului
TMR0IF din registrul INTCON. Pentru a putea detecta o nou depire flag-ul de semnalizare
TMR0IF trebuie ters din program.

Accesarea valorii numrtorului se face prin 2 regitrii ntruct instruciunile microcontrolerului permit doar
citirea unor date de 8 bii. Astfel, cei 16 bii se vor accesa pe rnd n 2 etape.
4
ATENIE operaiile de scriere / citire trebuie s respecte ordinea menionat

52

2.2 Configurarea Timerului0


nainte de a realiza configurarea efectiv a Timerului0, n vederea realizrii unei
temporizri, trebuie determinat valoarea de iniializare a numrtorului corespunztoare
temporizrii dorite.
Astfel, dac se dorete o temporizare bazat pe tactul de execuie al instruciunilor se
poate utiliza urmtoarea formul:
Tdorita = NrIncr Predivizor Ti = NrIncr Pr edivizor

4
FOSC

(7.1)

unde:
- Tdorita este durata temporizrii dorite
- NrIncr este numrul total de impulsuri care trebuie numrate pentru obinerea
temporizrii dorite
- Predivizor este valoarea predivizorului (se vor considera valorile predefinite posibile
Pr edivizor {1,2,4,8,16,32,64,128,256} )
-

Ti =

4
FOSC

este tactul de execuie al instruciunilor. Pentru FOSC = 20MHz Ti = 0.2 s

Pentru exemplificare se va considera determinarea valorii de iniializare a


numrtorului necesar obinerii unei temporizri de o secund. Se va considera cazul unui
microcontroler care dispune de un cuar cu FOSC = 20MHz .
Conform relaiei (7.1), pentru un raport de predivizare de 1:256, obinem5:
(7.2)
1s = NrIncr 256 0.2 10 6 s
NrIncr = 19531.25 19531
(7.3)
Din relaiile de mai sus rezult c pentru obinerea unei temporizri de o secund,
Timerul0 va trebui s numere 19531 impulsuri cu perioada Ti = 0.2 s , va utiliza un raport de
predivizare de 1:2566 i va fi configurat ca numrtor pe 16 bii.
Pentru a putea fi semnalat expirarea temporizrii prin intermediul flag-ului TMR0IF,
numrtorul va trebui iniializat cu valoarea 65535-19531=46004. Astfel, avnd n vedere
faptul c numrtorul numr n sus, n momentul depirii capacitii de numrare vor fi fost
numrate impulsurile necesare pentru obinerea temporizrii dorite, care va fi semnalat prin
setarea bitului TMR0IF.
Cei doi regitri TMR0H:TMR0L vor trebui iniializai cu valorile:
(46004)10 = B3B4h
B3h TMR0H
(7.4)
B4h TMR0L
n general, problema iniializrii timerului se rezum la determinarea perechii: valoare
de iniializare - raport de predivizare pe baza relaiei (7.1).
Odat determinat valoarea de iniializare a Timerului0 se poate trece la etapa de
configurare, care presupune parcurgerea urmtorior pai:
oprirea timerului (bitul TMR0ON=0, registrul T0CON) ;
selectarea sursei de incrementare (bitul T0CS, registrul T0CON):
n cazul unei surse externe de incrementare se va selecta frontul utilizat (bitul T0SE,
registrul T0CON)
selectarea utilizrii predivizorului (bitul PSA, registrul T0CON)
n cazul utilizrii predivizorului se va selecta raportul de predivizare dorit (biii
TOPS2:TOPS0, registrul T0CON)
selectarea modului de funcionare (bitul T08BIT, registrul T0CON);
5
6

Dac se consider un raport de predivizare de 1:128, rezult NrIncr = 39062


Practic se numr fiecare al 256-lea impuls

53

tergerea flag-ului de semnalizare (bitul TMR0IF, registrul INTCON);


iniializarea valorii timerului (regitrii TMR0H i TMR0L)
pornirea timerului (bitul TMR0ON, registrul T0CON).
Pentru exemplificare se va considera cazul analizat anterior, care conduce la obinerea
unei temporizri cu durata de o secund.
CONFIGURARE_TIMER0:
BCF
T0CON, TMR0ON
BCF
T0CON, T0CS
BCF
T0CON, PSA
BSF
T0CON, TOPS2
BSF
T0CON, TOPS1
BSF
T0CON, TOPS0
BCF
T0CON, T08BIT
MOVLW
0xB3
MOVWF
TMR0H
MOVLW
0xB4
MOVWF
TMR0L
BCF
INTCON, TMR0IF
BSF
T0CON, TMR0ON

;Oprirea timerului
;Tact intern
;utilizare predivizor
;predivizare 1:256
;numrtor 16bii
;init. Timer0 cu val 46004

;Stergerea flag-ului
;Pornirea timerului

LOOP_TESTARE:
BTFSS
INTCON, TMR0IF
GOTO LOOP_TESTARE
;Cnd se ajunge n acest punct, temporizarea s-a terminat
Bineneles, configurarea timerului se poate realiza i ntr-un singur pas, prin
specificarea valorii octetului care va trebui nscris n registrul T0CON.
n continuare, se prezint acelai exemplu de configurare, dar utiliznd limbajul de
programare C7.
T0CONbits.TMR0ON = 0;
T0CONbits.T0CS = 0;
T0CONbits.PSA = 0;
T0CONbits.TOPS2 = 1;
T0CONbits.TOPS1 = 1;
T0CONbits.TOPS0 = 1;
T0CONbits.T08BIT = 0
TMR0H = 0xB3;
TMR0L = 0xB4;
INTCONbits.TMR0IF = 0;
T0CONbits.TMR0ON = 0;

//Oprirea timerului
//Tact intern
//utilizare predivizor
//predivizare 1:256
//numrtor 16bii
//init. Timer0 cu val 46004
//Stergerea flag-ului
//Pornirea timerului

if (INTCONbits.TMR0IF == 1) //temporizarea a expirat


2.3 Funcii C pentru ntrzieri hardware
O alt alternativ la dezvoltarea programelor folosind limbajul de programare C const
n utilizarea funciilor definite n biblioteca timers.hdisponibil atunci cnd se
instaleaz compilatorul MPLAB C18 n mediul MPLAB IDE. Funciile disponibile se
prezint n Tabelul 7.1.
7

Pentru detalii privind dezvoltarea aplicaiilor pentru microcontroler folosind limbajul de programare C se
recomand consultarea Anexei 5.

54

Tabelul 7.1. Funcii C predefinite n biblioteca timers.h


Funcia
Descriere
CloseTimerx
Dezactivare Timerx
OpenTimerx
Configurare i activare Timerx
ReadTimerx
Citire valoare din Timerx
WriteTimerx
nscriere valoare n Timerx
SetTmrCCPSrc
Configurare timer ca surs de tact pentru modulul CCP
Descrierea funciilor
CloseTimerx
Dezactivare Timer specificat
Funcia:
timers.h
Include:
void CloseTimer0 (void);
Prototip:
void CloseTimer1 (void);
void CloseTimer2 (void);
void CloseTimer3 (void);
Aceast funcie dezactiveaz ntreruperea i timerul specificat.
Detalii:
OpenTimerx
Configurare i activare Timer specificat
Funcia:
timers.h
Include:
void OpenTimer0 (unsigned char config);
Prototip:
void OpenTimer1 (unsigned char config);8
void OpenTimer2 (unsigned char config);
void OpenTimer3 (unsigned char config);

Argumente:

config
Octet creat prin realizarea unor operaii logice I (&) cu valorile din categoriile
urmtoare. Aceste valori sunt definite n usart.h
Activarea ntreruperii Timerului0:
Activarea ntreruperii
Dezactivarea ntreruperii

TIMER_INT_ON
TIMER_INT_OFF

Selecie numrtor pe 8 / 16 bii:


T0_8BIT
T0_16BIT

Numrtor pe 8 bii
Numrtor pe 16 bii

Surs tact de incrementare:


Tact extern (pin)
Tact intern
Front de incrementeare (pentru T0_SOURCE_EXT ):
T0_EDGE_FALL
Front descresctor
T0_EDGE_RISE
Front cresctor
T0_SOURCE_EXT
T0_SOURCE_INT

Valoare predivizor:
T0_PS_1_1
T0_PS_1_2
T0_PS_1_4
T0_PS_1_8
T0_PS_1_16
T0_PS_1_32
T0_PS_1_64

Raport de predivizare 1:1


Raport de predivizare 1:2
Raport de predivizare 1:4
Raport de predivizare 1:8
Raport de predivizare 1:16
Raport de predivizare 1:32
Raport de predivizare 1:64

Pentru detalii privind parametrii funciilor OpenTimer1(), OpenTimer2(), OpenTimer3() se va


consulta documentaia tehnic asociat bibliotecii timers.h, disponibil la instalarea compilatorului MPLAB
C18 pentru MPLAB IDE. Pentru detalii privind structura i principiile de funcionare ale Timerelor 1,2,3 se va
consulta documentaia tehnic a microcontrolerului PIC18F4455.

55

T0_PS_1_128
T0_PS_1_256

Detalii:
Exemplu:

Raport de predivizare 1:128


Raport de predivizare 1:256

Aceast funcie configureaz timerul0 conform opiunilor specificate, iar apoi


l activeaz. Funcia reprezint, de fapt, ncapsularea iniializrii registrului
T0CON.
OpenTimer0 (TIMER_INT_OFF &
T0_16BIT &
T0_SOURCE_INT &
T0_PS_1_256);

ReadTimerx
Citire valoare din Timerx
Funcia:
timers.h
Include:
unsigned int ReadTimer0 (void);
Prototip:
unsigned int ReadTimer1 (void);
unsigned char ReadTimer2 (void);
unsigned int ReadTimer3 (void);
Returneaz: Valoarea curent a timerului
Aceaste funcii citesc valorea curent din regitrii timerelor, dup cum
Detalii:
urmeaz:
Timer0: TMR0H:TMR0L
Timer1: TMR1H:TMR1L
Timer29: TMR2
Timer3: TMR3H:TMR3L
/*
exemplu
de citire a valorii pe 16 bii a
Exemplu:
timerului0 funcionnd ca numrtor pe 8 bii10 */
unsigned int rezultat;
rezultat = (unsigned char) ReadTimer0();
WriteTimerx
nscriere valoare n Timerx
Funcia:
timers.h
Include:
void WriteTimer0 (unsigned int timer);
Prototip:
void WriteTimer1 (unsigned int timer);
void WriteTimer2 (unsigned char timer);
void WriteTimer3 (unsigned int timer);
Argumente: timer
Valoarea care va fi ncrcat n regitrii timerului specificat.
Aceaste funcii nscriu o valoare n regitrii Timerelor, dup cum urmeaz:
Detalii:
Timer0: TMR0H:TMR0L
Timer1: TMR1H:TMR1L
Timer211: TMR2
Timer3: TMR3H:TMR3L
WriteTimer0(10000);
Exemplu:

Timerul2 este un timer pe 8 bii, deci valoarea returnat de funcia ReadTimer2() este de tip unsigned
char.
10
La utilizarea timerului0 ca numrtor de 8 bii nu se poate ti exact dac octetul superior este zero. Astfel,
pentru obinerea unor rezultate corecte se recomand cast spre char.
11
Timerul2 este un timer pe 8 bii, deci argumentul funciei WriteTimer2() este de tip unsigned char.

56

SetTmrCCPSrc
Configurare timer ca surs de tact pentru modulul CCP
Funcia:
timers.h
Include:
void SetTmrCCPSrc (unsigned char config);
Prototip:
Argumente: config
Octet ce poate lua una din valorile urmtoare definte n timers.h
T3_SOURCE_CCP
T1_CCP1_T3_CCP2
T1_SOURCE_CCP

Detalii:
Exemplu:

Timer3 surs de tact pentru CCP1 i CCP2


Timer1 surs de tact pentru CCP1,
Timer3 surs de tact pentru CCP2
Timer1 surs de tact pentru CCP1 i CCP2

Aceast funcie configureaza Timerul1 i Timerul3 pentru a fi utilizate ca


surs de tact pentru modulele CCP1 i CCP212.
SetTmrCCPSrc(T3_SOURCE_CCP);

Utiliznd funciile definite n biblioteca timers.h, exemplul prezentat n seciunea


anterioar poate fi scris n felul urmtor:
#include <p18f4455.h>
#include <timers.h>
void main ()
{
CloseTimer0();
WriteTimer0(46004);
OpenTimer0 (TIMER_INT_OFF &
T0_16BIT &
T0_SOURCE_INT &
T0_PS_1_256);
while (!INTCONbits.TMR0IF);
//temporizarea a expirat
...
}
3. Probleme propuse
P1. S se realizeze un numrtor pe afiajul cu 7 segmente, conectat pe PORTB, care
se va incrementa la fiecare 250ms. Temporizarea va fi obinut prin utilizarea Timerului0.
P2. S se realizeze un numrtor pe afiajul cu 7 segmente, conectat pe PORTB, care
se va incrementa la fiecare apsare a butonului conectat pe PORTD0.
P3. Se consider dou butoane legate pe PORTD<0:1> i 8 LED-uri legate pe
PORTB.S se implementeze o lumin dinamic (aprinderea succesiv a LED-urilor conform
unei secvene predefinite) pe cele 8 LED-uri. Se vor considera dou temporizri obinute cu
ajutorul Timerului0 selectabile prin butonul D0 i dou secvene diferite de aprindere a LEDurilor selectabile prin butonul D1.
P4. Se consider dou butoane legate pe PORTD<0:1>, dou LED-uri legate pe
PORTD<2:3>. S se implementeze automatul cu stri finite a crui structur este prezentat
n Figura 7.2.
12

Detalii privind utilizarea modulelor CCP se gsesc n lucrarea 12.

57

Figura 7.2. Automatul cu stri finite propus


Automatul va avea 3 stri caracterizate de urmtoarele:
Starea S0 LED-urile sunt stinse
Starea S1 LED-ul D2 este aprins, LED-ul D3 este stins
Starea S2 LED-ul D3 este aprins, LED-ul D2 este stins
Trecerea de la o stare la alta se face prin apsarea butonului D0 dup cum urmeaz:
Starea S0Starea S1 butonul este inut apsat un timp cuprins ntre 200ms i 1s
Starea S1Starea S0 butonul este inut apsat mai puin de 1s
Starea S1Starea S2 butonul este inut apsat mai mult de 1s
Starea S0Starea S2 butonul este inut apsat mai mult de 1s
Starea S2Starea S0 butonul este inut apsat mai mult de 3s
P5. Pornind de la problema anterioar s se implementeze un automat cu stri finite cu
structur asemntoare, caracterizat de urmtoarele stri:
Starea S0 LED-urile sunt stinse
Starea S1 Lumina dinamic pe cele 8 LED-uri conectate pe PORTB cu o perioad de
200ms
Starea S2 LED-urile i schimb starea (plpie) cu o perioad de 200ms
i de urmtoarele tranziii ntre stri:
Starea S0Starea S1 butonul este inut apsat un timp cuprins ntre 200ms i 1s
Starea S1Starea S0 butonul este inut apsat mai puin de 1s
Starea S1Starea S2 butonul este inut apsat mai mult de 1s
Starea S0Starea S2 butonul este inut apsat mai mult de 1s
Starea S2Starea S0 aceast tranziie se execut n mod automat dup 3s

Indicaii
nainte de implementare se vor realiza diagramele de stare i de activitate asociate
aplicaiilor
Se recomand dezvoltarea aplicaiilor folosind limbajul de programare C. n acest
sens, pentru detalii, se va consulta Anexa 5.
n cazul problemei P2 se va elimina prel-ul prezent la apsarea butonului. Se va
considera un prel cu durata P=10ms. Pentru detalii se va consulta Lucrarea 5.
Se recomand structurarea codului pe subrutine / funcii.
Rezolvarea problemei P4 se poate face innd cont de diagrama de evoluie a strilor
prezentat n Figura 7.2 i de indicaiile asociate.

58

Figura 7.3. Diagrama evoluiei strilor pentru problema P4


n diagrama din Figura 7.3 s-a considerat o singur temporizare de baz cu durata de
100ms pe baza creia se determin durata meninerii butonului apsat, sau alte temporizri
care intervin.

59

Lucrarea 8. PWM
1. Scopul lucrrii
Obiectivul acestei lucrri este de a familiariza cititorul cu modulul de generare a
semnalelor modulate n laime (PWM Pulse Width Modulation), n vederea generrii unor
trenuri de impulsuri cu factor de umplere i perioad configurabile.
2. Consideraii teoretice
Un semnal PWM este n esen un semnal periodic dreputunghiular, a crui lime
(factor de umplere) poate fi modificat.
Factorul de umplere ( FU ) reprezint intervalul de timp dintr-o perioad ( TPWM ) ct
semnalul este n starea 1.
Cei doi parametrii ai semnalului PWM, factorul de umplere FU i perioada TPWM se
pot vedea n Figura 8.1.

Figura 8.1. Parametrii semnalului PWM


n general aceste semnale sunt folosite pentru a controla turaia motoarelor de curent
continuu. Semnalul PWM este convertit ntr-o valoare efectiv a tensiunii de comand,
datorit caracterului integrativ al acestor motoare. n Figura 8.2 se prezint modul n care se
pot genera diferite tensiune de comand prin simpla modificare a factorului de umplere al
semnalului PWM.

Figura 8.2. Principiul comenzii PWM


Microcontrolerul PIC18F4455 conine dou module CCP (Capture/Compare/PWM),
notate cu CCP1 i CCP2. n funcie de configurare, modulele pot funiona n trei regimuri
distincte:
- Captur
- Comparare
- PWM

60

n funcionarea n regim PWM, modulele CCP se folosesc mpreun cu Timerul2.


Timerul2 este un timer de 8 bii, avnd tactul de incrementare de la oscilatorul intern1, care
dispune de un predivizor i un postdivizor programabil.
Configurarea timerului se realizeaz din registrul T2CON, iar pentru regimul de lucru
PWM, biii de interes sunt doar cei legai de activarea / dezactivarea timerului, i cei legai de
algerea predivizorului. Postdivizorul nu va fi utilizat n cazul generrii semnalelor PWM. n
Figura 8.3 se prezint structura acestui registru de control.
bit 7
-

bit 0
T2OUTPS3 T2OUTPS2 T2OUTPS1 T2OUTPS0

TMR2ON

T2CKPS1

T2CKPS0

Figura 8.3. Registrul T2CON: Timer2 Control Register


Bit 7
Biii 6-3
Bit 2
Biii 1-0

Neimplementat
T2OUTPS3:T2OUTPS0 Biii de selecie pentru postdivizor
Nu se utilizeaz la funcionarea n regim PWM
TMR2ON Bit de Pornire / Oprire Timer2
1 = Pornire Timer2
0 = Oprire Timer2
T2CKPS1:T2CKPS0 Bii de selecie a valorii de predivizare pentru tactul
de incrementare
00 = Predivizor 1
01 = Predivizor 4
1x = Predivizor 16

Configurarea modulului PWM presupune selectarea regimului de lucru PWM,


configurarea perioadei, precum i a factorului de umplere.
2.1 Selectarea regimului de lucru PWM
Selectarea regimului de lucru PWM pentru cele dou module CCP se face prin
intermediul regitrilor de control CCP1CON pentru modulul CCP1, respectiv CCP2CON
pentru modulul CCP2. n continuare, pentru simplitate, se va folosi pentru aceti regitri de
control notaia CCPxCON, unde x{1,2}. n Figura 8.4 se prezint structura regitrilor
CCPxCON.
bit 7
Biii 7-6
Biii 5-4
Biii 3-0

DCxB1
DCxB0
CCPxM3 CCPxM2 CCPxM1
Figura 8.4. Regitrii CCPxCON: CCPx Control Register

bit 0
CCPxM0

Neimplementai
DCxB1:DCxB0 Utilizai la specificarea factorului de umplere al semnalului
PWM produs de modulul CCPx
CCPxM3:CCPxM0 Selectarea regimului de lucru pentru modulul CCPx
11xx = Regim de lucru PWM
restul combinaiilor se aleg pentru modurile Captur sau Comparare

Se va incrementa la fiecare ciclu instruciune Ti =

4
FOSC

61

2.2 Stabilirea perioadei (TPWM)


Perioada semnalului PWM se stabilete prin intermediul valorii nscrise n registrul
PR2.
Calcularea valorii corespunztoare perioadei dorite se face utiliznd formula
urmtoare:
TPWM = [(PR2)+1]4TOSC PredivizorTMR2
(8.1)
unde:
- TPWM este perioada semnalului PWM
- PR2 este valorea pe 8 bii care va trebui nscris n registrul PR2
- 4TOSC este tactul de execuie al instruciunilor. Pentru FOSC = 20MHz este 0.2s
- PredivizorTMR2 este valoarea predivizorului tactului de incrementare
(PredivizorTMR2{1,4,16})specificat prin biii T2CON<1:0>.
2.3 Stabilirea factorului de umplere (FU)
Factorul de umplere se stabilete prin intermediul unei valori de 10 bii care se
introduce n CCPRxL:CCPxCON<5:4>. Registrul CCPxCON conine cei mai
nesemnificativi doi bii (DCxB1:DCxB0), iar CCPRxL conine octetul superior
Factorulul de umplere se poate calcula dup formula:
FU = (CCPRxL:CCPxCON<5:4>)TOSC PredivizorTMR2
(8.2)
unde:
- FU este factorul de umplere al semnalului PWM
- CCPRxL:CCPxCON<5:4> este valorea pe 10 bii
1

TOSC =

PredivizorTMR2 este valoarea predivizorului tactului de incrementare

FOSC

este tactul oscilatorului

2.4 Iniializarea modulului PWM


n continuare se prezint un exemplu de calcul al parametrilor de configurare pentru
un semnal PWM cu perioada TPWM = 100s, factor de umplere FU = 50s, implementat cu
ajutorul unei frecvene de lucru FOSC = 20MHz i cu un predivizor al timerului
PredivizorTMR2=16.
Utiliznd formula (8.1) obinem:
TPWM FOSC
100 s 20 MHz
1 = 30.25 30
1 =
PR 2 =
(8.3)
4 PredivizorTMR 2

4 16

Utiliznd formula (8.2) obinem:

(CCPRxL : CCPxCON 5 : 4 ) =

FU FOSC
50 s 20 MHz
=
= 62.5 63
PredivizorTMR 2
16

(8.4)

Astfel, perioada semnalului PWM va fi configurat prin nscrierea n registrul PR2 a


valorii 30:
(30)10 = 1Eh = (11110)2
(8.5)
1Eh PR2
iar factorul de umplere al semnalului PWM va fi configurat prin nscrierea valorii 63 n
perechea CCPRxL:CCPxCON<5:4>. ntruct reprezentarea binar a lui 63 este (111111)2,
rezult c DCxB1=1, DCxB0=1, iar CCPRxL=0Fh, dup cum se poate vedea i n expresia
(8.6).
(63)10 = 3Fh = (111111)2
3h = (11)2 CCPxCON<5:4>
(8.6)
Fh = (1111)2 CCPRxL

62

Odat determinate valorile de configurare pentru perioada i factorul de umplere al


semnalului PWM se poate trece la etapa de iniializare, care presupune parcurgerea
urmtorior pai:
configurarea pinului CCPx ca pin de ieire, prin tergerea bitului corespunztor n
registrul TRIS2
oprirea Timerului2 (bitul TMR2ON, registrul T2CON)
configurarea perioadei semnalului PWM prin nscrierea valorii determinate n registrul
PR2
configurarea factorului de umplere al semnalului PWM prin nscrierea valorii
determinate n perechea CCPRxL:CCPxCON<5:4>
configurarea predivizorului (biii T2CKPS1:T2CKPS0, registrul T2CON)
pornirea Timerului2 (bitul TMR2ON, registrul T2CON)
configurarea regimului de lucru PWM pentru modulul CCP utilizat (biii
CCPxM3:CCPxM0, registrul CCPxCON)
Pentru a exemplifica etapa de iniializare se va considera cazul analizat anterior, care
va determina generarea unui semnal PWM folosind modulul CCP1, i care va avea parametrii
de configurare determinai prin relaiile (8.3)-(8.6).
CONFIGURARE_PWM:
BCF
TRISC, TRISC2
BCF
T2CON, TMR2ON
MOVLW
0x1E
MOVWF
PR2
MOVLW
0x0F
MOVWF
CCPR1L
BSF
CCP1CON, DC1B1
BSF
CCP1CON, DC1B0
BSF
T2CON, T2CKPS1
BSF
T2CON, T2CKPS0
BSF
T2CON, TMR2ON
BSF
CCP1CON, CCP1M3
BSF
CCP1CON, CCP1M2
BSF
CCP1CON, CCP1M1
BSF
CCP1CON, CCP1M0

; pin CCP1 de ieire


; oprire Timer2
; configurare TPWM
; configurare FU

; predivizor 16
; pornire Timer2
; configurare mod PWM

n continuare, se prezint acelai exemplu de configurare, dar utiliznd limbajul de


programare C3.
TRISCbits.TRISC2 = 0;
T2CONbits.TMR2ON = 0;
PR2 = 0x1E;
CCPR1L = 0x0F;
CCP1CONbits.DC1B1 = 1;
CCP1CONbits.DC1B0 = 1;
T2CONbits.T2CKPS1 = 1;
T2CONbits.T2CKPS0 = 1;

;
;
;
;

pin CCP1 de ieire


oprire Timer2
configurare TPWM
configurare FU

; predivizor 16

Pinii CCP1 i CCP2, asociai celor dou module CCP sunt multiplexai cu pinii RC2, respectiv RC1 i trebuie
configurai ca pini de ieire cu ajutorul registrului TRISC
3
Pentru detalii privind dezvoltarea aplicaiilor pentru microcontroler folosind limbajul de programare C se
recomand consultarea Anexei 5.

63

T2CONbits.TMR2ON =
CCP1CONbits.CCP1M3
CCP1CONbits.CCP1M2
CCP1CONbits.CCP1M1
CCP1CONbits.CCP1M0

1;
= 1;
= 1;
= 1;
= 1;

; pornire Timer2
; configurare mod PWM

2.4 Funcii C pentru generarea semnalelor PWM


O alt abordare, dac se dorete utilizarea limbajului de programare C pentru
generarea semnalelor PWM presupune utilizarea funciilor predefinite existente n librria
pwm.h disponibil atunci cnd se instaleaz compilatorul MPLAB C18 n mediul MPLAB
IDE. Aceste funcii se prezint n Tabelul 8.1.
Funcia
ClosePWMx
OpenPWMx
SetDCPWMx

Tabelul 8.1. Funcii C predefinite n biblioteca pwm.h


Descriere
Dezactivarea canalului PWM x. n cazul microcontroleruui
PIC18F4455 x{1,2}, fiind disponibile doar dou module PWM
Configurarea canalului PWM x
Configurarea factorului de umplere pentru canalul PWM x

Descrierea funciilor
ClosePWM1, ClosePWM2
Dezactivare canal PWM
Funcia:
pwm.h
Include:
void ClosePWM1 (void);
Prototip:
void ClosePWM2 (void);
Aceast funcie nchide canalul PWM specificat
Detalii:
OpenPWM1,
Funcia:
Include:
Prototip:

OpenPWM2
Configurare canal PWM
pwm.h
void OpenPWM1 (char perioada);
void OpenPWM2 (char perioada);
Argumente: perioada
Valoare cuprins ntre 00h i FFh. Aceast valoare determin frecvena
semnalului PWM, n baza formulei (8.1)
Aceast funcie configureaz canalul PWM specificat n vederea generrii unui
Detalii:
semnal PWM cu perioada specificat.
Pe lng deschiderea canalului PWM, trebuie configurat Timerul2, prin
specificarea predivizorului i deschiderea acestuia.

SetDCPWM1, SetDCPWM2
nscrierea factorului de umplere n regitrii corespunztori
Funcia:
pwm.h
Include:
void SetDCPWM1 (unsigned int factor_umplere);
Prototip:
void SetDCPWM2 (unsigned int factor_umplere);
Argumente: factor_umplere
Valoarea argumentului factor_umplere poate fi orice numr reprezentat
pe 10 bii. Doar cei 10 bii mai nesemnificativi ai acestui argument vor fi luai
n considerare i vor fi nscrii n perechea CCPRxL:CCPxCON<5:4>.
Factorul de umplere se determin n baza formulei (8.2)
Funcia nscrie valoarea factorului de umplere n regitrii corespunztori.
Detalii:
64

n condiiile utilizrii funciilor predefinite n vederea generrii semnalelor PWM,


iniializarea din exemplul anterior poate fi scris n felul urmtor:
TRISCbits.TRISC2 = 0;
T2CONbits.TMR2ON = 0;
T2CONbits.T2CKPS1 = 1;
T2CONbits.T2CKPS0 = 1;
T2CONbits.TMR2ON = 1;
OpenPWM1(30);
SetDCPWM1(63);
...
ClosePWM1();

; pin CCP1 de ieire


; oprire Timer2
; predivizor 16
; pornire Timer2
; configurare TPWM
; configurare FU
; nchidere PWM

3. Probleme propuse
P1. Se consider dou butoane legate pe PORTD<0:1>, 8 LED-uri legate pe PORTB
i un speaker conectat pe pinul CCP1. Utiliznd modulul PWM1 s se redea cu ajutorul
speakerului un fragment din Oda bucuriei, de Ludwig van Beethoven.
n teoria muzicii, o melodie descris prin notele muzicale componente i timpii
corespunztori fiecrei note reprezint o partitur. n Figura 8.5 se prezint partitura acestui
fragment.

Figura 8.5. Fragment din Oda bucuriei de Ludwig van Beethoven


Cunoscnd frecvena fiecrei note muzicale, o melodie se poate construi printr-o
trecere de la o frecven la alta, atand fiecrei note un timp de susinere. n Tabelul 8.2 se
prezint frecvenele asociate fiecrei note muzicale n parte, dar i valorea regitrilor de
configurare pentru perioad i factorul de umplere:
Tabelul 8.2. Notele muzicale i parametrii de configurare
PR2
CCPRxL:CCPxCON<5:4>
Nota muzical Frecvena [Hz]
DO_JOS
261.64
238
477
RE
293.68
211
425
MI
329.64
191
379
FA
349.24
179
358
SOL
392.00
160
319
LA
440.00
142
284
SI
493.92
127
253
DO_SUS
523.28
120
239
n cadrul fragmentului de mai sus, notele muzicale se mpart n dou categorii, din
punctul de vedere al timpului ct trebuie susinute:
note de o ptrime (notele umplute);
note de dou ptrimi (notele goale).
65

Notele de dou ptrimi trebuie susinute un timp de dou ori mai lung dect notele
de o ptrime.
Timpul ct trebuie susinut o not de o ptrime depinde de la o partitur la alta, acesta
fiind de regul specificat printr-o meniune de nceput (Allegro, Allegretto, Moderato,
Piano).La apsarea unui buton se va schimba viteza de redare a melodiei, prin modificarea
timpilor de susinere a notelor muzicale. Se vor considera 3 viteze de redare diferite.
LED-urile de pe PORTB vor implementa funcionalitatea unui vu-metru, astfel nct la
redarea fiecrei note muzicale se vor aprinde LED-urile conform secvenei urmtoare:
Nota muzical DO_JOS LED1 aprins, restul LED-urilor stinse
Nota muzical RE LED1, LED2 aprinse, restul LED-urilor stinse
Nota muzical MI LED1, LED2, LED3 aprinse, restul LED-urilor stinse

Nota muzical DO_SUS toate LED-urile aprinse
Indicaii
nainte de implementare trebuie fcut urmtoarea observaie. Pornind de la ecuaia
(8.1) se poate determina valoarea minim a frecvenei semnalului PWM care poate fi
generat utiliznd un oscilator cu FOSC = 20MHz. Aceast frecven se determin dup
cum urmeaz:
TPWM = [(PR2)+1]4TOSC PredivizorTMR2

(TPWM )max
(FPWM )min

= [(255) + 1]
=

(TPWM )max

4
16
20 MHz

(8.7)

1220 Hz

Analiznd rezultatul obinut se constat, c frecvenele asociate notelor muzicale nu se


pot obine prin utilizarea oscilatorului extern de 20MHz ataat microcontrolerului4. n
acest context, trebuie redus frecvena de lucru.
Microcontrolerele din seria 18F ofer posibilitatea utilizrii unui oscilator intern
configurabil din programul utilizator prin registrul special OSCCON.
Secvena urmtoare de cod configureaz oscilatorul intern la frecvena de lucru de
4MHz, care perimite obinerea frecvenei fiecrei note muzicale
BSF
OSCCON, IRCF2 ;Oscilator intern de 4MHz
BSF
OSCCON, IRCF1
BCF
OSCCON, IRCF0
BSF
OSCCON, SCS1
;Selecie oscilator intern
Parametrii de configurare pentru regitrii PWM prezentai n Tabelul 8.2 s-au obinut
pe baza relaiilor (8.1) i (8.2). n care s-au introdus perioada semnalului PWM obinut
pe baza frecvenei notei muzicale cu relaia:

(TPWM )nota

(8.8)

Fnota

i factor de umplere de 50%, caracterizat de urmtoarea relaie:

(FU )nota

(TPWM )nota

(8.9)

La utilizarea unei frecvene de lucru de 4MHz crete timpul de execuie al


instruciunilor, iar la calculul temporizrilor va trebui luat n considerare aceast nou
valoare a frecvenei de lucru.
Pentru realizarea temporizrilor necesare timpilor de susinere a notelor se pot utiliza
funciile C descrise n Lucrarea 6. Temporizri software.
4

1220Hz > 523.28Hz (DO_SUS)

66

Lucrarea 9. Convertorul analog-digital


1. Scopul lucrrii
Pentru facilitarea prelucrrii datelor provenite de la surse analogice se utilizeaz
convertoare analog-digitale. Obiectivul acestei lucrri este de a familiariza cititorul cu modul
de utilizare al convertorului analog-digital prezent n structura microcontrolerului
PIC18F4455.
2. Consideraii teoretice
Exist numeroase situaii n care comunicarea dintre microcontroler i lumea
exterioar nu se poate realiza doar prin intermediul porturilor de intrare-ieire digitale. O
asemnea situaie este caracteristic utilizrii senzorilor, de la care datele sunt preluate sub
form analogic, ceea ce nseamn c fiecrui nivel de tensiune i corespunde o anumit
valoare a parametrului msurat (ex. temperatu, intensitate luminoas etc.) ntr-un asemenea
context se utilizeaz convertoarele analog-digitale (A/D) care transform nivelele de tensiune
analogice n secvene de bii care pot fi utilizai cu uurin n prelucrrile digitale.
2.1 Structura intern
Microcontrolerul PIC18F4455 este dotat cu un convertor A/D, cuprins n cadrul unui
modul intern legat la magistrala de adrese i de date. Modulul de conversie dispune de 13
canale de intrare multiplexate cu pinii microcontrolerului1, iar rezoluia convertorului este de
10 bii.
Modulul poate fi configurat prin simpla modificare a unor regitri speciali, iar citirea
datelor se rezum la simpla citire a doi regitri (ADRESH: ADRESL).
Modulul de conversie A/D dispune de 3 regitri de configurare (ADCON0, ADCON1,
ADCON2), a cror structur se prezint n continuare.
bit 7
-

Biii 7-6
Biii 5-2

Bit 1

Bit 0

CHS3
CHS2
CHS1
CHS0
GO/ DONE
Figura 9.1. Registrul ADCON0: A/D Control Register 0

bit 0
ADON

Neutilizai
CHS3:CHS0 Bii de selecie ai canalului de intrare A/D utilizat la conversie
0000 = Canal 0 (pin AN0)
0001 = Canal 1 (pin AN1)
...
1100 = Canal 12 (pin AN12)
1101 = Neimplementai
1110 = Neimplementai
1111 = Neimplementai
GO/DONE Bit status conversie A/D
cnd ADON = 1 (convertor A/D activat)
1 = start conversie / conversie A/D n desfurare
0 = conversie A/D finalizat
ADON Activare / Dezactivare convertor A/D
1 = activare convertor A/D
0 = dezactivare convertor A/D

Din aceast cauz, utilizarea unui canal este condiionat de setarea pinului respectiv ca intrare analogic (vezi
Figura 9.2)

67

bit 7
Biii 7-6
Biii 5-4

Biii 3-0

VCFG1
VCFG0
PCFG3
PCFG2
PCFG1
Figura 9.2. Registrul ADCON1: A/D Control Register 1

Neutilizai
VCFG1:VCFG0 Bii de configurare pentru tensiunile de referin
00 : VREF+ = Vdd = 5V, VREF- = Vss = 0V
01 : VREF+ = extern (pin AN3), VREF- = Vss = 0V
10 : VREF+ = Vdd = 5V, VREF- = extern (pin AN2)
11 : VREF+ = extern (pin AN3), VREF- = extern (pin AN2)
PCFG3:PCFG0 Bii de configurare a funcionalitii porturilor
PCFG3:
PCFG0

AN12

AN11

0000 A
A
0001 A
A
0010 A
A
0011 D
A
0100 D
D
0101 D
D
0110 D
D
0111 D
D
1000 D
D
1001 D
D
1010 D
D
1011 D
D
1100 D
D
1101 D
D
1110 D
D
1111 D
D
A = intrare analogic
bit 7
ADFM
Bit 7
Bit 6
Biii 5-3

bit 0
PCFG0

AN10

AN9

AN8

A
A
A
A
A
D
D
D
D
D
D
D
D
D
D
D

A
A
A
A
A
A
D
D
D
D
D
D
D
D
D
D

A
A
A
A
A
A
A
D
D
D
D
D
D
D
D
D

AN7

AN6

AN5

AN4

AN3

AN2

A A A A A A
A A A A A A
A A A A A A
A A A A A A
A A A A A A
A A A A A A
A A A A A A
A A A A A A
D A A A A A
D D A A A A
D D D A A A
D D D D A A
D D D D D A
D D D D D D
D D D D D D
D D D D D D
D = intrare / ieire digital

ACQT2 ACQT1
ACQT0
ADCS2
ADCS1
Figura 9.3. Registrul ADCON2: A/D Control Register 2

ADFM Formatare rezultat conversie A/D


1 = aliniere rezultat la dreapta
0 = aliniere rezultat la stnga (vezi Figura 9.6)
Neimplementat
ACQT2:ACQT0 Configurare timp de achiziie
111 : TAQ = 20TAD
110 : TAQ = 16TAD
101 : TAQ = 12TAD
100 : TAQ = 8TAD
011 : TAQ = 6TAD
010 : TAQ = 4TAD
001 : TAQ = 2TAD
000 : TAQ = 0TAD (achiziie manual)

68

AN1

AN0

A
A
A
A
A
A
A
A
A
A
A
A
A
A
D
D

A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
D

bit 0
ADCS0

Biii 2-0

ADCS2:ADCS0 Configurare tact de conversie2


111 : TAD = RC(oscilator intern)4ms
110 : TAD = 64TOSC
101 : TAD = 16TOSC
100 : TAD = 4TOSC
011 : TAD = RC(oscilator intern)4ms
010 : TAD = 32TOSC
001 : TAD = 8TOSC
000 : TAD = 2TOSC

2.2 Configurarea modulului de conversie A/D


Dac structura i configurarea primilor doi regitri de control (ADCON1, ADCON0) ai
convertorului A/D este oarecum intuitiv, pentru a putea configura corect registrul ADCON2,
trebuie neles principiul de funcionare al modulului de conversie A/D.
Astfel, trebuie tiut c n structura modulului de conversie A/D exist i un circuit de
eantionare-memorare (Figura 9.4), al crui rol este de a menine constant tensiunea
analogic de intrare pe durata efecturii conversiei. Aceast tensiune este meninut constant
cu ajutorul unui condensator, care necesit un timp de ncrcare. Acest timp de ncrcare
intervine n proporie semnificativ i caracterizeaz timpul de achiziie TAQ al tensiunii care
urmeaz a fi convertit cu ajutorul convertorului A/D. n Figura 9.5 se evideniaz timpii care
intervin n procesul de conversie analog-digital

Figura 9.4. Versiunea simplificat a unui circuit de eantionare-memorare

Figura 9.5. Timpii care intervin n procesul de conversie A/D

TAD reprezint timpul alocat conversiei unui bit i este dependent de frecvena de lucru

69

Pentru a se asigura ncrcarea condensatorului din circuitul de eantionare-memorare


la valoarea efectiv a tensiunii de intrare Vin se recomand ca durata minim a timpului de
achiziie s fie:
(TAQ )min 3s
(9.1)
Dac acest timp nu este suficient de mare, rezultatul conversiei poate fi eronat.
Timpul de achiziie se obine fie prin introducerea unor temporizri n program3, fie
prin configurarea tactului de conversie (biii ADCS2:ADCS0) i a timpului de achiziie (biii
ACQT2:ACQT0) astfel nct s se asigure obinerea unui timp minim de achiziie conform
relaiei (9.1)
Astfel, se remarc dou moduri de funcionare ale modulului de conversie A/D:
Modul manual
Modul automat
Modul de lucru manual se selecteaz dac biii ACQT2:ACQT0 = 000. n acest
mod de lucru, achiziia ncepe la schimbarea (selectarea) canalului analogic. La setarea bitului
GO/ DONE se ntrerupe achiziia i ncepe conversia. n acest caz, pentru a obine rezultate
corecte, utilizatorul este responsabil pentru asigurarea timpului minim necesar achiziiei,
conform relaiei (9.1), ntre momentul selectrii canalului analogic i momentul setrii bitului
GO/ DONE .
Celelalte valori ale biilor ACQT2:ACQT0 caracterizeaz un modul de lucru
automat, n care timpul de achiziie ia valori specifice de la 2TAD la 20TAD n funcie de
configurare. n acest caz, la setarea bitului GO/ DONE se realizeaz achiziia (eantionarea
semnalului) pe durata de timp selectat prin biii ACQT2:ACQT0, iar apoi conversia ncepe n
mod automat.4
n ambele situaii, la terminarea conversiei se reseteaz bitul GO/ DONE i se seteaz
flagul indicator de ntrerupere al convertorului A/D ADIF n registrul PIR1.
Fiecrui bit convertit i corespunde un timp de conversie TAD, dependent de frecvena
de lucru. Pentru a realiza o conversie ntreag este nevoie de un timp
Tconv = 11 T AD
(9.2)
TAD se configureaz soft prin biii ADCS2:ADCS0 ai registrului ADCON2.
Valorile posibilele pentru TAD corespunztoare diferitelor frecvene de lucru sunt date
n Tabelul 9.1.
Tabelul 9.1. Alegerea tactului de conversie n funcie de frecvena de lucru
ADCS2:ADCS0 Tact de conversie TAD
Frecvena maxim de lucru FOSC
000
2TOSC
2.86 MHz
001
8TOSC
11.43 MHz
010
32TOSC
45.71 MHz
011
RC (osc. intern)4ms
1.00 MHz
100
4TOSC
5.71 MHz
101
16TOSC
22.86 MHz
110
64TOSC
48.0 MHz
111
RC (osc. intern5)4ms
1.00 MHz
3

Dup activarea modulului i selectarea canalului dorit, utilizatorul va trebui s implementeze n program
ntrzierea respectiv, nainte de a realiza conversia.
4
n aceast situaie nu se poate spune exact cnd s-a terminat achiziia i cnd a nceput conversia, timpul de
achiziie fiind inut n interiorul modulului.
5
Aceste cazuri sunt prevzute pentru funcionarea n regim SLEEP (cu consum redus de energie), tactul de
conversie provenind de la oscilatorul intern.

70

Pentru a exemplifica modul de configurare al registrului ADCON2 s considerm cazul


unui microcontroler cu o frecven de lucru de 20MHz pentru care trebuie ales tactul de
conversie i timpul de achiziie.
Conform Tabelului 9.1 pentru o frecven maxim de lucru FOSC = 22.86MHz , tactul
de conversie ia valoarea:
TAD = 16 TOSC =

16
= 0.8s
FOSC

(9.3)

Astfel, conform relaiei (9.2) durata conversiei este:


Tconv = 11 TAD = 8.8s
iar conform relaiei (9.1) timpul necesar achiziiei se alege:
TAQ = 4 TAD = 3.2s

(9.4)
(9.5)

n baza celor calculate biii corespunztori vor fi iniializai cu urmtoarele valori:


<ADCS2:ADCS0>=101
(9.6)
<ACQT2:ACQT0>=010
Rezultatul conversiei se acceseaz direct prin simpla citire a regitrilor ADRESH i
ADRESL. n funcie de starea bitului ADFM din registrul ADCON2, rezultatul poate fi aliniat la
stnga sau la dreapta, dup cum se poate vedea n Figura 9.6
9

ADRESH

Rez. conv.
A/D MSb

Rezultat conversie A/D octetul inferior

ADRESL
a)

Rez. conv.
A/D LSb

Rezultat conversie A/D octetul superior

ADRESH

ADRESL

b)
Figura 9.6. Rezultatul conversiei A/D
a) aliniere la dreapta ADFM = 1 b) aliniere la stnga ADFM = 0
Cunoscnd codul de 10 bii obinut n urma conversiei A/D se poate determina
valoarea efectiv a tensiunii analogice de intrare pe baza formulei urmtoare:
Vin =

VREF + VREF
(rezultatConversie )
1024

(9.7)

Etapa de configurare a modulului de conversie A/D n vederea realizrii unei


conversii presupune parcurgerea urmtorilor pai:
configurarea pinilor ANx utilizai ca pini de intrare, prin setarea biilor corespunztori
n regitrii TRIS;
configurare pini analogici utilizai (biii PCFG3:PCFG0, registrul ADCON1);
configurare tensiuni de referin (biii VCFG1:VCFG0, registrul ADCON1);
selectare canal de intrare utilizat pentru achiziie i conversie (biii CHS3:CHS0,
registrul ADCON0);
configurare timp de achiziie (biii ACQT2:ACQT0, registrul ADCON2);
configurare tact de conversie (biii ADCS2:ADCS0, registrul ADCON2);
formatare rezultat conversie (bitul ADFM, registrul ADCON2);
pornire modul de conversie (bitul ADON, registrul ADCON0);
ateptarea expirrii timpului de achiziie (n cazul funcionrii n mod manual
<ACQT2:ACQT0>=000)
71

start conversie (bitul GO/ DONE , registrul ADCON0)6;


ateptarea terminrii conversiei. Terminarea conversiei este indicat de resetarea
bitului GO/ DONE i de setarea flagului indicator de ntrerupere ADIF din registrul
PIR1;
citirea rezultatului (regitrii ADRESH:ADRESL);
tergerea flagului indicator de ntrerupere (bitul ADIF, registrul PIR1);
nainte ca urmtoarea achiziie s nceap se recomand o ateptare minim de 3TAD,
necesar descrcrii condensatorului din circuitul de eantionare-meninere (vezi
Figura 9.5)
n continuare se prezint codul corespunztor configurrii modulului de conversie A/D
n vederea realizrii unei achiziii automate, pentru cazul unui microcontroler cu o frecven
de lucru de 20MHz care recepioneaz pe canalul 0 un semnal analogic cuprins ntre 05V. Se
va prezenta codul att n limbaj de asamblare, ct i n limbaj C.
CONFIGURARE_CONVERTOR_AD:
BSF
TRISA, TRISA0
BSF
ADCON1,PCFG3
BSF
ADCON1,PCFG2
BSF
ADCON1,PCFG1
BCF
ADCON1,PCFG0
BCF
ADCON1,VCFG1
BCF
ADCON1,VCFG0
BCF
ADCON0,CHS3
BCF
ADCON0,CHS2
BCF
ADCON0,CHS1
BCF
ADCON0,CHS0
BCF
ADCON2,ACQT2
BSF
ADCON2,ACQT1
BCF
ADCON2,ACQT0
BSF
ADCON2,ADCS2
BCF
ADCON2,ADCS1
BSF
ADCON2,ADCS0
BCF
ADCON2,ADFM
BSF
ADCON0,ADON
BSF
ADCON0,GO

;pin RA0/AN0 de intrare


;pin AN0 intrare analogic

;tens. de referi interne


;selectare canal 0

;configurare timp achiziie7


;configurare tact conversie8
;aliniere rezultat la stnga
;pornire modul
;start conversie

LOOP_TESTARE:
BTFSS
PIR1, ADIF
;sau
BTFSC
ADCON0, GO
GOTO LOOP_TESTARE
;Cnd se ajunge n acest punct, conversia s-a terminat
;se citete rezultatul
;se resteaz flagul de ntrerupere
;se ateapt minim 3TAD=2.4s pn la urmtoarea conversie

ATENIE se recomand ca bitul GO/ DONE s nu fie setat n aceeai instruciune n care se pornete modulul
de conversie A/D
7
vezi relaia (9.6)
8
vezi relaia (9.6)

72

n continuare se prezint configurarea modulului de conversie A/D sub form de cod


C. ntruct este posibil configurarea simultan a mai multor bii n cadrul aceluiai registru se
va opta n codul urmtor pentru aceast variant:
TRISAbits.TRISA0 = 1;
ADCON1 = 0x0E;
ADCON0bits.CHS3 = 0;
ADCON0bits.CHS2 = 0;
ADCON0bits.CHS1 = 0;
ADCON0bits.CHS0 = 0;
ADCON2 = 0x15;
ADCON0bits.ADON = 1;
ADCON0bits.GO = 1;

//pin RA0/AN0 de intrare


//configurare ADCON1
//selectare canal 0

if(ADCON0bits.GO == 0)

//conversia s-a terminat

//configurare ADCON2
//pornire modul
//start conversie

2.3 Funcii C pentru conversia A/D


O alt abordare, dac se dorete utilizarea limbajului de programare C pentru
realizarea conversiilor A/D presupune utilizarea funciilor predefinite existente n librria
adc.h disponibil atunci cnd se instaleaz compilatorul MPLAB C18 n mediul MPLAB
IDE. Funciile disponibile se prezint n Tabelul 9.2.
Tabelul 9.2. Funcii C predefinite n biblioteca adc.h
Funcia
Descriere
BusyADC
Indic status conversie
CloseADC
Dezactivare modul de conversie A/D
ConvertADC
Start conversie A/D
OpenADC
Configurare modul de conversie A/D
ReadADC
Citire rezultat conversie
SetChanADC
Selectare canal analogic
SelChanConvADC Selectare canal analogic i pornire conversie A/D
Descrierea funciilor
BusyADC
Funcia:
Include:
Prototip:
Detalii:

Indic status conversie


adc.h
char BusyADC (void);
Aceast funcie indic dac modulul de conversie A/D se afl n decursul unei
conversii
Returneaz: 1 dac modulul este ocupat cu realizarea unei conversii
0 dac modulul nu realizeaz nici o conversie
CloseADC
Funcia:
Include:
Prototip:
Detalii:

Dezactivare modul de conversie A/D


adc.h
void CloseADC (void);
Aceast funcie dezactiveaz convertorul A/D precum i mecanismul de
ntreruperi asociat acestuia.

73

ConvertADC
Start conversie A/D
Funcia:
adc.h
Include:
void ConvertADC (void);
Prototip:
Aceast funcie pornete o nou conversie A/D. Pentru detectarea terminrii
Detalii:
conversiei se poate utiliza funcia BusyADC() sau ntreruperea generat.
Configurare modul de conversie A/D
Funcia:
adc.h
Include:
void OpenADC (unsigned char config,
Prototip:
unsigned char config2,
unsigned char portconfig);
Argumente: config
Octet creat prin realizarea unor operaii logice I (&) cu valorile din categoriile
urmtoare. Aceste valori sunt definite n adc.h
Surs tact conversie A/D:
ADC_FOSC_2
ADC_FOSC_4
ADC_FOSC_8
ADC_FOSC_16
ADC_FOSC_32
ADC_FOSC_64

FOSC
FOSC
FOSC
FOSC
FOSC
FOSC

/
/
/
/
/
/

2
4
8
16
32
64

ADC_FOSC_RC

Oscilator intern

Aliniere rezultat conversie:


ADC_RIGHT_JUST

Aliniere la dreapta

ADC_LEFT_JUST

Aliniere la stnga

Timp de achiziie:
ADC_0_TAD
ADC_2_TAD
ADC_4_TAD
ADC_6_TAD
ADC_8_TAD
ADC_12_TAD
ADC_16_TAD
ADC_20_TAD

0
2
4
6
8
12
16
20

TAD
TAD
TAD
TAD
TAD
TAD
TAD
TAD

config2
Octet creat prin realizarea unor operaii logice I (&) cu valorile din categoriile
urmtoare. Aceste valori sunt definite n adc.h
Canalul anlogic:
ADC_CH0

Canalul 0

ADC_CH1
...

Canalul 1

ADC_CH11

Canalul 11

ADC_CH12

Canalul 12

ntreruperi A/D:
ADC_INT_ON

ntreruperi activate

ADC_INT_OFF ntreruperi dezactivate

74

Tensiuni de referin:
ADC_REF_VDD_VREFMINUS

VREF+ = Vdd i VREF- = Ext.

ADC_REF_VREFPLUS_VREFMINUS

VREF+ = Ext. i VREF- = Ext.

ADC_REF_VREFPLUS_VSS

VREF+ = Ext. i VREF- = Vss

ADC_REF_VDD_VSS

VREF+ = Vdd i VREF- = Vss

portconfig
Octet care permite configurarea funcionalitii porturilor. Pot fi utilizate
urmtoarele valori definite n adc.h

Detalii:
Exemplu:

ReadADC
Funcia:
Include:
Prototip:
Detalii:
Returneaz:

ADC_0ANA

toi pinii digitali

ADC_1ANA

pini analogici:AN0

pini digital:AN1-AN15

ADC_2ANA

pini analogici:AN0-AN1

pini digitali:AN2-AN15

ADC_3ANA

pini analogici:AN0-AN2

pini digitali:AN3-AN15

ADC_4ANA

pini analogici:AN0-AN3

pini digitali:AN4-AN15

ADC_5ANA

pini analogici:AN0-AN4

pini digitali:AN5-AN15

ADC_6ANA

pini analogici:AN0-AN5

pini digitali:AN6-AN15

ADC_7ANA

pini analogici:AN0-AN6

pini digitali:AN7-AN15

ADC_8ANA

pini analogici:AN0-AN7

pini digitali:AN8-AN15

ADC_9ANA

pini analogici:AN0-AN8

pini digitali:AN9-AN15

ADC_10ANA

pini analogici:AN0-AN9

pini digitali:AN10-AN15

ADC_11ANA

pini analogici:AN0-AN10

pini digitali:AN11-AN15

ADC_12ANA

pini analogici:AN0-AN11

pini digitali:AN12-AN15

ADC_13ANA

pini analogici:AN0-AN12

pini digitali:AN13-AN15

ADC_14ANA

pini analogici:AN0-AN13

pini digitali:AN14-AN15

ADC_15ANA

toi pinii analogici

Aceast funcie configureaz regitrii de control ai modulului de conversie


A/D. Se configureaz: tactul de conversie, timpul de achiziie, formatarea
rezultatului, porturile i canalul utilizat..
Pentru exemplificare, se consider cazul prezentat anterior
OpenADC( ADC_FOSC_16 & ADC_LEFT_JUST & ADC_4_TAD,
ADC_CH0 & ADC_REF_VDD_VSS & ADC_INT_OFF,
ADC_1ANA );
Citire rezultat conversie
adc.h
int ReadADC (void);
Aceast funcie citete cei 16 bii care conin rezultatul conversiei.
Valoarea coninut n regitrii ADRESH:ADRESL.
n funcie de modul n care a fost configurat formatarea rezultatului (utiliznd
funcia OpenADC()) rezultatul va fi coninut de cei mai nesmnificativi sau
cei mai semnificativi 10 bii.

75

SetChanADC
Selectare canal analogic
Funcia:
adc.h
Include:
void SetChanADC (unsigned char canal);
Prototip:
Argumente: canal
Una din urmtoarele valori (definite n adc.h):
ADC_CH0

Canalul 0

ADC_CH1
...

Canalul 1

ADC_CH11

Canalul 11

ADC_CH12

Canalul 12

Detalii:
Exemplu:

Funcia selecteaz pinul care va fi utilizat ca intrare a convertorului A/D.


SetChanADC (ADC_CH0);

Funcia:
Include:
Prototip:
Argumente:

Selectare canal analogic i pornire conversie A/D


adc.h
void SetChanConvADC (unsigned char canal);
canal
Una din urmtoarele valori (definite n adc.h):

Detalii:
Exemplu:

ADC_CH0

Canalul 0

ADC_CH1
...

Canalul 1

ADC_CH11

Canalul 11

ADC_CH12

Canalul 12

Aceast funcie selecteaz pinul care va fi utilizat ca intrare a convertorului


A/D, apoi pornete o conversie A/D. Pentru testarea terminrii conversiei
poate fi utilizat funcia BusyADC() sau ntreruperea generat.
SetChanConvADC (ADC_CH0);

Pentru a exemplifica utilizarea funciilor definite n adc.h n vederea realizrii unei


conversii A/D se consider exemplul din programul urmtor:
#include <p18f4455.h>
#include <adc.h>
#include <delays.h>
int result;
void main( void )
{
// configurare convertor A/D
OpenADC( ADC_FOSC_16 & ADC_LEFT_JUST & ADC_4_TAD,
ADC_CH0 & ADC_REF_VDD_VSS & ADC_INT_OFF,
ADC_1ANA );
Delay10TCYx( 5 );
ConvertADC();
while( BusyADC() );
result = ReadADC();
CloseADC();

//
//
//
//
//

Delay 50TCY
Start conversie
Ateptare sfrit conversie
Citire rezultat
Dezactivare convertor A/D

}
76

3. Probleme propuse
P1. Se consider dou LED-uri legate pe PORTD<2:3>, 8 LED-uri legate pe
PORTB i un poteniometru alimentat de la Vdd i Vss, iar cursorul conectat la canalul
analogic 0. S se implementeze un program care citete periodic, la fiecare 100ms, tensiunea
analogic de intrare, obinut de pe poteniometru, i afieaz rezultatul conversiei pe cele 10
LED-uri disponibile.
P2. Folosind perifericele disponibile s se implementeze un sistem de reglare automat
a temperaturii. Se va utiliza un termistor (sau un poteniometru pentru simulare) pe post de
traductor, comanda implementat va fi o comand bipoziional (de tip pornit/oprit), iar
elementul comandat va fi un ventilator. Mrimea de referina poate fi specificat direct din
program. LED-urile disponibile pot fi utilizate pentru afiarea valorii convertite.
P3. Folosind un senzor de temperatur conectat la canalul analogic 0 i un speaker
conectat pe pinul CCP1, s se realizeze un sistem de alarm care monitorizeaz temperatura.
P4. Folosind un senzor de lumin i un speaker, s se realizeze un sistem de alarm
bazat pe detectarea micrii.

Indicaii
Se recomand dezvoltarea aplicaiilor folosind att limbajul de asamblare ct i
limbajul de programare C cu sau fr funciile definite n adc.h.

77

Lucrarea 10. ntreruperi


1. Scopul lucrrii
Exist dou metode care ne permit s determinm dac starea unui periferic s-a
modificat: prin interogare sau prin ntrerupere. De regul, interogarea a fost metoda abordat
pn acum. Obiectivul acestei lucrri este de a familiariza cititorul cu modul de utilizare al
sistemului de ntreruperi
2. Consideraii teoretice
Pn acum, ne-am obinuit c pentru a determina modificarea strii unui periferic,
trebuie testat n mod repetat perifericul respectiv (un anumit bit sau registru ntreg). Din
aceast cauz, implementarea unor programe cu o complexitate ridicat poate fi problematic.
Dac programul ar putea fi anunat de modificarea strii perifericului lucrurile s-ar putea
simplifica. Aici intervine sistemul de ntreruperi.
Mecanismul de suspendare a firului de execuie la apariia unui eveniment, se numeste
ntrerupere. Microcontrolere au deja implementat un mecanism de ntrerupere, prin care se
permite execuia unei rutine de tratare a ntreruperii la apariia unei ntreruperi.
2.1 Sistemul de ntreruperi la PIC18F4455
Microcontrolerul PIC18F4455 dispune de mai multe surse de ntrerupere distincte.
Acestea pot fi clasificate n dou categorii:
Externe:
- 3 linii de intrare distincte (pinii RB0/INT0, RB1/INT1, RB2/INT2):
modificarea strii1 fiecrei linii va genera cte o nterupere
- biii PORTB<4:7>: modificarea strii acestor bii de intrare va genera o
ntrerupere
Interne
- Timer0, 1, 2, 3: fiecare timer va genera cte o ntrerupere la depirea
capacitii de numrare
- CCP1, 2: se va genera cte o ntrerupere la fiecare captur realizat sau
comparare reuit
- Convertorul A/D: se va genera ntrerupere la terminarea conversiei
- USART
- USB
- etc.
Controlul operaiei fiecrei ntreruperi se realizeaz prin trei bii:
un bit indicator (xxxIF interrupt flag) care se seteaz la apariia unui eveniment de
ntrerupere
un bit de activare/dezactivare (xxxIE interrupt enable) care permite selectarea
individual a surselor de nterupere utilizate prin activarea sau dezactivarea acestora
un bit de prioritate (xxxIP interrupt priority) care permite stabilirea unui nivel de
prioritate (mare sau mic / high sau low) pentru fiecare ntrerupere
Pe lng biii care controleaz operaia fiecrei ntreruperi, mai exist o serie de bii de
configurare a cror funcionalitate este prezentat n cele ce urmeaz:
Seria de microcontrolere PIC18F permite funcionarea n dou regimuri:
Un regim de lucru fr prioriti2 (bitul IPEN=0, registrul RCON)
Un regim de lucru cu dou nivele de prioritate (bitul IPEN=1, registrul RCON)
1
2

Front cresctor sau descresctor selectabil din soft


De fapt toate ntreruperile au aceeai prioritate.

78

Dac nu se utilizeaz prioriti, activarea/dezactivarea tuturor surselor de ntrerupere


se realizeaz prin setarea/resetarea bitului GIE al registrului INTCON. Dac prioritile sunt
utilizate, ntreruperile cu prioritatea high se pot activa independent de ntreruperile cu
prioritatea low prin bitul GIEH al registrului INTCON. Aceeai afirmaie este valabil i n
cazul prioritilor low, care se pot controla prin bitul GIEL al aceluiai registru.
Trebuie menionat faptul c n cazul utilizrii prioritilor de ntrerupere, toate sursele
de ntrerupere pot concura pe cele dou nivele de ntrerupere3.
ntruct sursele de ntrerupere includ att perifericele microcontrolerelor ct i o serie
de componente interne, seria 18F ofer posibilitatea activrii/dezactivrii ntreruperilor
provenite de la periferice prin bitul PEIE al registrului INTCON (valabil doar n cazul n care
prioritile nu sunt folosite).
n Tabelul 10.1 se prezint combinaiile posibile ale biilor de configurare.
IPEN
1
0

Tabel 10.1. Biii de configurare


GIEH
GIEL
GIE
1/0
1/0
x
x
x
1/0

PEIE
x
1/0

Toi biii care intervin n utilizarea ntreruperilor se regsesc n regitrii urmtori4:


RCON Reset Control Register
INTCON Interrupt Control Register
INTCON2 Interrupt Control Register
INTCON3 Interrupt Control Register
PIR1, PIR2 Peripheral Interrupt Request (Flag) Register 1, 2
PIE1, PIE2 Peripheral Interrupt Enable Register 1, 2
IPR1, IPR2 Peripheral Interrupt Prioriry Register 1, 2
2.2 Tratarea ntreruperilor
Apariia unei ntreruperi determin urmtoarele:
se termin execuia instruciunii curente
se salveaz adresa instruciunii urmtoare5
se execut secvena de cod din rutina de tratare a ntreruperii pn la ntlnirea
unei instruciuni de revenire din ntrerupere
se reia execuia programului principal de la adresa salvat
Pentru tratarea ntreruperilor se folosesc doi vectori de ntrerupere (0x08 i 0x18).
Vectorul de ntrerupere reprezint de fapt o adres din memoria program la care se face salt n
mod automat la apariia unei ntreruperi. Vectorul 0x08 este asociat nteruperilor cu prioritate
mare (high), iar vectorul 0x18 celor cu prioritate mic (low). Dac microcontrolerul
utilizeaz boot loader atunci adresele celor doi vectori devin 0x808, respectiv 0x818.
La aceste adrese se poate plasa rutina de tratare a ntreruperii care se va apela n mod
automat la fiecare apariie a unei ntreruperi. Revenirea din ntrerupere se realizeaz prin
instruciunea RETFIE.
n cazul utilizrii mai multor ntreruperi, sursa care a generat ntreruperea se poate
determina prin testarea biilor indicatori (xxxIF). La revenirea din ntrerupere indicatorul
corespunztor trebuie resetat.

Orice surs de ntrerupere poate fi configurat pe high sau pe low.


Recomandm cititorului s consulte foaia de catalog a microcontrolerului PIC18F4455 pentru detalii privind
aceti regitrii (cap. 9 Interrupts)
5
Valoarea numrtorului de program asociat instruciunii urmtoare este salvat n stiv.
4

79

n cazul utilizrii prioritilor de ntrerupere, trebuie cunoscut faptul c ntreruperile de


prioritate high nu pot fi ntrerupte de nici o alt ntrerupere, iar ntreruperile de prioritate low
pot fi ntrerupte doar de ntreruperile de prioritate high.
2.3 Salvarea contextului
Dup cum s-a vazut, apariia unei ntreruperi genereaz suspendarea execuiei
programului i rularea unei rutine de tratare a ntreruperii. Execuia rutinei de tratare a
ntreruperii determin salvarea automat n stiva rapid (Fast Stack) a regitrilor WREG,
BSR i STATUS. Pentru a asigura restaurarea celor trei regitri, este necesar utilizarea
instruciunii de revenire din ntrerupere sub forma RETFIE 1 sau RETFIE FAST6.
Pentru salvarea i refacerea valorii altor regitri trebuie intervenit prin cod utilizator.
2.4 Configurarea ntreruperilor
De regul, paii care trebuie urmai pentru configurarea ntreruperilor sunt
urmtorii:
activarea / dezactivarea prioritilor (bitul IPEN, registrul RCON);
activarea / dezactivarea ntreruperilor provenite de la periferice (bitul PEIE,
registrul INTCON);
dac bitul IPEN este setat se pot stabili prioriti pentru sursa de ntrerupere
utilizat (biii xxxIP);
tergerea indicatorului corespunztor sursei de ntrerupere configurate (bitul
xxxIF);
activarea ntreruperii corespunztoare sursei configurate (bitul xxxIE);
setarea bitului global de ntrerupere (bitul GIE sau biii GIEH i GIEL,
registrul INTCON).
n ceea ce privete rutina de tratare a ntreruperii se recomand parcurgerea
urmtorilor pai:
Salvarea regitrilor WREG, BSR i STATUS;
Testarea sursei ntreruperii aprute (biii xxxIF) ;
Tratarea fiecrei surse de ntrerupere aprute;
tergerea biilor indicatori de ntrerupere (biii xxxIF) ;
Refacerea regitrilor STATUS, BSR i WREG7;
Revenirea din ntrerupere.
i respectarea urmtoarelor cerine:
realizarea de rutine de ntrerupere ct mai scurte.
evitarea realizrii de procesri n rutina de tratare a ntreruperii. Se practic
salvarea evenimentului ntr-o variabil, iar n bucla principal (programul
principal) se verific acea variabil. De regul, cnd apare o ntrerupere se
preiau date, care apoi se prelucreaz n programul principal.
evitarea utilizrii altor periferice n ntrerupere. Acest lucru se face n
programul principal.

Nu funcioneaz pe dou nivele de prioriti de nterupere. Astfel, se recomand ca la intrarea n rutina de


tratare a ntreruperii cu prioritate mic s se salveaze cei trei regitri, iar la revenirea din rutin acetia s fie
refcui. (vezi Anexa 2)
7
Se recomand refacerea regitrilor n ordinea menionat. Salvarea i refacerea manual a acestor regitrii se
face atunci cnd se utilizeaz prioritile de ntrerupere. Dac nu se utilizeaz prioritile cei trei regitrii vor fi
salvai automat, iar refacerea se poate face tot automat prin utilizarea instruciunii RETFIE cu flagul FAST
setat (vezi Anexa 2)

80

Pentru a exemplifica modalitatea de configurare i implementare a ntreruperilor se va


utiliza secvena urmtoare de program n cadrul creia s-a considerat generarea unei
ntreruperi corespunztoare Timerului 0 (avnd flag-ul indicator de ntrerupere T0IF):
#include P18F4455.INC
ORG 0x00
GOTO MAIN
; 0x008 dac nu se utilizeaz BOOT-LOADER
; 0x808 dac se utilizeaz BOOT-LOADER
ORG 0x008
; Salt la rutina de tratare a ntreruperii8
GOTO
Interrupt_Service_Routine
. . .
Interrupt_Service_Routine:
BTFSS
INTCON, TMR0IF
RETFIE
. . .
BCF
INTCON, TMR0IF
RETFIE
MAIN:
BCF
BCF
BSF
BSF
. . .
END

INTCON, TMR0IF
RCON, IPEN
INTCON, TMR0IE
INTCON, GIE

;Testare sursa ntr.


;Resetarea flagului
;Revenire din rutin
;Reset flag Timer0
;Dezactivare priorit.
;Activare ntr. Timer0
;Activare ntreruperi

n exemplul anterior, s-a considerat o ntrerupere provenit de la o depire a a


capacitii de numrare a Timerului 0. Configurarea propriuzis a Timerului a fost lsat la
latitudinea cititorului
n limbajul de programare C exemplul anterior devine:
#include <p18f4455.h>
//declaraia rutinei de tratare a ntreruperii
void Interrupt_Service_Routine (void);
. . .
#pragma code my_section = 0x808
void intrerupere (void)
{
_asm
goto Interrupt_Service_Routine
_endasm
}
8

n cazul utilizrii prioritilor de ntrerupere, o rutin de tratare a nteruperii high trebuie s ncap n zona de
memorie program cuprins ntre adresele 0x08 i 0x18. Prin realizarea unui apel de subrutin sau salt la alt
adres se evit constrngerea existent referitoare la dimensiunea rutinei de tratare a ntreruperii..

81

#pragma code
#pragma interrupt Interrupt_Service_Routine
void main()
{
INTCONbits.TMR0IF = 0;
RCONbits.IPEN = 0;
INTCONbits.TMR0IE = 1;
INTCONbits.GIE = 1;
}

//
//
//
//

Reset flag Timer0


Dezactivare priorit.
Activare ntr. Timer0
Activare ntreruperi

. . .

// definiia rutinei de tratare a nteruperii


void Interrupt_Service_Routine (void)
{
if (INTCONbits.TMR0IF == 1) //Testare sursa ntr.
{
INTCONbits.TMR0IF = 0;
//Resetarea flagului
. . .
}
}
3. Probleme propuse
P1. Se consider 8 LED-uri legate pe PORTB i dou butoane legate pe
PORTD<0:1>. Folosind ntreruperea generat de Timer0 s se implementeze n cadrul unui
program urmtoarele:
Dac butonul D0 este inut apsat, LED-urile de pe pinii RB0, RB1 i RB2 i
modific starea la fiecare 500ms.
Dac butonul D0 este eliberat, LED-ul conectat la pinul RB0 i schimb starea
la fiecare 100ms, cel de pe pinul RB1 i schimb starea la fiecare 500ms, iar
LED-ul de pe pinul RB2 i schimb starea la fiecare 1000ms.
Dac se apas butonul D1 toate LED-urile sunt stinse.

Indicaii
Pentru realizarea ntrzierilor cerute se va realiza cu ajutorul Timerului0 o singur
temporizare de baz de 100ms care va genera o ntrerupere. n rutina de tratare a
ntreruperii se vor folosi contoare pentru a obine celelalte ntrzieri pornind de la
aceast temporizare de baz.
n vederea aprofundrii cunotinelor referitoare la sistemul de ntreruperi se
recomand refacerea unor aplicaii din capitolele anterioare folosind ntreruperile.
Se recomand dezvoltarea aplicaiilor folosind att limbajul de asamblare ct i
limbajul de programare C.

82

Lucrarea 11. Comunicaii seriale asincrone


1. Scopul lucrrii
Aceast lucrare trateaz o implementare a standardului RS232 n microsisteme cu
microcontroler PIC18F4455. Cu ajutorul blocului EUSART (Enhanced Universal
Synchronous Asynchronous Receiver Transmitter) se poate realiza transmisia i recepia de
date cu echipamente externe conectate la microcontroler. Obiectivul acestei lucrri este de a
familiariza cititorul cu modul de setare i utilizare al blocului EUSART n vederea realizrii
unor comunicaii seriale asincrone.
2. Consideraii teoretice
Comunicaiile seriale permit plasarea echipamentelor la distane mult mai mare dect
este posibil n cazul comunicaiilor paralele, cu costul unor rate de transfer mai mici. Fa de
cazul comunicaiei paralele, unde 8 bii sunt transmii simultan, comunicaia serial
presupune transmiterea biilor de date unul dup altul pe un singur fir. La recepionare, datele
sunt transformate n form paralel pentru a putea fi depuse n regitri, de unde programele
utilizator pot s le prelucreze.
Standardul RS232 specific o serie de parametrii ai comunicaiei seriale. Aceti
parametrii cuprind i consideraii referitorare la nivelele de tensiune utilizate pentru
transmiterea datelor:
- pentru 0 logic se specific ntre +3V si +15V (valoare tipic pentru PC +12V)
- pentru 1 logic se specific ntre 3V si 15V. (valoare tipic pentru PC -12V)
Aceste consideraii sunt importante deoarece, legarea microcontrolerului la PC nu se
face direct, ci necesit un cicuit extern de transformare (se poate recurge la utilizarea unui
circuit MAX232).
Modulul de comunicare serial la microcontrolerul PIC18F4455 este denumit
EUSART (en. Enhanced Universal Synchronous Asynchronous Receiver Transmitter) i
ofer trei tipuri de comunicaii seriale:
- asincron full-duplex: echipamentul poate transmite (pe pinul RC6/TX/CK) i
recepiona (pe pinul RC7/RX/DT) n acelai timp date;
- master-sincron (half-duplex1): echipamentul genereaz pe pinul RC6/TX/CK un
tact de comunicaie i poate recepiona sau trimite date sincron cu tactul pe pinul
RC7/RX/DT.
- slave-sincron (half-duplex): difer de master-sincron prin faptul c tactul nu este
generat local ci este recepionat pe pinul RC6/TX/CK, iar echipamentul poate
transmite sau recepiona date sincron cu tactul pe pinul RC7/RX/DT2.
n cazul transmisiei asincrone prile trebuie s tie nainte viteza de comunicaie.
Vitezele ntlnite n comunicaiile seriale sunt specificate n standardul RS232 i au
urmtoarele valori: 110, 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 bps.
Totodat pentru a se asigura recepia corect a datelor, fiecrui caracter i se adaug o
informaie de cadru, care const dintr-un bit de start i un bit de stop. Bitul de start indic
receptorului nceputul procesului de asamblare a unui caracter din fluxul serial de bii care
urmeaz, precum i sincronizarea cu transmitorul. Dup bitul de start se transmite caracterul
care const din 8 sau 9 bii (configurabil din soft) de date ncepnd cu bitul cel mai
nesemnificativ. Sincronizarea are loc pe durata transmisiei unui singur caracter. Dup
recepionarea biilor de date, bitul de stop permite transferul datelor recepionate n ali
regitri pentru o prelucrare intern ulterioar.
1
2

Comunicaia se realizeaz alternativ n ambele sensuri


Pinii utilizai pentru realizarea comunicaiilor seriale sunt multiplexai cu PORTC<6:7>

83

2.1 Configurarea modulului EUSART


Funcionarea modulului EUSART este controlat prin intermediul a trei regitri:
- TXSTA Transmit Status and Control
- RCSTA Receive Status and Control
- BAUDCON Baud Rate Control
Structura acestor regitri i modul de configurare al acestora este detaliat n paginile
urmtoare. ntruct obiectivul acestei lucrri l constituie comunicaiile asincrone seriale, n
structura regitrilor nu se va pune accent i pe detaliile referitoare la comunicaiile sincrone.
2.1.1 Configurarea transmisiei i recepiei seriale asincrone
Regitrii de control TXSTA (Figura 11.1) i RCSTA (Figura 11.2) permit
configurarea transmisiei i recepiei seriale i cuprind totodat n structura lor o serie de bii
indicatori3 ai strii comunicaiei.
bit 7
CSRC
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0

TX9
TXEN
SYNC
SENDB
BRGH
TRMT
Figura 11.1. Registrul TXSTA: Transmit Status and Control

bit 0
TX9D

CSRC Bit de selecie a tactului de comunicaie


Neutilizat la comunicaia asincron
TX9 Bit de activare a transmisiei pe 9 bii
1 = selectare transmisie pe 9 bii
0 = selectare transmisie pe 8 bii
TXEN Bit de activare / dezactivare transmisie
1 = activare transmisie
0 = dezactivare transmisie
SYNC Bit de selecie a tipului de comunicaie serial
1 = comunicaie serial sincron
0 = comunicaie serial asincron
SENDB Bit transmisie caracter break
1 = transmisie caracter break pornit
0 = transmisie caracter break terminat
BRGH Bit de selecie pentru viteza de transmisie
1 = vitez mare de transmisie
0 = vitez mic de transmisie
TRMT Bit indicator stare registru de serializare4
1 = registrul de serializare pentru datele transmise este gol
0 = registrul de serializare pentru datele transmise este plin
TX9D Al 9-lea bit de date
Acest bit poate fi folosit fie pentru implementarea unui mecanism de verificare
a paritii sau ca bit indicator de adres n cazul comunicaiilor seriale cu
adresare sau pur i simplu ca un bit de date obinuit.

Indic apariia unor erori sau a unor evenimente caracteristice comunicaiei seriale.
Registrul de serializare TSR este un registru intern care nu poate fi accesat prin program. Are rol de buffer de
transmisie. Exist un registru asemntor i la partea de recepie serial.
4

84

bit 7
SPEN
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3

Bit 2
Bit 1
Bit 0

RX9
SREN
CREN
ADDEN
FERR
OERR
Figura 11.2. Registrul RCSTA: Transmit Status and Control

bit 0
RX9D

SPEN Bit de activare / dezactivare transmisie a portului serial


1 = port serial pornit
0 = port serial oprit
RX9 Bit de activare a recepiei pe 9 bii
1 = selectare recepie pe 9 bii
0 = selectare recepie pe 8 bii
SREN Bit de activare recepie singular
Neutilizat la comunicaia asincron
CREN Bit de activare / dezactivare recepie
1 = activare recepie
0 = dezactivare recepie
ADDEN Bit de activare a detectrii adresei
Pentru mod asincron cu 9 bii de date (RX9=1)
1 = activare detecie adres
0 = dezactivare detecie adres
Pentru mod asincron cu 8 bii de date (RX9=0)
Neutilizat
FERR Bit indicator eroare de ncadrare
1 = a fost detectat o eroare de ncadrare
0 = nu a fost detectat o eroare de ncadrare
OERR Bit indicator eroare de suprapunere
1 = a fost detectat o eroare de suprapunere
0 = nu a fost detectat o eroare de ncadrare
RX9D Al 9-lea bit de date

Selectarea modului de funcionare asincron se realizeaz prin resetarea bitului SYNC


(TXSTA<4>). n acest mod de funcionare, modulul EUSART utilizeaz pentru comunicaie
formatul standard NRZ (Non Return to Zero: 1 bit de start, 8 sau 9 bii de date, 1 bit de stop,
se transmiste/recepioneaz primul bitul cel mai nesemnificativ).
Modulul EUSART este dotat cu un generator de rat de transfer5 de 8/16bii utilizat
pentru obinerea vitezelor de transmisie standard necesare n comunicaia asincron serial
prin divizarea frecvenei de lucru a microcontrolerului.
Chiar dac blocurile de transmisie i recepie din cadrul modulului EUSART sunt
independente din punct de vedere funcional, ele utilizeaz acelai format al pachetelor i
aceeai rat de transfer.
2.1.2 Configurarea vitezei de comunicaie
O atenie deosebit trebuie acordat etapei de configurare a vitezei de lucru, ntruct n
cazul comunicaiei asincrone full-duplex, viteza de comunicare trebuie s coincid la ambele
capete.
Viteza de comunicare se stabilete prin configurarea registrului de control BAUDCON
al generatorului de rat de transfer i prin specificarea a doi octei stocai n regitrii SPBRGH
(octetul superior) i SPBRG (octetul inferior).
n Figura 11.3 se prezint structura registrului BAUDCON.
5

en. Baud Rate Generator

85

bit 7
ABDOVF
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3

Bit 2
Bit 1
Bit 0

RCIDL
RXDTP
TXCKP
BRG16
WUE
Figura 11.3. Registrul BAUDCON: Baud Rate Control

bit 0
ABDEN

ABDOVF Auto-Baud Acquisition Rollover Status bit


RCIDL Bit indicator al operaiei de recepie
1 = nu se recepioneaz date
0 = recepie date n desfurare
RXDTP Bit de selecie a polaritii datelor recepionate
1 = Polaritatea semnalului de recepie este inversat
0 = Polaritatea semnalului de recepie nu este inversat
TXCKP Bit de selecie a polaritii datelor transmise
1 = Polaritatea semnalului de transmisie este inversat
0 = Polaritatea semnalului de transmisie nu este inversat
BRG16 Bit de selecie a generatorului de rat de transfer pe 8 sau 16bii
1 = Generator de rat de trasfer pe 16 bii se utilizeaz SPBRGH i SPBRG
0 = Generator de rat de trasfer pe 8 bii se utilizeaz doar SPBRG, valoarea
din SPBRGH este ignorat.
Neimplementat
WUE Wake-up Enable bit
ABDEN Auto-Baud Detect Enable bit6

Generatorul de rat de transfer poate funciona pe 8 bii (BRG16=0, registrul


BAUDCON) sau pe 16 bii (BRG16=1). Cei doi octei sunt stocai n doi regitri SPBRGH
(octetul superior) i SPBRG (octetul inferior). Valoarea stocat n aceti regitri determin
viteza de comunicare.
Alegerea utilizrii generatorului de rat de transfer pe 8 sau 16 bii depinde de eroarea
maxim tolerat dintre viteza dorit i cea obinut prin divizarea frecvenei de lucru a
microcontrolerului. De regul, bitul BRG16 este folosit n combinaie cu bitul BRGH
(TXSTA<2>) pentru asigurarea unei erori ct mai mici a vitezei de transmisie sau n vederea
atingerii unor viteze mici la frecvene de lucru mari.
n Tabelele 11.1 i 11.2 sunt prezentate valorile ce se pot alege pentru
SPBRGH:SPBRG, considernd o frecven de lucru a microcontrolerului FOSC= 20MHz.

Viteza
dorit
[bps]
300
1200
2400
9600
19200
57600
115200

Tabelul 11.1. Valori de iniializare pentru SPBRG


n cazurile BRG16=0, BRGH=0 i BRG16=0, BRGH=1
FOSC= 20MHz.
BRG16=0, BRGH = 0
BRG16=0, BRGH = 1
Viteza calc.
Eroarea
Viteza calc.
Eroarea
SPBRG
SPBRG
[bps]
[%]
[bps]
[%]
1221
1.73
255
2404
0.16
129
9766
1.73
31
9615
0.16
129
19531
1.73
15
19231
0.16
64
62500
8.51
4
56818
-1.36
21
104167
-9.58
2
113636
-1.36
10

Pentru detalii referitoare la rolul biilor ABDOVF, WUE, ABDEN se recomand consultarea documentaiei
tehnice a microcontrolerului PIC18F4455. n cadrul acestui capitol aceti bii nu vor fi utilizai.

86

Viteza
dorit
[bps]
300
1200
2400
9600
19200
57600
115200

Tabelul 11.2. Valori de iniializare pentru SPBRGH:SPBRG


n cazurile BRG16=1, BRGH=0 i BRG16=1, BRGH=1
FOSC= 20MHz.
BRG16=1, BRGH = 0
BRG16=1, BRGH = 1
Viteza calc. Eroarea SPBRGH:SPBRG Viteza calc. Eroarea SPBRGH:SPBRG
[bps]
[%]
[bps]
[%]
300.04
0.02
4165
300
0.00
16665
1200
-0.03
1041
1200
0.00
4165
2399
-0.03
520
2400
0.00
2082
9615
0.16
129
9596
-0.03
520
19231
0.16
64
19231
0.16
259
56818
-1.36
21
57471
-0.22
86
113636
-1.36
10
116279
0.94
42

Se consider erori acceptabile pentru viteza de comunicaie erorile mai mici de 2%.
Pentru calcularea valorii de iniializare a regitrilor SPBRGH:SPBRG la alte frecvene
de lucru, cititorul este rugat s consulte documentaia7 ataat microcontrolerului.
2.2 Realizarea comunicaiei
2.2.1 Transmisia serial asincron
Paii care tebuie urmai pentru configurarea modulului de transmisie sunt urmtorii:
iniializarea vitezei de transmisie dorite (regitrii SPBRGH:SPBRG, bitul BRG16
din registrul BAUDCON, bitul BRGH din registrul TXSTA)
activarea comunicaiei seriale asincrone (bitul SYNC, registrul TXSTA);
activarea modulului EUSART prin (bitul SPEN, registrul RCSTA);
configurarea pinilor RC6/TX/CK i RC7/RX/DT pentru funcionare serial prin
setarea biior TRISC<6,7>;
dac e cazul: inversarea polaritii semnalului de transmisie (bitul TXCKP,
registrul BAUDCON);
dac e cazul: activarea ntreruperii de transmisie (bitul TXIE, registrul PIE1) i
setarea biilor GIE i PEIE (registrul INTCON)8;
dac e cazul: configurarea transmisiei pe 9 bii (bitul TX9, registrul TXSTA);
activarea modulului de transmisie (bitul TXEN, registrul TXSTA);
dac s-a selectat transmisa pe 9 bii, bitul 9 trebuie stocat n TX9D (registrul
TXSTA);
stocarea datelor n registrul TXREG, pas care pornete procesul de transmisie;
testarea flag-ului indicator de ntrerupere TXIF=1 (registrul PIR1) n vederea
realizrii unei noi transmisii, numai dup cel puin doi ciclii instruciune de la
pasul anterior;
sau
testarea bitului TRMT=1 (registrul TXSTA) pentru a determina dac datele au fost
transmise fizic.
Pentru a transmite date, utilizatorul le va scrie n registrul TXREG. Ulterior, datele sunt
transferate unui registru de serializare TSR, care se ocup cu transmisia lor efectiv. Acest
7

Fia tehnic a microcontrolerului PIC18F4455 cuprinde informaii (formule) referitoare la modul n care se
calculeaz valorile de iniializare ale regitrilor SPBRGH:SPBRG sau tabele cu valori predefinite pentru diferite
valori ale FOSC
8
Pentru detalii privind sistemul de ntreruperi vezi Lucrarea 10

87

registru conine datele n curs de transmitere i nu este accesibil direct din programele
utilizator. Datele sunt transmise pe pinul TX al microcontrolerului.
La terminarea transferului din registrul de date TXREG n registrul de serializare TSR
se seteaz bitul indicator de ntrerupere TXIF (registrul PIR1). Prin testarea acestui bit,
utilizatorul poate determina dac se pot trimite date noi. Flag-ul TXIF este ters de system
dup dou cicluri instruciune de la o nou ncrcare a registrului TXREG de ctre utilizator.
Din acest motiv nu este indicat testarea bitul TXIF imediat dup ncrcarea unei valori n
TXREG.
Pentru a determina dac datele au fost transmise, se recomand testarea unui alt bit,
TRMT (registrul TXSTA). Bitul acesta indic starea registrului TSR. La ncrcarea registrului
TSR, bitul TRMT este ters automat, iar la terminarea unei transmisii, bitul TRMT este setat.
La fel ca i flag-ul TXIF, bitul TRMT nu poate fi ters de utilizator.
Dac se dorete semnalarea sfritului transferului printr-o ntrerupere9, se poate activa
ntreruperea de transmisie prin setarea bitului TXIE (registrul PIE1).
2.2.2 Recepia serial asincron
Paii care tebuie urmai pentru configurarea modulului de recepie sunt urmtorii:
iniializarea vitezei de transmisie dorite (regitrii SPBRGH:SPBRG, bitul BRG16
din registrul BAUDCON, bitul BRGH din registrul TXSTA)
activarea comunicaiei seriale asincrone (bitul SYNC, registrul TXSTA);
activarea modulului EUSART prin (bitul SPEN, registrul RCSTA);
configurarea pinilor RC6/TX/CK i RC7/RX/DT pentru funcionare serial prin
setarea biior TRISC<6,7>;
dac e cazul: inversarea polaritii semnalului de transmisie (bitul RXDTP,
registrul BAUDCON);
dac e cazul: activarea ntreruperii de recepie (bitul RCIE, registrul PIE1) i
setarea biilor GIE i PEIE (registrul INTCON)10;
dac e cazul: configurarea recepiei pe 9 bii (bitul RX9, registrul RCSTA);
activarea modulului de recepie (bitul CREN, registrul RCSTA);
la recepionarea datelor, flag-ul indicator al ntreruperii de recepie este setat
RCIF=1 (registrul PIR1);
dac s-a selectat recepia pe 9 bii, bitul 9 este RX9D (registrul RCSTA);
datele recepionate sunt disponibile n registrul RCREG;
erorile sunt semnalate de biii FERR11 i OERR12 (registrul RCSTA);
dac a avut loc o eroare, biii de eroare se terg prin tergerea bitului CREN,
(registrul RCSTA);
La fel ca i n cazul transmisiei, inima modulului de recepie este un registru de
serializare (deplasare) RSR n care se construieste octetul n curs de recepionare. Acest
registru nu este accesibil direct din programele utilizator. Datele se recepioneaz pe pinul RX
al microcontrolerului.
La terminarea asamblrii unui octet, datele sunt transferate n registrul RCREG i n
bitul RX9D (doar pentru cazul recepionrii pe 9 bii), de unde pot fi accesate de utilizator.
9

La activarea modului de transmisie, prin setarea bitului TXEN (registrul TXSTA), flag-ul TXIF este setat
automat.
10
Pentru detalii privind sistemul de ntreruperi vezi Lucrarea 10
11
FERR eroare de recpeionare a datelor
12
OERR eroare de suprasciere. Apare atunci cnd, dup recepie, programul utilizator nu citete datele din
registrul RCREG suficient de repede i se recepioneaz date noi care le suprascriu pe cele vechi.

88

Dup transfer, flag-ul indicator al ntreruperii de recepie RCIF (registrul PIR1) este setat
pentru a semnala utilizatorului terminarea recepionrii.
2.2.3 Exemplu de utilizare
n continuare se va exemplifica modalitatea de utilizare a modului EUSART n
vederea trasnmisiei i a recepionrii de date. Se vor prezenta poriuni de cod att n limbaj de
asamblare, ct i n limbaj de programare C.
Exemplele urmtoare vor realiza transmisia i recepia serial asincron cu viteza de
trnsfer de 9600bps a unui caracter (8 bii de date). Se va considera cazul unui microcontroler
cu o frecven de lucru FOSC=20MHz.
; iniializare
; configurare viteza de transmisie 9600bps13
BSF
TXSTA, BRGH
; BRGH=1
BCF
BAUDCON, BRG16
; BRG16=0
MOVLW
d'129'
; SPBRG=129 ;
MOVWF
SPBRG
; activare comunicaie serial asincron
BCF
TXSTA, SYNC
; SYNC=0
; activare modul EUSART
BSF
RCSTA, SPEN
; SPEN=1
; configurare pini
BSF
TRISC, 6
BSF
TRISC, 7
; date cu polaritate neinversat
BCF
BAUDCON, RXDTP
BCF
BAUDCON, TXCKP
; pornire transmisie i recepie
BSF
TXSTA, TXEN
; pornire transmisie
BSF
RCSTA, CREN
; pornire recepie
...
; transmisia
MOVLW
A
;se transmite caracterul A
MOVWF
TXREG
TEST_TX
BTFSS
TXSTA, TRMT
;test sfrit de transmisie
GOTO
TEST_TX
;transmisie n desfurare
; cnd se ajunge n acest punct transmisia s-a realizat
...
; recepia
TEST_RX
BTFSS
PIR1, RCIF
;test recepie
GOTO
TEST_RX
; cnd se ajunge n acest punct s-au primit date
BCF
PIR1, RCIF
;tergere flag
MOVF
RCREG, W
;copiere date n WREG
...
Acelai exemplu, scris n limbajul de programare C devine:
13

Vezi Tabel 11.1

89

char data;
// iniializare
// configurare viteza de transmisie 9600bps
TXSTAbits.BRGH = 1;
BAUDCONbits.BRG16 = 0;
SPBRG = 129;
// activare comunicaie serial asincron
TXSTAbits.SYNC=0;
// activare modul EUSART
RCSTAbits.SPEN=1;
// configurare pini
TRISCbits.TRISC6 = 1;
TRISCbits.TRISC7 = 1;
// date cu polaritate neinversat
BAUDCONbits.RXDTP = 0;
BAUDCONbits.TXCKP = 0;
// pornire transmisie i recepie
TXSTAbits.TXEN = 1;
RCSTAbits.CREN = 1;
...
// transmisia
TXREG = A;
// se transmite caracterul A
while (TXSTAbits.TRMT==0);
//test sfrit de transmisie
// cnd se ajunge n acest punct transmisia s-a realizat
...
; recepia
while(PIR1bits.RCIF==0);
// test recepie
; cnd se ajunge n acest punct s-au primit date
PIR1bits.RCIF = 1;
// tergere flag
data = RCREG;
...
2.3 Funcii C pentru realizarea comunicaiei seriale
O alt abordare, dac se dorete utilizarea limbajului de programare C pentru
realizarea comunicaiilor seriale presupune utilizarea funciilor definite n librria
usart.h disponibil atunci cnd se instaleaz compilatorul MPLAB C18 n mediul
MPLAB IDE. Funciile disponibile se prezint n Tabelul 11.3.
Tabelul 11.3. Funcii C predefinite n biblioteca usart.h
Funcia
Descriere
BusyUSART
Indic status transmisie
DataRdyUSART
Indic status recepie
baudUSART
Configureaz rata de transfer pentru portul serial
OpenUSART
Configureaz portul serial
CloseUSART
Dezactivare modul EUSART
ReadUSART
Citete octet de la portul serial
WriteUSART
Scrie octet pe portul serial
getsUSART
Citete ir de caractere de la portul serial
putsUSART
Scrie un ir de caractere din memoria de date pe portul serial
putrsUSART
Scrie un ir de caractere din memoria de program pe portul serial
90

Descrierea funciilor
BusyUSART
Funcia:
Include:
Prototip:
Detalii:

Indic status transmisie


usart.h
char BusyUSART (void);
Aceast funcie indic dac modulul transmisie serial din cadrul EUSART
este ocupat cu transmisia. Se recomand utilizarea acestei funcii nainte de
nceperea unei noi transmisii.
Returneaz: 1 se realizeaz transmisie
0 nu se realizeaz transmisie
while(BusyUSART());
Exemplu:

DataRdyUSART
Indic status recepie
Funcia:
usart.h
Include:
char DataRdyUSART (void);
Prototip:
Detalii:
Aceast funcie ntoarce valoarea flag-ului indicator de ntrerupere RCIF din
registrul PIR1.
Returneaz: 1 sunt date disponibile
0 nu sunt date disponibile
while(!DataRdyUSART());
Exemplu:
baudUSART
Funcia:
Include:
Prototip:
Argumente:

Configureaz rata de transfer pentru portul serial


usart.h
void baudUSART (unsigned char baudconfig);
baudconfig
Octet creat prin realizarea unor operaii logice I (&) cu valorile din categoriile
urmtoare. Aceste valori sunt definite n usart.h
Polaritate semnal:
BAUD_IDLE_RX_PIN_STATE_HIGH
BAUD_IDLE_RX_PIN_STATE_LOW
BAUD_IDLE_TX_PIN_STATE_HIGH
BAUD_IDLE_TX_PIN_STATE_LOW

Polaritate pin RX inversat


Polaritate pin RX neinversat
Polaritate pin TX inversat
Polaritate pin TX neinversat

Generator de rat de transfer pe 8/16 bii:


BAUD_16_BIT_RATE
BAUD_8_BIT_RATE

Generator de rat de transfer pe 16bii (bit BRG16=1)


Generator de rat de transfer pe 8bii (bit BRG16=0)

Monitorizare pin RX:


BAUD_WAKEUP_ON
BAUD_WAKEUP_OFF

pin RX monitorizat (Wake-up activat)


pin RX nu e monitorizat (Wake-up inctiv)

Detectarea automat a ratei de transfer:


BAUD_AUTO_ON
BAUD_AUTO_OFF

Exemplu:

detectarea automat a ratei de transfer activat


detectarea automat a ratei de transfer dezactivat

baudUSART (BAUD_IDLE_TX_PIN_STATE_LOW &


BAUD_8_BIT_RATE &
BAUD_WAKEUP_OFF &
BAUD_AUTO_OFF);

91

OpenUSART
Configureaz portul serial
Funcia:
usart.h
Include:
void OpenUSART (unsigned char config,
Prototip:
unsigned int spbrg);
config
Argumente:
Octet creat prin realizarea unor operaii logice I (&) cu valorile din categoriile
urmtoare. Aceste valori sunt definite n usart.h
Activare ntrerupere la transmisie:
Activarea ntreruperii de transmisie
Dezactivarea ntreruperii de transmisie

USART_TX_INT_ON
USART_TX_INT_OFF

Activare ntrerupere la recepie:


Activarea ntreruperii de recepie
Dezactivarea ntreruperii de recepie

USART_RX_INT_ON
USART_RX_INT_OFF

Mod de lucru port serial:


USART_ASYNCH_MODE
USART_SYNCH_MODE

Mod asincron
Mod sincron

Mrime pachete:
USART_EIGHT_BIT
USART_NINE_BIT

comunicaie pe 8 bii
comunicaie pe 9 bii

Selectare Slava/Master:
Comunicaie sincron, mod slave
Comunicaie sincron, mod master

USART_SYNC_SLAVE
USART_SYNC_MASTER

Mod recepie:
USART_SINGLE_RX
USART_CONT_RX

Comunicaie sincron, recepie singular


Comunicaie sincron, recepie continu

Rat de transfer:
Vitez de comunicare mare (bit BRGH = 1)
Vitez de comunicare mic (bit BRGH = 0)

USART_BRGH_HIGH
USART_BRGH_LOW

Detalii:
Exemplu:

spbrg
Valoarea nscris n regitrii generatorului de rat de transfer
(SPBRGH:SPBRG) care determin viteza de comunicaie dorit (valoarea se
poate lua din Tabel 11.1 i Tabel 11.2)
Aceast funcie configureaz modulul EUSART conform specificaiilor date
prin intermediul parametrilor funciei.
OpenUSART (USART_TX_INT_OFF &
USART_RX_INT_OFF &
USART_ASYNCH_MODE &
USART_EIGHT_BIT &
USART_BRGH_HIGH,
129);

CloseUSART
Dezactivare modul EUSART
Funcia:
usart.h
Include:
void CloseUSART (void);
Prototip:
Aceast dezactiveaz ntreruperile, modulul de transmisie i recepie al
Detalii:
portului serial.

92

ReadUSART
Funcia:
Include:
Prototip:
Detalii:
Exemplu:

Citete octet de la portul serial


usart.h
char ReadUSART (void);
Aceast funcie citete un octet (caracter) recepionat. Pentru detalii privind
citirea celui de-al 9-lea bit de date, sau a biilor de status recomandm
consultarea documentaiei asociate funciilor din biblioteca usart.h
char data;
data = ReadUSART();

WriteUSART
Scrie octet pe portul serial
Funcia:
usart.h
Include:
void WriteUSART (char data);
Prototip:
Argumente: data
Valoarea scris pe portul serial
Aceast funcie transmit un octet (caracter) pe portul serial. Pentru detalii
Detalii:
privind scrierea celui de-al 9-lea bit de date recomandm consultarea
documentaiei asociate funciilor din biblioteca usart.h
char data=A;
Exemplu:
WriteUSART(data);
getsUSART
Citete ir de caractere de la portul serial
Funcia:
usart.h
Include:
void getsUSART (char *buffer,
Prototip:
unsigned char len);
buffer
Argumente:
Pointer ctre locaia unde vor fi salvate datele recepionate
len
Numrul de caractere care vor fi citite de la portul serial
Aceast funcie citete un ir de dimensiune fix de la portul serial. Funcia se
Detalii:
utilizeaz doar pentru transmisia / recepia de pachete de 8bii. Aceast funcie
ateapt i citete numrul de caractere specificat prin parametrul len.
char inputstr[10];
Exemplu:
getsUSART(inputstr, 5);
putsUSART, putrsUSART
Scrie un ir de caractere pe portul serial
Funcia:
usart.h
Include:
void putsUSART (char *data);
Prototip:
void putrsUSART (const rom char *data);
Argumente: data
Pointer ctre un string de date
len
Numrul de caractere care vor fi citite de la portul serial
Funcia se utilizeaz doar pentru transmisia / recepia de pachete de 8bii.
Detalii:
Aceast funcie scrie un ir de caractere (incluznd caracterul de sfrit de ir)
pe portul serial.
Transmiterea irurilor stocate n memoria de date se va face utiliznd funcia
putsUSART.
Transmiterea irurilor stocate n memoria program se va face utiliznd funcia
93

Exemplu:

putrsUSART.
putrsUSART(Hello World!);

Utiliznd funciile definite n biblioteca usart.h, exemplul prezentat n seciunea


anterioar poate fi scris n felul urmtor:
char data=A;
char buffer;
//iniializare
baudUSART (BAUD_IDLE_TX_PIN_STATE_LOW &
BAUD_8_BIT_RATE &
BAUD_WAKEUP_OFF &
BAUD_AUTO_OFF);
OpenUSART (USART_TX_INT_OFF &
USART_RX_INT_OFF &
USART_ASYNCH_MODE &
USART_EIGHT_BIT &
USART_BRGH_HIGH,
129);
...
/*
transmisie
ateapt pn cnd reg. de deplasare e gol apoi transmite data
*/
while(BusyUSART());
WriteUSART(data);
...
/*
recepie
ateapt pn cnd sunt date disponibile pentru citire, apoi
citete datele
*/
while(!DataRdyUSART());
buffer = ReadUSART();
...
3. Probleme propuse
P1. Utiliznd o comunicaie serial asincron s se realizeze comanda de pe PC a
aprinderii LED-urilor conectate la microcontroler.
P2. Se consider o comunicaie serial asincron ntre microcontroler i PC i cele
dou butoane legate pe PORTD<0:1>. Se dorete ca la apsarea butoanelor s se transmit i
s se afieze pe PC mesajul Buton X apsat, iar la eliberare Buton X eliberat, unde X
identific butonul D0 sau D1. Mesajele vor fi transmise la detectarea fronturilor de apsare,
respectiv de eliberare.

94

P3. S se citeasc un senzor de temperatur conectat la canalul analogic 0 i s se


transmit prin comunicaie asincron serial valoarea citit unui PC care s o afieze. Se va
considera o rat de transfer de 4800bps.
P4. Se consider dou microcontrolere care au conectate dou butoane pe
PORTD<0:1> i dou LED-uri legate pe PORTD<2:3>. S se conecteze ntre ele cele dou
microcontrolere prin portul serial i s se implementeze o comand bidirecional ntre cele
dou echipamente conectate care realizeaz urmtoarele:
apsarea butonului D0 al unui microcontroler va determina aprinderea LEDului D2 la cellalt microcontroler
apsarea butonului D1 al unui microcontroler va determina aprinderea LEDului D3 la cellalt microcontroler i viceversa

Indicaii
Pentru implementarea mesajelor care vor fi transmise, n limbaj de asamblare, se
recomand utilizarea tablourilor. Pentru detalii privind implementarea tablourilor se
poate consulta lucrarea 4.
n cazul problemei P2 trebuie rezolvat problema detectrii fronturilor prin eliminarea
prel-ului. n acest scop se poate consulta lucrarea 5.
Aplicaiile de pe PC necesare realizrii comunicaiilor dintre microcontroler i PC pot
fi aplicaii de sine sttoare realizate de utilizator, poate fi utilizat aplicaia Hyper
Terminal14 disponibil cu sistemul de operare Windows sau alte aplicaii asemntoare
care permit monitorizarea i comunicaia prin port serial.
La implementarea aplicaiilor se recomand utilizarea, pe ct posibil, a ntreruperilor
Pentru conectarea echipamentelor se utilizeaz un cablu de date serial de tip Null
Modem, cu structura din Figura 11.4

Figura 11.4. Cablajul Null Modem i conectorul serial de 9 pini (D9)

14

Pentru detalii referitorare la utilizarea aplicaiei Hyper Terminal se poate consulta Anexa 7

95

Lucrarea 12. Captura


1. Scopul lucrrii
Obiectivul acestei lucrri este de a familiariza cititorul cu utilizarea modulului de
captur n vederea msurrii cu ajutorul microcontrolerului a caracteristicilor (perioad,
frecven, factor de umplere) anumitor semnale care pot proveni de la diveri senzori.
2. Consideraii teoretice
Microcontrolerul PIC18F4455 conine dou module CCP (Capture/Compare/PWM),
notate cu CCP1 i CCP2. n funcie de configurare, modulele pot funiona n trei regimuri
distincte:
- Captur
- Comparare
- PWM
n funcionarea n regim de captur modulele CCP se folosesc mpreun cu Timer1 sau
Timer3. Principiul de funcionare al modulelor CCPx (x{1, 2}) n funcionarea n regim de
captur este simplu. La apariia unuia din evenimentele urmtoare:
- front cresctor pe pinul CCPx;
- front descresctor pe pinul CCPx;
- fiecare al 4-lea front cresctor pe pinul CCPx;
- fiecare al 16-lea front cresctor pe pinul CCPx;
n perechea de regitri CCPRxH:CCPRxL se copiaz valoarea pe 16 bii a Timerului1, din
regitrii TMR1H:TMR1L, sau a Timerului3, din regitrii TMR3H:TMR3L.
La realizarea capturii se seteaz flagul indicator de ntrerupere CCPxIF din registrul
PIRx. Acesta va trebui ters din program. Dac valorea din regitrii CCPRxH:CCPRxL nu
este citit la timp, la realizarea unei alte capturi va fi suprascris.
2.1 Regitrii utilizai
Selectarea regimului de lucru captura pentru cele dou module CCP se face prin
intermediul regitrilor de control CCP1CON, n cazul modulul CCP1, respectiv CCP2CON
pentru modulul CCP2. n continuare, pentru simplitate, se va folosi pentru aceti regitri de
control notaia CCPxCON, unde x{1,2}. n Figura 12.1 se prezint structura regitrilor
CCPxCON.
Regitrii permit selectarea regimului de lucru - captur i a evenimentelor care
determin captura prin intermediul biilor CCPxM3:CCPxM0.
bit 7
Biii 7-6
Biii 5-4
Biii 3-0

DCxB1
DCxB0
CCPxM3 CCPxM2 CCPxM1
Figura 12.1. Regitrii CCPxCON: CCPx Control Register

bit 0
CCPxM0

Neimplementai
DCxB1:DCxB0 Utilizai la regimul de lucru PWM (vezi Lucrarea 8 - PWM)
CCPxM3:CCPxM0 Selectarea regimului de lucru pentru modulul CCPx
0000 = modu CCPx dezactivat
0100 = Captur la fiecare front cresctor pe pinul CCPx
0101 = Captur la fiecare front descresctor pe pinul CCPx
0110 = Captur la fiecare al 4-lea front cresctor pe pinul CCPx
0111 = Captur la fiecare al 16-lea front cresctor pe pinul CCPx

96

Timerele care urmeaz a fi utilizate cu modulul de captur (Timer1 i/sau Timer3)


trebuie s funcioneze n regim de temporizare sau de numrtor sincron. n regim de
funcionare asincron, captura nu va funciona. Selectarea Timer-ului utilizat cu fiecare modul
n parte se face prin intermediul biilor T3CCP2 i T3CCP1 din registrului T3CON. Registrul
T3CON este de fapt i registrul de configurare al Timerului3. Pentru configurarea funcionrii
Timerului1 se utilizeaz registrul T1CON.
Structura celor doi regitri de control se prezint n Figurile 12.1 i 12.2.
bit 7
RD16
Bit 7
Bit 6
Biii 5:4

Bit 3
Bit 2

Bit 1

Bit 0

T1RUN T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1XS


Figura 12.2. Registrul T1CON: Timer1 Control Register

bit 0
TMR1ON

RD16 bit de activare/dezactivare mod de citire/scriere


1 = regitrii timerului se scriu/citesc printr-o singur operaie de 16 bii
0 = regitrii timerului se scriu/citesc prin dou operaii de 8 bii
T1RUN Bit indicator al sursei tactului de incrementare (read-only)
1 = Tactul de incrementare provine de la oscilatorul Timerului1
0 = Tactul de incrementare provine din alt surs
T1CKPS1:T1CKPS0 Bii de selecie a valorii de predivizare
11 = Raport de predivizare 1:8
10 = Raport de predivizare 1:4
01 = Raport de predivizare 1:2
00 = Raport de predivizare 1:1
T1OSCEN Bit de activare al oscilatorului Timerului1
1 = oscilatorul Timerului1 este activat
0 = oscilatorul Timerului1 este oprit
T1SYNC Bit de selecie a sincronizrii cu intrarea de tact extern
Dac TMR1CS=1 (se utilizeaz tact de incrementare extern)
1 = nu se sincronizeaz
0 = se sincronizeaz
Dac TMR1CS=0
Acest bit este ignorat. Se tactul intern pentru incrementare.
TMR1CS Bit selecie surs tact de incrementare1
1 = Tact extern (front cresctor pe pinul RC0/T1OSO/T13CKI)
0 = Tact intern (tactul de execuie al instruciunilor FOSC/4)
TMR1ON Bit de Pornire / Oprire Timer1
1 = Pornire Timer1
0 = Oprire Timer1

Accesarea valorii Timerului1 se face prin instruciuni obinuite att pentru scriere, ct
i pentru citire, prin intermediul regitrilor TMR1L i TMR1H. Accesul la valoarea timerului se
face fie: prin dou operaii distincte (RD16=0) cnd se acceseaz pe rnd fiecare octet prin
intermediul regitrilor TMR1L i TMR1H sau dac RD16 =1 coninutul celor 2 regitri se
actualizeaz atomic cu toi cei 16 bii ai valorii Timerului la accesarea registrului TMR1L2.
1

Timerul1 dispune de trei surse distincte de incrementare (selectabile prin biii: T1CS i T1OSCEN): tact intern
(FOSC/4), tact extern, tact provenind de la oscilatorul intern.
2
La citirea TMR1L, valoarea octetului superior se transfer n registrul TMR1H. Acest registru este accesibil
direct prin operaii normale de citire/scriere. La scrierea registrului TMR1L, valoarea stocat n prealabil n
TMR0H se transfer automat n octetul superior al timerului. Prin aceast arhitectur, timerul permite un acces
atomic la valoarea numrtorului pe 16 bii pe o magistral de 8 bii

97

bit 7
RD16
Bit 7
Biii 6,3

Biii 5:4

Bit 2

Bit 1

Bit 0

T3CCP2 T3CKPS1 T3CKPS0 T3CCP1 T3SYNC TMR3CS


Figura 12.3. Registrul T3CON: Timer3 Control Register

bit 0
TMR3ON

RD16 bit de activare/dezactivare mod de citire/scriere


1 = regitrii timerului se scriu/citesc printr-o singur operaie de 16 bii
0 = regitrii timerului se scriu/citesc prin dou operaii de 8 bii
T3CCP2:T3CCP1 Bii selecie utilizare Timer1 i Timer3 impreun cu
modulele CCP1 i CCP2
1x = Timerul3 se utilizeaz mpreun cu ambele module CCP
01 = Timerul3 se utilizeaz mpreun cu modulul CCP2
Timerul1 se utilizeaz mpreun cu modulul CCP1
00 = Timerul1 se utilizeaz mpreun cu ambele module CCP
T3CKPS1:T3CKPS0 Bii de selecie a valorii de predivizare
11 = Raport de predivizare 1:8
10 = Raport de predivizare 1:4
01 = Raport de predivizare 1:2
00 = Raport de predivizare 1:1
T3SYNC Bit de selecie a sincronizrii cu intrarea de tact extern
Dac TMR3CS=1 (se utilizeaz tact de incrementare extern)
1 = nu se sincronizeaz
0 = se sincronizeaz
Dac TMR3CS=0
Acest bit este ignorat. Se tactul intern pentru incrementare.
TMR3CS Bit selecie surs tact de incrementare3
1 = Tact extern (front cresctor pe pinul RC0/T1OSO/T13CKI)
0 = Tact intern (tactul de execuie al instruciunilor FOSC/4)
TMR3ON Bit de Pornire / Oprire Timer1
1 = Pornire Timer1
0 = Oprire Timer1

Accesarea valorii Timerului3 se face ca i n cazul Timerului 1 prin instruciuni


obinuite de scriere/citire, prin intermediul regitrilor TMR3L i TMR3H, innd cont i de
modul de acces specificat prin bitul RD16.

2.2 Configurarea modulului de captur


Etapa de configurare a modulului de captur presupune parcurgerea urmtorior pai:
configurarea pinului CCPx ca pin de ieire, prin tergerea bitului corespunztor n
registrul TRIS4
oprirea Timerului1 i/sau a Timerului3 (bitul TMR1ON, registrul T1CON, respectiv
bitul TMR3ON, registrul T3CON)
selectarea Timerului care se utilizeaz cu modulul CCP configurat (biii
T3CCP2:T3CCP1, registrul T3CON)
configurarea Timerului1 i/sau a Timerului3 (registrul T1CON i/sau T3CON)
dac e cazul: iniializarea valorii Timerului1 i/sau a Timerului3 (regitrii
TMR1H:TMR1L i/sau TMR3H:TMR3L)

Asemenea Timerului1, i Timerul3 dispune de trei surse distincte de incrementare (selectabile prin biii: T3CS
i T1OSCEN): tact intern (FOSC/4), tact extern, tact provenind de la oscilatorul intern al Timerului1.
4
Pinii CCP1 i CCP2, asociai celor dou module CCP sunt multiplexai cu pinii RC2, respectiv RC1 i trebuie
configurai ca pini de ieire cu ajutorul registrului TRISC

98

configurarea regimului de lucru pentru captur a modulului CCP utilizat (biii


CCPxM3:CCPxM0, registrul CCPxCON)
pornirea Timerului1 i/sau a Timerului3 (bitul TMR1ON, registrul T1CON, respectiv
bitul TMR3ON, registrul T3CON)
ateptarea realizrii capturii. Captura este marcat de setarea flagului indicator de
ntrerupere CCPxIF din registrul PIRx;
citirea rezultatului (regitrii CCPRxH:CCPRxL);
tergerea flagului indicator de ntrerupere (bitul CCPxIF, registrul PIRx);
dac e cazul: iniializarea unor noi valori pentru Timerul1 i/sau pentru Timerul3
(regitrii TMR1H:TMR1L i/sau TMR3H:TMR3L)
n continuare se prezint codul corespunztor configurrii i utilizrii modulului de
captur. Se consider cazul utilizrii modulului CCP1 cu baza de timp furnizat de Timer1. Se
va prezenta codul att n limbaj de asamblare, ct i n limbaj C.
CONFIGURARE_CAPTURA:
BSF
TRISC, TRISC2
BCF
T1CON, TMR1ON
BCF
T3CON, T3CCP2
BCF
T3CON, T3CCP1
BSF
T1CON, RD16
BSF
T1CON, T1CKPS1
BCF
T1CON, T1CKPS0
BCF
T1CON, T1OSCEN
BCF
T1CON, TMR1CS
BCF
CCP1CON,CCP1M3
BSF
CCP1CON,CCP1M2
BCF
CCP1CON,CCP1M1
BCF
CCP1CON,CCP1M0
BCF
T1CON, TMR1ON

;pin CCP1 de intrare


;oprire Timer1
;utilizare Timer1 cu CCP1
;scriere/citire pe 16 bii
;predivizor 1:4
;oscilator Timer1 dezactivat
;tact de incrementare intern
;caputura la fiecare fr. cr.

;pornire Timer1

LOOP_TESTARE:
BTFSS
PIR1, CCP1IF
GOTO LOOP_TESTARE
;Cnd se ajunge n acest punct, captura s-a terminat
;se citete rezultatul din CCPR1H:CCPR1L
;se resteaz flagul de ntrerupere
n continuare se prezint codul echivalent n limbajul de programare C.
TRISCbits.TRISC2 = 1;
//pin CCP1 de intrare
T3CONbits.T3CCP2 = 0;
//utiliz. Timer1 cu CCP1 i CCP2
T3CONbits.T3CCP1 = 0;
T1CON = 0xA0;
//configurare Timer15
CCP1CONbits.CCP1M3 = 0; //captura la fiecare front cresc.
CCP1CONbits.CCP1M2 = 1;
CCP1CONbits.CCP1M1 = 0;
CCP1CONbits.CCP1M0 = 0;
T1CONbits.TMR1ON = 1;
//pornire Timer1
if (PIR1bits.CCP1IF ==1) //s-a realizat captura
5

exist posibilitatea de a specifica toi biii registrului T1CON printr-o singur operaie

99

2.3 Funcii C pentru realizarea capturii


O alt abordare, dac se dorete utilizarea limbajului de programare C pentru utilizarea
modulului de captur presupune utilizarea funciilor definite existente n librria
capture.h disponibil atunci cnd se instaleaz compilatorul MPLAB C18 n mediul
MPLAB IDE. Funciile disponibile se prezint n Tabelul 12.1.
Tabelul 12.1. Funcii C predefinite n biblioteca capture.h
Funcia
Descriere
CloseCapturex
Dezactivare modul de captur CCPx
OpenCapturex
Configurare modul de captur CCPx
ReadCapturex
Citire valoare capturat de modulul CCPx
Descrierea funciilor
CloseCapturex
Dezactivare modul de captur specificat
Funcia:
capture.h
Include:
void CloseCapture1 (void);
Prototip:
void CloseCapture2 (void);
Aceast funcie dezactiveaz ntreruperea asociat modulului de captur
Detalii:
specificat.
OpenCapturex
Configurare modul de captur specificat
Funcia:
capture.h
Include:
void OpenCapture1 (unsigned char config);
Prototip:
void OpenCapture2 (unsigned char config);
Argumente: config
Octet creat prin realizarea unor operaii logice I (&) cu valorile din categoriile
urmtoare. Aceste valori sunt definite n capture.h
ntreruperi:
CAPTURE_INT_ON

Activarea ntreruperii modulului de captur

CAPTURE_INT_OFF

Dezactivarea ntreruperii modulului de captur

Configurare captur:
CAP_EVERY_FALL_EDGE

Captur la fiecare front descresctor

CAP_EVERY_RISE_EDGE

Captur la fiecare front cresctor

CAP_EVERY_4_RISE_EDGE

Captur la fiecare al 4-lea front cresctor

CAP_EVERY_16_RISE_EDGE Captur la fiecare al 16-lea front cresctor

Detalii:

Exemplu:

Aceast funcie reseteaz modulul de captur apoi l configureaz pentru


captur la apariia evenimentului specificat.
Pe lng configurarea modulului de captur, trebuie configurat timerul
corespunztor, fr de care nu se poate realiza captura. Vezi funciile asociate
timerelor din lucrarea 7.
OpenCapture1(CAPTURE_INT_ON & CAP_EVERY_RISE_EDGE);

100

ReadCapturex
Citire valoare capturat de modulul specificat
Funcia:
capture.h
Include:
unsigned int ReadCapture1 (void);
Prototip:
unsigned int ReadCapture2 (void);
Returneaz: Rezultatul capturii
Aceast funcie citete valoarea stocat n regitrii de captur
Detalii:
CCPRxH:CCPRxL asociai modulului specificat prin antetul funciei.
Utiliznd funciile definite n biblioteca capture.h, exemplul prezentat n seciunea
anterioar poate fi scris n felul urmtor:
#include <p18f4455.h>
#include <capture.h>
#include <timers.h>
void main ()
{
unsigned int result;
// Configurare modul CCP1 pentru captur
OpenCapture1(CAPTURE_INT_OFF & CAP_EVERY_RISE_EDGE);
// Configurare Timer1 pentru a fi utilizat cu modulul CCP1
SetTmrCCPSrc(T1_SOURCE_CCP);
// Configurare Timer1
OpenTimer1 (TIMER_INT_OFF &
T1_16BIT_RW &
T1_SOURCE_INT &
T1_PS_1_4 &
T1_OSC1EN_OFF &
T1_SYNC_EXT_OFF);
while(!PIR1bits.CCP1IF);

// Ateptare realizare captur

result = ReadCapture1(); // citire rezultat


// Clean up
CloseCapture1();
CloseTimer1();
}
3. Probleme propuse
P1. Se consider un semnal dreptunghiular produs de un generator de semnal conectat
la pinul CCP1 al microcontrolerului. S se implementeze un program care determin perioada
semnalului de intrare i transmite valoarea acesteia spre un PC care o afieaz. Pentru
transmiterea datelor spre PC se va implementa o comunicaia serial asincron ntre
microcontroler i PC. Figura 12.4 este sugestiv pentru problema cerut.
P2. Pentru aceeai configuraie a sistemului se cere s se determine factorul de
umplere al semnalului de intrare.
101

Figura 12.4. Determinarea perioadei i a factorului de umplere pentru un semnal (P1, P2)

Indicaii
Pentru determinarea perioadei se recomand citirea regitrilor de captur la fiecare
front cresctor. Perioada semnalului se obine ca diferen a dou valori capturate
succesive. Dac dup fiecare captur se reseteaz valoarea timerului utilizat atunci
valoarea capturat indic direct perioada.
Pentru determinarea factorului de umplere se poate configura modulul de captur
pentru a realiza captura succesiv pe front cresctor, apoi pe front descresctor.
Factorul de umplere se obine ca diferen a celor dou valori.
O alt abordare pentru msurarea factorului de umplere presupune utilizarea ambelor
module de captur cu aceai baz de timp. Unul dintre module va fi configurat pentru
a realiza captura pe frontul cresctor al semnalului, iar cellalt modul pe frontul
descresctor al semnalului. n acest caz, se va conecta acelai semnal la cei doi pini de
intrare ai modulelor: pinii CCP1 i CCP2.
Afiarea valorii recepionate de PC se poate realiza utiliznd o aplicaie special creat
pentru acest lucru sau prin intermediul aplicaiei HyperTerminal sau a altor aplicaii
similare.
ntruct funcionarea modulului de captur poate fi implementat i n lipsa acestui
periferic se recomand implementarea celor dou probleme fcnd abstracie de
existena modulelor CCP

102

Lucrarea 13. Comunicaii prin portul serial virtual


1. Scopul lucrrii
n cele ce urmeaz va fi prezentat modul de programare a microcontrolerelor de tip
PIC18F ce conin port USB pentru emularea unui port serial virtual.
2. Consideraii teoretice
Comunicaia serial prin portul RS232 se realizeaz foarte simplu att din punct de
vedere fizic (conectic, fire de legtur, etc.) ct si din punct de vedere al efortului de
programare.
n ultimul timp portul RS232 se gsete din ce n ce mai rar pe echipamentele de
calcul, acesta fiind nlocuit de portul USB. Pentru a putea folosi n continuare aplicaiile
existente, fr modificri, este nevoie de un adaptor. La ora actual exist plci ce se
conecteaz pe magistrale de tip PCI sau PCI-e i adaptoare USB-RS232 care ofer n
continuare suport pentru comunicaii seriale prin portul RS232. O alt metod presupune
utilizarea unui microcontroler ce conine un port USB i emularea portului RS232 prin
software.
2.1 Privire de ansamblu asupra sistemului
Sistemul de operare vede un port serial ca un port de comunicaie (port COM).
Programele pot accesa acest port prin funcii de conectare, deconectare, configurare, scriere,
citire etc. Prin folosirea unui port serial virtual aceste funcii rmn valabile (chiar dac nu
exist ataat la calculator un port serial real). Aceste funcii pot fi accesate datorit driverelor
portului virtual, ce fac legtura ntre portul USB i sistemul de operare.
n Figura 13.1-a se poate vedea un exemplu de conectare a unui microcontroler la un
port serial real. Circuitul integrat MAX232 realizeaz conversia semnalului de la nivelele de
tensiune specifice standardului RS232 la semnale de tip TTL compatibile cu microcontrolerul.
n Figura 13.1-b este prezentat conectarea unui microcontroler de tip 18F la portul
USB.
n ambele situaii programul din computer folosete portul serial.

a)

b)

Figura 13.1. Comparaie ntre comunicaiile prin port serial real (a)
i cele prin port serial virtual (b)
Printre avantajele folosirii portului serial virtual se pot aminti:
- aplicaiile ce ruleaz pe PC nu trebuie modificate;
- timp scurt de implementare a softului;
- nu este necesar dezvoltarea de drivere speciale pentru sistemul de operare;
- reducerea numrului de componente electronice
- migrarea de la microcontrolerele fr port USB se poate face uor;
103

2.2 Funcii pentru implementarea portului virtual pe microcontroler


Microchip pune la dispoziie exemple de programe ce permit realizarea de dispozitive
de comunicaie cu specificaii conforme cu aa numita Communication Device Class
(CDC), care folosete driverul usbser.sys existent n sistemul de operare Windows. n
aceast lucrare nu se vor prezenta aspectele privind comunicaiile prin portul USB ce vizeaz
utilizarea driverului de ctre sistemul de operare. n cele ce urmeaz va fi explicat modul de
utilizare a funciilor de comunicaie n microcontroler cu exemple de cod pentru realizarea
unei comunicaii bidirecionale ntre microcontroler i computer.
Funciile de comunicaie se gsesc ntr-o librrie ce face parte din pachetul de
programe Microchip USB firmware framework ce poate fi descrcat de pe site-ul
Microchip. Pentru instalarea portului serial virtual se va utiliza driverul mchpcdc.inf ce
poate fi gsit n pachetul de programe amintit mai sus.
Un sumar al funciilor de comunicaie este prezentat n Tabelul 13.1.
Tabelul 13.1. Funcii de comunicaie
Funcia
Descriere
putrsUSBUSART
Trimite un ir de caractere din memoria de program la
USB
putsUSBUSART
Trimite un ir de caractere din memoria de date la USB
mUSBUSARTTxRom
Trimite un ir de caractere cu lungime cunoscut din
memoria de program la USB
mUSBUSARTTxRam
Trimite un ir de caractere cu lungime cunoscut din
memoria de date la USB
mUSBUSARTIsTxTrfReady Test dac se pot transmite date ctre USB
getsUSBUSART
Recepie date de la USB
mCDCGetRxLength
Funcia returneaz lungimea ultimului ir de caractere
recepionat
irul de caractere transmis cu funciile putrsUSBUSART i putsUSBUSART
trebuie s fie un ir ce se termin cu caracterul NULL.
n cele ce urmeaz vor fi prezentate funciile pe larg.
Descrierea funciilor
putrsUSBUSART
Transmite un ir de caractere aflat n memoria program
Funcia:
void putrsUSBUSART(const rom char *data);
Prototip:
Detalii:
Aceast funcie transmite un ir de caractere terminat cu caracterul NULL aflat
n memoria de program, la portul USB.
nainte de a transmite irul trebuie verificat dac driverul este gata pentru
recepia de date noi. Acest lucru se face cu ajutorul funciei
mUSBUSARTIsTxTrfReady .
Lungimea maxim a irului inclusiv caracterul NULL este de 255. Dac nu
este gsit caracterul NULL atunci vor fi transmii primele 255 de caractere.
void example_1(void)
Exemplul 1:
{
if(mUSBUSARTIsTxTrfReady())
putrsUSBUSART(Hello World.);
}

104

Exemplul 2:

rom char example_string[] = {Microchip};


void example_2(void)
{
if(mUSBUSARTIsTxTrfReady())
putrsUSBUSART(example_string);
}

putsUSBUSART
Transmite un ir de caractere aflat n memoria de date
Funcia:
void putsUSBUSART(char *data);
Prototip:
Detalii:
Aceast funcie transmite un sir de caractere terminat cu caracterul NULL aflat
n memoria de date, la portul USB.
nainte de a transmite irul trebuie verificat dac driverul este gata pentru
recepia de date noi. Acest lucru se face cu ajutorul funciei
mUSBUSARTIsTxTrfReady .
Lungimea maxim a irului inclusiv caracterul NULL este de 255. Dac nu
este gsit caracterul NULL atunci vor fi transmii primele 255 de caractere.
char example_string[4];
Exemplu:
void example_1(void)
{
example_string[0]=U;
example_string[1]=S;
example_string[2]=B;
example_string[3]=0x00; // NULL chr
if(mUSBUSARTIsTxTrfReady())
putsUSBUSART(example_string);
}
Macro mUSBUSARTTxRom
Transmite un ir de caractere de lungime cunoscut aflat n memoria program
Macro:
mUSBUSARTTxRom(rom byte *pData, byte len);
Prototip:
Argumente: *pData - pointer catre sirul de caractere
len - numrul de octei transmii
Aceast macroinstruciune transmite un sir de caractere de lungime cunoscut
Detalii:
aflat n memoria program, la portul USB.
nainte de a transmite irul trebuie verificat dac driverul este gata pentru
recepia de date noi. Acest lucru se face cu ajutorul funciei
mUSBUSARTIsTxTrfReady .
rom char example_string[] = {0x31,0x32,0x33};
Exemplu:
void example_1(void)
{
if(mUSBUSARTIsTxTrfReady())
mUSBUSARTTxRom((rom byte*)example_string,3);
}
Macro mUSBUSARTTxRam
Transmite un ir de caractere de lungime cunoscut aflat n memoria de date
Macro:
mUSBUSARTTxRam(byte *pData, byte len);
Prototip:
Argumente: *pData - pointer catre sirul de caractere
len - numrul de octei transmii. Numrul de octei transmii (len) trebuie
s fie mai mic sau egal cu 255.
105

Detalii:

Exemplu:

Aceast macroinstruciune transmite un ir de caractere de lungime cunoscut


aflat n memoria de date, la portul USB.
nainte de a transmite irul trebuie verificat dac driverul este gata pentru
recepia de date noi. Acest lucru se face cu ajutorul funciei
mUSBUSARTIsTxTrfReady.
char example_string[3];
void example_1(void)
{
example_string[0] = U;
example_string[1] = S;
example_string[2] = B;
if(mUSBUSARTIsTxTrfReady())
{
mUSBUSARTTxRam((byte*)example_string,3);
}
}

Macro mUSBUSARTIsTxTrfReady
Testare disponibilitate USB
Macro:
BOOL mUSBUSARTIsTxTrfReady(void);
Prototip:
Aceast macroinstruciune returneaz 1 dac driverul este gata s
Detalii:
recepioneze date i returneaz 0 n caz contrar. Macroinstruciunea trebuie
apelat nainte de transmiterea datelor la USB.
Apelarea acestei macroinstruciuni nu trebuie s se fac n funcii cu blocare,
de exemplu: while(!mUSBUSARTIsTxTrfReady()).
void example_1(void)
Exemplu:
{
if(mUSBUSARTIsTxTrfReady()){
putrsUSBUSART(Microchip);
}
}
getsUSBUSART
Copiaz datele recepionate de la USB n memoria de date
Funcia:
byte getsUSBUSART(char *buffer, byte len);
Prototip:
Argumente: *buffer este un pointer ctre irul de caractere unde vor fi copiate datele.
len este numrul de octei ce se dorete a fi recepionai.
byte este numrul de octei copiai n memorie
Funcia copiaz datele recepionate de la USB n memoria de date.
Detalii:
Funcia este fr blocare.
Dac nu exist datre recepionate ea returneaz zero.
Dac numrul de octei recepionai este mai mare dect lungimea len, n
memorie vor fi copiai doar numrul de octei specificai prin parametrul
len. Lungimea irului buffer trebuie s fie mai mare sau egal cu
numrul de octei specificat in len.
char input_buffer[64];
Exemplu:
void example_1(void)
{
byte index, count, total_sum;
if(getsUSBUSART(input_buffer, 8)
{
count = mCDCGetRxLength();
106

total_sum = 0;
for(index = 0; index < count; index++)
{
total_sum += input_buffer[index];
}
}

mCDCGetRxLength
Returneaz numrul de octei copiai n memorie
Funcia:
byte mCDCGetRxLength(void)
Prototip:
Returneaz: byte este numrul de octei copiai n memorie la ultimul apel a funciei
getsUSBUSART
Aceast funcie returneaz numrul de octei copiai n memorie la ultimul
Detalii:
apel al funciei getsUSBUSART.
char input_buffer[64];
Exemplu:
void example_1(void)
{
if(getsUSBUSART(input_buffer, 2)
{
// Do something with input_buffer[0]
if(mCDCGetRxLength() == 2)
// Do something with input_buffer[1]
}
}
2.3 Specificaii privind implementarea portului serial virtual
n codul implementat de utilizator nu trebuie folosite funcii cu blocare, de exemplu :
while(a==1) { ... }
Nu folosii urmtoarea secven de cod: while(!mUSBUSARTIsTxTrfReady())
Trebuie avut n vedere tipul de pointer pe care l ateapt funciile
mUSBUSARTTxRom i mUSBUSARTTxRam. Este posibil ca s fie nevoie de o
schimbare a tipului de pointer (casting).
nainte de a transmite date la USB trebuie verificat dac driverul este pregatit s
primeasc respectivele date. Acest lucru se face prin apelarea funciei
mUSBUSARTIsTxTrfReady.
Funciile
putrsUSBUSART, putsUSBUSART
mUSBUSARTTxRom
i
mUSBUSARTTxRam sunt funcii fr blocare, ele nu transmit imediat datele la portul
USB i nu ateapt ca datele s fie trimise. Funcia care trimite de fapt datele este
CDCTxService i ea este apelat prin intermediul funciei USBTasks. Funcia
USBTasks trebuie apelat n bucla principal a programului ca n exemplul de mai
jos.

107

2.4 Exemplu de cod pentru comunicare serial


n urmtorul exemplu microcontrolerul transmite date la interval de 1 secund ctre
computer i recepioneaz date (1 octet) . Dac se recepioneaz caracterul a
microcontrolerul va schimba starea bitului 3 de la portul D la care este conectat un LED. Dac
se recepioneaz caracterul s microcontrolerul va schimba starea bitului 4 de la portul D la
care este conectat un al doilea LED.
// definire valoare nscris n TIMER0

pt. o ntrziere de

1 sec

#define delay_val 26473


void main(void)
{
InitializeSystem();
OpenTimer0( TIMER_INT_OFF & T0_16BIT & T0_SOURCE_INT & T0_PS_1_128 );
WriteTimer0( delay_val );
TRISD = 0xf3 ;
// bit 2 si 3 = 0 configurare port
while(1)
{

// Bucla infinit

//funcia USB Tasks trebuie sa fie apelat la fiecare ciclu din bucla while
USBTasks();
if(mUSBUSARTIsTxTrfReady())
// Test dac se pot transmite date
{
if(INTCONbits.T0IF==1)
// a trecut 1 sec?
{
INTCONbits.T0IF = 0;
// se terge bitul T0IF
WriteTimer0(delay_val); // se nscrie valoarea dorit a ntrzierii
trans_buffer[0] = '-';
// se scriu datele n buffer
trans_buffer[1] = 't';
trans_buffer[2] = '-';
trans_buffer[3] = ' '
// spaiu
trans_buffer[4] = 0;
// caracterul NULL
putsUSBUSART(trans_buffer); // se transmit datele la PC
}
}
if(getsUSBUSART(rec_buffer,2)) //recepie date
{
if (rec_buffer[0]=='a')
{
LATD = 0x04;
//un led aprins
}

if (rec_buffer[0]=='s')
{
LATD = 0x08;
}

//alt led aprins

} //end while
} //end main

108

3. Probleme propuse
P1. S se realizeze un program de tip cheie electronic. Microcontrolerul va atepta
transmiterea unui ir de caractere de la computer, acest ir va fi comparat cu un ir de
caractere aflat n memoria program a microcontrolerului. Dac cele dou iruri sunt
echivalente acest lucru va fi semnalizat prin aprinderea unui LED de pe placa de dezvoltare.
P2. S se realizeze un program ce face achiziie de semnale analogice de la
convertorul analogic digital i transmite datele n format ASCII ctre portul serial virtual.
Indicaii
Pentru crearea proiectului va fi utilizat proiectul cadru ce se gsete pe serverul
facultii.
Pentru testarea aplicaiei se poate folosi aplicaia HyperTerminal. Modul de lucru i
setarea programului de mai sus este prezentat n Anexa 7.

109

Anexa 1 Setul de instruciuni pentru microcontrolerul PIC18F4455


Setul de instruciuni al microcontrolerului PIC18F4455 poate fi mprit n patru
categorii de baz:
Instruciuni pe octet
Instruciuni pe bit
Instruciuni cu constante (literali)
Instruciuni de control
1. Formatul instruciunilor
1.1 Instruciuni orientate pe octet
Majoritatea instruciunilor orientate pe octet au trei operanzi:
1. Registrul (specificat prin operandul f)
2. Destinaia rezultatului (specificat prin operandul d)
3. Zona de memorie accesat (specificat prin operandul a)
n instruciunile pe octet, operandul f specific registrul1 care urmeaz a fi folosit de
instruciune. Operandul d specific locul n care va fi plasat rezultatul operaiei realizate de
instruciune. Dac d=0 (d=W) rezultatul operaiei va fi plasat n registrul de lucru WREG.
Dac d=1 (d=F) rezultatul operaiei va fi plasat n registrul specificat n instruciune.
Operandul a specific modul de acces la registrul f. Dac a=0 (a=ACCESS) atunci
registrul f se gsete n Access Bank. Dac a=1 (a=BANKED) atunci registrul f se gsete
n Bank-uri, iar pentr a-l accesa se utilizeaz registrul BSR.
n Tabelul A1.1 se prezint formatul general al instruciunilor pe octet i cteva
exemple de utilizare.
Tabel A1.1. Formatul general al instruciunilor orientate pe octet
Format instruciuni orientate pe octet
Exemplu
cod_operaie
f,d,a
ADDWF REG1, W, BANKED
cod_operaie
f,a
CLRF
REG2, ACCESS
f=adresa pe 8 bii a registrului
d=0 (d=W) destinaia rezultatului este registrul de lucru WREG
d=1 (d=F) destinaia rezultatului este registrul f
a=0 (a=ACCESS) registrul f se gsete n Access Bank
a=1 (a=BANKED) registrul f se gsete n Bank-uri

Excepie:

MOVFF

MOVFF

fs,fd

REG_s, REG_d

fs=adresa pe 12 bii a registrului surs


fd=adresa pe 12 bii a registrului destinaie

1.2. Instruciuni orientate pe bit


Toate instruciunile orientate pe bit au trei operanzi:
1. Registrul (specificat prin operandul f)
2. Bitul din registru (specificat prin operandul b)
3. Zona de memorie accesat (specificat prin operandul a)
n instruciunile pe bit,. operandul b selecteaz bitul afectat de operaia realizat de
instruciune, iar operandul f specific registrul n care se gsete acel bit. Operandul a
specific zona de memorie n care se gsete registrul accesat.
1

Registrul f poate fi specificat fie prin numele su simbolic (dac are) fie prin adresa sa de 8 bii

110

n Tabelul A1.2 se prezint formatul general al instruciunilor pe bit i un exemplu de


utilizare.
Tabel A1.2. Formatul general al instruciunilor orientate pe bit
Format instruciuni orientate pe bit
Exemplu
cod_operaie
f,b,a
BSF REG, 4, ACCESS
f=adresa pe 8 bii a registrului
b=poziia bitului (0:7) n cadrul registrului f
a=0 (a=ACCESS) registrul f se gsete n Access Bank
a=1 (a=BANKED) registrul f se gsete n Bank-uri

1.3. Instruciuni cu constante


Instruciunile cu constate utilizeaz n general un singur operand k reprezentnd
valoarea efectiv a constantei utilizate de instruciune. n Tabelul A1.3 se prezint formatul
general al instruciunilor cu constante i cteva exemple de utilizare.
Tabel A1.3. Formatul general al instruciunilor cu constante
Format instruciuni cu constante
Exemplu
cod_operaie
k
MOVLW
d23
k=valoarea efectiv pe 8 bii

Excepie:

LFSR

LFSR

f,k

FSR0, h100

f=registrul FSR utilizat


k=adresa pe 12 bii

1.4. Instruciuni de control


Instruciunile de control pot utiliza urmtorii operanzi:
adres din memoria program / etichet (specificat prin operandul n)
Utilizarea stivei rapide n cazul instruciunilor CALL, RETURN i RETFIE
(specificat prin operandul s)
Fr operand
n Tabelul A1.4 se prezint formatul general al instruciunilor cu constante i cteva
exemple de utilizare.
Tabel A1.4. Formatul general al instruciunilor de control
Format instruciuni de control
Exemplu
cod_operaie
n
GOTO
main_loop
cod_operaie
n,{s}
CALL
rutina
cod_operaie
s
RETURN FAST
cod_operaie
NOP
n=etichet (adres din memoria program pe 20bii)
s= utilizare stiv rapid

Excepie:

RETLW
k=constant pe 8 bii

RETLW

111

0x15

2. Setul de instruciuni
Majoritatea instruciunilor sunt reprezentate n memoria program prin cuvinte cu
lungimea de 16 bii (2 octei), cu excepia a patru instruciuni (lungi) reprezentate prin 32 de
bii (2 cuvinte = 4 octei).
Toate instruciunile scurte se execut ntr-un singur ciclu instruciune. Excepie fac
instruciunile de comparaie pentru care condiia e evaluat ca adevrat sau instruciunile
care modifc numrtorul de program. n aceste cazuri instruciunile respective se execut n
2 sau 3 cicluri instruciune.
Toate instruciunile lungi se execut n 2 cicluri instruciune.
Un ciclu instruciune const din patru perioade de oscilaie. Astfel, n cazul unei
frecevene de lucru FOSC=20MHz, timpul de execuie al unei instruciuni este
Ti=4/FOSC=0.2s.
Tabelul A1.5 cuprinde setul de instruciuni recunoscute de compilatorul Microchip
MPASM pentru microcontrolerul PIC18F4455. n acest tabel se utilizeaz urmtoarele
notaii:
a

b
BSR
d
f
fs
fd
FSR
k
n
PC
PRODH
PRODL
s

WREG
{}

Metoda de acces
a=0 (a=ACCESS): locaia de memorie RAM (registrul) se gsete n Access
Bank (BSR se ingnor)
a=1 (a=BANKED): locaia de memorie RAM (registrul) se gsete n Bankuri. Bank-ul utilizat este specificat de registrul BSR
Poziia bitului n cadrul unui registru (0-7)
Bank Select Register. Registru utilizat pentru selectarea bank-ului curent de lucru
Destinaia rezultatului
d=0 (d=W): rezultatul este stocat n WREG
d=1 (d=F): rezultatul este stocat n registrul f
Adresa de 8 bii a unui registru (00h - FFh) sau identificatorul de 2 bii al
regitrilor FSR (0h 3h)
Adresa de 12 bii a unui registru (000h - FFFh). Adresa registrului surs
Adresa de 12 bii a unui registru (000h - FFFh). Adresa registrului destinaie
File Select Register
Constant (valoare efectiv reprezentat pe 8 sau 12 bii n funcie instruciune)
Etichet sau adres efectiv din memoria program
Numrtorul de program
Registru care conine octetul superior al operaiei de nmulire
Registru care conine octetul inferior al operaiei de nmulire
Utilizarea stivei rapide
s=0: nu se utilizeaz stiva rapid pentru salvarea / refacerea regitrilor
STATUS, WREG, BSR
s=1 (s=FAST): se utilizeaz stiva rapid pentru salvarea / refacerea regitrilor
STATUS, WREG, BSR
Registrul de lucru
Argument opional al instruciunii

112

Instr. de
mutare

Instruciuni de
comparaie

Instruciuni logice

Instruciuni aritmetice

Tabelul A1.5. Setul de instruciuni al microcontrolerului PIC18F4455


Instruciuni orientate pe octet
Cat.
Instruciuni
Descriere
Cicluri instr.
ADDWF
f,d,a
1
Adun WREG cu f
ADDWFC
f,d,a
1
Adun WREG cu f i cu bitul de transport
SUBWF
f,d,a
1
Scade WREG din f
SUBWFB
f,d,a
1
Scade f din WREG cu bitul de mprunut
SUBFWB
f,d,a
1
Scade WREG din f cu bitul de mprumut
INCF
f,d,a
1
Incrementeaz f
DECF
f,d,a
1
Decrementeaz f
2
MULWF
f,a
1
nmulete f cu WREG
NEGF
f,a
1
Negare f
ANDWF
f,d,a
1
I logic ntre WREG i f
IORWF
f,d,a
1
SAU logic ntre WREG i f
XORWF
f,d,a
1
SAU-EXCLUSIV ntre WREG i f
COMF
f,d,a
1
Complement f
CLRF
f,a
1
Resetare bii din registrul f
SETF
f,a
1
Setare bii din registrul f
SWAPF
f,d,a
1
Interschimbare semioctei din registrul f
RLCF
f,d,a
1
Rotire f la stnga cu bit de transport
RLNCF
f,d,a
1
Rotire f la stnga fr bit de transport
RRCF
f,d,a
1
Rotire f la dreapta cu bit de transport
RRNCF
f,d,a
1
Rotire f la dreapta fr bit de transport
INCFSZ
f,d,a
1 (2 sau 3)
Incrementeaz f, salt dac rezultatul = 0
INCFSNZ f,d,a
1 (2 sau 3)
Incrementeaz f, salt dac rezultatul 0
DECFSZ
f,d,a
1 (2 sau 3)
Decrementeaz f, salt dac rezultatul = 0
DECFSNZ f,d,a
1 (2 sau 3)
Decrementeaz f, salt dac rezultatul 0
TSTFSZ
f,a
1 (2 sau 3)
Testeaz f, salt dac f=0
CPFSEQ
f,a
1 (2 sau 3)
Compar f cu WREG, salt dac f=WREG
CPFSGT
f,a
1 (2 sau 3)
Compar f cu WREG, salt dac f>WREG
CPFSLT
f,a
1 (2 sau 3)
Compar f cu WREG, salt dac f<WREG
MOVWF
f,a
1
Mut WREG n f
MOVF
f,d,a
1
Mut f
MOVFF
fs,fd
2
Mut fs(sursa) n fd(destinaie)

Instr.
comp

Instr.
logice

Instruciuni orientate pe bit


Cat.
Instruciuni
BCF
f,b,a
BSF
f,b,a
BTG
f,b,a
BTFSC
f,b,a
BTFSS
f,b,a

Descriere
Reseteaz bitul b din registrul f
Seteaz bitul b din registrul f
Schimb starea bitului b din registrul f
Testeaz bitul b din reg. f, salt dac este 0
Testeaz bitul b din reg. f, salt dac este 1

rezultatul acestei operaii se va regsi n regitrii PRODH:PRODL

113

Cicluri instr.
1
1
1
1 (2 sau 3)
1 (2 sau 3)

Descriere
Adun WREG cu literal
Scade WREG din literal
nmulete WREG cu literal
I logic ntre WREG i literal
SAU logic ntre WREG i literal
SAU-EXCLUSIV ntre WREG i literal
Mut literal n WREG
Mut literal n BSR<3:0>
Mut literal (12 bii) n FSR(f)
Revenire din subrutin cu literal n WREG3

Cicluri instr.
1
1
1
1
1
1
1
1
2
2

Instruciuni de control
Cat.
Instruciuni
BC
n
BN
n
BOV
n
BZ
n
BNC
n
BNN
n
BNOV
n
BNZ
n
BRA
n
GOTO
n
PUSH
POP
CALL
n,s
RETURN
s
RETLW
k
RETFIE
s
RCALL
n
NOP
RESET
CLRWDT
SLEEP
DAW

Descriere
Salt dac bitul de transport (carry) este 1
Salt dac bitul negativ este 1
Salt dac bitul de overflow este 1
Salt dac bitul zero este 1
Salt dac bitul de transport (carry) este 0
Salt dac bitul negativ este 0
Salt dac bitul de overflow este 0
Salt dac bitul zero este 0
Salt necondiionat
Salt la adresa / etichet
Pune n stiv (Salveaz PC n stiv)
Scoate din stiv (Reface PC)
Apel de subrutin
Revenire din subrutin
Revenire din subrutin cu literal n WREG
Revenire din rutina de tratare a ntreruperii
Apel relativ
Nici o operaie
Resetare soft a controlerului
tergere Watch Dog Timer
Intrare n mod Stand-By
Ajusteaz zecimal WREG

Cicluri instr.
1 (2)
1 (2)
1 (2)
1 (2)
1 (2)
1 (2)
1 (2)
1 (2)
2
2
1
1
2
2
2
2
2
1
1
1
1
1

Instr. de
mutare

Instr. aritmetice
i logice

Instruciuni cu constante
Cat.
Instruciuni
ADDLW
k
SUBLW
k
MULLW
k
ANDLW
k
IORLW
k
XORLW
k
MOVLW
k
MOVLB
k
LFSR
f,k
RETLW
k

Instr. de
scriere

Instr. de
citire

Instruciuni tabelare (transfer ntre memoria de date RAM i memoria program)


Cat.
Instruciuni
Descriere
Cicluri instr.
TBLRD*
Citire tabelar
2
TBLRD*+
Citire tabelar cu post incrementare
TBLRD*Citire tabelar cu post decrementare
TBLRD+*
Citire tabelar cu pre incrementare
TBLWT*
Scriere tabelar
2
TBLWT*+
Scriere tabelar cu post incrementare
TBLWT*Scriere tabelar cu post decrementare
TBLWT+*
Scriere tabelar cu pre incrementare
3

aceast instruciune se regsete i la categoria instruciuni de control

114

3. Exemple
n continuare, sunt explicate mai detaliat cteva din instruciunile disponibile. Acestea
sunt prezentate n ordine alfabetic. S-a ncercat selectarea unei instruciuni din fiecare
categorie n parte. Pentru detalii referitoare la instruciunile care nu au fost acoperite n
aceast lucrare se poate consulta documentaia tehnic a microcontrolerului PIC18F4455.
Atenie o serie de instruciuni afecteaz o serie de bii din registrul STATUS4.
ANDWF - I logic ntre WREG i f
ANDWF f{,d{,a}}
Sintaxa:
Operanzi:
0f255 valoare pe 8 bii care specific adresa unui registru din memorie
d[0,1] destinaia rezultatului
a[0,1] metoda de acces
Descriere:
(WREG) I (f) destinaie
Detalii:
Instruciunea realizeaz operaia I-LOGIC ntre coninutul registrului de
lucru WREG i coninutul registrului f. Dac operandul d=0 (W) rezultatul se
stocheaz n registrul WREG. Dac operandul d=1 (F) rezultatul se stocheaz
n registrul f.
Dac operandul a=0 (ACCESS) este selectat Access Bank-ul.
Dac operandul a=1 (BANKED) se folosete registrul BSR pentru a selecta
bank-ul de lucru.
1 ciclu
Cicluri:
ANDWF
REG,0,0
Exemplu:
naintea instruciunii:
WREG = 17h
REG = C2h
Dup instruciune:
WREG = 02h
REG = C2h
BCF - Reseteaz bitul b din registrul f
BCF f,b{,a}
Sintaxa:
Operanzi:
0f255 valoare pe 8 bii care specific adresa unui registru din memorie
0b7 poziia bitului n registru
a[0,1] metoda de acces
Descriere:
0f<b>
Instruciunea terge bitul b din registrul f.
Detalii:
Dac operandul a=0 (ACCESS) este selectat Access Bank-ul.
Dac operandul a=1 (BANKED) se folosete registrul BSR pentru a selecta
bank-ul de lucru.
1 ciclu
Cicluri:
BCF
REG,7,0
Exemplu:
naintea instruciunii:
REG = C7h
Dup instruciune:
REG = 47h

Detalii privind biii din registrul STATUS afectai de instruciuni se gsesc n documentaia tehnic.

115

BTFSS - Testeaz bitul b din registrul f, salt dac este 1


BTFSS f,b,{,a}
Sintaxa:
Operanzi:
0f255 valoare pe 8 bii care specific adresa unui registru din memorie
0b7 poziia bitului n registru
a[0,1] metoda de acces
Descriere:
Salt dac (f<b>) = 1
Detalii:
Instruciunea compar dac bitul de pe poziia b din cadrul registrului f este 1.
Dac bitul este 1 se face salt peste instruciunea urmtoare.
Dac operandul a=0 (ACCESS) este selectat Access Bank-ul.
Dac operandul a=1 (BANKED) se folosete registrul BSR pentru a selecta
bank-ul de lucru.
1 ciclu dac nu se execut salt
Cicluri:
2 cicluri dac se execut salt peste o instruciune scurt
3 cicluri dac se execut salt peste o instruciune lung
AICI:
Exemplu:
BTFSS REG,1,0
FALS:
ADEVARAT:
nainte de instruciune:
PC = Adresa(AICI)
Dup instruciune:
Dac REG<1> = 1
PC = Adresa(ADEVARAT)
Dac REG<1> = 0
PC = Adresa(FALS)
CALL - Apel de subrutin
CALL n{,s}
Sintaxa:
Operanzi:
0n1048575 valoare pe 20 bii (etichet) care specific adresa unei
subrutine din memoria program
s[0,1] utilizare stiv rapid
Descriere:
(PC)+4TOS
kPC<20:1>
dac s=1 se salveaz contextul (WREG, BSR, STATUS) n stiva rapid
Instruciunea permite apelul unei subrutine aflat n spaiul de adrese de 2MB
Detalii:
al memoriei program. Instruciunea determin salvarea adresei de revenire n
stiv (TOS - Top Of Stack). Dac operadul s=1 (FAST) coninutul
regitrilor WREG, BSR i STATUS se salveaz n stiva rapid. Dac s=0 stiva
rapid nu se utilizeaz.
2 cicluri
Cicluri:
Dimensiune: 2 cuvinte (32 bii)
Eticheta_apel CALL
rutina, 0
Exemplu:
nainte de instruciune:
PC = Adresa(Eticheta_apel)
Dup instruciune:
PC = Adresa(rutina)
TOS = Adresa(eticheta_apel+4)

116

CLRF - Resetare bii din registrul f


CLRF f{,a}
Sintaxa:
Operanzi:
0f255 valoare pe 8 bii care specific adresa unui registru din memorie
a[0,1] metoda de acces
Descriere:
00hf
Instruciunea reseteaz toi biii registrului f.
Detalii:
Dac operandul a=0 (ACCESS) este selectat Access Bank-ul.
Dac operandul a=1 (BANKED) se folosete registrul BSR pentru a selecta
bank-ul de lucru.
1 ciclu
Cicluri:
BCF
REG,1
Exemplu:
naintea instruciunii:
REG = C7h
Dup instruciune:
REG = 00h
CPFSEQ - Compar registrul f cu WREG, salt dac f=WREG
CPFSEQ f{,a}
Sintaxa:
Operanzi:
0f255 valoare pe 8 bii care specific adresa unui registru din memorie
a[0,1] metoda de acces
Descriere:
Salt dac (f) = (WREG)
Detalii:
Instruciunea compar coninutul locaiei de memorie de f cu coninutul
registrului de lucru WREG prin realizarea diferenei dintre cele dou valori.
Dac operandul a=0 (ACCESS) este selectat Access Bank-ul.
Dac operandul a=1 (BANKED) se folosete registrul BSR pentru a selecta
bank-ul de lucru.
1 ciclu dac nu se execut salt
Cicluri:
2 cicluri dac se execut salt peste o instruciune scurt
3 cicluri dac se execut salt peste o instruciune lung
AICI:
Exemplu:
CPFSEQ REG,0
DIFERIT:
EGAL:
nainte de instruciune:
PC = Adresa(AICI)
Dup instruciune:
Dac REG = WREG
PC = Adresa(EGAL)
Dac REG WREG
PC = Adresa(DIFERIT)
DECFSZ - Decrementeaz f, salt dac rezultatul este 0
DECFSZ f{,d{,a}}
Sintaxa:
Operanzi:
0f255 valoare pe 8 bii care specific adresa unui registru din memorie
d[0,1] destinaia rezultatului
a[0,1] metoda de acces
Descriere:
(f)-1 destinaie
salt dac rezultatul =0
Detalii:
Instruciunea decrementeaz valoarea din registrul f. Dac operandul d=0
117

Cicluri:
Exemplu:

(W) rezultatul este plasat n registrul WREG. Dac operandul d=1 (F)
rezultatul este plasat napoi n registrul f. Dac rezultatul este 0 se execut salt
peste instruciunea urmtoare
Dac operandul a=0 (ACCESS) este selectat Access Bank-ul.
Dac operandul a=1 (BANKED) se folosete registrul BSR pentru a selecta
bank-ul de lucru.
1 ciclu dac nu se execut salt
2 cicluri dac se execut salt peste o instruciune scurt
3 cicluri dac se execut salt peste o instruciune lung
AICI:
DECFSZ CONTOR,1,1
GOTO LOOP
CONTINUA:
nainte de instruciune:
PC = Adresa(AICI)
Dup instruciune:
CONTOR = CONTOR-1
Dac CONTOR = 0
PC = Adresa(CONTINUA)
Dac CONTOR 0
PC = Adresa(AICI+2)
(PC = Adresa (GOTO))

GOTO - Salt necondiionat la adresa / etichet


GOTO n
Sintaxa:
Operanzi:
0n1048575 valoare pe 20 bii (etichet) care specific adresa unei
instruciuni din memoria program
Descriere:
nPC<20:1>
Instruciunea permite realizarea de salturi necondiionate oriunde n spaiul de
Detalii:
adrese de 2MB al memoriei program. Instruciunea determin ncrcarea
valorii de 20-bii n n numrtorul de program PC<20:1>
Instruciunea coincide la nivel de programare cu saltul la o etichet specificat
n program.
2 cicluri
Cicluri:
GOTO
eticheta
Exemplu:
Dup instruciune:
PC = Adresa(eticheta)
INCF - Incrementeaz f
INCF f{,d{,a}}
Sintaxa:
Operanzi:
0f255 valoare pe 8 bii care specific adresa unui registru din memorie
d[0,1] destinaia rezultatului
a[0,1] metoda de acces
Descriere:
(f)+1destinaie
Detalii:
Instruciunea incrementeaz valoarea din registrul f. Dac operandul d=0
(W) rezultatul se stocheaz n registrul WREG. Dac operandul d=1 (F)
rezultatul se stocheaz n registrul f.
Dac operandul a=0 (ACCESS) este selectat Access Bank-ul.
Dac operandul a=1 (BANKED) se folosete registrul BSR pentru a selecta
bank-ul de lucru.
118

Cicluri:
Exemplu:

1 ciclu
INCF
CONTOR,1,0
naintea instruciunii:
CONTOR = 12h
Dup instruciune:
CONTOR = 13h

LFSR - Mut literal (12 bii) n FSR(f)


LFSR f,k
Sintaxa:
Operanzi:
0f2 (f{FSR0, FSR1, FSR2})
0k4095 constant (literal) pe 12 bii care specific o adres absolut din
memoria de date RAM
Descriere:
kf
Detalii:
Instruciunea ncarc constanta de 12 bii n registrul FSR specificat..
2 cicluri
Cicluri:
Dimensiune: 2 cuvnt (32 bii)
LFSR 2, 0x3AB
Exemplu:
Dup instruciune:
FSR2H = 0x03
FSR2L = 0xAB
MOVF - Mut f la destinaie
MOVF f{,d{,a}}
Sintaxa:
Operanzi:
0f255 valoare pe 8 bii care specific adresa unui registru din memorie
d[0,1] destinaia rezultatului
a[0,1] metoda de acces
Descriere:
(f) destinaie
Detalii:
Instruciunea mut coninutul registrului f la destinaia specificat prin
operandul d. Dac operandul d=0 (W) rezultatul se plaseaz n registrul
WREG. Dac operandul d=1 (F) rezultatul se plaseaz napoi n registrul f.
Dac operandul a=0 (ACCESS) este selectat Access Bank-ul.
Dac operandul a=1 (BANKED) se folosete registrul BSR pentru a selecta
bank-ul de lucru.
1 ciclu
Cicluri:
MOVF
REG,W,ACCESS
Exemplu:
naintea instruciunii:
REG = 22h
WREG = FFh
Dup instruciune:
REG = 22h
WREG = 22h
MOVFF - Mut fs(sursa) n fd(destinaie)
MOVF fs,fd
Sintaxa:
Operanzi:
0fs4095 valoare pe 12 bii care specific adresa absolut a unui registru
din memorie
0fd4095 valoare pe 12 bii care specific adresa absolut a unui registru
din memorie
119

Descriere:
Detalii:

Cicluri:
Exemplu:

(fs)(fd)
Instruciunea mut coninutul registrului surs fs n registrul destinaie fd.
Locaia regitrilor fs i fd se poate afla oriunde n spaiul de adrese al
memoriei de date RAM (000h-FFFh)
2 cicluri instruciune
MOVFF
REG1,REG2
naintea instruciunii:
REG1 = 22h
REG2 = FFh
Dup instruciune:
REG1 = 22h
REG2 = 22h

MOVLW - Mut literal n WREG


MOVLW k
Sintaxa:
Operanzi:
0k255 constant (literal) pe 8 bii
Descriere:
kWREG
Detalii:
Instruciunea ncarc constanta de 8 bii n registrul WREG.
1 ciclu
Cicluri:
MOVLW
d23
Exemplu:
Dup instruciune:
WREG = 23
MOVWF - Mut WREG n f
MOVWF f{,a}
Sintaxa:
Operanzi:
0f255 valoare pe 8 bii care specific adresa unui registru din memorie
a[0,1] metoda de acces
Descriere:
(WREG) f
Detalii:
Mut datele din registrul de lucru WREG n registrul f. Locaia registrului f se
poate gsi oriunde n spaiul de adrese de 256 octei al unui bank.
Dac operandul a=0 (ACCESS) este selectat Access Bank-ul.
Dac operandul a=1 (BANKED) se folosete registrul BSR pentru a selecta
bank-ul de lucru.
1 ciclu
Cicluri:
MOVWF
TRISA,0
Exemplu:
naintea instruciunii:
TRIS = FFh
WREG = 0Fh
Dup instruciune:
TRIS = 0Fh
WREG = 0Fh

120

RLCF - Rotire f la stnga cu bit de transport5


RLCF f{,d{,a}}
Sintaxa:
Operanzi:
0f255 valoare pe 8 bii care specific adresa unui registru din memorie
d[0,1] destinaia rezultatului
a[0,1] metoda de acces
Descriere:
(f<n>)dest<n+1>
(f<7>)C
(C)dest<0>
Coninutul registrului f este rotit cu un bit spre stnga prin intermediul bitului
Detalii:
de transport. Dac operandul d=0 (W) rezultatul se plaseaz n registrul
WREG. Dac operandul d=1 (F) rezultatul se plaseaz napoi n registrul f.
Dac operandul a=0 (ACCESS) este selectat Access Bank-ul.
Dac operandul a=1 (BANKED) se folosete registrul BSR pentru a selecta
bank-ul de lucru.

Cicluri:
Exemplu:

1 ciclu
RLCF
REG,W,ACCESS
naintea instruciunii:
REG = 1110 0110
C
= 0
Dup instruciune:
REG = 11100110
WREG = 11001100
C
= 1

RETLW - Revenire din subrutin cu literal n WREG


RETLW k
Sintaxa:
Operanzi:
0k255 constant (literal) pe 8 bii
Descriere:
kWREG
(TOS) PC
Detalii:
Instruciunea ncarc constanta de 8 bii n registrul WREG i determin
scoaterea din stiv (TOS - Top Of Stack) a adresei de revenire din subrutin i
ncrcarea acesteia n numrtorul de program.
2 cicluri
Cicluri:
Dimensiune: 1 cuvnt (16 bii)
Test_bit
Exemplu:
BTFSC REG,2,ACCESS
RETLW 0xFF
RETLW 0x00
nainte de instruciune:
WREG = xxh
Dup instruciune:
Dac REG<2>=0 atunci WREG = 00h
Dac REG<2>=1 atunci WREG = FFh

Anumite instruciuni afecteaz unii bii din registrul STATUS. De exemplu, instruciunea RLCF afecteaz bitul
de transport C (Carry) din registrul STATUS.

121

RETURN - Revenire din subrutin


RETURN {s}
Sintaxa:
Operanzi:
s[0,1] utilizare stiv rapid
Descriere:
(TOS) PC
dac s=1 se restaureaz contextul (WREG, BSR, STATUS) salvat
anterior n stiva rapid
Instruciunea specific ntoarcerea din subrutin. Instruciunea determin
Detalii:
scoaterea din stiv (TOS - Top Of Stack) a adresei de revenire i ncrcarea
acesteia n numrtorul de program. Dac operadul s=1 (FAST) coninutul
stivei rapide se ncarc n regitrii WREG, BSR i STATUS. Dac s=0 stiva
rapid nu se utilizeaz.
2 cicluri
Cicluri:
Dimensiune: 1 cuvnt (16 bii)
RETURN
Exemplu:
Dup instruciune:
PC = TOS
SUBLW - Scade WREG din literal
SUBLW k
Sintaxa:
Operanzi:
0k255 constant (literal) pe 8 bii
Descriere:
k-(WREG) WREG
Detalii:
Valoarea coninut n registrul de lucru WREG se scade din constanta k.
Rezultatul este plasat n WREG.
1 ciclu
Cicluri:
SUBLW
d23
Exemplu:
nainte de instruciune
WREG = 47
Dup instruciune:
WREG = 24

122

Anexa 2 Template de cod surs n asamblare


;***************************************************************************
; Codul surs prezentat n aceast anex reprezint un ablon de baz *
; pentru dezvoltarea aplicaiilor n limbaj de asamblare pentru *
*
; microcontrolerul PIC18F4455.
*
;
; Utilizai acest ablon n programele d-voastr. Introducei modificri *
*
; i completri n el n funcie de ceriele aplicaiei.
*
;
; Consultai documentaia tehnic a microcontrolerului PIC18F4455 pentru *
; informaii suplimentare privind arhitectura microcontrolerului i *
*
; setul de instruciuni
;***************************************************************************
;***************************************************************************
*
; Filename:
*
;
*
; Date:
*
;
*
; File Version:
*
;
*
; Author:
*
;
*
; Company:
*
;
;***************************************************************************
;***************************************************************************
;
*
; Fiiere necesare: P18F4455.INC
*
;
*
;
*
;***************************************************************************

LIST P=18F4455
#include <P18F4455.INC>

;directiv care definete procesorul


;definiie variabile specifice procesorului

;***************************************************************************
; Declaraie variabile
;
urmtoare
sunt
folosite
doar
n
cazul
utilizrii
; Variabilele
; ntreruperilor de prioritate mic (low) pentru salvarea contextului
; (WREG, BSR, STATUS)
CBLOCK
WREG_TEMP
STATUS_TEMP
BSR_TEMP
ENDC

0x080
;variabil utilizat pentru salvarea contextului
;variabil utilizat pentru salvarea contextului
;variabil utilizat pentru salvarea contextului

CBLOCK
VAR
ENDC

0x000
;examplu de variabil declarat n access RAM

123

;***************************************************************************
; EEPROM data
;
; Datele nscrise n EEPROM se definesc aici
ORG

0xf00000

DE

"Test Data",0,1,2,3,4,5

;***************************************************************************
; Adresa de reset
;
; Acest cod se va executa la resetarea microcontrolerului
ORG

0x0000

GOTO

Main

;***************************************************************************
; Vectorul nteruperii cu prioritate mare
;
; Acest cod se va executa la apariia unei nteruperi de prioritate mare
; (high) sau la apariia oricrei nteruperi dac nu se utilizeaz
; prioritile de nterupere.
ORG

0x0008

BRA

HighInt

;salt la rutina de tratare a ntreruperii high

;***************************************************************************
; Vectorul i rutina de tratare a nteruperii cu prioritate mic
;
; Acest cod se va executa la apariia unei nteruperi de prioritate mic
; (low). Aceast poriune de cod poate fi scoas din program dac nu se
; utilizeaz prioritile de nterupere.
ORG

0x0018

movff WREG,WREG_TEMP
movff BSR,BSR_TEMP
movff STATUS,STATUS_TEMP
;

;salvare registru de lucru WREG


;salvare registru BSR
;salvare registru STATUS

*** codul ntreruperii ***


movff STATUS_TEMP,STATUS
movff BSR_TEMP,BSR
movff WREG_TEMP,WREG

;restaurare registru STATUS


;restaurare registru BSR
;restaurare reg. de lucru WREG

retfie
;***************************************************************************
; Rutina de tratare a ntreruperii de prioritate mare
;
; Codul rutinei de tratare a nteruperii de prioritate mare este plasat n
; acest loc pentru a evita un eventual conflict (din cauza dimensiunii
; rutinei) cu rutina de tratare a nteruperii cu prioritate mic
HighInt:
;

*** codul nteruperii ***


retfie

FAST

124

;***************************************************************************
; nceputul programului principal
;
; Corpul principal al programului este plasat aici
Main:
*** codul programului principal ***

;
END

;sfritul programului

125

Anexa 3 Schema electronic a plcii de dezvoltare utilizat n cadrul laboratorului

126

Anexa 4 ncrcarea programului compilat n microcontroler


Pentru a ncrca programul compilat n microcontroler cu ajutorul Boot Loader-ului se
parcurg urmtorii pai:
1.
Se lanseaz n execuie utilitarul PDFSUSB.exe. Aceast aplicaie asigur
interfaa care permite ncrcarea programului compilat (fiier *.hex) n
microcontroler i execuia sa pe microcontroler.
2.
Se intr n modul de lucru BootLoader al microcontrolerului. Pentru acest lucru,
pe placa de dezvoltare se apas i se ine apsat unul din cele dou butoane
conectate la PORTD apoi se apas i se elibereaz butonul de reset. Dac LEDurile conectate la PORTD<2:3> plpie alternativ, modul BootLoader a fost
activat.

Figura A4.1. Placa de dezvoltare cu microcontroler PIC18F4455


3.

n aplicaia utilizat pentru ncrcare se selecteaz placa de dezvoltare.

Figura A4.2. Selectarea plcii de dezvoltare


127

4.

5.

6.

Apsarea pe butonul Load HEX File permite alegerea fiierului cu extensia


*.hex care va fi ncrcat n microcontroler. Acest fiier se gsete n directorul n
care a fost creat proiectul. Fiierul se genereaz automat n urma unei compilri
reuite a proiectului.
Dup selectarea fiierului hex, prin apsarea butonului Program Device acesta
va fi ncrcat n microcontroler.

Figura A4.3. ncrcarea programului n microcontroler


Se execut programul din microcontroler prin apsarea butonului Execute.

Observaii
Programul trebuie compilat de la adresa 0x800 (ORG 0x800). Cu alte cuvinte,
programul realizat trebuie s se plaseze n memoria program ncepnd cu adresa 0x800.
Spaiul de memorie program cuprins ntre adresa 0x000 i 0x800 este rezervat Boot
Loaderului.
Pentru a identifica dac programul realizat a fost compilat de la adresa corect se poate
urmri listarea programului n cod main n partea inferioar a ferestrei aplicaiei de
ncrcare. n Figura A4.4 se prezint cazul unui program compilat de la adresa corect, iar n
Figura A4.5 se prezint cazul unui program compilat de la adresa incorect (0x000000)

Figura A4.4. Program (cod main) compilat de la adresa 0x800

128

Figura A4.5. Program (cod main) compilat de la adresa 0x000

129

Anexa 5 Indicaii privind programarea microcontrolerului PIC18F4455


folosind limbajul de programare C
1. Introducere
Pachetul Microchip C18 include, alturi de toate unelte de limbaj disponibile n
pachetul Microchip MPASM, compilatorul MPLAB C pentru microcontrolerele din familia
PIC18. Acest compilator este disponibil pe site-ul productorului i se instaleaz separat de
mediul de dezvoltare MPLAB.
Compilator MPLAB C18 este un compilator C care ruleaz pe PC i care produce cod
care poate fi executat de microcontrolerele din familia PIC18. Asemenea unui asambler,
compilatorul MPLAB C18 transform limbajul de nivel nalt n cod main. Spre deosebire de
asambler, unde instruciunile erau convertite direct n reprezentarea lor binar, n cazul
compilatorului MPLAB C18 transformarea programului n cod main este un procedeu mult
mai complex care presupune, printre altele, rearanjarea codului, eliminarea codului care nu se
execut, identificarea regitrilor i a datelor utilizate ineficient i optimizarea accesului la
acestea etc.
Compilatorul MPLAB C18 permite simplificarea procesului de dezvoltare al
aplicaiilor pentru sisteme ncorporate bazate pe microcontrolere PIC18 prin utilizarea
limbajului de programare C standard. Printre avantajele limbajului C se pot enumera:
utilizarea pe scar larg, portabilitatea pe diferite arhitecturi, o uurin crescut n depanare i
modificare raportat la limbajul de asamblare i, bineneles, o multitudine de surse
bibliografice care trateaz acest limbaj de programare.
Lucrarea de fa presupune cunoscute fundamentele limbajului de programare C.
2. Structura pachetului
Compilatorul MPLAB C18 poate fi instalat oriunde n structura de directoare a
sistemului de operare. Directorul implicit de instalare este C:\mcc18.
n Figura A5.1 se prezint structura acestui director.

Figura A5.1. Structura directorului mcc18


Tabelul A5.1 cuprinde o scurt descriere a subdirectoarelor

130

Tabelul A5.1. Descrierea subdirectoarelor asociate compilatorului MPLAB C18


Directorul
Descriere
bin
Conine executabilele pentru compilator i linker
doc
Conine documentaia / help-ul pentru compilatorul C18.
example Cuprinde o serie de aplicaii demonstrative pentru familiarizarea utilizatorilor cu
utilizarea limbajului de programare C i a compilatorului MPBLAB C18 la
dezvoltarea aplicaiilor pentru microcontrolere.
h
Cuprinde fiierele de tip header pentru biblioteca standard C i pentru
bibiliotecile specifice diferitelor tipuri de microcontroler suportate.
lib
Conine biblioteca C standard (clib.lib sau clib_e.lib), bibliotecile
specifice microcontrolerelor suportate (p18xxxx.lib sau p18xxxx_e.lib,
unde xxxx identific tipul procesorului) i modulele start-up (c018.o,
c018_e.o, c018i.o, c018i_e.o, c018iz.o, c018iz_e.o)
lkr
Conine fiierele linker script utilizate cu MPLAB C18
mpasm
Conine asamblerul MPASM i fiierele asociate pentru dispozitivele suportate
de MPLAB C18 (p18xxxx.inc)
src
Conine fiierele cod surs, n limbaj C i asamblare, ale bibliotecii standard C i
ale bibiliotecilor specifice diferitelor tipuri de microcontroler suportate.
3. Configurarea proiectului
La fel ca i n cazul dezvoltrii aplicaiilor n limbaj de asamblare, pentru realizarea
programelor n limbajul de programare C, lucrul ncepe cu realizarea unui proiect nou i
configurarea diferitelor opiuni asociate proiectului. n acest sens, o parte din etapele care au
fost prezentate n Lucrarea 1 se pstreaz i nu se va reveni asupra lor. n cele ce urmeaz se
va insista asupra particularitilor specifice proiectelor care utilizeaz compilatorului C18 i
limbajul de programare C.
Una din etapele importante n configurarea proiectului o reprezint configurarea
uneltelor de limbaj (pasul doi din Project Wizard)
Astfel, selectai Microchip C18 Toolsuite n list-boxul Active Toolsuite. n fereastra
Toolsuite Contents ar trebui s fie vizibile urmtoarele componente:
MPASM Assambler
MPLINK Object Linker
MPLAB C18 C Compiler
MPLIB Librarian
Selectai-le pe rnd pentru a v asigura c acestea exist, iar calea lor a fost aleas
corect. Dac s-a instalat compilatorul MPLAB C18 n directorul implicit, atunci calea pentru
executabilul de asamblare (assembler) MPASM va fi:
C:\MCC18\MPASM\mpasmwin.exe
pentru executabilul de legatur (linker-ul) MPLINK:
C:\MCC18\bin\mplink.exe
pentru compilatorul C18:
C:\MCC18\bin\mcc18.exe
iar executabilul bibiliotecii (library) MPLIB:
C:\MCC18\bin\mplib.exe
Dac exist erori n cazul acestor unelte de limbaj, acestea vor fi marcate printr-un X
de culoare roie. n aceast situaie, utilizai butonul Browse pentru a fixa corect calea ctre
cele trei componente.
Odat ncheiat aceast etap, apsai butonul Next >.

131

Figura A5.2. Project Wizard. Selectarea uneletelor de limbaj1


Etapele urmtoare n constituirea proiectului sunt cele obinuite, cu meniunea c
fiierele cod surs care vor conine programul, vor trebui salvate cu extensia *.c i adugate
n proiect.
De asemenea, n cazul aplicaiilor dezvoltate pentru microcontrolerul PIC18F4455,
directorul care conine proiectul va trebui s cuprind dou fiiere adiionale2:
18f4455.lkr
c018i.o
iar fiierul 18f4455.lkr va trebui adugat n proiect.
Pentru a obine o compilare reuit a proiectului, va trebui s ne asigurm c proiectul
conine i calea spre directoarele care cuprind fiierele de tip header (*.h) i bibliotecile
asociate (*.lib) care vor fi utilizate la dezvoltarea aplicaiei.
n acest sens se acceseaz Project>Build Options...>Project i se verific dac
directoarele specificate de Include Search Path i Library Search Path sunt listate, i calea lor
indic spre subdirectoarele specifice asociate compilatorului MPLAB C18.
Cile implicite pentru cele dou componente sunt:
Include Search Path: C:\MCC18\h
Library Search Path: C:\MCC18\lib
Bineneles, cile pentru cele dou componente vor fi diferite dac compilatorul
MPLAB C18 a fost instalat n alt director dect cel implicit. Este i cazul prezentat n Figura
A5.3 care prezint fereastra de configurare a acestor opiuni. n situaia n care cile
respective nu sunt listate, acestea vor trebui adugate manual prin apsarea butonului
simbolizat prin trei puncte (...)

n acest figur se exemplific situaia n care pachetul MPLAB C18 nu a fost instalat n directorul implicit. n
aceast situaie cile spre componente vor trebui selectate manual
2
Aceste fiiere vor fi puse la dispoziie n cadrul laboratorului. Codul surs al 18f4455.lkr este disponibil n
Anexa 6, iar fiierul c018i.o este disponibil n C:\mcc18\lib.

132

Figura A5.3. Fereastra Build Options


Parcurgerea etapelor de configurare a proiectului prezentate n aceast anex va
asigura cadrul necesar dezvoltrii de aplicaii pentru microcontrolerul PIC18F4455 folosind
limbajul de programare C.

133

Anexa 6 18f4455.lkr
Codul surs de mai jos poate fi copiat i salvat ntr-un fiier cu denumirea
18f4455.lkr. Acest fiier se va copia n directorul care conine proiectul pentru aplicaia
dezvoltat folosind limbajul de programare C i compilatorul MPLAB C18, iar apoi se va
aduga la proiect.
// $Id: 18f4455.lkr,v 1.3 2004/08/23 18:08:22 curtiss Exp $
// File: 18f4455.lkr
// Sample linker script for the PIC18F4455 processor
LIBPATH .
FILES c018i.o
FILES clib.lib
FILES p18f4455.lib
CODEPAGE
PROTECTED
CODEPAGE
CODEPAGE
PROTECTED
CODEPAGE
PROTECTED
CODEPAGE
PROTECTED
CODEPAGE
PROTECTED

NAME=vectors

START=0x0

END=0x29

NAME=page
NAME=idlocs

START=0x800
START=0x200000

END=0x5FFF
END=0x200007

NAME=config

START=0x300000

END=0x30000D

NAME=devid

START=0x3FFFFE

END=0x3FFFFF

NAME=eedata

START=0xF00000

END=0xF000FF

ACCESSBANK
DATABANK
DATABANK
DATABANK
DATABANK
DATABANK
PROTECTED
DATABANK
PROTECTED
DATABANK
PROTECTED
DATABANK
PROTECTED
ACCESSBANK
PROTECTED

NAME=accessram
NAME=gpr0
NAME=gpr1
NAME=gpr2
NAME=gpr3
NAME=usb4

START=0x0
START=0x60
START=0x100
START=0x200
START=0x300
START=0x400

END=0x5F
END=0xFF
END=0x1FF
END=0x2FF
END=0x3FF
END=0x4FF

NAME=usb5

START=0x500

END=0x5FF

NAME=usb6

START=0x600

END=0x6FF

NAME=usb7

START=0x700

END=0x7FF

NAME=accesssfr

START=0xF60

END=0xFFF

SECTION

NAME=CONFIG

ROM=config

STACK SIZE=0x100 RAM=gpr3

134

Anexa 7 Utilizarea aplicaiei HyperTerminal


1. Introducere
Pentru testarea comunicaiilor seriale se poate folosi programul HyperTerminal din
sistemul de operare Windows. Acest program se poate lansa n execuie prin clic pe icoana ce
se gsete n: Start Programs Acessories Communication HiperTerminal.
Cu acest program se poate recepiona / transmite date de la / la un periferic.
La lansarea n execuie a programului apare o fereastr cu un cmp n care se va scrie
numele conexiunii curente, cum se poate observa n Figura A7.1.

Figura A7.1. Fereastr pentru alegere numelui conexiunii.


Dup alegerea numelui conexiunii trebuie selectat portul serial cu care se dorete
efectuarea transferului de date. n Figura A7.2 a fost ales portul serial COM11.

Figura A7.2. Fereastr pentru alegere portului serial.

135

Urmtorul pas este alegerea vitezei de comunicare, numrul de bii al datelor, paritii,
numrul biilor de stop i al controlului fluxului de date (Flow control). n Figura A7.3 a fost
aleas urmtoarea configuraie: viteza de comunicaie de 9600 bii pe secund, 8biti de date,
fara paritate, un bit de stop i fr controlul fluxului de date.

Figura A7.3. Fereastr pentru configurarea portului serial.


Dup efectuarea unui clic pe butonul OK programul este pregtit pentru recepionarea
i transmiterea de date.
n Figura A7.4 este prezentata o recepie de date de la portul serial virtual realizat cu
ajutorul unui PIC18F4455 care a fost programat conform specificaiilor Communication
Device Class (CDC).

Figura A7.4. Recepie de date de la portul serial virtual.


Pentru transmiterea de date de la computer la Microcontroler, se poate folosi tastatura.

136

Bibliografie
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

Steven F. Barrett, Daniel J. Pack Microcontrollers Fundamentals for Engineers and


Scientists, Morgan & Claypool Publishers, 2006
Genge Bela, Haller Piroska Proiectarea sistemelor dedicate i ncorporate cu
microcontrolerul PIC, Editura Universitii Petru Maior, Tg. Mure, 2008
Randall Hyde The Art of Assembly Language, No Starch Press, 2003
Dogan Ibrahim Advanced PIC Microcontroller Projects in C From USB to RTOS
with the PIC18F Series, Elsevier, 2008
Lucio Di Jasio, Tim Wilmshurst, Dogan Ibrahim, John Morton, Martin P. Bates, Jack
Smith, D. W. Smith, Chuck Hellebuyck PIC Microcontrollers, Elsevier, 2008
Joseph Julicher Hardware Techniques for PICmicro Microcontrollers, Microchip
Technology Inc., 2003
Microchip Microchip USB Device Firmware Framework Users Guide, Microchip
Technology Inc., 2008
Microchip MPLAB IDE Users Guide with MPLAB Editor and MPLAB SIM
Simulator, Microchip Technology Inc. 2009
Microchip MPLAB C18 C Compiler Getting Started, Microchip Technology Inc.
2005
Microchip MPLAB C18 C Compiler Libraries, Microchip Technology Inc. 2005
Microchip MPLAB C18 C Compiler Users Guide, Microchip Technology Inc. 2005
Microchip PIC18F2455/2550/4455/4550 Data Sheet, Microchip Technology Inc.
2006
Joakim Ogren Hardware Book v1.3, 1997
Jivan S. Parab, Vinod G. Shelake, Rajanish K. Kamat, Gourish M. Naik Exploring C
for Microcontrollers, Springer, 2007
Craig Peacock USB in a Nutshell. Making Sense of the USB Standard, Beyond
Logic, 2005
Rawin Rojvanit Migrating Applications to USB from RS-232 UART with Minimal
Impact on PC Software, Microchip Technology Inc 2004
Julio Sanchez Maria P. Canton Microcontroller Programming. The Microchip PIC,
CRC Press 2007 by Taylor & Francis Group
Milan Verle PIC Microcontrollers 1st edition, mikroElektronika, 2008

137

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