Sunteți pe pagina 1din 72

CAPITOLUL 1

Introducere n Microcontrolere
Introducere
Istorie
Microcontrolere contra microprocesoare

1.1 Unitatea de memorie


1.2 Unitatea de procesare
1.3 Bus-ul
1.4 Unitatea intrare-ieire
1.5 Comunicaie serial
1.6 Unitatea de timer
1.7 Watchdog-ul
1.8 Convertorul Analog-Digital
1.9 Programul

Introducere
Circumstanele n care ne gsim astzi n domeniul microcontrolerelor i-au avut
nceputurile n dezvoltarea tehnologiei circuitelor integrate. Aceast dezvoltare a
fcut posibil nmagazinarea a sute de mii de tranzistoare ntr-un singur cip. Aceasta
a fost o premiz pentru producia de microprocesoare, i primele calculatoare au fost
fcute prin adugarea perifericelor ca memorie, linii intrare-ieire, timer-i i altele.
Urmtoarea cretere a volumului capsulei a dus la crearea circuitelor integrate.
Aceste circuite integrate conin att procesorul ct i perifericele. Aa s-a ntmplat
cum primul cip coninnd un microcalculator, sau ce va deveni cunoscut mai trziu ca
microcontroler a luat fiin.

Istorie
Este anul 1969, i o echip de ingineri japonezi de la compania BUSICOM sosesc n
Statele Unite cu cererea ca unele circuite integrate pentru calculatoare s fie fcute
folosind proiectele lor. Propunerea a fost fcut ctre INTEL, iar Marcian Hoff a fost
desemnat responsabil cu acest proiect. Pentru c el era cel ce avea experien n
lucrul cu un calculator (PC) PDP8, i-a venit s sugereze o soluie diferit fundamental
n locul construciei propuse. Aceast soluie presupunea c funcionarea circuitului
integrat este determinat de un program memorat n el. Aceasta a nsemnat c
configuraia ar fi fost mult mai simpl, dar aceasta ar fi cerut mult mai mult
memorie dect ar fi cerut proiectul propus de inginerii japonezi. Dup un timp, cu
toate c inginerii japonezi au ncercat s caute o soluie mai simpl, ideea lui Marcian
a ctigat, i a luat natere primul microprocesor. n transformarea unei idei ntr-un
produs finit, Frederico Faggin a fost de un ajutor major pentru INTEL. El s-a
transferat la INTEL, i doar n 9 luni a reuit s scoat un produs din prima sa
concepie. INTEL a obinut drepturile de a vinde acest bloc integral n 1971. n primul
rnd ei au cumprat licena de la compania BUSICOM care nu au avut idee ce
comoar avuseser. n timpul acelui an a aprut pe pia un microprocesor numit
4004. Acela a fost primul microprocesor de 4 bii cu vitez 6000 operaii pe secund.
Nu mult dup aceea, compania american CTC a cerut de la INTEL i de la Texas
Instruments s fac un microprocesor pe 8 bii pentru folosin n terminale. Cu
toate c CTC a renunat la aceast idee pn la sfrit, INTEL i Texas Instruments
au continuat s lucreze la microprocesor i n aprilie 1972 a aprut pe pia primul
microprocesor de 8 bii sub numele de 8008. Putea s adreseze 16Kb de memorie i
avea 45 de instruciuni i viteza de 300.000 de operaii pe secund. Acel
microprocesor a fost predecesorul tuturor microprocesoarelor de astzi. INTEL au
continuat dezvoltrile lor pn n aprilie 1974 i au lansat pe pia microprocesorul
de 8 bii sub numele de 8080 ce putea adresa 64Kb de memorie i avea 75 de
instruciuni, iar preul ncepuse de la 360$.

ntr-o alt companie american Motorola, i-au dat seama repede ce se ntmpla,
aa c au lansat pe pia un microprocesor de 8 bii 6800. Constructor ef era Chuck
Peddle i pe lng microprocesorul propriu-zis, Motorola a fost prima companie care
s fac alte periferice ca 6820 i 6850. La acel timp multe companii au recunoscut
marea importan a microprocesoarelor i au nceput propriile lor dezvoltri. Chuck
Peddle prsete Motorola pentru a se muta la MOS Technology i continu s
lucreze intensiv la dezvoltarea microprocesoarelor.

La expoziia WESCON din Statele Unite din 1975 a avut loc un eveniment critic n
istoria microprocesoarelor. MOS Technology a anunat c produce microprocesoarele
6501 i 6502 la 25$ bucata pe care cumprtorii le puteau cumpra imediat. Aceasta
a fost att de senzaional nct au crezut c este un fel de nelciune, gndind c
competitorii vindeau 8080 i 6800 la 179$. Ca un rspuns la competitorii lor att
INTEL ct i Motorola au sczut preurile lor n prima zi a expoziiei pn la 69.95$
pe microprocesor. Motorola intenteaz repede proces contra lui MOS Technology i
contra lui Chuck Peddle pentru copierea protejatului 6800. MOS Technology
nceteaz de a mai produce 6501 dar continu s produc 6502. 6502 este un
microcontroler pe 8 bii cu 56 de instruciuni i o capabilitate de adresare direct de
64Kb de memorie. Datorit costului sczut, 6502 devine foarte popular, aa c este
instalat n calculatoare ca :KIM-1, Apple I, Apple II, Atari, Comodore, Acorn, Oric,
Galeb, Orao, Ultra i multe altele. Curnd apar civa productori de 6502 (Rockwell,
Sznertek, GTE, NCR, Ricoh i Comodore preiau MOS Technology) ce era n momentul
prosperitii sale vndut la o rat de 15 milioane de microprocesoare pe an!

Alii totui nu au cedat. Federico Faggin prsete INTEL, i i pornete propria sa


companie Zilog Inc.
n 1976 Zilog anun Z80. n timpul crerii acestui microprocesor, Faggin ia o decizie
crucial. tiind c un mare numr de programe fuseser dezvoltate pentru 8080,
Faggin i d seama c muli vor rmne fideli acelui microprocesor din cauza marii
cheltuieli care ar rezulta n urma refacerii tuturor programelor. Astfel el decide c un
nou microprocesor trebuie s fie compatibil cu 8080, sau c trebuie s fie capabil s
execute toate programele care deja fusese scrise pentru 8080. n afar acestor
caracteristici, multe altele noi au fost adugate, aa c Z80 a fost un microprocesor
foarte puternic la vremea lui. Putea adresa direct 64Kb de memorie, avea 176
instruciuni, un numr mare de registre, o opiune incorporat pentru
remprosptarea memoriei RAM dinamice, o singur surs, vitez de lucru mult mai
mare etc. Z80 a fost un succes mare i toat lumea a fcut conversia de 8080 la
Z80. Se poate spune c Z80 comercial, a fost fr nici o ndoial, cel mai de succes
micropocesor de 8 bii a acelui timp. n afar de Zilog, ali noi productori apar de
asemenea ca: Mostek, NEC, SHARP i SGS. Z80 a fost inima a multor calculatoare
ca: Spectrum, Partner, TRS703, Z-3.

n 1976, INTEL iese pe pia cu o versiune mbuntit de microprocesor pe 8 bii


numit 8085. Totui, Z80 era cu mult mai bun nct INTEL curnd a pierdut btlia.
Chiar dac au aprut pe pia nc cteva microprocesoare (6809, 2650, SC/MP
etc.), totul fusese de fapt deja hotrt. Nu mai erau de fcut mbuntiri importante
ca s-i fac pe productori s se converteasc spre ceva nou, aa c 6502 i Z80
mpreun cu 6800 au rmas ca cei mai reprezentativi ai microprocesoarelor de 8 bii
ai acelui timp.

Microcontrolere contra Microprocesoare


Microcontrolerul difer de un microprocesor n multe feluri. n primul rnd i cel mai
important este funcionalitatea sa. Pentru a fi folosit, unui microprocesor
trebuie s i se adauge alte componente ca memorie, sau componente
pentru primirea i trimiterea de date. Pe scurt, aceasta nseamn c
microprocesorul este inima calculatorului. Pe de alt parte,
microcontrolerul este proiectat s fie toate acestea ntr-unul singur. Nu
sunt necesare alte componente externe pentru aplicarea sa pentru c toate
perifericele necesare sunt deja incluse n el. Astfel, economisim timpul i
spaiul necesare pentru construirea de aparate.

1.1 Unitatea de memorie


Memoria este o parte a microcontrolerului a crei funcie este de a nmagazina date.
Cel mai uor mod de a explica este de a-l descrie ca un dulap mare cu multe sertare.
Dac presupunem c am marcat sertarele ntr-un asemenea fel nct s nu fie
confundate, oricare din coninutul lor va fi atunci uor accesibil. Este suficient s se
tie desemnarea sertarului i astfel coninutul lui ne va fi cunoscut n mod sigur.
Componentele de memorie sunt exact aa. Pentru o anumit intrare obinem
coninutul unei anumite locaii de memorie adresate i aceasta este totul. Dou noi
concepte ne sunt aduse: adresarea i locaia de memorie. Memoria const din toate
locaiile de memorie, i adresarea nu este altceva dect selectarea uneia din ele.
Aceasta nseamn c noi trebuie s selectm locaia de memorie la un capt, i la
cellalt capt trebuie s ateptm coninutul acelei locaii. n afar de citirea dintr-o
locaie de memorie, memoria trebuie de asemenea s permit scrierea n ea. Aceasta
se face prin asigurarea unei linii adiionale numit linie de control. Vom desemna
aceast linie ca R/W (citete /scrie). Linia de control este folosit n urmtorul fel:
dac r/w=1, se face citirea, i dac opusul este adevrat atunci se face scrierea n
locaia de memorie. Memoria este primul element, dar avem nevoie i de altele
pentru ca microcontrolerul nostru s funcioneze.

1.2 Unitatea de procesare central


S adugm alte 3 locaii de memorie pentru un bloc specific ce va avea o
capabilitate incorporat de nmulire, mprire, scdere i s-i mutm coninutul
dintr-o locaie de memorie n alta. Partea pe care tocmai am adugat-o este numit
"unitatea de procesare central" (CPU). Locaiile ei de memorie sunt numite regitri.
Regitrii sunt deci locaii de memorie al cror rol este de a ajuta prin executarea a
variate operaii matematice sau a altor operaii cu date oriunde se vor fi gsit datele.
S privim la situaia curent. Avem dou entiti independente (memoria i CPU) ce
sunt interconectate, i astfel orice schimb de informaii este ascuns, ca i
funcionalitatea sa. Dac, de exemplu, dorim s adugm coninutul a dou locaii de
memorie i ntoarcem rezultatul napoi n memorie, vom avea nevoie de o conexiune
ntre memorie i CPU. Mai simplu formulat, trebuie s avem o anumit "cale" prin
care datele circul de la un bloc la altul.

1.3 Bus-ul
Calea este numit "bus"- magistral. Fizic, el reprezint un grup de 8, 16, sau mai
multe fire. Sunt dou tipuri de bus-uri: bus de adres i bus de date. Primul const
din attea linii ct este cantitatea de memorie ce dorim s o adresm, iar cellalt
este att de lat ct sunt datele, n cazul nostru 8 bii sau linia de conectare. Primul
servete la transmiterea adreselor de la CPU la memorie, iar cel de al doilea la
conectarea tuturor blocurilor din interiorul microcontrolerului.

n ceea ce privete funcionalitatea, situaia s-a mbuntit, dar o nou problem a


aprut de asemenea: avem o unitate ce este capabil s lucreze singur, dar ce nu
are nici un contact cu lumea de afar, sau cu noi! Pentru a nltura aceast
deficien, s adugm un bloc ce conine cteva locaii de memorie al cror singur
capt este conectat la bus-ul de date, iar cellalt are conexiune cu liniile de ieire la
microcontroler ce pot fi vzute cu ochiul liber ca pini la componenta electronic.

1.4 Unitatea intrare-ieire


Aceste locaii ce tocmai le-am adugat sunt numite "porturi". Sunt diferite tipuri de
porturi: intrare, ieire sau porturi pe dou-ci. Cnd se lucreaz cu porturi, mai nti
de toate este necesar s se aleag cu ce port urmeaz s se lucreze, i apoi s se
trimit date la, sau s se ia date de la port.

Cnd se lucreaz cu el portul se comport ca o locaie de memorie. Ceva este pur i


simplu scris n sau citit din el, i este posibil de a remarca uor aceasta la pinii
microcontrolerului.

1.5 Comunicaia serial


Cu aceasta am adugat la unitatea deja existent posibilitatea comunicrii cu lumea
de afar. Totui, acest mod de comunicare are neajunsurile lui. Unul din neajunsurile
de baz este numrul de linii ce trebuie s fie folosite pentru a transfera datele. Ce
s-ar ntmpla dac acestea ar trebui transferate la distan de civa kilometri?
Numrul de linii nmulit cu numrul de kilometri nu promite costuri eficiente pentru
proiect. Nu ne rmne dect s reducem numrul de linii ntr-un aa fel nct s nu
scdem funcionalitatea. S presupunem c lucrm doar cu 3 linii, i c o linie este
folosit pentru trimiterea de date, alta pentru recepie i a treia este folosit ca o
linie de referin att pentru partea de intrare ct i pentru partea de ieire. Pentru
ca aceasta s funcioneze, trebuie s stabilim regulile de schimb ale datelor. Aceste
reguli sunt numite protocol. Protocolul este de aceea definit n avans ca s nu fie nici
o nenelegere ntre prile ce comunic una cu alta. De exemplu, dac un om
vorbete n francez, i altul vorbete n englez, este puin probabil c ei se vor
nelege repede i eficient unul cu altul. S presupunem c avem urmtorul protocol.
Unitatea logic "1" este setat pe linia de transmisie pn ce ncepe transferul.
Odat ce ncepe transferul, coborm linia de transmisie la "0" logic pentru o perioad
de timp (pe care o vom desemna ca T), aa c partea receptoare va ti c sunt date
de primit, aa c va activa mecanismul ei de recepie. S ne ntoarcem acum la
partea de transmisie i s ncepem s punem zero-uri i unu-uri pe linia de
transmisie n ordinea de la un bit a celei mai de jos valori la un bit a celei mai de sus
valori. S lsm ca fiecare bit s rmn pe linie pentru o perioad de timp egal cu
T, i la sfrit, sau dup al 8-lea bit, s aducem unitatea logic "1" napoi pe linie ce
va marca sfritul transmisiei unei date. Protocolul ce tocmai l-am descris este
numit n literatura profesional NRZ (Non-Return to Zero).

