CAPITOLUL 1
CAPITOLUL 1Introducere n MicrocontrolereIntroducereCircumstanele
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 capsuleia 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.
IstorieEste 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 microprocesoarelori 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 calculatoareca :KIM-1,
Apple I, Apple II, Atari, Comodore, Acorn, Oric, Galeb, Orao,
Ultrai 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 MicroprocesoareMicrocontrolerul 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 centralS 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 intoarcem 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 liniintr-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 referinatt 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 liniiPentru 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 urmarea 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 microcontrolerLiniile 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. STARTREGISTER1=MEMORY
LOCATION_AREGISTER2=MEMORY LOCATION_BPORTA=REGISTER1 + REGISTER2END
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
aceastatrebuie 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
IntroducerePIC16F84 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 gsitn 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. Separareaprogramului 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
INTELi 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.
AplicaiiPIC16F84 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. PipeliningCiclul 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 pinilorPIC16F84 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
laSurface 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.
CAPITOLUL 3 Set Instruciuni 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 microcontroleruls-l execute. Vom descrie n acest
capitol instruciunile care alctuiesc assembler-ul, sau limbajul de
programare cu nivel sczut pentru microcontrolerele PIC.Setde
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 tergereaunui 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 unuiprogram 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 ntoarcedintr-un
subprogram, constanta definit de operandul din 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 microcontrolerW registru de lucrub poziie bit n
registru fd bit destinaielabel grup de opt caractere ce marcheaz
nceputul unei pri de programTOS 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
automatters*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 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.
ComentariiComentariul 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 a 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 []
Descriere:De fiecare dat cnd apare n program , va fi nlocuit cu
.
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 #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 #include subprog.asm
4.3 CONSTANT D o valoare numeric constant desemnrii textuale
Sintax:Constant =
Descriere:De fiecare dat cnd apare n program, va fi nlocuit cu
.
Exemplu:Constant MAXIMUM=100Constant Length=30
Directive similare: SET, VARIABLE
4.4 VARIABLE D o valoare numeric variabil desemnrii textuale
Sintax:Variable=
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=20variable time=13
Directive similare: SET, CONSTANT
4.5 SET Definirea variabilei asamblorului
Sintax:set
Descriere:Variabilei i este adugat expresia . Directiva SET este
similar lui EQU, dar cu directiva SET numele variabilei poate fi
redefinit urmnd o definiie.
Exemplu:level set 0length set 12level set 45
Directive similare: EQU, VARIABLE
4.6 EQU Definind constanta asamblorului
Sintax: equ
Descriere:To the name of a constant is added value
Exemplu:five equ 5six equ 6seven equ 7
Instruciuni similare: SET
4.7 ORG Definete o adres de unde programul este nmagazinat n
memoria microcontrolerului
Sintax:org
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 0xFFmovwf PORTBend
Instruciuni condiionale
4.9 IF Ramificare de program condiional
Sintax:if
Descriere:Dac condiia n 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=100goto PUNIelsegoto PRAZNIendif
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< 50goto SPEED UPelse goto SLOW DOWNendif
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=100goto LOADSelsegoto UNLOADSendif
Directive similare: ELSE, IF
4.12 WHILE Execuia seciunii programului ct timp condiia este
ndeplinit
Sintax:while.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 NEW PROJECT putei s v denumii proiectul i s-l
memorai ntr-un director pe care-l dorii. n imaginea de mai jos,
este creat un proiect numit 'test.pjt' i memorat n directorul
c:\PIC\PROJEKTS\. Acest director este ales pentru c autorii au ales
acest director n calculatorul lor. n general, un director cu fiiere
este plasat de obicei ntr-un director mai mare a crui nume este
asociat negreit cu coninutul lui.
Deschiderea unui proiect nou
Dup denumirea unui proiect, clic pe OK. O nou fereastr apare n
imaginea umtoare.
Ajustnd elementele proiectului
Fcnd un clic pe "test [.hex]" se activeaz opiunea 'Node
properties' n colul din dreapta jos a ferestrei. Fcnd clic pe ea
obinei urmtoarea fereastr.
Definind parametrii asamblorului MPASM
Din aceast imagine observm c sunt diferii parametri. Fiecare fel
corespunde la un parametru n "Command line". Pentru c memorarea
acestor parametri este foarte necomfortabil, chiar interzis pentru
nceptori, s-a introdus ajustarea grafic. Din imagine observm ce
opiuni trebuie deschise. Fcnd clic pe OK ne ntoarcem la fereastra
anterioar unde "Add node" este o opiune activ. Fcnd clic pe ea
obinem urmtoarea fereastr unde ne denumim programul asamblor. S-l
denumim"Test.asm" pentru c acesta este primul nostru program n
MPLAB.
Deschiznd un proiect nou
Fcnd clic pe OK ne ntoarcem la fereastra de nceput unde observm
adugat un fiier asamblor.
Fiier asamblor adugat
Fcnd clic pe OK ne ntoarcem la mediul de dezvoltare MPLAB.
5.5 Conceperea unui nou fiier asamblor(scrierea un program
nou)
Cnd partea "proiect" a lucrului este terminat, trebuie s ncepem
s scriem un program. Cu alte cuvinte, un nou fiier trebuie deschis,
i se va denumi "test.asm". n cazul nostru, fiierul trebuie denumit
"test.asm" pentru c n proiecte ce au doar un fiier ( ca al nostru),
numele proiectului i numele fiierului surs trebuie s fie aceleai.
Un nou fiier este deschis fcnd clic pe FILE>NEW. Astfel obinem o
fereastr text n interiorul spaiului de lucru MPLAB.
Fiier nou asamblor deschis
Fereastra nou reprezint un fiier unde va fi scris programul.
Pentru c fiierul nostru trebuie denumit "test.asm", l vom denumi
aa. Denumirea se face (ca la toate programele Windows) prin clic pe
FILE>SAVE AS. Obinem apoi o fereastr ca imaginea urmtoare.
Denumirea i salvarea unui fiier asamblor nou
Cnd obinem aceast fereastr, trebuie s scrierm'test.asm' mai jos
de 'File name:', i facem clic pe OK. Dup aceea, vom observa numele
fiierului 'test.asm' n partea de sus a ferestrei noastre.5.6
Scrierea unui program
Numai dup ce toate operaiile precedente au fost terminate suntem
capabili s ncepem s scriem un program. Pentru c un program simplu a
fost deja scris n seciunea crii "Programare n Limbaj de Asamblare",
vom folosi acelai program aici, de asemenea.
Programul trebuie s fie scris ntr-o fereastr care este deschis,
sau copiat de pe un disc, sau luat din prezentarea Mikroelektronika
Internet folosind opiunile copy i paste. Cnd programul este copiat
n "test.asm" window, putem folosi comanda PROJECT -> BUILD ALL
(dac nu sunt erori), i o nou fereastr va apare ca n imaginea
urmtoare.
Fereastr cu mesaje dup translarea programului asamblor
Putem vedea din imagine c obinem fiierul "test.hex" ca rezultat
al procesului de translare, pentru care este folosit programul
MPASMWIN, i c este doar un mesaj. n toate aceste informaii, ultima
propoziie n fereastr este cea mai important pentru c arat dac
translarea a fost sau nu fcut cu succes. 'Build completed
successfully' este un mesaj afirmnd c translarea a fost de succces
i c nu sunt alt erori. n caz c apare o eroare, trebuie s facem
dublu clic pe mesajul eroare n fereastra 'Build Results'. Aceasta v
va transfera automat n programul asamblor i n linia unde a fost
eroarea.
5.7 Simulatorul MPSIM
Simulatorul este o parte a mediului MPLAB care d o mai bun
imagine a lucrrilor unui microcontroler. Printr-un simulator, putem
monitoriza valorile curente ale variabilelor, valorile registrului
i starea pinilor portului. Este adevrat, simulatorul nu are aceeai
valoare n toate programele. Dac un program este simplu ( ca cel dat
aici ca exemplu), simularea nu este foarte important pentru c
setarea pinilor portului B la unu logic nu este o sarcin dificil.
Totui, simulatorul poate fi de mare de mare ajutor la programele
mai complicate ce includ timer-i, condiii diferite unde ceva se
ntmpl , i alte cerine similare (n special cu operaii matematice).
Simularea, dup cum indic numele " simuleaz lucrul unui
microcontroler". n timp ce simulatorul este conceput ca
microcontrolerul s execute instruciunile una cte una, programatorul
se mic ntr-un program pas-cu-pas (linie-cu-linie) i urmrete ce se
ntmpl cu datele n microcontroler. Cnd scrierea s-a terminat, este
un obicei bun ca programatorul s-i verifice mai nti programul su n
simulator, i apoi s-l ruleze ntr-o situaie real. Din nefericire, a
cum se ntmpl cu multe alte obiceiuri bune, acesta este mai puin sau
mai mult luat n seam. Motivele pentru aceasta sunt n parte
personalitatea, i n parte lipsa unor simulatoare bune. Primul lucru
pe care trebuie s-l facem este, ca ntr-o situaie real, este de a
reseta un microcontroler cu comanda DEBUG > RUN > RESET.
Aceast comand rezult n linia ngroat poziionat la nceputul unui
program, i contorul programului este poziionat la zero ceea ce
poate fi observat n linia de stare (pc: 0x00).
nceperea simulrii programului, resetarea microcontrolerului
Una din principalele caracteristici a simulatorului este
abilitatea de a vedea starea regitrilor din microcontroler. Aceti
regitri sunt numii regitri de funcie special, sau SFR. Putem obine
o fereastr cu regitri SFR fcnd clic pe WINDOW->SPECIAL FUNCTION
REGISTERS, sau pe icon-ul SFR. nafar de regitrii SFR, este util de
a avea o avea o privire n interiorul fiierului regitrilor.
Fereastra cu fiierul regitrilor poate fi deschis fcnd clic pe
WINDOW->FILE REGISTERS. Dac sunt variabile n program, este bine
de a le vedea de asemenea. Fiecrei variabile i este desemnat o
fereastr (Watch Windows) fcnd clic pe WINDOW->WATCH WINDOWS.
Simulator cu ferestre deschise pentru regitri SFR, fiierul
regitrilor i variabile.
Comanda urmtoare ntr-un simulator este DEBUG>RUN>STEP care
ncepe paii notri prin program. Aceeai comand ar fi putut fi
desemnat de la o tastatur cu tasta (n general, toate comenzile
importante au taste desemnate de le claviatur). Folosind tasta F7,
programul este executat pas cu pas. Cnd obinem un macro, fiierul
coninnd un macro este deschis (Bank.inc), i continum cu macro.
ntr-o fereastr cu regitri SFR putem observa cum registrul W primete
valoarea 0xFF i pe care o trimite la portul B. Fcnd clic pe tasta
F7 din nou, nu obinem nimic pentru c programul a ajuns ntr-o
"infinite loop"-bucl infinit. Bucla infinit este un termen pe care
l ntlnim adesea. Reprezint bucla din care un microcontroler nu
poate iei pn nu se ntmpl ntreruperea (dac este folosit ntr-un
program), sau pn ce micorcontrolerul va fi resetat.5.8 Toolbar
Pentru c MPLAB are mai mult de o component, fiecare component
are bara sa de instrumente, toolbar-ul su. Totui, este un toolbar
care este un fel de compilaie a tuturor toolbar-ilor, i poate servi
ca un toolbar folosit n mod uzual. Acest toolbar este de ajuns
pentru nevoile noastre, i va fi descris n detaliu. n figura de mai
jos putem vedea un toolbar pentru care avem nevoie de o scurt
explicaie pentru fiecare icon. Din cauza formatului limitat a
cestei cri, acest toolbar este reprezentat ca un toolbar suspendat.
n general, este plasat orizontal mai jos de menu, de-a lungul
ntregului ecran.
Toolbar universal cu scurte explicaii ale icon urilor
Descriere a icon-urilor toolbar-ului Dac toolbar-ul curent nu
rspunde datorit diferitor motive la un clic pe acest icon, apare
urmtorul. Schimbarea total este repetat aa nct la al patrulea clic
vom obine acelai toolbar.
Icon pentru deschiderea unui proiect. Proiectul deschis n acest
fel conine toate ajustrile ecranului i ajustarea tuturor
elementelor care sunt cruciale pentru proiectul curent.
Icon pentru salvarea unui proiect. Proiectul salvat va pstra
toate ajustrile ferestrei i toate ajustrile parametrilor. Cnd citim
un program din nou, totul se va ntoarce pe ecran ca atunci cnd s-a
nchis proiectul.
Cutarea unei pri de program, sau cuvinte este operaia de care
avem nevoie cnd cutm printr-un asamblor mare sau alte programe.
Folosindu-l, putem gsi repede o parte a programului, label, macro,
etc.
Tind o parte a textului. Acesta i urmtoarele trei icon-uri sunt
standard n toate programele care au de a face cu procesarea
fiierelor textuale. Pentru c fiecare program este de fapt un fiier
text obinuit, aceste operaii sunt folositoare.
Copiind o parte a textului. Este o diferen ntre acesta i iconul
precedent.Cu operaia de tiere, cnd tiai o parte a textului, dispare
din ecran (i din program) i este copiat dup aceea. Dar cu operaia
copy, textul este copiat i nu tiat, i rmne pe ecran.
Cnd o parte a textului este copiat, este mutat ntr-o parte a
memoriei ce servete pentru transferarea datelor n sistemul
operaional Windows. Mai trziu, fcnd clic pe acest icon poate fi
lipit-'pasted' n textul unde este cursorul.
Salvnd un program (fiier asamblor).
Starteaz execuia programului la vitez maxim.Se recunoate prin
apariia unei linii de stare galbene. Cu acest fel de execuie de
program, simulatorul execut un program la vitez maxim pn ce este
ntrerupt de un clic pe iconul cu lumin roie de trafic.
Oprete execuia programului la vitez maxim. Dup clic pe acest
icon, linia de stare devine gri din nou, i execuia programului
poate continua pas cu pas.
Pas cu pas execuia programului. Fcnd clic pe acest icon, ncepem
executarea unei instruciuni din linia urmtoare n legtur cu cea
curent.
Cerere de a sri-skip. Pentru c simulatorul este totui o simulare
de software de lucru real, este posibil de a sri pur i simplu peste
unele cereri ale programului. Aceasta este n special la ndemn cu
instruciuni ce ateapt o anumit cerere dup care programul poate s
continue. Acea parte a programului ce urmeaz unei cerei este partea
ce este interesant pentru un programator.
Resetnd un microcontroler. Fcnd clic pe acest icon, contorul
programului este poziionat la nceputul programului i simularea
poate ncepe.
Fcnd clic pe acest icon obinem o fereastr cu un program, dar de
aceast dat ca memorie de program unde putem veea ce instruciune
este gsit i la ce adres.
Cu ajutorul acestui icon obinem o fereastr cu coninutul memoriei
RAM a microcontrolerului.
Fcnd clic pe acest icon, apare fereastra cu registrul SFR.
Pentru c regitrii SFR sunt folosii n fiecare program, este
recomandat ca n simulator aceast fereastr s fie totdeauna
activ.
Dac un program conine variabile ale cror valoare trebuie s le
urmrim (ex. contorul), o fereastr are nevoie s fie adgat pentru
fiecare din ele, ceea ce se face prin folosirea acestui icon.
Cnd unele erori ntr-un program sunt evideniate n timpul
procesului de simulare, programul trebuie corectat. Pentru c
simulatorul folosete fiier HEX ca intrare a sa, trebuie s translm
un program din nou aa ca toate schimbrile s fie transferate ntr-un
simulator. Fcnd clic pe acest icon, ntregul proiect este translat
din nou, i obinem versiunea mai nou a fiierului HEX pentru
simulator.
CAPITOLUL 6
Mostrele
Introducere
Exemplele oferite n aceast capitol v vor arta cum s conectai
microcontrolerul PIC cu alte componente sau dispozitive periferice
cnd producei propriul sistem bazat pe microcontroler. Fiecare
exemplu conine descriere detaliat a prii hardware cu schema
electric i comentarii despre program. Toate programele pot fi luate
direct din prezentarea de pe internet MikroElektronika.
Alimentarea microcontrolerului
n general, alimentarea corect este de o importan maxim pentru
funcionarea corect a sistemului cu microcontroler. Poate fi uor
comparat cu respiraia unui om n aer. Este mai probabil ca un om
care respir n aer curat va tri mai mult dect un om care locuiete
ntrun mediu poluat. Pentru o funcionare corect a oricrui
microcontroler, este necesar s oferim o surs stabil de alimentare,
un reset sigur n momentul n care l pornii i un oscilator. Conform
specificaiilor tehnice oferite de productorul microcontrolerului
PIC, tensiunea de alimentare ar trebui s se ncadreze ntre 2.0V i
6.0V pentru toate versiunile. Cea mai simpl soluie este folosirea
stabilizatorului de tensiune LM7805 care ofer tensiune stabil de
+5V la ieire. O astfel de surs este ilustrat n figura de mai
jos.
Pentru a funciona corect sau pentru a avea o tensiune stabilizat
la 5V la ieire (pinul 3), tensiunea de intrare pe pinul 1 la LM7805
ar trebui s fie ntre 7V i 24V. n funcie de curentul consumat de
montaj vom folosi tipul corespunztor de stabilizator de tensiune
LM7805. Sunt diferite versiuni de LM7805. Pentru consum de curent
de pn la un 1A ar trebui s folosim versiunea n capsul TO-220 cu
posibilitatea de rcire adiional. Dac consumul total este de 50mA,
putem s folosim 78L05 (versiune de stabilizator n capsul mic TO-92
pentru curent de pn la 100mA).
Macrouri folosite n programe
Exemplele din seciunile urmtoare ale acestui capitol utilizeaz
deseori WAIT, WAITx i PRINT, de aceea ele vor fi explicate n
detaliu.
Macrourile WAIT, WAITx
Fiierul Wait.inc conine dou macrouri: WAIT i WAITx. Prin
intermediul acestor macrouri este posibil s repartizm ntrzieri de
timp n intervale variate. Amndou macrouri folosesc depirea
contorului TMR0 ca un interval de timp de baz. Prin schimbarea
prescaler-ului putem schimba lungimea intervalului depirii
contorului TMR0.
Dac folosim un oscilator (rezonator) de 4MHz, pentru valorile
prescaler-ului 0,1 i 7 care divid ceasul de baz al oscilatorului,
intervalul urmat de o depire a contorului TMR0 va fi 0.512, 1.02 i
65.3ms. Practic, aceasta nseamn c cea mai mare ntrziere va fi
256x65.3ms care este egal cu 16.72 secunde.
Pentru a utiliza macrouri n programul principal este necesar s
declarm variabilele wcycle i prescWAIT dup cum vom vedea n
exemplele ce vor urma acestui capitol. Macroul WAIT are un singur
argument. Valoarea standard atribuit prescaler-ului acestui macro
este 1 (1.02ms), i nu poate fi schimbat. WAIT timeconst_1
timeconst_1 este un numr de la 0 la 255. Prin multiplicarea
acestui numr cu perioada de timp de depire (overflow) vom obine
durata total a ntrzierii: TIME = timeconst_1 x 1.02ms. Exemplu:
WAIT .100
Exemplul arat cum s obinem o ntrziere de 100x1.02ms, sau durata
total de 102ms. Spre deosebire de macroul WAIT, macroul WAITX mai
are un argument care poate atribui o valoare prescaler-ului.
Macroul WAITX are dou argumente:
timeconst_2 este un numr de la 0 la 255. Prin multiplicarea
acestui numr cu perioada de timp de depire (overflow) vom obine
durata total a ntrzierii: TIME = timeconst_1 x 1.02ms x PRESCext.
PRESCext este un numr de la 0 la 7 care seteaz relaia dintre tact i
timer-ul TMR0. Exemplu: WAITX .100,7 Exemplul arat cum s obinem o
ntrziere de 100x65.3ms, sau durata total de 653ms. Macroul
PRINT
Macroul PRINT este localizat n fiierul Print.inc. El uureaz
lucrul pentru trimiterea unui ir de date la unul dintre
dispozitivele de ieire, cum ar fi: LCD, RS232, imprimant
matricial...etc. Cea mai uoar cale pentru a forma o serie este prin
folosirea unei directive dt (define table). Aceast instruciune
memoreaz o serie de date n cadrul memoriei programului ca un grup
de instruciuni retlw al crui operand este data din ir.
Modalitatea prin care o astfel de secven este format folosind
instruciunea dt este artat n urmtorul exemplu:
org 0x00goto Main String movwf PCLString1 dt "acesta este un sir
ASCII"String2 dt "al doilea sir"EndMain movlw .5call String: Prima
instruciune dup eticheta Main scrie poziia unui membru al irului n
registrul W. Executm un salt cu instruciunea call la eticheta
irului unde poziia membrului irului este adunat la valoarea PC
(Program Counter): PCL = PCL + W. n continuare avem n program
counter o adres a instruciunii retlw cu membrul dorit al irului. n
momentul n care aceast instruciune este executat, membrul irului va
fi n registrul W, i adresa instruciunii care va fi executat dup
instruciunea call va fi n program counter. Eticheta end este o
metod elegant de a marca adresa la care irul se termin. Macroul
PRINT are cinci argumente: PRINT macro Addr, Start, End, Var, Out
Addr este o adres unde unul sau mai multe iruri (situate unul dup
altul) ncep.Start este o adres a primului membru al irului.End este
o adres unde irul se termin.Var este variabila care are rolul de a
arta (pointa) membrii irului.Out este un argument pe care l folosim
pentru a trimite adresa rutinelor existente atribuite
dispozitivelor de ieire cum ar fi: LCD, RS-232, etc.
Macroul PRINT scrie la ieire un ir mikroElektronika format din
caractere ASCII la un dispozitiv de afiare LCD. irul takes one part
of program memory ncepnd cu adresa 0x03.
Example
Light Emitting Diodes LEDuri Ledurile sunt unele dintre cele mai
folosite elemente n electronic. LED este o abreviere pentru Light
Emitting Diode. n momentul n care alegem un led, sunt mai muli
parametri de care trebuie s inem seama: diametrul, care este
deobicei 3 sau 5mm (milimetri), curentul de funcionare care este n
jur de 10mA (poate fi mai mic dect 2mA pentru ledurile cu randament
maxim: emisie de lumin puternic) i bineneles culoarea, care poate
fi roie sau verde dei mai sunt leduri portocalii, albastre,
galbene... . Ledurile trebuie conectate corect pentru a emite lumin
i rezistena care limiteaz curentul trebuie s fie de o valoare
corect pentru ca ledul s nu se ard (supranclzire). Tensiunea
pozitiv de alimentare este legat la ANOD, iar catodul este legat la
tensiunea negativ sau la masa circuitului. Pentru a identifica
fiecare pin, catodul este cel mai scurt pin iar corpul are n
general o teitur pe partea catodului. Diodele vor emite lumin numai
dac curentul circul de la ANOD spre CATOD. Altfel jonctiunea PN
este polarizat invers i curentul nu va circula. Pentru a conecta
corect un led trebuie adugat o rezisten n serie pentru a limita de
curentul prin diod, pentru ca aceasta s nu se ard. Valoarea
rezistenei este determinat de curentul care vrei s circule prin
led. Curentul maxim care poate curge printr-un led a fost stabilit
de productor. Ledurile cu randament maxim pot produce rezultate
bune cu un curent mai mic de de 2mA.
Pentru a determina valoarea rezistenei serie, trebuie s cunoatem
valoarea tensiunii de alimentare. De aici scdem tensiunea care cade
pe led. Aceast valoare va varia de la 1,2v la 1,6v, depinznd de
culoarea ledului. Rspunsul este valoarea lui Ur. Folosind aceast
valoare i curentul care vrem s circule prin LED (ntre 0.002A i
0.01A) putem s aflm valoarea rezistenei cu ajutorul formulei: R=UR
/ I.
Ledurile sunt conectate la microcontroler n dou metode. Una este
s le activm cu zero logic i a doua este s le activm cu unu logic.
Prima metod este numit logic NEGATIV iar cea de-a doua este numit
logic POZITIV. Figura de mai sus ilustreaz modalitatea de conectare
prin logic POZITIV. Deoarece logica POZITIV ofer o tensiune de +5v
diodei i rezistenei serie, ledul va emite lumin de fiecare dat cnd
un pin al portului B este n starea 1 logic (1 = ieire HIGH). Logica
NEGATIV necesit ca ledul s fie ntors i terminalele de tip anod s
fie conectate mpreun la borna pozitiv a sursei. n momentul n care
este livrat o ieire LOW de la microcontroler ctre anod i rezisten,
ledul va lumina.
Connecting LED diodes to PORTB microcontroller
Exemplul urmtor initializeaz portul B ca port de ieire i seteaz
unu logic pe fiecare pin al portului B pentru a activa toate
ledurile.
Tastatura Tastaturile sunt dispozitive mecanice utilizate pentru
a executa o ntrerupere sau pentru a realiza o conexiune ntre dou
puncte. Ele au diferite mrimi i au diferite scopuri. Tastele care
sunt utilizate aici sunt denumite taste dip. Ele sunt lipite direct
pe o plac de circuit i sunt deseori ntlnite n electronic. Au patru
pini (doi pentru fiecare contact), ceea ce le ofer stabilitate
mecanic.
Exemplu pentru conectarea tastelor la pinii microcontrolerului
Funcia tastei este simpl. n momentul n care apsm o tast, dou
contacte sunt unite i se realizeaz o conexiune. Totui, nu toate
lucrurile sunt simple. Problema const n natura tensiunii ca
valoare, i n imperfeciunea contactelor mecanice. nainte ca un
contact s fie realizat sau decuplat, exist o perioad scurt de timp
cnd pot aprea vibraii (oscilaii) ca rezultat al imperfeciunii
contactelor mecanice, sau din cauza vitezei diferite de apsare
(acest lucru depinde de persoana care apas tasta). Termenul
atribuit acestui fenomen este denumit switch (contact) debounce.
Dac acest lucru nu este prevzut n momentul n care un program este
conceput, poate aprea o eroare sau programul poate produce mai mult
dect un singur impuls la ieire pentru o singur apsare de tast.
Pentru a evita acest lucru, putem introduce o mic ntrziere cnd
detectm nchiderea unui contact. Aceasta va asigura faptul c apsarea
unei taste este interpretat ca un singur impuls. ntrzierea de
debounce este produs n software i durata ntrzierii depinde de buton
i de scopul butonului. Problema poate fi parial rezolvat prin
adugarea unui condensator n paralel la tast, dar un program bine
realizat ofer rezultate mai bune. Programul poate fi ajustat pn cnd
detecia fals este complet eliminat. n anumite cazuri o simpl
ntrziere poate fi suficient dar dac vrei ca programul s se ocupe de
mai multe lucruri n acelai timp, o simpl ntrziere va nsemna c
procesorul nu va face nimic pe o lung perioad de timp i poate rata
alte intrri sau poate decupla portul de ieire ctre un afior. Soluia
este s avem un program care s urmreasc apsarea unei taste ct i
decuplarea unei taste. Macroul de mai jos poate fi folosit pentru
keypress debounce.
Macroul precedent are mai multe argumente care trebuiesc
explicate: BUTTON macro HiLo, Port, Bit, Delay, Address HiLo poate
fi 0 sau 1 care reprezint frontul cresctor sau cztor unde
subrutinele pot fi executate n momentul n care apsai o tast.
Port este un port al microcontrolerului la care trebuie conectat
tasta. n cazul microcontrolerului PIC16F84, el poate fi PORT A sau
PORT B.
Bit este un pin al portului la care tasta este conectat.
Delay este un numr de la 0 la 255, folosit pentru a atribui
timpul necesar pentru a detecta key debounce contact oscillation to
stop. El este calculat astfel: TIME = Delay x 1ms.
Adress este adresa la care microcontrolerul se duce dup ce este
detectat un eveniment provenit de la tastatur. Subrutina de la
aceast adres execut instruciunile necesare pentru apsarea unei
taste. Exemplu 1 BUTTON 0, PORTA, 3, .100, Tester1_above Tasta-1
este conectat la RA0 (prima ieire a portului A) cu o ntrziere de
100 milisecunde i cu o reacie la zero logic. Subrutina care
proceseaz tasta este localizat la adresa etichetei Tester1_above.
Exemplu 2 BUTTON 1, PORTA, 2, .200, Tester1_below Tasta-2 este
conectat la RA1 (a doua ieire a portului A) cu 200ms ntrziere i cu
reacie la unu logic. Exemplul urmtor arat modul de folosire ntr-un
program. BUTTON.ASM aprinde i stinge LEDul. LEDul este conectat la
cea de-a aptea ieire a portului B. Tasta-1 este folosit pentru a
aprinde LEDul. Tasta-2 stinge LEDul.
Optocuplor
Optocuplorul combin un LED i un fototranzistor n aceeai capsul.
Rolul unui optocuplor este acela de a separa dou pri de circuit.
Aceasta este realizat pentru un numr de motive: Interferena. O
parte a unui circuit poate fi ntr-o zon unde este influenat de
interferene (cum ar fi cele de la motoarele electrice, echipamente
de sudur, motoare termice etc.). Dac ieirea acestui circuit trece
printr-un optocuplor spre alt circuit, numai semnalele dorite vor
trece prin optocuplor. Semnalele de interferen nu vor avea destul
putere s activeze LEDul din optocuplor i de aceea ele sunt
eliminate. Exemplele tipice sunt unitile industriale care au mai
multe interferene care afecteaz semnalele pe cablu. Dac aceste
interferene afecteaz funcia unei seciuni de control, vor apare
erori i unitatea nu va mai funciona. Separare simultan i
intensitatea semnalului. Un semnal mai mic de 3v este capabil s
activeze un optocuplor i ieirea optocuplorului poate fi conectat la
o linie de intrare a microcontrolerului. Microcontrolerul are
nevoie de un impuls de intrare de 5v i n acest caz semnalul de 3v
este amplificat la 5v. Poate fi folosit pentru a amplifica curentul
semnalului. Uitai-v mai jos pentru utilizarea unei linii de ieire a
microcontrolerului pentru amplificare de curent. Separare de
tensiune mare. Optocuploarele au caliti nnscute pentru separarea
tensiunilor mari. Deoarece LEDul este complet separat de
fototranzistor, optocuploarele pot da dovad de izolare de tensiune
de 3Kv sau chiar mai mare. Optocuploarele pot fi folosite ca
dispozitive de intrare sau ieire. Ele au funcii adiionale cum ar fi
Schmitt triggering (ieirea unui Schmitt trigger este 0 sau 1 se
schimb ncet ridicnd i cobornd forma de und n valori definite LOW
sau HIGH). Optocuploarele sunt mpachetate ca o singur unitate sau n
grupuri de dou sau mai multe ntr-o singur capsul. Ele mai sunt
denumite foto-ntreruptoare n care un disc cu fante este introdus
ntr-un lca ntre LED i fototranzistor i de fiecare dat cnd lumina
este ntrerupt, tranzistorul produce un impuls. Fiecare optocuplor
are nevoie de dou alimentri pentru a funciona. Ele pot fi folosite
cu o alimentare, dar capacitatea de izolare a tensiunii este
pierdut.Optocuplor pe o linie de intrare
Modul de funcionare este simplu: cnd ajunge un semnal, LEDul din
optocuplor este aprins i lumineaz pe baza fototranzistorului din
aceeai carcas. n momentul n care tranzistorul este activat,
tensiunea dintre colector i emitor cade la 0.5v sau mai puin i
microcontrolerul sesizeaz acest lucru ca zero logic pe pinul RA4.
Exemplul de mai jos este un contor, folosit pentru numrarea
produselor de pe o linie de producie, pentru determinarea vitezei
motorului, pentru contorizarea numrului de revoluii a unei axe etc.
Considerm senzorul ca un microntreruptor. De fiecare dat cnd
ntreruptorul este nchis, LEDul este luminat. LEDul transfer
semnalul ctre fototranzistor i operaia fototranzistorului livreaz
LOW ctre intrarea RA4 a microcontrolerului. Un program n
microcontroler va fi necesar pentru a preveni contorizrile false i
un indicator conectat la oricare dintre ieirile microcontrolerului
va indica starea curent a contorului.
Exemplu de linie de intrare cu optocuplor
Optocuplor pe o linie de ieire
Un optocuplor poate fi folosit pentru a separa semnalul de ieire
a unui microcontroler fa de un dispozitiv de ieire. Acest lucru
poate fi necesar pentru separarea tensiunilor nalte sau pentru
amplificare. Ieirea unor anumite microcontrolere este limitat la
25mA. Optocuplorul va lua semnal de curent sczut din microcontroler
i tranzistorul de ieire va comanda un LED sau un releu, cum este
exemplificat mai jos:
Output line optocoupler example Programul pentru acest exemplu
este simplu. Prin livrarea unui 1 logic n pinul 4 al portului A,
LEDul se va aprinde i tranzistorul va fi activat n optocuplor.
Orice dispozitiv conectat la ieirea optocuplorului va fi activat.
Curentul limit pentru tranzistor este n jur de 250mA. Releul
Releul este un dispozitiv electromecanic care transform un
semnal electric ntr-o micare mecanic. El este alctuit dintr-o bobin
din conductori izolai nfurai pe un nucleu metalic i o armtur
metalic cu unul sau mai multe contacte. n momentul n care o
tensiune de alimentare este aplicat la bornele unei bobin, curentul
circul i va fi produs un cmp magnetic care mic armtura pentru a
nchide un set de contacte i/sau pentru a deschide un alt set. Cnd
alimentarea este dezactivat din releu, cade fluxul magnetic din
bobin i se produce o tensiune nalt n direcia opus. Aceast tensiune
poate strica tranzistorul de comand i de aceea este conectat o diod
cu polarizare invers de-a lungul bobinei pentru a scurtcircuita
vrfurile de tensiune n momentul n care apar.
Conectarea unui releu la microcontroler prin intermediul unui
tranzistor Multe microcontrolere nu pot comanda un releu direct i
de aceea un tranzistor de comand este necesar. Un HIGH pe baza
tranzistorului activeaz tranzistorul i acesta la rndul lui activeaz
releul. Releul poate fi conectat la orice dispozitiv electric prin
intermediul contactelor. Rezistena de 10K din baza tranzistorului
limiteaz curentul dinspre microcontroler la o valoare solicitat de
tranzistor. Rezistena de 10K dinspre baz i bara negativ previne ca
tensiunile de zgomot aplicate n baza tranzistorului s activeze
releul. De aceea numai un semnal clar de la microcontroler va
activa releul.
Connecting the optocoupler and relay to a microcontroller Un
releu poate fi de altfel activat prin intermediul unui optocuplor
care n aceli timp amplific curentul provenit de la ieirea
microcontrolerului i ofer un grad nalt de izolare. Optocuploarele
HIGH CURRENT deobicei conin un tranzistor cu o ieire Darlington
pentru a oferi curent mare de ieire. Conectarea prin intermediul
unui optocuplor este recomandat n mod special pentru aplicaiile
microcontroler unde motoarele sunt activate i zgomotulele de
comutaie provenite de la motor pot ajunge n microcontroler prin
intermediul liniilor de alimentare. Optocuplorul comand un releu
iar releul activeaz motorul. Figura de mai jos arat programul
necesar pentru activarea releului i include cteva din macrourile
deja discutate.
Generarea unui sunet Un buzzer piezo poate fi adugat la o linie
de ieire a unui microcontroler pentru a livra tonuri audio,
piuituri i semnale. Este important de tiut c sunt dou mari tipuri
de dispozitive piezoelectrice emitoare de sunet. Una are componente
active nuntrul carcasei i are nevoie numai de alimentare de curent
continuu pentru a emite un ton sau un beep. n general tonurile sau
beep-urile emise de aceste difuzoare sau piuitoare nu pot fi
schimbate ele sunt fixe din cauza circuitelor interne. Acesta nu
este tipul despre care discutm n acest articol. Cellalt tip const
dintr-un buzzer piezo i necesit semnal livrat n ea pentru a
funciona. Depinznd de frecvena formei de und, ieirea poate fi ton,
melodie, alarm sau chiar un mesaj vocal. Pentru ca ele s funcioneze
trebuie s livrm un ciclu care este alctuit din semnale HIGH i LOW.
Tranziia de la HIGH la LOW sau de la LOW la HIGH cauzeaz micri
diafragmei pentru a produce secvene de sunete. Forma de und poate
avea o schimbare fin de la o valoare la alta (denumit und
sinusoidal) sau o schimbare rapid (denumit und dreptunghiular). Un
calculator este ideal pentru producerea de unde dreptunghiulare.
Livrarea de unde dreptunghiulare produce o ieire uor grosier.
Conectarea unui buzzer piezo este foarte uoar. Un pin este conectat
la linia negativ, iar cealalt la o ieire a microcontrolerului, dup
cum este ilustrat n figura de mai jos. Acesta va livra o form de
und de 5v ctre buzzerul piezo. Pentru a produce o tensiune mai
mare, forma de und trebuie amplificat i aceasta necesit un
tranzistor de comand i o bobin.
Conectarea unui buzzer piezo la un microcontrolerCa i n cazul
tastaturii, putei folosi un macro care va furniza o rutin BEEP
ntr-un program cnd va fi necesar. BEEP macro freq, duration freq:
frecvena sunetului. Un numr mai mare produce o frecven mai
nalt.duration: durata sunetului. Un numr mai mare reprezint un
sunet mai lung. Exemplu 1: BEEP 0xFF, 0x02 Ieirea buzzerului piezo
are cea mai nalt frecven i durata de 2 cicluri de 65.3ms, ceea ce
rezult 130.6ms. Exemplu 2: BEEP 0x90, 0x05 Ieirea buzzerului piezo
are frecvena de 0x90 i durata de 5 cicluri de 65.3ms. Este bine ca
argumentele macroului s fie determinate prin experimente i astfel s
fie ales sunetul care se potrivete cel mai bine pentru aplicaie. n
continuare este prezentat macroul BEEP:
Urmtorul exemplu arat ntrebuinarea unui macro ntr-un program.
Programul produce dou melodii care sunt obinute prin apsarea T1 sau
T2. Cteva din macrourile discutate anterior sunt incluse n
program.
Regitrii de deplasare
Exist dou tipuri de regitrii de deplasare: de intrare i de
ieire. Regitrii de intrare ncarc datele paralel, prin intermediul a
8 linii, i apoi le trimite serial prin intermediul a dou linii ctre
microcontroler. Regitrii de ieire opereaz n direcie opus: primesc
date serial i la un semnal pe linia latch, transform datele n date
paralele. Regitrii de deplasare sunt folosii n general pentru a mri
numrul de intrri ieiri ale unui microcontroler. Ei nu prea mai sunt
folosii pentru c microcontrolerele moderne au un numr mare de linii
intrare ieire. Oricum, utilizarea lor cu microcontrolere cum ar fi
PIC16F84 este foarte important.
Regitrii de deplasare de intrare 74HC597
Regitrii de deplasare de intrare transform datele paralele n
date seriale i le transfer ctre microcontroler. Modul lor de
funcionare este simplu. Sunt patru linii pentru transferul datelor:
clock, latch, load i data. Datele sunt citite de la pinii de
intrare de un registru intern prin intermediul unui semnal latch.
Apoi, cu un semnal load, datele sunt transferate de la registrul
latch de intrare ctre registrul de deplasare, iar de acolo sunt
transferate serial ctre un microcontroler prin intermediul liniilor
data i clock.O schem de legtur a registrului de deplasare 74HC597
la un microcontroler este prezentat mai jos:
Modalitatea de conectare a unui registru de deplasare de intrare
la un microcontrolerPentru simplificarea programului principal, un
macro poate fi utilizat pentru registrul de deplasare de intrare.
Macroul HC597 are dou argumente: HC597 macro Var, Var1 Var variabil
unde datele provenite de la pinii registrului de deplasare de
intrare sunt transferate.Var1 contor bucl. Exemplu: HC597 data,
counter Datele provenite de la pinii registrului de deplasare sunt
stocate n variabila data. Variabila Time/counter este folosit pe
post de contor bucl. Textul macroului:
Exemplul care v arat cum s folosii macroul HC597 este n
programul urmtor. Programul recepioneaz date de la intrarea paralel
a registrului de deplasare i le mut serial n variabila RX a
microcontrolerului. LEDurile conectate la portul B vor indica
rezultatul datelor de intrare.
Registru de deplasare de ieire
Regitrii de deplasare de ieire transform datele seriale n date
paralele. Pe fiecare front cresctor al tactului, registrul de
deplasare citete valoarea de la linia de date, o memoreaz ntr-un
registru temporar, apoi repet acest ciclu de 8 ori. La un semnal de
la linia latch, datele sunt copiate din registrul de deplasare n
registrul de intrare, apoi datele sunt transformate din date
seriale n date paralele.
O schem a registrului de deplasare este prezentat mai jos:
Conectarea unui registru de deplasare de ieire la un
microcontrolerMacroul folosit n acest exemplu este localizat n
fisierul HC595.INC i se numete HC595. Macroul HC595 are dou
argumente: Var variabil a crei coninut este transferat la ieirea
registrului de deplasare.Var1 contor bucl. Exemplu: HC595 Data,
Counter Datele pe care vrem s le transferm sunt stocate n variabila
Data, iar variabila Counter este folosit pe post de contor bucl
Un exemplu al utilizrii macroului HC595 este n programul urmtor.
Datele provenite de la variabila TX sunt transferate serial n
registrul de deplasare. LEDurile conectate la ieirea paralel a
registrului de deplasare vor indica starea liniilor. n acest
exemplu valoarea 0xCB (11001011) este transmis astfel nct LEDurile
8, 7, 4, 2 i 1 sunt iluminate.
Afiaj cu 7 segmente (multiplexare)Segmentele ntr-un afiaj cu 7
segmente sunt aranjate astfel nct s formeze un singur digit de la 0
la F, dup cum se observ n desen:
Putem afia un numr pe mai muli digii prin conectarea de afiaje
adiionale. Chiar dac este mult mai confortabil s lucrm cu LCDuri,
afiajele cu 7 segmente sunt nc un standard n industrie. Aceasta din
cauza rezistenei la temperatur, vizibilitii i unghiului larg de
observare. Segmentele sunt marcate cu litere mici: a, b, c, d, e,
f, g i dp, unde dp este punctul zecimal. Cele 8 LEDuri din cadrul
fiecrui afiaj pot fi aranjate cu catod comun sau cu anod comun. La
un afiaj cu catod comun, catodul comun trebuie s fie conectat la
linia de 0v i LEDurile sunt activate cu unu logic. Afiajele cu anod
comun trebuie s prezinte anodul comun conectat la linia de +5v.
Segmentele sunt activate cu zero logic. Dimensiunea afiajului este
msurat n milimetri; se msoar doar nlimea digitului (nu carcasa,
doar digitul!). Afiajele sunt disponibile cu digii de nlimi de 7,
10, 13.5, 20 sau 25 milimetri. Sunt de diferite culori incluznd:
rou, portocaliu i verde. Cea mai simpl metod pentru a comanda un
afiaj este prin intermediul unui driver de afiaj. Acestea sunt
disponibile pentru pn la 4 afiaje. Alternativ, afiajele pot fi
comandate de un microcontroler, i, dac este necesar mai mult dect
un afiaj, metoda de comandare se numete multiplexare. Principala
diferen dintre cele dou metode este numrul de linii de comand. Un
driver special poate avea numai o singur linie de tact i integratul
de comand va accesa toate segmentele i va incrementa afiajul. Dac
avem doar un singur afiaj de comandat de ctre microcontroler, vor
fi necesare 7 linii plus una pentru punctul zecimal. Pentru fiecare
afiaj zecimal, este necesar doar cte o linie n plus. Pentru a
produce un afiaj cu 4, 5 sau 6 digii, toate afiajele cu 7 segmente
vor fi conectate n paralel. Linia comun (linia catodului comun)
este conectat separat i aceast linie este conectat la zero logic
pentru o perioad scurt de timp pentru a activa afiajul. Fiecare
afiaj este activat de 100 ori pe secund i vor da impresia c toate
afiajele sunt active n acelai timp. n timp ce fiecare afiaj este
activat, informaia trebuie livrat astfel nct el va afia informaia
corect. Pot fi accesate pn la 6 afiaje n acest mod fr ca strlucirea
fiecrui afiaj s fie afectat. Fiecare afiaj este activat efectiv
pentru 1/6 din timp i persistena vizual a ochilor d impresia c
afiajul este pornit tot timpul. Toate semnalele de sincronizare
pentru afiaj sunt produse de program, avantajul unui afiaj
controlat de un microcontroler este flexibilitatea. Afiajul poate
fi configurat ca un contor cresctor, contor descresctor, i poate
produce un numr de mesaje folosind literele alfabetului care pot fi
uor de afiat. Exemplul de mai jos arat cum s controlm dou
afiaje.
Conectarea unui microcontroler cu afiaje cu 7 segmente n mod
multiplexatFiierul LED.INC conine dou macrouri: LED_Init i
LED_Disp2. Primul macro este folosit pentru initializarea
afiajului. Aici este definit perioada de remprosptare ct i pinii
microcontrolerului utilizai pentru conectarea afiajelor. Macroul
LED_Disp2 are un argument:LED_Disp2 macro first first este numrul
de la 0 la 99 care trebuie afiat pe digiii MSD i LSD. Exemplu:
LED_Disp2 0x34 Numrul 34 va fi afiat.
Realizarea macroului arat modalitatea de utilizare a macrourilor
ntr-un program. Programul afieaz numrul 21 n 2 digii cu 7
segmente.
Afiaj LCD Multe dispozitive cu microcontroler folosesc LCDuri
inteligente pentru a afia informaia vizual. Urmtorul material se
ocup de conectarea unui afiaj LDC Hitachi la un microcontroler PIC.
Afiajele LCD proiectate cu HD44780, modulul pentru LCD fabricat de
Hitachi, nu sunt scumpe i sunt uor de folosit, i chiar posibil s
produc verificarea datelor afiate folosind cei 8x80 pixeli ai
afiajului. Afiajele LCD Hitachi conin un set de caractere ASCII
plus simboluri japoneze, greceti i matematice.
A 16x2 line Hitachi HD44780 display
Fiecare dintre cei 640 de pixeli ai afiajului trebuie s poat fi
accesat individual i aceasta se poate realiza cu un numr de
integrate SMD pentru control montate pe spatele afiajului. Aceasta
ne salveaz de o cantitate enorm de fire i de un control adecvat
astfel nct sunt necesare doar cteva linii pentru a accesa afiajul.
Putem comunica cu afiajul prin intermediul unui bus de date pe 8
bii sau de 4 biti. Pentru un bus de 8 biti, afiajul are nevoie de o
tensiune de alimentare de +5v i 11 linii I/O. Pentru un bus de 4
bii sunt necesare doar liniile de alimentare i 7 linii. Cnd afiajul
LCD nu este pornit liniile de date sunt TRI-STATE, ceea ce nseamn c
ele sunt n stare de nalt impedan (ca i cum ar fi deconectate) i
astfel nu interfereaz cu funcionabilitatea microcontrolerului cnd
afiajul nu este adresat. LCDul necesit de altfel 3 linii de control
de la microcontroler. Linia Enable (E) permite accesul la afiaj
prin intermediul liniilor R/W i RS. Cnd aceast linie este LOW,
LCDul este dezactivat i ignor semnalele de la R/W i RS. Cnd linia
(E) este HIGH, LCDul verific starea celor dou linii de control i
rspunde corespunztor. Linia Read/Write (R/W) stabilete direcia
datelor dintre LCD i microcontroler. Cnd linia este LOW, datele
sunt scrise n LCD. Cnd este HIGH, datele sunt citite de la LCD. Cu
ajutorul liniei Register select (RS), LCD interpreteaz tipul
datelor de pe liniile de date. Cnd este LOW, o instruciune este
scris n LCD. Cnd este HIGH, un caracter este scris n LCD. Starea
logic a liniilor de control: E 0 Accesul la LCD dezactivat 1
Accesul la LCD activat R/W 0 Scrie date n LCD 1 Citete date din LCD
RS 0 Instruciuni 1 Caracter Scrierea datelor n LCD se realizeaz n
civa pai:se seteaz bitul R/W LOWse seteaz bitul RS n 0 sau 1 logic
(instruciune sau caracter)se trimit datele ctre liniile de date
(dac se execut o scriere)se seteaz linia E HIGHse citesc datele de
la liniile de date (dac se execut o citire)Citirea datelor de la
LCD se realizeaz similar, cu deosebirea c linia de control R/W
trebuie s fie HIGH. Cnd trimitem un HIGH ctre LCD, el se va reseta
i va accepta instruciuni. Instruciunile tipice care sunt transmise
ctre un afiaj LCD dup reset sunt: pornirea afiajului, activarea
cursorului i scrierea caracterelor de la stnga spre dreapta. n
momentul n care un LCD este iniializat, el este pregtit sa primeasc
date sau instruciuni. Dac recepioneaz un caracter, el l va afia i
va muta cursorul un spaiu la dreapta. Cursorul marcheaz locaia
urmtoare unde un caracter va fi afiat. Cnd dorim s scriem un ir de
caractere, mai nti trebuie s setm adresa de start, i apoi s
trimitem cte un caracter pe rnd. Caracterele care pot fi afiate pe
ecran sunt memorate n memoria video DD RAM (Data Display RAM).
Capacitatea memoriei DD RAM este de 80 bytes.Afiajul LCD mai conine
64 bytes CG RAM ( Character Generator RAM). Aceast memorie este
rezervat pentru caracterele definite de utilizator. Datele din CG
RAM sunt reprezentate sub form de caractere bitmap de 8 biti.
Fiecare caracter ocup maxim 8 bytes n CG RAM, astfel numrul total
de caractere pe care un utilizator poate s le defineasc este 8.
Pentru a afia caracterul bitmap pe LCD, trebuie setat adresa CG RAM
la punctul de start (de obicei 0) i apoi s fie scrise datele n
afiaj. Definirea unui caracter special este exemplificat n
figur.
nainte de a accesa DD RAM, dup definirea unui caracter special,
programul trebuie s seteze adresa n DD RAM. Orice scriere i citire
a datelor din memoria LCD este realizat de la ultima adres care a
fost setat, folosind instruciunea set-adress. Odat ce adresa DD RAM
este setat, un caracter nou va fi afiat n locul potrivit pe ecran.
Pn acum am discutat operaia de scriere i citire a memoriei unui LCD
ca i cum ar fi o memorie obinuit. Acest lucru nu este adevrat.
Controlerul LCD are nevoie de 40 pn la 120 microsecunde (us) pentru
scriere i citire. Alte operaii pot dura pn la 5 ms. n acest timp
microcontrolerul nu poate accesa LCDul, astfel un program trebuie s
tie cnd un LCD este ocupat. Putem rezolva aceasta n dou metode.
O metod este verificarea bitului BUSY de pe linia de date D7.
Aceasta nu este cea mai bun metod pentru c LCDul se poate bloca i
programul va sta ntr-o bucl infinit verificnd bitul BUSY. O alt
metod este introducerea unei ntrzieri n program. ntrzierea trebuie
s fie destul de lung pentru ca LCDul s termine operaia n desfurare.
Instruciunile pentru scriere i citire cu memoria LCDului sunt
afiate mai sus. La nceput am menionat c avem nevoie de 11 linii I/O
pentru a comunica cu un LCD. Oricum, putem comunica cu u