Documente noi - cercetari, esee, comentariu, compunere, document
Documente categorii

Microcontroler - Organizarea memoriei

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).