Unitatea serial folosit pentru a trimite date, dar numai prin trei linii

Pentru c avem linii separate de recepie i de transmitere, este posibil s


recepionm i s transmitem date (informaii) n acelai timp. Blocul aa numit full-
duplex mode ce permite acest mod de comunicare este numit blocul de comunicare
serial. Spre deosebire de transmisia paralel, datele sunt mutate aici bit cu bit, sau
ntr-o serie de bii, de unde vine i numele de comunicaie serial. Dup recepia de
date trebuie s le citim din locaia de transmisie i s le nmagazinm n memorie n
mod opus transmiterii unde procesul este invers. Datele circul din memorie prin bus
ctre locaia de trimitere, i de acolo ctre unitatea de recepie conform protocolului.

1.6 Unitatea timer


Acum c avem comunicaia serial, putem recepiona, trimite i procesa date.

Totui, pentru noi ca s putem s l folosim n industrie mai avem nevoie de cteva
blocuri. Unul din acestea este blocul timer care este important pentru noi pentru c
ne d informaia de timp, durat, protocol etc. Unitatea de baz a timer-ului este un
contor liber (free-run) care este de fapt un registru a crui valoare numeric crete
cu unu la intervale egale, aa nct lundu-i valoarea dup intervalele T1 i T2 i pe
baza diferenei lor s putem determina ct timp a trecut. Acesta este o parte foarte
important a microcontrolerului al crui control cere cea mai mare parte a timpului
nostru.

1.7 Watchdog-ul
nc un lucru ce necesit atenia noastr este funcionarea fr defecte a
microcontrolerului n timpul funcionrii. S presupunem c urmare a unei anumite
interferene (ce adesea se ntmpl n industrie) microcontrolerul nostru se oprete
din executarea programului, sau i mai ru, ncepe s funcioneze incorect.

Bineneles, cnd aceasta se ntmpl cu un calculator, l resetm pur i simplu i va


continua s lucreze. Totui, nu exist buton de resetare pe care s-l apsm n cazul
microcontrolerului care s rezolve astfel problema noastr. Pentru a depi acest
obstacol, avem nevoie de a introduce nc un bloc numit watchdog-cinele de paz.
Acest bloc este de fapt un alt contor liber (free-run) unde programul nostru trebuie
s scrie un zero ori de cte ori se execut corect. n caz c programul se
"nepenete", nu se va mai scrie zero, iar contorul se va reseta singur la atingerea
valorii sale maxime. Aceasta va duce la rularea programului din nou, i corect de
aceast dat pe toat durata. Acesta este un element important al fiecrui program
ce trebuie s fie fiabil fr supravegherea omului.

1.8 Convertorul Analog-Digital


Pentru c semnalele de la periferice sunt substanial diferite de cele pe care le poate
nelege microcontrolerul (zero i unu), ele trebuie convertite ntr-un mod care s fie
neles de microcontroler. Aceast sarcin este ndeplinit de un bloc pentru
conversia analog-digital sau de un convertor AD. Acest bloc este responsabil pentru
convertirea unei informaii despre o anumit valoare analogic ntr-un numr binar i
pentru a o urmri pe tot parcursul la un bloc CPU aa ca blocul CPU s o poat
procesa.

Astfel microcontrolerul este acum terminat, i tot ce mai rmne de fcut este de a-l
pune ntr-o component electronic unde va accesa blocurile interioare prin pinii
exteriori. Imaginea de mai jos arat cum arat un microcontroler n interior.
Configuraia fizic a interiorului unui microcontroler

Liniile subiri ce merg din interior ctre prile laterale ale microcontrolerului
reprezint fire conectnd blocurile interioare cu pinii capsulei microcontrolerului.
Schema urmtoare reprezint seciunea central a microcontrolerului.
Pentru o aplicaie real, un microcontroler singur nu este de ajuns. n afar de
microcontroler, avem nevoie de un program pe care s-l execute, i alte cteva
elemente ce constituie o interfa logic ctre elementele de stabilizare (ce se va
discuta n capitolele urmtoare).

1.9 Programul
Scrierea programului este un domeniu special de lucru al microcontolerului i este
denumit "programare". S ncercm s scriem un mic program ce l vom crea singuri
i pe care oricine va fi n stare s-l neleag.
START
REGISTER1=MEMORY LOCATION_A
REGISTER2=MEMORY LOCATION_B
PORTA=REGISTER1 + REGISTER2

END

Programul adun coninutul a dou locaii de memorie, i vede suma lor la portul A.
Prima linie a programului este pentru mutarea coninutul locaiei de memorie "A"
ntr-unul din regitri unitii de procesare centrale. Pentru c avem nevoie i de
celelalte date de asemenea, le vom muta de asemenea n cellalt registru al unitii
de procesare centrale. Urmtoarea instruciune instruiete unitatea de procesare
central s adune coninutul celor doi regitri s trimit rezultatul obinut la portul A,
nct suma acestei adunri s fie vizibil pentru toat lumea de afar. Pentru o
problem mai complex, programul care s lucreze la rezolvarea ei va fi mai mare.

Programarea poate fi fcut n cteva limbaje ca Assembler, C i Basic care sunt cele
mai folosite limbaje. Assembler aparine limbajelor de nivel sczut ce sunt
programate lent, dar folosesc cel mai mic spaiu n memorie i d cele mai bune
rezultate cnd se are n vedere viteza de execuie a programului. Pentru c este cel
mai folosit limbaj n programarea microcontrolerelor va fi discutat ntr-un capitol
ulterior. Programele n limbajul C sunt mai uor de scris, mai uor de neles, dar
sunt mai lente n executare dect programele n Assembler. Basic este cel mai uor
de nvat, i instruciunile sale sunt cele mai aproape de modul de gndire a omului,
dar ca i limbajul de programare C este de asemenea mai lent dect Assembler-ul.
n orice caz, nainte de a v hotr n privina unuia din aceste limbaje trebuie s
studiai cu atenie cerinele privind viteza de execuie, mrimea memoriei i timpul
disponibil pentru asamblarea sa.

Dup ce este scris programul, trebuie s instalm microcontrolerul ntr-un aparat i


s-l lsm s lucreze. Pentru a face aceasta trebuie s adugm cteva componente
externe necesare pentru funcionarea sa. Mai nti trebuie s dm via
microcontrolerului prin conectarea sa la o surs (tensiune necesar pentru operarea
tuturor instrumentelor electronice) i oscilatorului al crui rol este similar inimii din
corpul uman. Bazat pe ceasul su microcontrolerul execut instruciunile
programului. ndat ce este alimentat microcontrolerul va executa un scurt control
asupra sa, se va uita la nceputul programului i va ncepe s-l execute. Cum va
lucra aparatul depinde de muli parametri, cel mai important fiind priceperea
dezvoltatorului de hardware, i de experiena programatorului n obinerea
maximului din aparat cu programul su.
CAPITOLUL 2
Microcontrolerul PIC16F84
Introducere

CISC, RISC
Aplicaii
Clock-ul/instruciune
Pipelining
Semnificaia pinilor

2.1 Generator-oscilator de ceas


2.2 Reset
2.3 Unitatea de procesare central
2.4 Porturi
2.5 Organizarea memoriei
2.6 ntreruperi
2.7 Timer-ul liber TMRO
2.8 Memoria de date EEPROM

Introducere
PIC16F84 aparine unei clase de microcontrolere de 8 bii cu arhitectur RISC.
Structura lui general este artat n schia urmtoare reprezentnd blocurile de
baz.

Memoria program (FLASH)-pentru memorarea unui program scris.


Pentru c memoria ce este fcut n tehnologia FLASH poate fi
programat i tears mai mult dect odat, aceasta face
microcontrolerul potrivit pentru dezvoltarea de component.

EEPROM-memorie de date ce trebuie s fie salvate cnd nu mai este alimentare.


Este n mod uzual folosit pentru memorarea de date importante ce nu trebuie
pierdute dac sursa de alimentare se ntrerupe dintr-o dat. De exemplu, o astfel de
dat este o temperatur prestabilit n regulatoarele de temperatur. Dac n timpul
ntreruperii alimentrii aceast dat se pierde, va trebui s facem ajustarea nc o
dat la revenirea alimentrii. Astfel componenta noastr pierde n privina auto-
meninerii.

RAM-memorie de date folosit de un program n timpul executrii sale.


n RAM sunt memorate toate rezultatele intermediare sau datele temporare ce nu
sunt cruciale la ntreruperea sursei de alimentare.

PORTUL A i PORTUL B sunt conexiuni fizice ntre microcontroler i lumea de afar.


Portul A are 5 pini, iar portul B are 8 pini.
TIMER-UL LIBER (FREE-RUN) este un registru de 8 bii n interiorul
microcontrolerului ce lucreaz independent de program. La fiecare al
patrulea impuls de ceas al oscilatorului i ncrementeaz valoarea lui
pn ce atinge maximul (255), i apoi ncepe s numere tot din nou
de la zero. Dup cum tim timpul exact dintre fiecare dou
incrementri ale coninutului timer-ului, poate fi folosit pentru
msurarea timpului ce este foarte util la unele componente.

UNITATEA DE PROCESARE CENTRAL are rolul unui element de conectivitate


ntre celelalte blocuri ale microcontrolerului. Coordoneaz lucrul altor blocuri i
execut programul utilizatorului.

CISC, RISC
S-a spus deja c PIC1684 are o arhitectur RISC. Acest termen este adeseori gsit n
literatura despre calculatoare, i are nevoie s fie explicat aici mai n detaliu.
Arhitectura Harvard este un concept mai nou dect von-Neumann. S-a nscut din
nevoia de mrire a vitezei microcontrolerului. n arhitectura Harvard, bus-ul de date
i bus-ul de adrese sunt separate. Astfel este posibil un mare debit de date prin
unitatea de procesare central, i bineneles, o vitez mai mare de lucru.
Separarea programului de memoria de date face posibil ca mai departe instruciunile
s nu trebuiasc s fie cuvinte de 8 bii. PIC16F84 folosete 14 bii pentru
instruciuni ceea ce permite ca toate instruciunile s fie instruciuni dintr-un singur
cuvnt. Este de asemenea tipic pentru arhitectura Harvard s aib mai puine
instruciuni dect von-Newmann i s aib instruciuni executate uzual intr-un ciclu.

Microcontrolerele cu arhitectur Harvard sunt de asemenea numite "microcontrolere


RISC". RISC nseamn Reduced Instruction Set Computer. Microcontrolerele cu
arhitectura von-Newmann sunt numite "microcontrolere CISC". Titlul CISC
nseamn Complex Instruction Set Computer.

Pentru c PIC16F84 este un microcontroler RISC, aceasta nseamn c are un set


redus de instruciuni, mai precis 35 de instruciuni (de ex. microcontrolerele INTEL i
Motorola au peste 100 de instruciuni). Toate aceste instruciuni sunt executate ntr-
un ciclu cu excepia instruciunilor jump i branch. Conform cu ceea ce spune
constructorul, PIC16F84 ajunge la rezultate de 2:1 n compresia cod i 4:1 n vitez
n comparaie cu alte microcontrolere de 8 bii din clasa sa.

Aplicaii
PIC16F84 se potrivete perfect n multe folosine, de la industriile auto i aplicaiile
de control casnice la instrumentele industriale, senzori la distan, mnere electrice
de ui i dispozitivele de securitate. Este de asemenea ideal pentru cardurile smart
ca i pentru aparatele alimentate de baterie din cauza consumului lui mic.

Memoria EEPROM face mai uoar aplicarea microcontrolerelor la aparate unde se


cere memorarea permanent a diferitor parametri (coduri pentru transmitoare,
viteza motorului, frecvenele receptorului, etc.). Costul sczut, consumul sczut,
mnuirea uoar i flexibilitatea fac PIC16F84 aplicabil chiar i n domenii unde
microcontrolerele nu au fost prevzute nainte (exemple: funcii de timer, nlocuirea
interfeei n sistemele mari, aplicaiile coprocesor, etc.).
Programabilitatea sistemului acestui cip (mpreun cu folosirea a doar doi pini n
transferul de date) face posibil flexibilitatea produsului, dup ce asamblarea i
testarea au fost terminate. Aceast capabilitate poate fi folosit pentru a crea
producie pe linie de asamblare, de a nmagazina date de calibrare disponibile doar
dup testarea final, sau poate fi folosit pentru a mbunti programele la produsele
finite.

Clock-ul /ciclul instruciune


Clock-ul sau ceasul este starter-ul principal al microcontrolerului, i este obinut
dintr-o component de memorie extern numit "oscilator". Dac ar fi s comparm
un microcontroler cu un ceas de timp, "clock-ul" nostru ar fi un ticit pe care l-am
auzi de la ceasul de timp. n acest caz, oscilatorul ar putea fi comparat cu arcul ce
este rsucit astfel ca ceasul de timp s mearg. De asemenea, fora folosit pentru a
ntoarce ceasul poate fi comparat cu o surs electric.

Clock-ul de la oscilator intr ntr-un microcontroler prin pinul OSC1 unde circuitul
intern al microcontrolerului divide clock-ul n 4 clock-uri egale Q1, Q2, Q3 i Q4 ce nu
se suprapun. Aceste 4 clock-uri constituie un ciclu de o singur instruciune (numit
de asemenea ciclu main) n timpul creia instruciunea este executat.
Executarea instruciunii ncepe prin apelarea unei instruciuni care este urmtoarea
n linie. Instruciunea este apelat din memoria program la fiecare Q1 i este scris
n registrul de instruciuni la Q4. Decodarea i executarea instruciunii sunt fcute
ntre urmtoarele cicluri Q1 i Q4. n urmtoarea diagram putem vedea relaia
dintre ciclul instruciunii i clock-ul oscilatorului (OSC1) ca i aceea a clock-urilor
interne Q1-Q4. Contorul de program (PC) reine informaia despre adresa urmtoarei
instruciuni.

