|
Microcontroler - Organizarea memoriei
PIC16F84 are
doua blocuri separate de memorie, unul pentru date si celalalt
pentru programe. Memoria EEPROM si registrii GPR in memoria RAM
constituie un bloc, si memoria FLASH constituie un bloc de
programe.
Memoria program
Memoria program a fost realizata in tehnologia FLASH ceea ce face posibil
de a programa un microcontroler de mai multe ori inainte de a fi instalat
intr-un montaj, si chiar dupa instalarea sa daca se
intampla unele schimbari in program sau parametri de proces.
Marimea memoriei program este de 1024 locatii cu latime de
14 biti unde locatiile zero si patru sunt rezervate pentru reset
si pentru vectorul intrerupere.
Memoria de date
Memoria de date consta din memoriile EEPROM si RAM. Memoria EEPROM
consta din 64 de locatii de opt biti a caror continut
nu este pierdut in timpul opririi sursei de alimentare. EEPROM-ul nu este
direct adresabil, dar este accesat indirect prin registrii EEADR si
EEDATA. Pentru ca memoria EEPROM este folosita curent la memorarea
unor parametri importanti (de exemplu, o temperatura data in
regulatoarele de temperatura), exista o procedura stricta
de scriere in EEPROM ce trebuie urmata pentru a preveni scrierea
accidentala. Memoria RAM pentru date ocupa un spatiu intr-o
harta a memoriei de la locatia 0x0C la 0x4F ceea ce inseamna 68
de locatii. Locatiile memoriei RAM sunt de asemenea denumite
registri GPR care este o abreviere General Purpose Registers-Registri
cu Scop General. Registrii GPR pot fi accesati indiferent de ce banc
este selectat la un moment.
Registri SFR
Registri ce ocupa primele 12 locatii in bancurile 0 si 1
si sunt registri ai functiei specializate asignata cu unele
blocuri ale microcontrolerului. Acestia sunt numiti Special Function
Registers-Registri ai Functiei Speciale.
Bancuri de Memorie
In afara de aceasta diviziune in 'lungime' a registrilor SFR
si GPR, harta memoriei este de asemenea impartita in
'latime' (vezi harta precedenta) in doua zone numite
'bancuri'. Selectarea unuia din bancuri se face de bitii RPO si RP1
in registrul STATUS-stare.
Exemplu:
bcf STATUS, RP0
Instructiunea BCF sterge bitul RPO (RP0=0) in registrul STATUS
si astfel seteaza bancul 0.
bsf STATUS, RP0
Instructiunea BSF seteaza bitul RPO (RP0=1) in registrul STATUS
si astfel seteaza bancul 1.
Uzual, grupurile de instructiuni care sunt adesea in uz, sunt conectate intr-o singura unitate ce poate fi usor apelata intr-un program, si a carei nume are o semnificatie clara, asa-numitul Macros-macrocomanda. Cu ajutorul lor, selectia dintre doua bancuri devine mai clara si programul mult mai elegibil.
BANK0 macro
Bcf STATUS, RP0;Select memory bank 0
Endm
BANK1 macro
Bsf STATUS, RP0;Select memory bank 1
Endm
Locatiile 0Ch - 4Fh sunt registri cu scop general (GPR) ce sunt folositi ca memorie RAM. Cand sunt accesate locatiile 8Ch - CFh in Bancul 1, accesam de fapt exact aceleasi locatii in Bancul 0. Cu alte cuvinte, cand doriti sa accesati unul din registrii GPR, nu trebuie sa va ingrijorati ca nu stiti in ce banc sunteti!
Contorul
de Program
Contorul de program (PC) este un registru de 13 biti ce contine
adresa instructiunii ce se executa. Prin incrementarea sau schimbarea
sa (ex. in caz de salturi) microcontrolerul executa instructiunile de
program pas-cu-pas.
Stiva
PIC16F84 are o stiva de 13 biti cu 8 nivele, sau cu alte cuvinte, un
grup de 8 locatii de memorie de 13 biti latime cu
functii speciale. Rolul sau de baza este de a pastra
valoarea contorului de program dupa un salt din programul principal la o
adresa a unui subprogram. Pentru ca un program sa stie cum
sa se intoarca la punctul de unde a pornit, trebuie sa inapoieze
valoarea contorului programului din stiva. Cand se muta dintr-un
program intr-un subprogram, contorul programului este impins in stiva (un
exemplu de acesta este instructiunea CALL). Cand se executa
instructiuni ca RETURN, RETLW sau RETFIE ce au fost executate la
sfarsitul unui subprogram, contorul programului a fost luat dintr-o
stiva, asa ca programul sa poata continua de unde a fost
oprit inainte de a fi intrerupt. Aceste operatii de plasare intr-o si
luare dintr-o stiva de contor de program sunt numite PUSH si POP,
si sunt numite conform cu instructiunile similare ale unor
microcontrolere mai mari.
Programarea In Sistem
Pentru a programa o memorie de program, microcontrolerul trebuie sa fie
setat pentru un mod de lucru special prin aducerea pinului MCLR la 13.5V, iar
sursa de tensiune Vdd trebuie sa fie stabilizata intre 4.5V si
5.5V. Memoria program poate fi programata serial folosind doi pini
'data/clock' ce trebuie sa fie mai intai separati de liniile
montajului, asa ca sa nu apara erori in timpul programarii.
Moduri de adresare
Locatiile de memorie RAM pot fi accesate direct sau indirect.
Adresarea
Directa
Adresarea Directa se face printr-o adresa de 9 biti.
Aceasta adresa este obtinuta prin conectarea celui de-al
saptelea bit al adresei directe a unei instructiuni cu doi biti
(RP1, RP0) din registrul STATUS dupa cum se arata in figura
urmatoarea. Orice acces la registrii SFR poate fi un exemplu de
adresare directa.
Bsf STATUS, RP0 ;Bankl
movlw 0xFF;w=0xFF
movwf TRISA ;address of TRISA register is taken from
;instruction movwf
Adresarea Directa
Adresarea
Indirecta
Adresarea indirecta spre deosebire de cea directa nu ia o adresa
dintr-o instructiune ci o creeaza cu ajutorul bitului IRP a
registrilor STATUS si FSR. Locatia adresata este
accesata prin registrul INDF care de fapt tine o adresa
indicata de un FSR. Cu alte cuvinte, orice instructiune care
foloseste INDF ca registrul al ei, in realitate acceseaza datele
indicate de un registru FSR. Sa spunem, de exemplu, ca un registru cu
scop general (GPR) la adresa 0Fh contine o valoarea 20. Prin scrierea unei
valori 0Fh in registrul FSR vom obtine un registru indicator la adresa
0Fh, iar prin citirea din registrul INDF, vom obtine valoarea 20, ceea ce
inseamna ca am citit din primul registru valoarea lui fara
accesarea lui directa (dar prin FSR si INDF). Se pare ca acest
tip de adresare nu are nici un avantaj fata de adresarea
directa, dar exista unele nevoi in timpul programarii ce se pot
rezolva mai simplu doar prin adresarea indirecta.
Un asemenea exemplu poate trimite un set de date prin comunicatia seriala, lucrand cu bufere si indicatoare (ce vor fi discutate in continuare intr-un capitol cu exemple), sau sa stearga o parte a memoriei RAM (16 locatii) ca in urmatorul exemplu.
Citind datele din registrul INDF cand continutul registrului FSR este egal cu zero, intoarce valoarea zero, si scrie in el rezultatul in operatia NOP (no operation- nu opereaza).