Explorați Cărți electronice
Categorii
Explorați Cărți audio
Categorii
Explorați Reviste
Categorii
Explorați Documente
Categorii
Introducere n Microcontrolere
Introducere
Istorie
Microcontrolere contra microprocesoare
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!
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.
Unitatea serial folosit pentru a trimite date, dar numai prin trei linii
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.
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.
CISC, RISC
Aplicaii
Clock-ul/instruciune
Pipelining
Semnificaia pinilor
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.
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.
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.
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.
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 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.
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.
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.
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 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
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.
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.
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.
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.
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
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.
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>).
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.
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.
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 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
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
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 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
Exemplu unei pri a programului ce scrie datele 0xEE n prima locaie n memoria
EEPROM ar putea arta ca mai jos:
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
ndeplineasc o sarcin, trebuie s-i spunem exact ce s fac, sau cu alte cuvinte
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
Aritmetic i logic
Din toate operaiile aritmetice, PIC ca majoritatea microcontrolerelor, accept doar
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
Unitatea logic a PIC-ului are capabilitatea de a face operaiile AND (I), OR (SAU),
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
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.
start a tabelului nostru, gsit n registrul PCL, i astfel obinem adresa datelor reale
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.
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
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
Limbaj de Asamblare
Elementele de baz ale limbajului de asamblare sunt:
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.
_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".
Directive de control
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
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"
Descriere:
De fiecare dat cnd apare <name> n program, va fi nlocuit cu <value>.
Exemplu:
Constant MAXIMUM=100
Constant Length=30
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
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
Descriere:
To the name of a constant <name_constant> is added value <value>
Exemplu:
five equ 5
six equ 6
seven equ 7
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
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
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
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
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
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
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
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 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
Descriere:
Directiva este folosit la sfritul definiiei unui bloc de constante ca translatorul de
asamblare s tie c nu mai sunt constante.
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
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
Descriere:
Directiva genereaz seria RETLW de instruciuni, o instruciune de fiecare termen.
Exemplu:
dt "Message", 0
dt first, second, third
Configurnd o directiv
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
Descriere:
Instruciunea seteaz tipul microcontrolerului unde programarea este fcut.
Exemplu:
processor 16F84
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:
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".