Pipelining
Ciclul instruciune const din ciclurile Q1, Q2, Q3 i Q4. Ciclurile de instruciuni de
apelare i executare sunt conectate ntr-un aa fel nct pentru a face o apelare, este
necesar un ciclu cu o instruciune, i mai este nevoie de nc unul pentru decodare i
executare. Totui, datorit pipelining-ului (folosirea unei pipeline-conduct, i este
aducerea unei instruciuni din memorie n timp ce se execut alta), fiecare
instruciune este executat efectiv ntr-un singur ciclu. Dac instruciunea cauzeaz o
schimbare n contorul programului, i PC-ul nu direcioneaz spre urmtoarea ci spre
alte adrese (poate fi cazul cu subprogramele jumps sau calling), 2 cicluri sunt
necesare pentru executarea unei instruciuni. Aceasta este pentru c instruciunea
trebuie procesat din nou, dar de data aceasta de la adresa corect. Ciclul ncepe cu
clock-ul Q1, prin scrierea n registrul instruction register (IR). Decodarea i
executarea ncepe cu clock-urile Q2, Q3 i Q4.
TYC0 citete instruciunea MOVLW 55h (nu are importan pentru noi ce instruciune
a fost executat, ce explic de ce nu este un dreptunghi desenat n partea de jos).
TCYI execut instruciunea MOVLW 55h i citete MOVWF PORTB.
TCY2 execut MOVWF PORTB i citete CALL SUB_1.
TCY3 execut o apelare a subprogramului CALL SUB_1, i citete instruciunea BSF
PORTA, BIT3. Pentru c instruciunea aceasta nu este aceea de care avem nevoie,
sau nu este prima instruciune a subprogramului SUB_1 a crei execuie este
urmtoarea n ordine, instruciunea trebuie citit din nou. Acesta este un bun
exemplu a unei instruciuni avnd nevoie de mai mult de un ciclu.
TCY4 ciclul instruciunii este total folosit pentru citirea primei instruciuni din
subprogram la adresa SUB_1.
TCY5 execut prima instruciune din subprogram SUB_1 i citete urmtoarea.

Semnificaia pinilor
PIC16F84 are un numr total de 18 pini. Cel mai adesea se gsete ntr-o capsul de
tip DIP18 dar se poate gsi de asemenea i ntr-o capsul SMD care este mai mic ca
cea DIP. DIP este prescurtarea de la Dual In Package. SMD este prescurtarea de
la Surface Mount Devices sugernd c gurile pentru pini unde s intre acetia, nu
sunt necesare n lipirea acestui tip de component.

Pinii microcontrolerului PIC16F84 au urmtoarea semnificaie:


Pin nr.1 RA2 Al doilea pin la portul A. Nu are funcie adiional.
Pin nr.2 RA3 Al treilea pin la portul A. Nu are funcie adiional.
Pin nr.3 RA4 Al patrulea pin la portul A. TOCK1 care funcioneaz ca timer se
gsete de asemenea la acest pin.
Pin nr.4 MCLR Reseteaz intrarea i tensiunea de programare Vpp a
microcontrolerului.
Pin nr.5 VSS Alimentare, mas.
Pin nr.6 RB0 Pin de zero la portul B. Intrarea ntrerupere este o funcie adiional.
Pin nr.7 RB1 Primul pin la portul B. Nu are funcie adiional.
Pin nr.8 RB2 Al doilea pin la portul B. Nu are funcie adiional.
Pin nr.9 RB3 Al treilea pin la portul B. Nu are funcie adiional.
Pin nr.10 RB4 Al patrulea pin la portul B. Nu are funcie adiional.
Pin nr.11 RB5 Al cincilea pin la portul B. Nu are funcie adiional.
Pin nr.12 RB6 Al aselea pin la portul B. Linia de 'Clock' n mod programare.
Pin nr.13 RB7 Al aptelea pin la portul B. Linia 'Data' n mod programare.
Pin nr.14 Vdd Polul pozitiv al sursei.
Pin nr.15 OSC2 Pin desemnat pentru conectarea la un oscilator.
Pin nr.16 OSC1 Pin desemnat pentru conectarea la un oscilator.
Pin nr.17 RA2 Al doilea pin la portul A. Nu are funcie adiional.
Pin nr.18 RA1 Primul pin la portul A. Nu are funcie adiional.

2.1 Generator de ceas oscilator


Circuitul oscilator este folosit pentru a da microcontrolerului un ceas-clock. Ceasul
este necesar pentru ca microcontrolerul s execute programul sau instruciunile din
program.

Tipuri de oscilatoare
PIC16F84 poate lucra cu patru configuraii diferite de oscilator. Pentru c
configuraiile cu oscilator cu cristal i rezistor-condensator (RC) sunt cele utilizate cel
mai frecvent, doar pe ele le vom meniona aici. Tipul de microcontroler cu oscilator
cu cristal este desemnat ca XT, iar microcontrolerul cu perechea rezistor-condensator
are desemnarea RC. Aceasta este important pentru c trebuie s numii tipul de
oscilator cnd cumprai un microcontroler.

Oscilatorul XT
Oscilatorul cu cristal se afl intr-o
carcas metalic cu doi pini pe care este
nscris frecvena la care cristalul
oscileaz. Mai este necesar cte un
condensator ceramic de 30pF cu cellalt
capt la mas de a fi conectai la fiecare
pin.

Oscilatorul i condensatorii pot fi


ncapsulai mpreun ntr-o carcas cu
trei pini. Un asemenea element se
numete rezonator ceramic i este
reprezentat n scheme ca cel de mai jos.
Pinii centrali ai elementului sunt masa,
iar pinii terminali sunt conectai la pinii
OSC1 i OSC2 ai microcontrolerului.
Cnd se proiecteaz un aparat, regula
este s plasai oscilatorul ct mai
aproape de microcontroler, pentru a
elimina orice interferen de pe liniile pe
care microcontrolerul primete tactul de
ceas.

Oscilatorul RC
n aplicaiile unde nu este nevoie de o mare precizie de timp, oscilatorul RC permite
economii adiionale la cumprare. Fecvena de rezonan a oscilatorului RC depinde
de valoarea tensiunii de alimentare, rezistorul R, condensatorul C i temperatura de
lucru. Trebuie de menionat c frecvena de rezonan este de asemenea influenat
de variaiile normale ale parametrilor de proces, de tolerana extern a
componentelor R i C, etc.
Diagrama de mai sus arat cum este conectat oscilatorul RC la PIC16F84. La
valoarea rezistorului mai mic 2.2k, oscilatorul poate deveni instabil, sau oscilaia se
poate chiar opri. La valori mari a lui R (ex.1M) oscilatorul devine foarte sensibil la
zgomot i umezeal. Se recomand ca valoarea rezistorului R s fie ntre 3 i 100k.
Chiar dac oscilatorul va lucra fr un condensator extern (C=0pF), trebuie totui
folosit un condensator de peste 20pF pentru zgomot i stabilitate. Indiferent de ce
oscilator este folosit, pentru a obine un ceas la care s funcioneze microcontrolerul,
ceasul trebuie divizat la 4. Un ceas al oscilatorului divizat cu 4 se poate obine la
pinul OSC2/CLKOUT, i poate fi folosit pentru testarea sau sincronizarea altor circuite
logice.

Dup alimentare, oscilatorul ncepe s oscileze. Oscilaia la nceput are o perioad i


o amplitudine instabile, dar dup un timp devin stabilizate.

Pentru a preveni ca un asemenea ceas inexact s influeneze performanele


microcontrolerului, trebuie s inem microcontrolerul n starea reset pe durata
stabilizrii ceasului oscilatorului. Diagrama de mai sus arat o form tipic de semnal
pe care microcontrolerul o primete de la oscilatorul cu cuar dup alimentare.

2.2 Reset-ul
Resetul este folosit pentru a pune microcontrolerul ntr-o condiie 'cunoscut'.
Aceasta nseamn practic c microcontrolerul poate s se comporte incorect n unele
condiii nedorite. Pentru a continua s funcioneze corect trebuie resetat, nsemnnd
c toi registrii vor fi pui ntr-o stare de start. Resetul nu este folosit numai cnd
microcontrolerul nu se comport cum vrem noi, dar poate de asemenea s fie folosit
cnd se ncearc un montaj ca o ntrerupere ntr-un program de execuie sau cnd se
pregtete un microcontroler de a citi un program.

Pentru a preveni ajungerea unui zero logic la pinul


MCLR accidental (linia de deasupra nseamn c
resetul este activat de un zero logic), MCLR trebuie
s fie conectat printr-un rezistor la polul pozitiv al
sursei de alimentare. Rezistorul trebuie s fie ntre
5 i 10k. Acest rezistor a crui funcie este de a
menine o anumit linie la starea logic unu ca o
prevenire, se numete o scoatere-pull up.

Microcontrolerul PIC16F84 are cteva surse de reset:

a) Reset la alimentare, POR (Power-On Reset)


b) Reset n timpul lucrului obinuit prin aducerea unui zero logic la pinul MCLR al
microcontrolerului.
c) Reset n timpul regimului SLEEP
d) Reset la depirea timer-ului watchdog (WDT)
e) Reset n timpul depirii WDT n timpul regimului SLEEP.

Cele mai importante resurse de reset sunt a) i b). Prima are loc de fiecare dat cnd
este alimentat microcontrolerul i servete la aducerea toturor regitrilor la starea
iniial a poziiei de start. A doua este pentru a aduce un zero logic la pinul MCLR n
timpul operaiei normale a microcontrolerului. Este des folosit n dezvoltarea de
programe.

n timpul unui reset, locaiile de memorie RAM nu sunt resetate. Ele sunt
necunoscute la alimentare i nu sunt schimbate la nici un reset. Spre deosebire de
acestea, regitrii SFR sunt resetai la o stare iniial a poziiei de start. Unul din cele
mai importante efecte ale resetului este setarea contorului de program (PC) la zero
(0000h), ceea ce permite programului s nceap executarea de la prima instruciune
scris.

Resetul la scderea tensiunii de alimentare dincolo de limita


permisibil (Brown-out Reset)

Impulsul pentru resetare n timpul creterii tensiunii este generat de microcontrolerul


nsui cnd detecteaz o cretere n tensiunea Vdd (n domeniul de la 1.2V la 1.8V).
Acest impuls dureaz 72 ms ceea ce este un timp suficient pentru oscilator ca s se
stabilizeze. Aceste 72 ms sunt asigurate de un timer intern PWRT care are oscilatorul
lui RC. Microcontrolerul este n modul reset ct timp PWRT este activ. Totui, cnd
montajul funcioneaz, probleme apar cnd sursa nu scade la zero ci cnd scade mai
jos de limita ce garanteaz funcionarea corect a microcontrolerului. Acesta este un
caz real din practic, n special n mediile industriale unde perturbaiile i
instabilitile sursei de alimentare sunt ceva foarte curent. Pentru a rezolva aceast
problem trebuie s ne asigurm c microcontrolerul este ntr-o stare de reset de
fiecare dat cnd tensiunea sursei scade sub limita admis.

Dac, conform cu specificaiile electrice, circuitul intern de resetare a


microcontrolerului nu poate satisface aceste cerine, se pot folosi componente
electronice speciale ce sunt capabile s genereze semnalul de reset dorit. n afar de
aceast funcie, ele pot funciona pentru supravegherea tensiunii de alimentare.
Dac tensiunea scade mai jos de nivelul specificat, un zero logic va apare la pinul
MCLR ce ine microcontrolerul n starea de reset pn ce tensiunea nu este n limitele
ce garanteaz funcionarea corect.

2.3 Unitatea de Procesare Central


Unitatea de procesare central (CPU) este creierul microcontrolerului. Aceast parte
este responsabil cu gsirea i aducerea (citirea din memorie)-fetching instruciunii
corecte ce trebuie executat, cu decodarea acelei instruciuni, i n final cu
executarea ei.
Unitatea de procesare central conecteaz toate prile microcontrolerului ntr-un
ntreg. Desigur, funcia sa cea mai important este s decodeze instruciunile de
program. Cnd programatorul scrie un program, instruciunile au o form clar ca
MOVLW 0x20. Totui, pentru ca microcontrolerul s neleag aceasta, aceast form
de 'scrisoare' a unei instruciuni trebuie tradus ntr-o serie de zero-uri i unu-uri ce
se numete 'opcode'. Aceast tranziie de la o scrisoare la o form binar este fcut
de translatori ca translatorul assembler (cunoscut ca i assembler sau asamblor).
Instruciunea astfel adus-fetched din memoria programului trebuie s fie decodat
de unitatea de procesare central. Putem apoi selecta din tabela tuturor
instruciunilor un set de aciuni ce execut o sarcin desemnat definit de
instruciune. Pentru c instruciunile pot s conin n ele asignri ce cer diferite
transferuri de date dintr-o memorie n alta, din memorie la porturi, sau alte calcule,
CPU trebuie s fie conectat cu toate prile microcontrolerului. Aceasta este posibil
printr-un bus de date i un bus de adrese.

Unitatea de Logic Aritmetic (ALU)


Unitatea de logic aritmetic este responsabil de executarea operaiilor ca
adunarea, scderea, mutarea (la stnga sau la dreapta ntr-un registru) i de
operaiile logice. Mutarea datelor ntr-un registru se mai numete 'shifting'-
transferare. PIC16F84 conine o unitate logic aritmetic de 8 bii i regitri de lucru
de 8 bii.
n instruciunile cu doi operanzi, n mod obinuit un operand este n registrul de lucru
(registrul W), iar cellalt este unul din regitri sau o constant. Prin operand
nelegem coninutul asupra cruia se fac unele operaii, iar un registru este oricare
din regitrii GPR sau SFR. GPR este o prescurtare de la 'General Purposes Registers'-
Regitri cu Scopuri Generale, iar SFR de la 'Special Function Registers'-Regitri cu
Funcie Special. n instruciunile cu un operand, un operand este fie registrul W fie
unul din regitri. Pe lng operaiile aritmetice i logice, ALU controleaz biii de
stare (bii gsii n registrul STATUS). Executarea unor instruciuni afecteaz biii de
stare, de care depinde rezultatul nsui. Depinznd de ce instruciune este executat,
ALU poate afecta valorile biilor Carry (C), Digit Carry (DC), i Zero (Z) n registrul
STATUS.
Registru STATUS

bit 0 C (Carry) Transfer


