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

Set de Instructiuni in Familia Microcontrolerului PIC16Cxx

Set de Instructiuni in Familia Microcontrolerului PIC16Cxx

Transfer Date Aritmetica si logica Operatii cu biti Directionarea debitului de program Perioada de Executie a Instructiunilor Lista de cuvinte

Introducere

Am mentionat deja ca microcontrolerul nu este ca orice alt circuit integrat. Cand ies din productie cele mai multe circuite integrate sunt gata de a fi introduse in aparate ceea ce nu este cazul cu microcontrolerele. Pentru a 'face' microcontrolerul sa indeplineasca o sarcina, trebuie sa-i spunem exact ce sa faca, sau cu alte cuvinte trebuie sa scriem programul pe care microcontrolerul sa-l execute. Vom descrie in acest capitol instructiunile care alcatuiesc assembler-ul, sau limbajul de programare cu nivel scazut pentru microcontrolerele PIC.



Set de Instructiuni in Familia Microcontrolerului PIC16Cxx

Setul complet care cuprinde 35 de instructiuni este dat in tabela urmatoare. Un motiv pentru un numar asa de mic de instructiuni sta in primul rand in faptul ca discutam despre un microcontroler RISC ale carui instructiuni  sunt bine optimizate avand in vedere viteza de lucru, simplitatea arhitecturala si compactitatea codului. Singurul neajuns este ca programatorul trebuie sa controleze o tehnica 'neconfortabila' in a utiliza un set modest de 35 de instructiuni.

Transfer de Date

Transferul de date intr-un microcontroler este facut intre registrul de lucru (W) si un registru 'f' ce reprezinta orice locatie in RAM-ul intern (indiferent daca acestia sunt registri speciali sau de scop general).

Primele trei instructiuni (a se vedea urmatorul tabel) fac ca o constanta sa fie inscrisa in registrul W (MOVLW este prescurtarea pentru MOVe Literal to W), si ca datele sa fie copiate din registrul W in RAM si datele din RAM sa fie copiate in registrul W (sau in aceeasi locatie RAM, la care punct numai starea steguletului Z se schimba). Instructiunea CLRF scrie constanta 0 in registrul 'f ', iar CLRW scrie constanta 0 in registrul W. Instructiunea SWAPF schimba locurile campului de nibbles- bucati de 4 biti in interiorul unui registru.

Aritmetica si logica

Din toate operatiile aritmetice, PIC ca majoritatea microcontrolerelor, accepta doar scaderea si adunarea. Steguletele C, DC si Z sunt setate functie de rezultatul adunarii sau scaderii, dar cu o exceptie: pentru ca scaderea se face ca o adunare a unei  valori negative, eticheta C este inversa urmand scaderii. Cu alte cuvinte, este setata daca operatia este posibila, si este resetata daca un numar mai mare a fost scazut din unul mai mic.



Unitatea logica a PIC-ului are capabilitatea de a face operatiile AND (SI), OR (SAU), EX-OR (SAU-EXCLUSIV), complementare (COMF) si rotatie (RLF si RRF).
Instructiunile ce rotesc continutul registrului muta bitii in interiorul registrului prin eticheta C cu un spatiu la stanga (catre bitul 7), sau la dreapta (catre bitul 0). Bitul ce 'iese' din registru este scris in steguletul C, si valoarea steguletului C este scrisa intr-un bit al 'partii opuse' a registrului.

Operatii cu biti

Instructiunile BCF si BSF fac setarea sau stergerea unui singur bit oriunde in memorie. Chiar daca pare o simpla operatie, este executata in asa fel ca CPU citeste mai intai intregul byte, schimba un bit in el si apoi scrie intregul byte in acelasi loc.

Directionarea debitului unui program

Instructiunile GOTO, CALL si RETURN sunt executate in acelasi fel ca si in celelalte microcontrolere, numai stiva este independenta de RAM-ul intern si limitata la opt nivele.
Instructiunea 'RETLW k' este identica cu instructiunea RETURN, cu exceptia ca inainte de a se intoarce dintr-un subprogram, constanta definita operandul de instructiuni este scrisa in registrul W. Aceasta instructiune ne permite sa proiectam usor tabelele (listele) Look-up. Cel mai mult le folosim la determinarea pozitiei datelor in tabelul nostru adaugand-o la adresa la care incep tabelele, si apoi citim datele din acea locatie (care este uzual gasita in memoria program).



Tabelul poate fi format ca un subprogram ce consta dintr-o serie de instructiuni 'RETLW k', unde constantele 'k' sunt membri ai tabelului.

Scriem pozitia unui membru al tabelului nostru in registrul W, si folosind instructiunea CALL apelam un subprogram care creaza tabelul. Prima linie de subprogram ADDWF PCL, f adauga pozitia unui membru al registrului W la adresa de start a tabelului nostru, gasita in registrul PCL, si astfel obtinem adresa datelor reale in memoria program. Cand ne intoarcem dintr-un subprogram vom avea in registrul W continutul unui membru al tabelului adresat. In exemplul anterior, constanta 'k2' va fi in registrul W urmand unei intoarceri dintr-un subprogram. 

RETFIE (RETurn From Interrupt - Interrupt Enable) este o intoarcere dintr-o rutina de intrerupere si difera de o RETURN numai in aceea ca seteaza automat bitul GIE (Global Interrupt Enable). La o intrerupere, acest bit este automat sters. Cand incepe intreruperea, numai valoarea contorului de program este pusa in varful stivei. Nu este prevazuta memorarea automata a valorilor si starii registrului.

Jump-urile (salturile) conditionale sunt sintetizate in doua instructiuni: BTFSC si BTFSS. Functie de starea bitului in registrul 'f' ce este testat, instructiunile sar sau nu peste instructiunea de program urmatoare.

Perioada de Executie a Instructiunii

Toate instructiunile sunt executate intr-un ciclu cu exceptia instructiunilor ramura conditionale daca conditia a fost adevarata, sau daca continutul contorului de program a fost schimbat de o anumita instructiune. In acest caz, executia cere doua cicluri de instructiuni, iar al doilea ciclu este executat ca NOP (No Operation-Fara operatii). Patru clock-uri oscilator fac un ciclu instructiune. Daca folosim un oscilator cu frecventa de 4 MHz, timpul normal pentru executia instructiunii este 1 µs, si in caz de branching-ramificare conditionala, perioada de executie este 2 µs.



Lista de cuvinte

f orice locatie de memorie intr-un microcontroler
W  registru de lucru
bpozitie bit in registru 'f'
dbit destinatie
label grup de opt caractere ce marcheaza inceputul unei parti de program
TOS  varful stivei
[]optiune
<>pozitie bit in  registru

*1 Daca portul I/O este operand sursa, este citita starea pinilor microcontrolerului
*2 Daca aceasta instructiune este executata in registrul TMRO si daca d=1, prescaler-ul asignat acelui timer va fi automat sters
*3 Daca PC s-a modificat, sau rezultatul testului =1, instructiunea s-a executat in doua cicluri