Bit care este afectat de operaiile de adunare, scdere i transfer.
1= transferul produs din bitul cel mai nalt al rezultatului
0= transferul nu s-a produs
Bitul C este afectat de instruciunile ADDWF, ADDLW, SUBLW, SUBWF.

bit 1 DC (Digit Carry) DC Transfer


Bit afectat de operaiile de adunare, scdere i transfer. Spre deosebire de bitul C,
acest bit reprezint transferul din al patrulea loc rezultat. Este setat de adunare cnd
se ntmpl un transport de la bitul 3 la bitul 4, sau de scdere cnd se ntmpl
mprumut de la bitul 4 la bitul 3, sau de transfer n ambele direcii.
1= transfer produs la al patrulea bit conform cu ordinea, al rezultatului.
0= transferul nu s-a produs
Bitul DC este afectat de instruciunile ADDWF, ADDLW, SUBLW, SUBWF.

bit 2 Z (Zero bit) Indicarea unui rezultat zero.


Acest bit este setat cnd rezultatul unei operaii aritmetice sau logice executate este
zero.
1= rezultatul egal cu zero
0= rezultatul nu este egal cu zero

bit 3 PD (Power-down bit)


Bit ce este setat cnd microcontrolerul este alimentat atunci cnd ncepe s
funcioneze, dup fiecare reset obinuit i dup executarea instruciunii CLRWDT.
Instruciunea SLEEP l reseteaz cnd microcontrolerul intr n regimul consum/uzaj
redus. Setarea lui repetat este posibil prin reset sau prin pornirea sau oprirea
sursei. Starea poate fi triggerat de asemenea de un semnal la pinul RB0/INT, de o
schimbare la portul RB, de terminarea scrierii n EEPROM-ul de date intern, i de
watchdog de asemenea.
1= dup ce sursa a fost pornit
0= executarea instruciunii SLEEP

bit 4 TO Time-out ; depirea-overflow watchdog-ului.


Bitul este setat dup pornirea sursei i executarea instruciunilor CLRWDT i SLEEP.
Bitul este resetat cnd watchdog-ul ajunge la sfrit semnalnd c ceva nu este n
ordine.
1= depirea-oveflow nu s-a produs
0= depirea-overflow s-a produs

bit6:5 RP1:RP0 (Register Bank Select bits-Bii de Selectare a Bancului de Regitri)


Aceti doi bii sunt partea superioar a adresei la adresarea direct. Pentru c
instruciunile ce adreseaz memoria direct au doar apte bii, ei au nevoie doar de
nc un bit pentru a adresa cei 256 bytes adic ci are PIC16F84. Bitul RP1 nu este
folosit, dar este lsat pentru expansiuni viitoare ale acestui microcntroler.
01= primul banc
00= bancul zero

bit 7 IRP (Register Bank Select bit-Bit de Selectare a Bancului de Regitri)


Bit al crui rol este de a fi al optulea bit la adresarea indirect a RAM-ului intern.
1= bancul 2 i 3
0= bancul 0 i 1 (de la 00h la FFh)

Registrul STATUS conine starea aritmetic ALU (C, DC, Z), starea RESET (TO, PD)
i biii pentru selectarea bancului de memorie (IRP, RP1, RP0). Considernd c
selecia bancului de memorie este controlat prin acest registru, el trebuie s fie
prezent n fiecare banc. Bancul de memorie se va discuta mai n detaliu n capitolul
Organizarea memoriei. Registrul STATUS poate fi o destinaie pentru orice
instruciune, cu oricare alt registru. Dac registrul STATUS este o destinaie pentru
instruciunile ce afecteaz biii Z, DC or C, atunci scrierea n aceti trei bii nu este
posibil.

Registrul OPTION

bit 0:2 PS0, PS1, PS2 (Prescaler Rate Select bit-Bit Selecie Rat Prescaler)
Aceti trei bii definesc bitul de selecie a ratei prescalerului. Ce este un prescaler i
cum pot afecta aceti bii funcionarea unui microcontroler va fi explicat n seciunea
depre TMRO.

bit 3 PSA (Prescaler Assignment bit-Bit de Asignare Prescaler)


Bit ce asigneaz prescalerul ntre TMRO i watchdog.
1= prescalerul este asignat watchdogului
0= prescalerul este asignat timer-ului liber (ree-run) TMRO

bit 4 T0SE (TMR0 Source Edge Select bit-Bit Selecie a Frontului Sursei TMR0)
Dac este permis de a se triggera TMRO prin impulsurile de la pinul RA4/T0CKI,
acest bit determin dac aceasta va fi la frontul descresctor sau cresctor al unui
semnal.
1= front cresctor
0= front descresctor

bit 5 TOCS (TMR0 Clock Source Select bit-Bit Selecie Surs Ceas TMR0)
Acest pin permite timerului liber (free-run) s incrementeze starea lui fie de la
oscilatorul intern la fiecare a ceasului oscilatorului, fie prin impulsuri externe la
pinul RA4/T0CKI.
1= impulsuri externe
0= ceas intern 1/4

bit 6 INTEDG (Interrupt Edge Select bit-Bit de Selecie a Frontului ntrerupere)


Dac ntreruperea este activat este posibil ca acest bit s determine frontul la care
o ntrerupere va fi activat la pinul RB0/INT.
1= front cresctor
0= front descresctor

bit 7 RBPU (PORTB Pull-up Enable bit-Bit Enable-Activare Pull-up PORTB)


Acest bit pornete i oprete rezistorii interni 'pull-up'-scoatere la portul B.
1= Rezistori oprire "pull-up"
0= Rezistori pornire "pull-up"

2.4 Porturi
Portul se refer la un grup de pini ai unui microcontroler ce pot fi accesai simultan,
sau la care putem seta combinaia dorit de zero-uri i unu-uri, sau de la care putem
citi o stare existent. Fizic, portul este un registru n interiorul unui microcontroler ce
este conectat cu fire la pinii microcontrolerului. Porturile reprezint conexiunea fizic
a Unitii de Procesare Central cu lumea exterioar. Microcontrolerul le folosete
pentru a monitoriza sau controla alte componente sau aparate. Datorit
funcionalitii, unii pini au rol dublu ca RA4/TOCKI de exemplu, care este simultan
al patrulea bit la portul A i o intrare extern pentru contorul liber (free-run).
Selecia uneia din aceste dou funcii ale pinului se face n unul din regitrii
configuraionali. O ilustraie a acesteia este al cincilea bit T0CS n registrul OPTION.
Selectnd una din funcii cealalt este dezactivat.

Toi pinii portului pot fi definii ca intrare sau ieire, conform cu nevoile unui montaj
ce este n dezvoltare. Pentru a defini un pin ca pin de intrare sau ca pin de ieire,
trebuie scris combinaia corect de zero-uri i unu-uri n registrul TRIS. Dac n
locul potrivit este scris "1" logic n registrul TRIS, acel pin este pin de intrare, iar
dac este valabil contrariul, este un pin de ieire. Fiecare port are registrul lui TRIS.
Astfel, portul A are TRISA la adresa 85h, iar portul B are TRISB la adresa 86h.
PORTB
PORTB are 8 pini legai la el. Registrul adecvat pentru direcia datelor este TRISB la
adresa 86h. Setarea unui bit n registrul TRISB definete pinul portului corespunztor
ca pin de intrare, i resetarea unui bit n registrul TRISB, definete pinul portului
corespunztor ca pin de ieire. Fiecare pin la PORTB are un rezistor slab intern pull-
up (scoatere) (rezistor care definete o linie la unu logic) care poate fi activat prin
resetarea celui de-al aptelea bit RBPU n registrul OPTION. Aceti rezistori 'pull-up'
se nchid automat cnd pinul portului este configurat ca o ieire. Cnd pornete
microcontrolerul, 'pull-up'-ii sunt dezactivai.

Patru pini ai portului PORTB, RB7:RB4 pot cauza o ntrerupere, care se ntmpl cnd
starea lor se schimb de la unu logic la zero logic i invers. Numai pinii configurai ca
intrare pot cauza aceast ntrerupere s se ntmple (dac fiecare pin RB7:RB4 este
configurat ca o ieire, nu va fi generat o ntrerupere la schimbarea strii). Aceast
opiune de ntrerupere cu rezistorii 'pull-up' fac mai uoar rezolvarea problemelor
din practic, ca de exemplu o tastatur matriceal. Dac rndurile tastaturii sunt
conectate la aceti pini, fiecare apsare a unei clape va cauza o ntrerupere.
Microcontrolerul va determina care clap este apsat n timp ce se proceseaz o
ntrerupere. Nu se recomand s apelai la portul B n timp ce se proceseaz
ntreruperea.

Exemplul de mai sus arat cum pinii 0, 1, 2, i 3 sunt declarai ca intrare, i pinii 4,
5, 6 i 7 ca ieire.

PORTA
PORTA are 5 pini legai la el. Registrul corespunztor pentru direcia datelor este
TRISA la adresa 85h. Ca i la portul B, setarea unui bit n registrul TRISA definete
de asemenea pinul portului corespunztor ca un pin de intrare, i resetarea unui bit
n registrul TRISA definete pinul portului corespunztor ca pin de ieire.
Al cincilea pin al portului A are funcie dual. La acel pin se afl de asemenea o
intrare extern pentru timer-ul TMRO. Una din aceste dou opiuni este aleas prin
setarea sau resetarea bitului TOCS (TMR0 Clock Source Select bit-bit de Selecie a
Sursei Ceasului TMRO). Acest pin permite timer-ului TMRO sa-i creasc starea fie de
la oscilatorul intern fie prin impulsuri externe la pinul RA4/T0CKI.
Exemplul arat cum pinii 0, 1, 2, 3, i 4 sunt declarai ca intrare iar 5, 6 i 7 ca pini
de ieire.

2.5 Organizarea memoriei


PIC16F84 are dou blocuri separate de memorie, unul pentru date i cellalt pentru
programe. Memoria EEPROM i regitrii GPR n memoria RAM constituie un bloc, i
memoria FLASH constituie un bloc de programe.

Memoria program
Memoria program a fost realizat n tehnologia FLASH ceea ce face posibil de a
programa un microcontroler de mai multe ori nainte de a fi instalat ntr-un montaj,
i chiar dup instalarea sa dac se ntmpl unele schimbri n program sau
parametri de proces. Mrimea memoriei program este de 1024 locaii cu lime de
14 bii unde locaiile zero i patru sunt rezervate pentru reset i pentru vectorul
ntrerupere.

Memoria de date
Memoria de date const din memoriile EEPROM i RAM. Memoria EEPROM const din
64 de locaii de opt bii a cror coninut nu este pierdut n timpul opririi sursei de
alimentare. EEPROM-ul nu este direct adresabil, dar este accesat indirect prin
regitrii EEADR i EEDATA. Pentru c memoria EEPROM este folosit curent la
memorarea unor parametri importani (de exemplu, o temperatur dat n
regulatoarele de temperatur), exist o procedur strict de scriere n EEPROM ce
trebuie urmat pentru a preveni scrierea accidental. Memoria RAM pentru date
ocup un spaiu ntr-o hart a memoriei de la locaia 0x0C la 0x4F ceea ce nseamn
68 de locaii. Locaiile memoriei RAM sunt de asemenea denumite regitri GPR care
este o abreviere General Purpose Registers-Regitri cu Scop General. Regitrii GPR
pot fi accesai indiferent de ce banc este selectat la un moment.

Regitri SFR
Regitri ce ocup primele 12 locaii n bancurile 0 i 1 i sunt regitri ai funciei
specializate asignat cu unele blocuri ale microcontrolerului. Acetia sunt numii
Special Function Registers-Regitri ai Funciei Speciale.
Bancuri de Memorie
n afar de aceast diviziune n 'lungime' a regitrilor SFR i GPR, harta memoriei
este de asemenea mprit n 'lime' (vezi harta precedent) n dou zone numite
'bancuri'. Selectarea unuia din bancuri se face de biii RPO i RP1 n registrul
STATUS-stare.

Exemplu:
bcf STATUS, RP0

Instruciunea BCF terge bitul RPO (RP0=0) n registrul STATUS i astfel seteaz
bancul 0.

bsf STATUS, RP0

Instruciunea BSF seteaz bitul RPO (RP0=1) n registrul STATUS i astfel seteaz
bancul 1.

Uzual, grupurile de instruciuni care sunt adesea n uz, sunt conectate ntr-o singur
unitate ce poate fi uor apelat ntr-un program, i a crei nume are o semnificaie
clar, aa-numitul Macros-macrocomand. Cu ajutorul lor, selecia dintre dou
bancuri devine mai clar i programul mult mai elegibil.

BANK0 macro
Bcf STATUS, RP0 ;Select memory bank 0
Endm

BANK1 macro
Bsf STATUS, RP0 ;Select memory bank 1
Endm

Locaiile 0Ch - 4Fh sunt regitri cu scop general (GPR) ce sunt folosii ca memorie RAM. Cnd su
accesate locaiile 8Ch - CFh n Bancul 1, accesm de fapt exact aceleai locaii n Bancul 0. Cu al
cuvinte, cnd dorii s accesai unul din regitrii GPR, nu trebuie s v ngrijorai c nu tii n ce
suntei!

Contorul de Program
Contorul de program (PC) este un registru de 13 bii ce conine adresa instruciunii
ce se execut. Prin incrementarea sau schimbarea sa (ex. n caz de salturi)
microcontrolerul execut instruciunile de program pas-cu-pas.

Stiva
PIC16F84 are o stiv de 13 bii cu 8 nivele, sau cu alte cuvinte, un grup de 8 locaii
de memorie de 13 bii lime cu funcii speciale. Rolul su de baz este de a pstra
valoarea contorului de program dup un salt din programul principal la o adres a
unui subprogram. Pentru ca un program s tie cum s se ntoarc la punctul de
unde a pornit, trebuie s napoieze valoarea contorului programului din stiv. Cnd
se mut dintr-un program ntr-un subprogram, contorul programului este mpins n
stiv (un exemplu de acesta este instruciunea CALL). Cnd se execut instruciuni
ca RETURN, RETLW sau RETFIE ce au fost executate la sfritul unui subprogram,
contorul programului a fost luat dintr-o stiv, aa ca programul s poat continua de
unde a fost oprit nainte de a fi ntrerupt. Aceste operaii de plasare ntr-o i luare
dintr-o stiv de contor de program sunt numite PUSH i POP, i sunt numite conform
cu instruciunile similare ale unor microcontrolere mai mari.
Programarea n Sistem
Pentru a programa o memorie de program, microcontrolerul trebuie s fie setat
pentru un mod de lucru special prin aducerea pinului MCLR la 13.5V, iar sursa de
tensiune Vdd trebuie s fie stabilizat ntre 4.5V i 5.5V. Memoria program poate fi
programat serial folosind doi pini 'data/clock' ce trebuie s fie mai nti separai de
liniile montajului, aa ca s nu apar erori n timpul programrii.

Moduri de adresare
Locaiile de memorie RAM pot fi accesate direct sau indirect.

Adresarea Direct
Adresarea Direct se face printr-o adres de 9 bii. Aceast adres este obinut prin
conectarea celui de-al aptelea bit al adresei directe a unei instruciuni cu doi bii
(RP1, RP0) din registrul STATUS dup cum se arat n figura urmtoarea. Orice acces
la regitrii SFR poate fi un exemplu de adresare direct.

Bsf STATUS, RP0 ;Bankl


movlw 0xFF ;w=0xFF
movwf TRISA ;address of TRISA register is taken from
;instruction movwf

Adresarea Direct
Adresarea Indirect
Adresarea indirect spre deosebire de cea direct nu ia o adres dintr-o instruciune
ci o creeaz cu ajutorul bitului IRP a regitrilor STATUS i FSR. Locaia adresat este
accesat prin registrul INDF care de fapt ine o adres indicat de un FSR. Cu alte
cuvinte, orice instruciune care folosete INDF ca registrul al ei, n realitate
acceseaz datele indicate de un registru FSR. S spunem, de exemplu, c un registru
cu scop general (GPR) la adresa 0Fh conine o valoarea 20. Prin scrierea unei valori
0Fh n registrul FSR vom obine un registru indicator la adresa 0Fh, iar prin citirea
din registrul INDF, vom obine valoarea 20, ceea ce nseamn c am citit din primul
registru valoarea lui fr accesarea lui direct (dar prin FSR i INDF). Se pare c
acest tip de adresare nu are nici un avantaj fa de adresarea direct, dar exist
unele nevoi n timpul programrii ce se pot rezolva mai simplu doar prin adresarea
indirect.

Un asemenea exemplu poate trimite un set de date prin comunicaia serial, lucrnd
cu bufere i indicatoare (ce vor fi discutate n continuare ntr-un capitol cu exemple),
sau s tearg o parte a memoriei RAM (16 locaii) ca n urmtorul exemplu.
Citind datele din registrul INDF cnd coninutul registrului FSR este egal cu zero,
ntoarce valoarea zero, i scrie n el rezultatul n operaia NOP (no operation- nu
opereaz).

2.6 ntreruperi
ntreruperile sunt un mecanism a unui microcontroler ce i permit s rspund la
unele evenimente la momentul cnd se ntmpl, indiferent de ce face atunci
microcontrolerul. Aceasta este o parte foarte important, pentru c permite
conexiunea microcontrolerului cu lumea de afar. n general, fiecare ntrerupere
schimb debitul programului, l ntrerupe i dup executarea unui subprogram (rutine
de ntrerupere), continu din acelai punct.

Registrul de control al unei ntreruperi se numete INTCON i se gsete la adresa


0Bh. Rolul lui este de a permite sau interzice cererile de ntreruperi, i n caz c nu
sunt permise, nregistreaz cererile de ntrerupere singulare prin biii lui.
Registru INTCON

bit 0 RBIF (RB Port Change Interrupt Flag bit-bit Stegule de ntrerupere a
Schimbrii Portului RB) Bit ce informeaz despre schimbrile de la pinii 4, 5, 6 i 7 ai
portului B.
1=cel puin un pin i-a schimbat starea
0=nu s-a ntmplat nici o schimbare la vreun pin

bit 1 INTF (INT External Interrupt Flag bit-bit Stegule de ntrerupere Extern INT)
A avut loc o ntrerupere extern.
1=a avut loc o ntrerupere
0=nu a avut loc o ntrerupere
Dac s-a detectat un front cresctor sau descresctor la pinul RB0/INT, (ce este
definit cu bitul INTEDG n registrul OPTION), bitul INTF este setat. Bitul trebuie s fie
ters n subprogramul ntrerupere pentru a detecta urmtoarea ntrerupere.

bit 2 T0IF (TMR0 Overflow Interrupt Flag bit-bit Stegule Depire ntrerupere
TMRO) Depirea contorului TMRO.
1=contorul i-a schimbat starea de la FFh la 00h.
0=depirea nu a avut loc
Bitul trebuie s fie ters n program pentru ca o ntrerupere s fie detectat.

bit 3 RBIE (RB port change Interrupt Enable bit-bit Permite ntreruperea schimbrii
portului RB) Permite s aib loc ntreruperi la schimbarea strii pinilor 4, 5, 6, i 7 ai
portului B.
1=permite ntreruperi la schimbarea strii
0=ntreruperi interzise la schimbarea strii
Dac RBIE i RBIF au fost simultan setate, va avea loc o ntrerupere.

bit 4 INTE (INT External Interrupt Enable bit-bit Permite ntrerupere extern INT)
Bit ce permite ntreruperea extern de la pinul RB0/INT.
1=ntrerupere extern permis
0=ntrerupere extern interzis
Dac INTE i INTF au fost setate simultan, va avea loc o ntrerupere.

bit 5 T0IE (TMR0 Overflow Interrupt Enable bit-bit Permite Depire ntrerupere
TMRO) Bit ce permite ntreruperile n timpul depirii contorului TMRO.
1=ntrerupere permis
0=ntrerupere interzis
Dac T0IE i T0IF au fost simultan setate, va avea loc ntreruperea.
Bit 6 EEIE (EEPROM Write Complete Interrupt Enable bit-bit Permite ntrerupere
Complet a Scrierii EEPROM) Bit ce permite o ntrerupere la sfritul unei rutine de
scriere n EEPROM
1= ntrerupere permis
0= ntrerupere interzis
Dac EEIE i EEIF (ce este n registrul EECON1) au fost simultan setate, va avea loc
o ntrerupere.

Bit 7 GIE (Global Interrupt Enable bit-bit Permite ntrerupere Global) Bit ce permite
sau interzice toate ntreruperile.
1=toate ntreruperile sunt permise
0=toate ntreruperile sunt interzise

PIC16F84 are patru surse de ntrerupere:

1. Terminarea scrierii datelor n EEPROM


2. ntrerupere TMR0 cauzat de depirea timer-ului
3. ntrerupere n timpul schimbrii la pinii RB4, RB5, RB6 i RB7 ai portului B.
4. ntrerupere Extern de la pinul RB0/INT al microcontrolerului

n general, fiecare surs de ntrerupere are doi bii legai la ea. Unul permite
ntreruperea, iar cellalt detecteaz cnd au loc ntreruperi. Exist un bit comun
numit GIE ce poate fi folosit pentru a interzice sau permite toate ntreruperile
simultan. Acest bit este foarte folositor cnd se scrie un program pentru c permite
ca toate ntreruperile s fie interzise pentru o perioad de timp, aa ca execuia unei
pri importante a programului s nu fie ntrerupt. Cnd instruciunea ce reseteaz
bitul GIE a fost executat (GIE=0, toate ntreruperile interzise), fiecare ntrerupere
ce rmne nerezolvat trebuie ignorat.
ntreruperile ce rmn nerezolvate i ce au fost ignorate, sunt procesate cnd bitul
GIE (GIE=1, toate ntreruperile sunt permise) va fi ters. Cnd i s-a rspuns
ntreruperii, bitul GIE a fost ters, aa c orice ntreruperi adiionale vor fi interzise,
adresa de ntoarcere a fost trimis n stiv, iar adresa 0004h a fost scris n contorul
programului numai dup aceasta ncepe rspunsul la o ntrerupere! Dup ce este
procesat ntreruperea, bitul a crui setare a cauzat o ntrerupere trebuie ters, sau
rutina de ntrerupere va fi procesat automat tot mereu n timpul ntoarcerii la
programul principal.

Pstrarea coninutului regitrilor importani


Doar valoarea de ntoarcere a contorului programului este nmagazinat ntr-o stiv
n timpul unei ntreruperi (prin valoare de ntoarcere a contorului programului
nelegem adresa instruciunii ce trebuie executat, dar nu a fost executat pentru c
a avut loc ntreruperea). Pstrnd doar valoarea contorului programului adesea nu
este suficient. Unii regitri ce sunt n uz n programul principal pot fi de asemenea n
uz n rutina de ntrerupere. Dac ei nu sunt reinui, programul principal va obine
valori complet diferite n acei regitri n timpul ntoarcerii dintr-o rutin de
ntrerupere, ceea ce va cauza erori n program. Un exemplu de asemenea caz este
coninutul registrului de lucru W. Dac presupunem c programul principal a folosit
registrul de lucru W pentru unele din operaiile sale, i c a pstrat n el o valoare ce
este important pentru urmtoarea instruciune, atunci o ntrerupere ce se va
ntmpla nainte de acea instruciune va schimba valoarea registrului de lucru W, ce
va influena direct programul principal.

Procedura de nregistrare de regitri importani nainte de a merge la o rutin de


ntrerupere se numete PUSH, n timp ce procedura ce aduce valorile nregistrate
napoi, se numete POP. PUSH i POP sunt instruciuni ale altor microcontrolere
(Intel), dar sunt att de larg acceptate c o ntreag operaie este numit dup ele.
PIC16F84 nu are instruciuni ca PUSH i POP, i ele trebuie s fie programate.
Datorit simplitii i folosirii frecvente, aceste pri ale programului pot fi fcute ca
macro-uri. Conceptul unui Macro este explicat n "Limbaj de asamblare program". n
urmtorul exemplu, coninuturile regitrilor W i STATUS sunt memorate n
variabilele W_TEMP i STATUS_TEMP nainte de rutina de ntrerupere. La nceputul
rutinei PUSH trebuie s verificm bancul selectat n prezent pentru c W_TEMP and
STATUS_TEMP nu se gsesc n bancul 0. Pentru schimbul de date ntre aceti regitri,
instruciunea SWAPF se folosete n loc de MOVF pentru c nu afecteaz starea biilor
registrului STATUS.

Exemplul este un program asamblor pentru urmtorii pai :


1. Testarea bancului curent
2. Stocarea registrului W indiferent de bancul curent
3. Stocarea registrul STATUS n bancul 0
4. Executarea rutinei de ntrerupere pentru procesul de ntrerupere (ISR)
5. Restaureaz registrul STATUS
6. Restaureaz registrul W

Dac mai sunt i alte variabile sau regitri ce trebuie stocai, atunci ei trebuie s fie
pstrai dup stocarea registrului STATUS (pasul 3), i adui napoi nainte ca
registrul STATUS s fie restaurat (pasul 5).
Acelai exemplu se poate realiza utiliznd macro-uri, fcnd astfel programul mai
eligibil. Macro-urile ce sunt deja definite, pot fi folosite pentru scrierea de noi macro-
uri. Macro-urile BANK1 i BANK0 ce sunt explicate n capitolul "Organizarea
memoriei" sunt folosite cu macro-urile 'push' i 'pop'.
ntrerupere extern la pinul RB0/INT al microcontrolerului
ntreruperea extern la pinul RB0/INT este triggerat de frontul cresctor (dac bitul
INTEDG=1 n registrul OPTION<6>), sau de frontul descresctor (dac INTEDG=0).
Cnd apare semnalul corect la pinul INT, bitul INTF este setat la registrul INTCON.
Bitul INTF (INTCON<1>) trebuie resetat n rutina de ntrerupere, aa ca ntreruperea
s nu aib loc din nou n timpul ntoarcerii la programul principal. Acesta este un pas
important al programului pe care programatorul nu trebuie s-l uite, sau programul
va merge constant n rutina de ntrerupere. ntreruperea poate fi nchis prin
resetarea bitului de control INTE (INTCON<4>).

ntreruperea n timpul depirii contorului TMRO


Depirea contorului TMRO (de la FFh la 00h) va seta bitul T0IF (INTCON<2>).
Aceasta este o ntrerupere foarte important pentru c multe probleme reale se por
rezolva folosind aceast ntrerupere. Unul din exemple este msurarea timpului.
Dac tim ct timp are nevoie contorul pentru a completa un ciclu de la 00h to FFh,
atunci numrul de ntreruperi nmulit cu acea durat de timp va da timpul total
scurs. n rutina de ntrerupere unele variabile vor fi incrementate n memoria RAM,
valoarea acelei variabile nmulite cu timpul de care are nevoie contorul pentru a
contoriza ntr-un ciclu ntreg, va da timpul total scurs. ntreruperea poate fi
pornit/oprit prin setarea/resetarea bitului T0IE (INTCON<5>).

ntrerupere pe timpul unei schimbri la pinii 4, 5, 6 i 7 ai


portului B
Schimbarea semnalului de intrare la PORTB <7:4> seteaz bitul RBIF (INTCON<0>).
Patru pini RB7, RB6, RB5 i RB4 ai portului B, pot triggera o ntrerupere ce are loc
cnd starea la ei se schimb de la unu la zero logic, sau viceversa. Pentru ca pinii s
fie sensibili la aceast schimbare, trebuie definii ca intrare. Dac oricare din ei este
definit ca ieire, ntreruperea nu va fi generat la schimbarea strii. Dac ei sunt
definii ca intrare, starea lor curent este comparat cu vechea valoare ce a fost
stocat la ultima citire de la portul B. ntreruperea poate fi pornit/oprit prin
setarea/resetarea bitului RBIE n registrul INTCON.

ntreruperea la terminarea subrutinei write n EEPROM


Aceast ntrerupere este doar de natur practic. Pentru c scrierea ntr-o locaie
EEPROM dureaz cam 10ms (care este o durat lung n termenii
microcontrolerului), nu este rentabil de a atepta pn la capt scrierea. Este
adugat astfel mecanismul de ntrerupere ceea ce permite microcontrolerului s
continue executarea programului principal, n timp ce scrierea n EEPROM este fcut
n plan secundar. Cnd scrierea este terminat, ntreruperea informeaz
microcontrolerul c scrierea s-a terminat. Bitul EEIF, prin care se face aceast
informare, se gsete n registrul EECON1. Producerea unei ntreruperi poate fi
interzis prin resetarea bitului EEIE n registrul INTCON.

Iniializarea ntreruperii
Pentru a folosi un mecanism de ntrerupere a unui microcontroler, trebuie fcute
unele sarcini pregtitoare. Aceste proceduri sunt pe scurt numite "iniializare". Prin
iniializare definim la ce va rspunde microcontrolerul, i ce va ignora. Dac nu
setm bitul ce permite o anumit ntrerupere, programul nu va executa un
subprogram ntrerupere. Prin aceasta putem obine controlul asupra producerii
ntreruperii, ceea ce este foarte folositor.

Exemplul de mai sus arat iniializarea unei ntreruperi externe la pinul RB0 al
microcontrolerului. Unde se vede unu setat, nseamn c ntreruperea este permis.
Producerea altor ntreruperi nu este permis, i toate ntreruperile mpreun sunt
interzise pn ce bitul GIE este inut n unu.

Urmtorul exemplu arat o cale tipic de a dirija ntreruperile. PIC16F84 are doar o
locaie unde adresa unui subprogram ntrerupere este memorat. Aceasta nseamn
c mai nti trebuie s detectm ce ntrerupere este la ndemn (dac mai mult de o
surs de ntreruperi este disponibil), i apoi putem executa acea parte a
programului ce se refer la acea ntrerupere.
Rentoarcerea dintr-o rutin de ntrerupere poate fi fcut cu instruciunile
RETURN, RETLW i RETFIE. Se recomand ca s fie utilizat instruciunea RETFIE
pentru c acea instruciune este singura ce seteaz automat bitul GIE, ceea ce
permite s se produc o nou ntrerupere.

2.7 Timer-ul liber TMR0


Timer-ele (temporizatoarele) sunt de obicei cele mai complicate pri ale unui
microcontroler, aa c este necesar s rezervm mai mult timp pentru a le explica.
Odat cu aplicarea lor este posibil s se creeze relaii ntre o dimensiune real ca
"timp" i o variabil ce reprezint starea timer-ului ntr-un microcontroler. Fizic,
timer-ul este un registru a crui valoare crete continuu pn la 255, i apoi
pornete de la capt: 0, 1, 2, 3, 4...255....0,1, 2, 3......etc.

Aceast incrementare se face n fundalul a tot ceea ce face un microcontroler.


Depinde de programator "s gseasc o cale" de cum s profite de aceast
caracteristic pentru nevoile lui. Una din ci este s creasc o variabil la fiecare
depire a timer-ului. Dac tim ct timp are nevoie timer-ul s fac o rund
complet, atunci nmulind valoarea variabilei cu acel timp obinem timpul total
scurs.

PIC16F84 are un timer de 8 bii. Numrul de bii determin pn la ce valoare


contorizeaz timer-ul nainte de a ncepe s contorizeze de la zero din nou. n cazul
unui timer de 8 bii, acel numr este 256. O schem simplificat a relaiei dintre un
timer i un prescaler-divizor este reprezentat n diagrama anterioar. Prescalerul
este numele acelei pri din microcontroler ce divide ceasul oscilatorului nainte de a
ajunge la logica ce crete starea timer-ului. Numrul ce divide un ceas este definit
prin trei bii n registrul OPTION. Cel mai mare divizor este 256. Aceasta nseamn
de fapt c doar la al fiecare 256-lea ceas, valoarea timer-ului va crete cu unu.
Aceasta ne d posibilitatea de a msura perioade de timp mai lungi.
Dup fiecare numrtoare pn la 255, timer-ul i reseteaz valoarea la zero i
ncepe cu un nou ciclu de contorizare pn la 255. n timpul fiecrei tranziii de la
255 la zero, bitul TOIF n registrul INTCON este setat. Dac se permit ntreruperi, de
aceasta se poate profita n generarea i n procesarea rutinei de ntrerupere. Depinde
de programator s reseteze bitul TOIF n rutina de ntrerupere, aa ca noua
ntrerupere, sau noua depire s fie detectate. n afar de ceasul oscilator intern,
starea timer-ului poate de asemenea s creasc prin ceasul extern la pinul
RA4/TOCKI. Alegerea uneia din aceste dou opiuni se face n registrul OPTION prin
bitul TOCS. Dac a fost aleas aceast opiune de ceas extern, va fi posibil s se
defineasc frontul unui semnal (cresctor sau descresctor), la care timer-ul s-i
creasc valoarea.
n practic, unul din exemplele tipice ce este rezolvat prin ceas extern i unde timer-
ul contorizeaz rotaiile complete ale unui ax al unei maini de producie, ca
bobinatorul de transformator de exemplu. S rotim patru uruburi de metal pe axul
unui bobinator. Aceste patru uruburi vor reprezenta convexitatea metalic. S
plasm acum un senzor inductiv la o distan de 5 mm de captul unui urub.
Senzorul inductiv va genera semnalul descresctor de fiecare dat cnd capul
urubului este paralel cu capul senzorului. Fiecare semnal va reprezenta o ptrime
dintr-o rotaie, i suma tuturor rotaiilor se va gsi n timer-ul TMRO. Programul
poate uor citi aceste date din timer printr-un bus de date.

Urmtorul exemplu ilustreaz cum s se iniializeze timer-ul la fronturile


descresctoare ale semnalului din sursa extern cu un prescaler 1:4. Timer-ul
lucreaz n mod "polig-mpingere".
Acelai exemplu poate fi realizat printr-o ntrerupere n modul urmtor:

Prescalerul poate fi asignat fie de timer-ul TMRO fie de watchdog. Watchdogul este
un mecanism pe care microcontrolerul l folosete s se apere mpotriva blocrii
programelor. Ca orice alt circuit electric, la fel i cu microcontrolerul se pot ntmpla
defectri, sau unele stricciuni. Din nefericire microcontrolerul are de asemenea un
program unde se pot ntmpla probleme. Cnd se ntmpl aceasta, microcontrolerul
se va opri din funcionare i va rmne n acea stare pn ce cineva l reseteaz. Din
cauza aceasta, a fost introdus mecanismul watchdog. Dup o anumit perioad de
timp, watchdogul reseteaz microcontrolerul (de fapt microcontrolerul se reseteaz
singur). Watchdogul luceaz pe baza unui principiu simplu: dac se ntmpl
depirea timer-ului, microcontrolerul este resetat, i ncepe executarea programului
mereu din nou. Astfel, se va ntmpla un reset att n cazul unei funcionri corecte
ct i incorecte. Urmtorul pas este prevenirea resetului n cazul unei funcionri
corecte, ce se face prin scrierea unui zero n registrul WDT (instruciunea CLRWDT)
de fiecare dat cnd se apropie de depire. Astfel programul va preveni un reset ct
timp este executat corect. De ndat ce s-a blocat, nu se va scrie zero, va avea loc
depirea timer-ului WDT i un reset ce va duce microcontrolerul napoi la
funcionarea corect din nou.

Prescalerul este acordat cu timer-ul TMRO, sau cu timer-ul watchdogului prin bitul
PSA n registrul OPTION. tergnd bitul PSA, prescalerul va fi acordat cu timer-ul
TMRO. Cnd prescalerul este acordat cu timer-ul TMRO, toate instruciunile de
scriere n registrul TMRO (CLRF TMR0, MOVWF TMR0, BSF TMR0,...) vor terge
prescalerul. Cnd prescalerul este asignat timerului watchdog, numai instruciunea
CLRWDT va terge prescalerul i timer-ul watchdog n acelai timp. Schimbarea
prescalerului este complet sub controlul programatorului, i poate fi schimbat n
timp ce se ruleaz programul.

Exist doar un prescaler i un timer. Funcie de nevoi, ele sunt asignate fie timer-ului TMRO fie
watchdog-ului.

Registrul control OPTION

Bit 0:2 PS0, PS1, PS2 (Prescaler Rate Select bit-bit Selectare Rat Prescaler)
Subiectul prescaler, i cum afecteaz aceti bii lucrul unui microcontroler va fi
abordat n seciunea despre TMRO.

bit 3 PSA (Prescaler Assignment bit-bit Asignare Prescaler)


Bit ce asigneaz prescalerul ntre TMRO i timer-ul watchdog).
1=prescalerul este asignat la timer-ul watchdog
0=prescalerul este asignat la timer-ul free-liber

bit 4 T0SE (TMR0 Source Edge Select bit-bit Selectare Front Surs TMRO)

Dac triggerul TMRO a fost activat cu impulsuri de la pinul RA4/T0CKI, acest bit va
determina dac va fi la frontul cresctor sau descresctor al semnalului.
1=front descresctor
0=front cresctor
bit 5 T0CS (TMR0 Clock Source Select bit-bit Selectare Surs Ceas TMRO)
Acest bit permite unui timer free-run s-i incrementeze valoarea fie de la oscilatorul
intern, de exemplu din ceasul oscilatorului, sau prin impulsuri externe la pinul
RA4/T0CKI.
1=impulsuri externe
0=1/4 ceas intern

bit 6 INTEDG (Interrupt Edge Select bit-bit Selectare Front ntreruperi)


Dac a fost permis producerea de ntreruperi, acest bit va determina la ce front va
avea loc ntreruperea la pinul RB0/INT.
1=front cresctor
0=front descresctor

bit 7 RBPU (PORTB Pull-up Enable bit-bit Permite Pull-up-tragerea PORTB)


Acest bit deschide sau nchide rezistorii interni la portul B.
1=rezistorii 'pull-up' deschii
0=rezistorii 'pull-up' nchii

2.8 Memoria de date EEPROM


PIC16F84 are 64 de bytes de locaii de memorie EEPROM la adresele de la 00h la
63h unde se poate scrie sau de unde se poate citi. Cea mai important caracteristic
a acestei memorii este c nu pierde coninutul n timpul nchideri sursei de
alimentare. Aceasta nseamn practic c ceea ce a fost scris n ea va rmne chiar i
cnd microcontrolerul este nchis. Datele pot fi reinute n EEPROM fr sursa de
alimentare pn la 40 de ani. (dup cum declar productorul lui PICD16F84), i se
pot executa 10000 de cicluri de scriere.

n practic, memoria EEPROM este folosit pentru stocarea unor date importante sau
a unor parametri de proces.
Un asemenea parametru este o temperatur dat, asignat cnd se seteaz un
regulator de temperatur la un proces. Dac nu s-a reinut, va fi nevoie s se
ajusteze temperatura dat dup fiecare ntrerupere a alimentrii. Pentru c aceasta
este foarte nepractic (chiar periculos), productorii de microntrolere au nceput s
instaleze un tip mai mic de memorie EEPROM.

Memoria EEPROM este plasat ntr-un loc special al memoriei i poate fi accesat
prin regitri speciali. Aceti regitri sunt:

EEDATA la adresa 08h, care reine datele de citit sau cele de scris.
EEADR la adresa 09h, ce conine o adres a locaiei EEPROM ce este accesat.
EECON1 la adresa 88h, ce conine bii de control.
EECON2 la adresa 89h. Acest registru nu exist fizic i servete la protejarea
EEPROM-ului de scrieri accidentale.

Registrul EECON1 la adresa 88h este un registru de control cu 5 bii implementai.


Biii 5, 6 i 7 nu sunt folosii, i prin citire sunt totdeauna zero. Interpretarea biilor
registrului EECON1 urmeaz.

Registrul EECON1
bit 0 RD (Read Control bit-bit Control Citire)
Setarea acestui bit iniializeaz transferul de date definit n EEADR la registrul
EEDATA. Pentru c timpul nu este esenial n citirea datelor ca la scriere, datele din
EEDATA pot fi deja folosite n urmtoarea instruciune.
1=initializeaz citirea
0=nu iniializeaz citirea

bit 1 WR (Write Control bit-bit Control Scriere)


Setarea acestui bit iniializeaz scrierea datelor din registrul EEDATA la adresa
specifcat prin registrul EEADR.
1=initializeaz scrierea
0=nu iniializeaz scrierea

bit 2 WREN (EEPROM Write Enable bit-bit Permite Scrierea EEPROM) Permite
scrierea n EEPROM
Dac acest bit nu a fost setat, microcontrolerul nu va permite scrierea n EEPROM.
1=scriere permis
0=scriere interzis

bit 3 WRERR (Write EEPROM Error Flag-Stegule Eroare Scriere EEPROM ) Eroare n
timpul scrierii n EEPROM
Acest bit a fost setat doar n caz c scrierea n EEPROM a fost intrerupt de un
semnal sau prin terminarea timpului din timer-ul watchdog (dac este activat).
1=a avut loc eroare
0=nu a avut loc eroare

bit 4 EEIF (EEPROM Write Operation Interrupt Flag bit-bit Stegule ntrerupere
Operaie Scriere EEPROM) Bit folosit pentru a informa c scrierea datelor s-a
terminat.
Cnd s-a terminat scrierea, acest bit va fi setat automat. Programtorul trebuie s
tearg bitul EEIF n programul su pentru a detecta noua terminare a scrierii.
1=scrierea terminat
0=scrierea nc neterminat, sau nc nu a nceput

Citirea din memoria EEPROM


Setarea bitului RD iniializeaz transferul de date de la adresa gsit n EEADR la
registrul EEDATA. Ca i la citirea datelor nu avem nevoie de att de mult timp ca la
scriere, datele luate din registrul EEDATA pot deja fi folosite mai departe n
urmtoarea instruciune.

O mostr a prii programului ce citete datele n EEPROM, ar putea arta ca mai


jos:
Dup ultima instruciune de program, coninutul de la o adres EEPROM zero poate fi
gsit n registrul w.

Scrierea n memoria EEPROM


Pentru a scrie datele n locaia EEPROM, programatorul trebuie mai nti s scrie
adresa n registrul EEADR i datele n registrul EEDATA. Numai atunci este folositor
de a seta bitul WR ce pune totul n micare. Bitul WR va fi resetat, i bitul EEIF setat
urmnd o scriere ce poate fi folosit n procesarea ntreruperilor. Valorile 55h i AAh
sunt prima i a doua cheie care interzic ca scrierea accidental n EEPROM s se
ntmple. Aceste dou valori sunt scrise n EECON2 care servete doar pentru acel
scop, de a primi aceste dou valori i de a preveni orice scriere accidental n
memoria EEPROM. Liniile de program marcate ca 1, 2, 3 i 4 trebuie s fie executate
n acea ordine n intervale egale de timp. De aceea este foarte important, s nchidei
ntreruperile ce ar putea schimba timpul necesar pentru executare instruciunilor.
Dup scriere, ntreruperile, pot fi permise din nou.

Exemplu unei pri a programului ce scrie datele 0xEE n prima locaie n memoria
EEPROM ar putea arta ca mai jos:

Este recomandat ca WREN s fie nchis tot timpul cu excepia scrierii


datelor n EEPROM, aa c posibilitatea unei scrieri accidentale va fi
minim. Scrierea n EEPROM va fi automat tears!
CAPITOLUL 3
Set Instruciuni
Introducere

Set de Instruciuni n Familia Microcontrolerului PIC16Cxx


Transfer Date
Aritmetic i logic
Operaii cu bii
Direcionarea debitului de program
Perioada de Execuie a Instruciunilor
Lista de cuvinte

Introducere
Am menionat deja c microcontrolerul nu este ca orice alt circuit integrat. Cnd ies

din producie cele mai multe circuite integrate sunt gata de a fi introduse n aparate

ceea ce nu este cazul cu microcontrolerele. Pentru a "face" microcontrolerul s

ndeplineasc o sarcin, trebuie s-i spunem exact ce s fac, sau cu alte cuvinte

trebuie s scriem programul pe care microcontrolerul s-l execute. Vom descrie n

acest capitol instruciunile care alctuiesc assembler-ul, sau limbajul de programare

cu nivel sczut pentru microcontrolerele PIC.

Set de Instruciuni n Familia Microcontrolerului


PIC16Cxx
Setul complet care cuprinde 35 de instruciuni este dat n tabela urmtoare. Un
motiv pentru un numr aa de mic de instruciuni st n primul rnd n faptul c
discutm despre un microcontroler RISC ale crui instruciuni sunt bine optimizate
avnd n vedere viteza de lucru, simplitatea arhitectural i compactitatea codului.
Singurul neajuns este c programatorul trebuie s controleze o tehnic
"neconfortabil" n a utiliza un set modest de 35 de instruciuni.

Transfer de Date
Transferul de date ntr-un microcontroler este fcut ntre registrul de lucru (W) i un

registru 'f' ce reprezint orice locaie n RAM-ul intern (indiferent dac acetia sunt

regitri speciali sau de scop general).

Primele trei instruciuni (a se vedea urmtorul tabel) fac ca o constant s fie


nscris n registrul W (MOVLW este prescurtarea pentru MOVe Literal to W), i ca
datele s fie copiate din registrul W n RAM i datele din RAM s fie copiate n
registrul W (sau n aceeai locaie RAM, la care punct numai starea steguleului Z se
schimb). Instruciunea CLRF scrie constanta 0 n registrul 'f ', iar CLRW scrie
constanta 0 n registrul W. Instruciunea SWAPF schimb locurile cmpului de
nibbles- buci de 4 bii n interiorul unui registru.

Aritmetic i logic
Din toate operaiile aritmetice, PIC ca majoritatea microcontrolerelor, accept doar

scderea i adunarea. Steguleele C, DC i Z sunt setate funcie de rezultatul

adunrii sau scderii, dar cu o excepie: pentru c scderea se face ca o adunare a

unei valori negative, eticheta C este invers urmnd scderii. Cu alte cuvinte, este

setat dac operaia este posibil, i este resetat dac un numr mai mare a fost

sczut din unul mai mic.

Unitatea logic a PIC-ului are capabilitatea de a face operaiile AND (I), OR (SAU),

EX-OR (SAU-EXCLUSIV), complementare (COMF) i rotaie (RLF i RRF).

Instruciunile ce rotesc coninutul registrului mut biii n interiorul registrului prin

eticheta C cu un spaiu la stnga (ctre bitul 7), sau la dreapta (ctre bitul 0). Bitul

ce "iese" din registru este scris n steguleul C, i valoarea steguleului C este scris

ntr-un bit al "prii opuse" a registrului.

Operaii cu bii
Instruciunile BCF i BSF fac setarea sau tergerea unui singur bit oriunde n
memorie. Chiar dac pare o simpl operaie, este executat n aa fel ca CPU citete
mai nti ntregul byte, schimb un bit n el i apoi scrie ntregul byte n acelai loc.

Direcionarea debitului unui program


Instruciunile GOTO, CALL i RETURN sunt executate n acelai fel ca i n celelalte
microcontrolere, numai stiva este independent de RAM-ul intern i limitat la opt
nivele.
Instruciunea 'RETLW k' este identic cu instruciunea RETURN, cu excepia c
nainte de a se ntoarce dintr-un subprogram, constanta definit operandul de
instruciuni este scris n registrul W. Aceast instruciune ne permite s proiectm
uor tabelele (listele) Look-up. Cel mai mult le folosim la determinarea poziiei
datelor n tabelul nostru adugnd-o la adresa la care ncep tabelele, i apoi citim
datele din acea locaie (care este uzual gsit n memoria program).

Tabelul poate fi format ca un subprogram ce const dintr-o serie de instruciuni


'RETLW k', unde constantele 'k' sunt membri ai tabelului.

Scriem poziia unui membru al tabelului nostru n registrul W, i folosind

instruciunea CALL apelm un subprogram care creaz tabelul. Prima linie de

subprogram ADDWF PCL, f adaug poziia unui membru al registrului W la adresa de

start a tabelului nostru, gsit n registrul PCL, i astfel obinem adresa datelor reale

n memoria program. Cnd ne ntoarcem dintr-un subprogram vom avea n registrul

W coninutul unui membru al tabelului adresat. n exemplul anterior, constanta 'k2'

va fi n registrul W urmnd unei ntoarceri dintr-un subprogram.

RETFIE (RETurn From Interrupt - Interrupt Enable) este o ntoarcere dintr-o rutin
de ntrerupere i difer de o RETURN numai n aceea c seteaz automat bitul GIE
(Global Interrupt Enable). La o ntrerupere, acest bit este automat ters. Cnd ncepe
ntreruperea, numai valoarea contorului de program este pus n vrful stivei. Nu
este prevzut memorarea automat a valorilor i strii registrului.

Jump-urile (salturile) condiionale sunt sintetizate n dou instruciuni: BTFSC i


BTFSS. Funcie de starea bitului n registrul 'f' ce este testat, instruciunile sar sau nu
peste instruciunea de program urmtoare.

Perioada de Execuie a Instruciunii


Toate instruciunile sunt executate ntr-un ciclu cu excepia instruciunilor ramur
condiionale dac condiia a fost adevrat, sau dac coninutul contorului de
program a fost schimbat de o anumit instruciune. n acest caz, execuia cere dou
cicluri de instruciuni, iar al doilea ciclu este executat ca NOP (No Operation-Fr
operaii). Patru clock-uri oscilator fac un ciclu instruciune. Dac folosim un oscilator
cu frecvena de 4 MHz, timpul normal pentru execuia instruciunii este 1 s, i n caz
de branching-ramificare condiional, perioada de execuie este 2 s.

List de cuvinte
f orice locaie de memorie ntr-un microcontroler
W registru de lucru
b poziie bit n registru 'f'
d bit destinaie
label grup de opt caractere ce marcheaz nceputul unei pri de program
TOS vrful stivei
[] opiune
<> poziie bit n registru
*1 Dac portul I/O este operand surs, este citit starea pinilor microcontrolerului
*2 Dac aceast instruciune este executat n registrul TMRO i dac d=1,
prescaler-ul asignat acelui timer va fi automat ters
*3 Dac PC s-a modificat, sau rezultatul testului =1, instruciunea s-a executat n
dou cicluri
CAPITOLUL 4
Programare n Limbaj de Asamblare
Introducere

Un exemplu de program scris

Directive de control

4.1 definete
4.2 include
4.3 constant
4.4 variabil
4.5 set
4.6 equ
4.7 org
4.8 end

Instruciuni condiionale

4.9 if
4.10 else
4.11 endif
4.12 while
4.13 endw
4.14 ifdef
4.15 ifndef

Directive de date

4.16 cblock
4.17 endc
4.18 db
4.19 de
4.20 dt

Configurnd o directiv

4.21 _CONFIG
4.22 Processor

Fiiere create ca rezultat al translrii de program


Macro-uri
Introducere
Abilitatea de a comunica este de mare importan n orice domeniu. Totui, este
posibil numai dac amndoi partenerii de comunicare cunosc acelai limbaj, sau
urmresc aceleai reguli n timpul comunicrii. Folosind aceste principii ca un punct
de plecare, putem de asemenea defini comunicarea ce are loc ntre microcontrolere
i om. Limbajul pe care microcontrolerul i omul l folosesc pentru a comunica este
numit "limbaj de asamblare". Titlul nsui nu are un neles deosebit, i este analog
numelor altor limbaje, de ex. engleza i franceza. Mai precis, "limbajul de asamblare"
este doar o soluie trectoare. Programele scrise n limbaj de asamblare trebuie
traduse ntr-un "limbaj de zero-uri i unu-uri" pentru ca un microcontroler s-l
neleag. "Limbajul de asamblare" i "assembler-ul" sau asamblorul sunt dou
noiuni diferite. Primul reprezint un set de reguli folosite n scrierea unui program
pentru un microcontroler, iar cellalt este un program n computerul personal care
traduce limbajul de asamblare ntr-un limbaj de zero-uri i unu-uri. Un program ce
este tradus n "zero-uri" i "unu-uri" este numit "limbaj main".

Fizic, "Program" reprezint un fiier pe discul computerului (sau n memorie dac


este citit ntr-un microcontroler), i este scris conform cu regulile de asamblare sau
ale altui limbaj pentru programarea microcontrolerului. Omul poate nelege pentru
c este constituit din semne i cuvinte ale alfabetului. Cnd se scrie un program,
trebuie urmrite unele reguli pentru a se obine un efect dorit. Un Translator
interpreteaz fiecare instruciune scris n limbajul de asamblare ca o serie de zero-
uri i unu-uri ce au o semnificaie pentru logica intern a microcontrolerului.

S lum de exemplu instruciunea "RETURN" pe care microcontrolerul o folosete


pentru a se ntoarce dintr-un sub-program.

Cnd asamblorul l traduce, obinem o serie de zero-uri i unu-uri pe care


microcontroleul tie cum s-l interpreteze.

Exemplu: RETURN 00 0000 0000 1000

Similar propoziiei de mai sus, fiecare instruciune de asamblare este interpretat ca


i corespunznd unei serii de zero-uri i unu-uri.
Locul unde aceast traducere a limbajului de asamblare se gsete , se numete un
fiier de "execuie". Vom ntlni adesea numele de fiier "HEX". Acest nume vine de
la o reprezentare hexazecimal a acelui fiier, ca i de la apendicele "hex" din titlu,
de ex. "run through.hex". Odat ce este generat, fiierul de execuie este citit n
microcontroler printr-un programator.

Un program n Limbaj de Asamblare este scris ntr-un program pentru procesarea


textului (editorul) i este capabil de a produce un fiier ASCII pe discul computerului
sau n zone specializate ca MPLAB ce se va explica n capitolul urmtor.

Limbaj de Asamblare
Elementele de baz ale limbajului de asamblare sunt:

Label-uri sau Etichete


Instruciuni
Operanzi
Directive
Comentarii

Label-uri
Un Label este o desemnare textual (n general un cuvnt uor de citit) pentru o
linie ntr-un program, sau seciunea unui program unde micro-ul poate sri sau
chiar nceputul unui set de linii a unui program. Poate fi folosit de asemenea pentru a
executa ramificare de program (ca Goto.) i programul poate chiar avea o
condiie ce trebuie ndeplinit pentru ca instruciunea Goto s fie executat. Este
important pentru un label de a ncepe cu o liter a alfabetului sau cu o subliniere "_".
Lungimea label-ului poate fi de pn la 32 caractere. Este de asemenea important ca
un label s nceap de la primul rnd.

Instruciuni
Instruciunile sunt deja definite prin folosirea unui microcontroler specific, aa c ne
rmne doar s urmm instruciunile pentru folosirea lor n limbajul de asamblare.
Modul n care scriem o instruciune mai este numit "sintaxa" instruciunii. n
exemplul urmtor putem recunoate o greeal n scriere pentru c instruciunile
movlp i goto nu exist pentru microcontrolerul PIC16F84.

Operanzi
Operanzii sunt elemente ale instruciunii pentru instruciunea ce este executat. Ei
sunt de obicei regitri sau variabile sau constante. Constantele sunt numite
"literal-e". Cuvntul literal nseamn "numr".

Comentarii
Comentariul este o serie de cuvinte pe care programatorul le scrie pentru a face
programul mai clar i mai uor de citit. Se plaseaz dup o instruciune , i trebuie
s nceap cu punct i virgul";".

Directive
O directiv este similar unei instruciuni, dar spre deosebire de o instruciune este
independent de modelul microcontrolerului, i reprezint o caracteristic a
limbajului de asamblare nsui. Directivelor le sunt date uzual nelesuri de scop prin
variabile i regitri. De exemplu, LEVEL poate fi o desemnaie pentru o variabil n
memoria RAM la adresa 0Dh. n felul acesta, variabila la acea adres poate fi
accesat prin desemnaia LEVEL. Aceasta este mult mai uor pentru un programator
s neleag dect s ncerce s-i aduc aminte c adresa 0Dh conine informaii
despre LEVEL.
Un exemplu de program scris
Urmtorul exemplu ilustreaz un program simplu scris n limbaj de asamblare
respectnd regulile de baz.

Cnd se scrie un program, nafar de regulile obligatorii, sunt de asemenea unele


reguli ce nu sunt scrise dar trebuie urmate. Una din ele s scrii numele programului
la nceput, ce face programul, versiunea lui, date cnd a fost scris, tipul
microcontrolerului pentru care a fost scris, i numele programatorului.

Pentru c aceste date nu sunt importante pentru translatorul de asamblare, este


scris ca i comentarii. Trebuie remarcat c un comentariu ncepe totdeauna cu
punct i virgul i c poate fi plasat ntr-un rnd nou sau poate urma dup
instruciune. Este cel mai bine inut n rndul al treilea pentru a face traseul uor de
urmrit.
Dup deschiderea comentariului ce a fost scris, trebuie inclus directiva. Aceasta
este artat n exemplul de mai sus.

Pentru a funciona corect, trebuie s definim civa parametri ai microcontrolerului


ca:
- tipul oscilatorului
- dac timer-ul watchdog este pe deschis, i
- dac circuitul de resetare intern este activ.

Toate acestea sunt definite prin urmtoarea directiv:

_CONFIG _CP_OFF&_WDT_OFF&PWRTE_ON&XT_OSC

Cnd toate elementele necesare au fost definite, putem ncepe scrierea unui
program. n primul rnd, este necesar de a determina adresa de unde ncepe
microcontrolerul, dup pornirea sursei de alimentare. Aceasta este (org 0x00).
Adresa de la care ncepe programul dac are loc o ntrerupere este (org 0x04).
Pentru c acesta este un program simplu, va fi suficient s direcionm
microcontrolerul la nceputul programului cu o instruciune "goto Main".

Instruciunile gsite n Main sub-routine selecteaz bank-ul 1 al memoriei (BANK1)


pentru a accesa registrul TRISIB, aa nct portul B s fie declarat ca o ieire (movlw
0x00, movwf TRISIB).

Urmtorul pas este de a selecta bank-ul de memorie 0 i de plasa statusul unu-lui


logic la portul B( movlw 0Xff, movwf PORTB ), i astfel programul principal este
terminat. Trebuie s facem o alt bucl unde microcontrolerul s fie inut ca s nu se
"rtceasc" dac se ntmpl o eroare. Pentru acest scop, se face o bucl infinit
unde micro-ul este reinut n timp ce sursa este conectat. Necesarul "sfrit" de la
concluzia fiecrui program informeaz translatorul de asamblare c nu mai sunt
instruciuni n program.

Directive de control

4.1 #DEFINE Schimb o bucat de text pentru o alta


Sintax:
#define<name> [<text ce schimb numele>]

Descriere:
De fiecare dat cnd apare <name> n program , va fi nlocuit cu <text ce schimb
numele>.

Exemplu:
#define turned on 1
#define turned off 0

Directive similare: #UNDEFINE, IFDEF,IFNDEF


4.2 INCLUDE Include un fiier adiional ntr-un program
Sintax:
#include <file_name>
#include "

Descriere:
O aplicaie a acestei directive are efect ca i cum ntregul fiier a fost copiat ntr-un
loc unde directiva "include" a fost gsit. Dac numele fiierului este n paranteze
ptrate, avem de a face cu un fiier de sistem, i dac este n interiorul ghilimelelor
de citare, avem de a face cu fiier de utilizator. Directiva "include" contribuie la un
traseu mai bun al programului principal.

Exemplu:
#include <regs.h>
#include "subprog.asm"

4.3 CONSTANT D o valoare numeric constant desemnrii


textuale
Sintax:
Constant <name>=<value>

Descriere:
De fiecare dat cnd apare <name> n program, va fi nlocuit cu <value>.

Exemplu:
Constant MAXIMUM=100
Constant Length=30

Directive similare: SET, VARIABLE

4.4 VARIABLE D o valoare numeric variabil desemnrii


textuale
Sintax:
Variable<name>=<value>

Descriere:
Folosind aceast directiv, desemnarea textual se nlocuiete cu o valoare
particular. Difer de directiva CONSTANT n aceea c dup aplicarea directivei,
valoarea desemnrii textuale poate fi nlocuit.

Exemplu:
variable level=20
variable time=13

Directive similare: SET, CONSTANT


4.5 SET Definirea variabilei asamblorului
Sintax:
<name_variable>set<value>

Descriere:
Variabilei <name_variable> i este adugat expresia <value>. Directiva SET este
similar lui EQU, dar cu directiva SET numele variabilei poate fi redefinit urmnd o
definiie.

Exemplu:
level set 0
length set 12
level set 45

Directive similare: EQU, VARIABLE

4.6 EQU Definind constanta asamblorului


Sintax:
<name_constant> equ <value>

Descriere:
To the name of a constant <name_constant> is added value <value>

Exemplu:
five equ 5
six equ 6
seven equ 7

Instruciuni similare: SET

4.7 ORG Definete o adres de unde programul este


nmagazinat n memoria microcontrolerului
Sintax:
<label>org<value>

Descriere:
Aceasta este cea mai frecvent folosit directiv. Cu ajutorul acestei directive definim
unde o anumit parte a programului va fi n memoria program.

Exemplu:
Start org 000
movlw
movwf

Primele dou instruciuni ce urmeaz dup prima directiv 'org' sunt memorate de la
adresa 00, i celelalte dou de la adresa 10.
4.8 END Sfrit de program
Sintax:
end

Descriere:
La sfritul fiecrui program este necesar de a plasa directiva 'end' aa ca
translatorul de asamblare s tie c numai sunt instruciuni n program.

Exemplu:
.
.
movlw 0xFF
movwf PORTB
end

Instruciuni condiionale

4.9 IF Ramificare de program condiional


Sintax:
if<conditional_term>

Descriere:
Dac condiia n <conditional_term> este ndeplinit, parte a programului ce
urmeaz directivei IF va fi executat. i dac nu este, partea ce urmeaz directivei
ELSE sau ENDIF va fi executat.

Exemplu:
if nivo=100
goto PUNI
else
goto PRAZNI
endif

Directive similare: #ELSE, ENDIF

4.10 ELSE 'IF' alternativ la blocul program cu termeni


condiionali
Sintax:
Else

Descriere:
Folosit cu directiva IF ca o alterntiv dac termenul condiional este incorect.

Exemplu:
If time< 50
goto SPEED UP
else goto SLOW DOWN
endif
Instruciuni similare: ENDIF, IF

4.11 ENDIF Sfritul seciunii de program condiionale


Sintax:
endif

Descriere:
Directiva este scris la sfritul blocului condiional pentru translatorul de asamblare
pentru a ti c este sfritul blocului condiional

Exemplu:
If level=100
goto LOADS
else
goto UNLOADS
endif

Directive similare: ELSE, IF

4.12 WHILE Execuia seciunii programului ct timp condiia


este ndeplinit
Sintax:
while<condition>
.
endw

Descriere:
Liniile de program ntre WHILE I ENDW vor fi execuate ct timp condiia este
ndeplinit. Dac condiia se oprete din a mai fi valid, programul continu
executarea instruciunilor urmnd linia ENDW. Numrul de instruciuni dintre WHILE
i ENDW poate fi cel mult 100, i numrul de execuii 256.

Exemplu:
While i<10
i=i+1
endw

4.13 ENDW Sfritul prii condiionale a programului


Sintax:
endw

Descriere:
Instuciunea este scris la sfritul blocului WHILE condiional, aa ca translatorul de
asamblare s tie c este sfritul blocului condiional

Exemplu:
while i<10
i=i+1

endw

Directive similare: WHILE

4.14 IFDEF Execuia unei pri de program dac simbolul este


definit
Sintax:
ifdef<designation>

Descriere:
Dac desemnarea <designation> este definit anterior (cel mai adesea prin
instruciunea#DEFINE), instruciunile ce urmeaz sunt executate pn ce nu se
ajunge la directivele ELSE i ENDIF.

Exemplu:
#define test
.
ifdef test ;how the test is defined
......; instructions from these lines will execute
endif

Directive similare: #DEFINE, ELSE, ENDIF, IFNDEF, #UNDEFINE

4.15 IFNDEF Execuia unei pri de program dac simbolul este


definit
Sintax:
ifndef<designation>

Descriere:
Dac desemnarea <designation> nu a fost definit anterior, sau dac definiia ei a
fost tears cu directiva directive #UNDEFINE, instruciunile ce urmeaz sunt
executate pn ce nu se ajunge la directivele ELSE i ENDIF.

Exemplu:
#define test
..........
#undefine test
..........
ifndef test ;how the test is undefined
..... .; instructions from these lines will execute
endif

Directive similare: #DEFINE, ELSE, ENDIF, IFDEF, #UNDEFINE

Directive de Date
4.16 CBLOCK Definind un bloc pentru constantele numite
Sintax:
Cblock [<term>]
<label>[:<increment>], <label>[:<increment>]......
endc

Descriere:
Directiva este folosit pentru a da valori constantelor numite. Fiecare termen ce
urmeaz primete o valoare mai mare cu unu dect precursorul lui. Dac parametrul
<increment> este de asemenea dat, atunci valoarea dat n parametrul
<increment> este adugat constantei urmtoare. Valoarea parametrului <term>
este valoarea de pornire. Dac nu este dat, este considerat a fi zero.

Exemplu:
Cblock 0x02
First, second, third ;first=0x02, second=0x03, third=0x04
endc

cblock 0x02
first : 4, second : 2, third ;first=0x06, second=0x08, third=0x09
endc

Directive similare: ENDC

4.17 ENDC Sfritul definiiei blocului constante


Sintax:
endc

Descriere:
Directiva este folosit la sfritul definiiei unui bloc de constante ca translatorul de
asamblare s tie c nu mai sunt constante.

Directive similare: CBLOCK

4.18 DB Definind date de un byte


Sintax:
[<term>]db <term> [, <term>,.....,<term>]

Descriere:
Directiva rezerv un byte n memoria de program. Cnd sunt mai muli termeni ce au
nevoie s li se desemneze un byte de fiecare, ei vor fi desemnai unul dup altul.

Exemplu:
db 't', 00f, 'e', 's', 012

Instruciuni similare: DE, DT


4.19 DE Definind Byte-ul de memorie EEPROM
Sintax:
[<term>] de <term> [, <term>,....., <term>]

Descriere:
Directiva este folosit pentru definirea byte-ului de memorie EEPROM. Chiar dac a
fost iniial intenionat doar pentru memoria EEPROM, poate fi folosit pentru oricare
alt locaie de memorie.

Exemplu:
org H'2100'
de "Version 1.0" , 0

Instruciuni similare: DB, DT

4.20 DT Definin tabelul de date


Sintax:
[<term>] dt <term> [, <term>,........., <term>]

Descriere:
Directiva genereaz seria RETLW de instruciuni, o instruciune de fiecare termen.

Exemplu:
dt "Message", 0
dt first, second, third

Directive similare: DB, DE

Configurnd o directiv

4.21 _CONFIG Setarea the biilor configuraionali


Sintax:
-config<term> or__config<address>,<term>

Descriere:
Sunt definite oscilatorul, aplicaia timer watchdog i circuitul intern de reset. nainte
de folosirea acestei directive, procesorul trebuie definit folosind directiva
PROCESSOR.

Exemplu:
_CONFIG _CP_OFF&_WDT_OFF&_PWRTE_ON&_XT_OSC

Directive similare: _IDLOCS, PROCESSOR

4.22 PROCESSOR Definind modeul microcontrolerului


Sintax:
Processor <microcontroller_type>

Descriere:
Instruciunea seteaz tipul microcontrolerului unde programarea este fcut.

Exemplu:
processor 16F84

Fiiere create ca rezultat al translrii programului


Ca un rezultat al procesului translrii unui program scris n limbaj de asamblare
obinem fiiere ca:

Fiier de executare (Program_Name.HEX)


Fiier de erori program (Program_Name.ERR)
Fiier list (Program_Name.LST)

Primul fiier conine programul translat ce este citit n microcontroler prin


programareare. Coninutul lui nu poate da orice informaie programatorului, aa c
nu ne vom mai referi la ele n continuare.
Al doilea fiier conine posibile erorile ce au fost fcute n procesul scrierii, i ca au
fost observate de translatorul de asamblare n timpul procesului de translare. Erorile
pot fi descoperite de asemenea ntr-un fiier "list". Acest fiier este mai potrivit dei
cnd programul este mare i vederea fiierului "list" dureaz mai mult.
Al treilea fiier este cel mai folositor programatorului. n el sunt coninute multe
informaii, ca informaii despre instruciunile de poziionare i variabilele din
memorie, sau semnalizarea erorii.

Exemplu unui fiier "list" pentru program urmeaz n acest capitol. n captul
fiecrei pagini se gsesc informaii despre numele fiierului, data cnd a fost translat
i numrul paginii. Prima coloan conine o adres din memoria programului unde
este plasat o instruciune din acel rnd. A doua coloan conine o valoare a oricrei
variabile definit de una din directive: SET, EQU, VARIABLE, CONSTANT or CBLOCK.
A treia coloan este rezervat pentru forma unei instruciuni translate pe care PIC-ul
o execut. A patra coloan conine instruciunile asamblorului i comentariile
programatorului. Posibile erori vor apare ntre rnduri urmnd o linie n care s-a
produs eroarea.
La sfritul fiierului "list" este un tabel cu simboluri folosite n program. Un element
folositor al fiierului "list" este un grafic de utilizare a memoriei. La sfrit de tot,
este o statistic de erori ca i cantitatea de program rmas.

Macro-uri
Macros-urile sunt elemente foarte folositoare n limbajul de asamblare. Ei ar putea fi
pe scurt descrii ca "grup definit al utilizatorului de instruciuni ce vor intra n
programul de asamblare unde a fost apelat macro-ul". Este posibil de a scrie un
program chiar fr folosirea macro-urilor. Dar cu folosirea lor programul scris este
mult mai uor de neles, n special dac mai muli programatori lucreaz la acelai
program. Macro-urile au acelai scop ca funcii ale limbajelor de programare
complexe.

Cum s le scriem:

<label> macro [<argument1>,<argument2>,......<argumentN>]


........
.......
endm

Din modul n care sunt scrise, vedem c macro-urile pot accepta argumente, ceea ce
este foarte folositor n programare. Cnd apare argumentul n corpul macro-ului, va
fi nlocuit cu valoarea <argumentN>.

Exemplu:

Exemplu de mai sus arat un macro a crui scop este de a nlocui la portul B
argumentul ARG1 ce a fost definit n timp ce a fost apelat macro-ul. Folosirea lui n
program ar fi limitat la scrierea unei linii: ON_PORTB 0xFF , i astfel am plasa
valoarea 0xFF la PORTB. Pentru a folosi un macro n program, este necesar de a
include fiierul macro n programul principal cu instruciunea include
"macro_name.inc". Coninutul unui program este copiat automat ntr-un loc unde
instruciunea este scris. Aceasta poate fi cel mai bine vzut ntr-un fiier list
anteriror unde fiierul cu macro-uri este copiat mai jos de linia #include"bank.inc".