Sunteți pe pagina 1din 16

2.

Operaţii aritmetice şi logice


realizate cu microcontrolere PIC
ALU şi regiştri. Un prim program

2.1. Scopul lucrării

Crearea deprinderilor şi abilităţilor de lucru cu ALU, cu registrul acumulator şi cu


regiştrii de memorie pentru microcontrolere PIC. Realizarea primelor programe,
elementare, în fişiere .asm, în mediul de dezvoltare MPLAB™ (© Microchip Technologies
Inc., USA).
Noţiuni introductive despre instrucţiuni la nivel de byte.
Învăţarea unor structuri de ALU şi regiştri.
Învăţarea unor instrucţiuni de adunare şi mişcare (move, deplasare) între regiştri.

2.2. Echipamente şi aplicaţii software (programe) utilizate

PC cu Windows (>=’98), mediul MPLAB versiune 7 sau mai recentă.

2.3. Noţiuni generale


2.3.1. Configurarea simulatorului

Simulatorul trebuie configurat corespunzător aplicaţiei pentru o funcţionare corectă.


(În laborator, în cazul în care nu a fost configurat de un membru al corpului didactic, va
trebui să o faceţi singuri). Pentru configurare, trebuie să faceţi următoarele operaţii.

 În bara de meniuri, selectaţi Programmer  Select programmer, apoi alegeţi


din lista MPLAB PM3
 În bara de meniuri, selectaţi Configure  Select device, apoi alegeţi din lista
microcontrolerul dorit.

2.3.2. Arhitectura microcontrolerelor PIC16FX...17YXX. Detalii ALU

Structura de bază pentru microcontrolerele PIC este ilustrată în fig. 1. În această


lucrare focalizăm atenţia asupra porţiunii marcate în chenarul cu linie punctată, groasă.
20 Elemente de utilizare a micro-controlerelor
Horia-Nicolai Teodorescu

Această porţiune include ALU şi registrul acumulator. Regiştrii de intrare nu sunt accesibili
direct utilizatorului, dar aducerea din memorie se poate face aparent direct în ALU pentru
operaţii cu variabile stocate în acumulator şi respectiv în memorie, cu instrucţiuni de forma:

nume_operaţieWF (ex. addwf, andwf etc.)

adrese
Numărător de RAM FSR
Program (PC)
EPROM MUX
memorie Adrese
program 4k
x 14 biţi
Stivă pe 8 Registru de
niveluri 13 biţi Registru de stare
instrucţiuni
14 8 Diverse
14 periferice
MUX
8

Decodare A B
8
instrucţiuni ALU
8
W Magistrala
de date

Fig. 1. Arhitectura generală a unui microcontroler din seria PIC16 XX – schema


simplificată (Schema bloc compilată după manualul firmei)

Regiştrii de date ai unităţii logic-artimetică

Acest circuit este partea centrală a oricărui sistem de calcul. Aici se efectuează
operaţiile logice (ŞI, SAU, SAU exclusiv, complementarea) şi aritmetice de bază (adunarea,
incrementarea cu 1, scăderea, scăderea unei unităţi). Deoarece aceste operaţii sunt, în
majoritatea lor, operaţii binare, un circuit ALU (un ALU, pe scurt), are nevoie de o
memorie proprie, în care să se păstreze cei doi operanzi, precum şi rezultatul. Circuitele de
memorie specifice se numesc regiştri ALU şi se notează uzual A, B şi Acc sau W (Acc
reprezintă prescurtarea “acumulator”, loc în care se ‘acumulează’ rezultatul operaţiei).
Schema acestei memorii locale (regiştri) a ALU este ilustrată în fig. 2. O particularitate a
registrului acumulator este că el poate transfera datele (rezultatele) direct primului registru
de intrare, A. În acest fel, rezultatul poate deveni, imediat, dată de intrare.
Operaţii aritmetice şi logice realizate cu microcontrolere PIC. ALU şi regiştri 21

Regiştri de
Registrul A Registrul B
intrare

ALU Setări mod de lucru

Registru Registru unic de ieşire,


acumulator pentru rezultat

Fig. 2. Schema de principiu a unităţii logico-aritmetice, cu regiştrii respectivi


(“inima” unui sistem de procesare clasic)
O caracteristică a modului de funcţionare a ALU şi, în consecinţă a microsistemului,
caracteristică ce decurge din schema constructivă a ALU, este aceea că toate datele ce ajung
la ALU trebuie să treacă întâi prin regiştrii proprii ai ALU. Deci, orice operaţie de transfer
de date între ALU şi altă memorie, de la sau către ALU, se face mediat prin intermediul
regiştrilor A, B şi Acc. Această particularitate creşte (aparent) timpul de acces la date, dar
introduce o ordine care, în final, se regăseşte într-o economie de timp de lucru.
O a doua caracteristică a lucrului cu memoria este că adresarea regiştrilor A, B, Acc se
face, în general, implicit: operanzii se preiau din regiştrii A şi B, la operaţii binare, sau din
A, la operaţii unare, iar rezultatul se depune automat în Acc. Adresarea se poate face
explicit, prin instrucţiune, dar fără o adresă a acestor regiştri (aceştia, precum şi unii regiştri
de stare folosiţi intern sunt singurii regiştri fără adresă efectivă).
Transferul de date între regiştrii A, B, Acc şi memorie se efectuează după următoarele
reguli:

 numai de la memorie către A şi B, adică nu este posibil transfer direct de la


memorie la ALU;
 numai de la Acc la memorie, adică ALU nu poate scrie direct în memorie.

La aceste reguli se adaugă cea deja cunoscută:

 de la Acc numai la A.

Ultima regulă este valabilă numai la unele procesoare1; multe procesoare fac accesibil
registrului B datele din acumulator prin intermediul unui multiplexor (de ex., PIC16F84A)
(vezi fig.3).

1
Toate regulile pot avea excepţii, mai ales pentru procesoarele proiectate “la
comandă”, pentru aplicaţii specifice.
22 Elemente de utilizare a micro-controlerelor
Horia-Nicolai Teodorescu

Multiplexor

Registrul A Registrul B

ALU

Registrul
acumulator

Fig. 3. Schema de principiu a unităţii logico-aritmetice, cu ieşire ALU conectată


direct la multiplexorul registrului B

De asemenea, ieşirea ALU poate fi conectată direct la un circuit periferic (o interfaţă),


ca în fig. 4.

Multiplexor

Registrul A Registrul B

ALU Circuit
I/O
Registru
acumulator

Fig. 4. Schema de principiu a unităţii logico-aritmetice, cu ieşire ALU conectată la


un circuit I/O

Regiştrii de stare (control) ai unităţii logic-artimetică

Modul efectiv de lucru al ALU este dictat (prin program) prin intermediul unei setări
menţinute de un registru de instrucţiuni.
Operaţii aritmetice şi logice realizate cu microcontrolere PIC. ALU şi regiştri 23

Instrucţiuni – o introducere

Controlerele PIC MICROCHIP sunt controlere de tip RISC, deci au un set redus de
instrucţiuni. Prezentăm introductiv câteva instrucţiuni folosite în lucrare. Acestea sunt:

Instrucţiuni de deplasare între regiştri şi încărcare de regiştri

Instrucţiunea de deplasare dintr-un fişier în altul este

MOVF f, d

Semnificaţia este: Pune fişierul de la adresa f în locaţia indicată de d.

Exemplu:
movf R1, 0 ; d = 0 indică ca destinaţie acumulatorul
; copie conţinut registru R1 în w
movf R1, 1 ; d = 1 indică ca destinaţie registrul R
; copie conţinut R1 tot în R1
;scop instrucţiune – setare flag zero Z (se va vedea ulterior)
movf R1 ; valoare implicită d = 1

Instrucţiunea de încărcare a unei constante (literal) în acumulator este:

MOVLW const

Exemplu:
movlw 92h ; pune valoarea 92h în w

Instrucţiunea de transport din registrul acumulator într-un registru de memorie este:

MOVWF f

Exemplu:
movwf TempR_2 ; pune conţinut w în registrul notat TempR_2.

Instrucţiuni la nivel de byte, de tip aritmetic

Instrucţiunile pot avea efect asupra unui întreg octet (byte) sau asupra unui singur bit,
specificat, dintr-un octet. Trei instrucţiuni aritmetice întâlnite în această lucrare sunt:

ADDWF f, d ; adună w la valoarea din locaţia f

SUBWF TempR_2, d ; scade w din Temp_R_2, rezultat final în


; acumulator w (d=0) sau în fişier (d=1)
RRF f, d . ; rotire la dreapta fişier
24 Elemente de utilizare a micro-controlerelor
Horia-Nicolai Teodorescu

(Considerăm aici RRF ca instrucţiune aritmetică deoarece, în această lucrare, o vom


folosi pentru împărţire. În alte contexte, cu alte aplicaţii, RRF este considerată operaţie
logică, deşi logica binară nu are o operaţie fundamentală de deplasare la stânga sau la
dreapta.)

Instrucţiuni de ştergere la nivel de byte (octet) şi de bit

Instrucţiunea de ştergere a acumulatorului este:

CLRW (clear W)

Această instrucţiune are efect asupra acumulatorului şi asupra unui bit din registrul de
stare. Anume, instrucţiunea setează la 1 bitul de zero Z, dar nu C, DC din registrul de stare.
Instrucţiunea de ştergere a unui bit, cu numărul (locaţia în cadrul cuvântului) b, din
locaţia f, este:

BCF f,b şterge bitul b din cuvântul de la locaţia f.


BSF f,b setează bitul b din cuvântul de la locaţia f.

Comenzi MPLAB

În afara instrucţiunilor propriu-zise ale controlerului, este necesar să se cunoască şi


unele instrucţiuni şi comenzi (directive) ale limbajului MPLAB. Cele folosite în această
lucrare sunt:

processor 16F84

Această linie indică tipul procesorului pe care urmează să se ruleze programul.

org 0010h

Această instrucţiune indică locul de unde începe programul, în memorie.

Comenzi de definire de constante sunt equ şi (preluat din C), #define. Exemplu:

acc equ 0 ; Definiţie de simbol: acc se înlocuieşte la compilare cu 0


f equ 1 ; Definiţie: f se înlocuieşte la compilare cu 1.

Comanda de terminare a programului este:

end

După această comandă nu se mai execută nici o instrucţiune eventual aflată (eronat) în
program.
Operaţii aritmetice şi logice realizate cu microcontrolere PIC. ALU şi regiştri 25

Exemple de lucru cu ALU pentru micro-controlere PIC16CXXX

Exemplul 1. Adunarea a două numere

Să considerăm că dorim adunarea a două numere, aflate la locaţiile f1 şi f2 în memorie,


iar rezultatul dorim: a) să fie păstrat în acumulator; b) să fie pus în locaţia f3 din memorie.
Nu trebuie ştearsă informaţia din f1, f2.
Pentru adunare, avem instrucţiunea:

ADDWF f, d

care adună acumulatorul W cu conţinutul din memorie, de la locaţia f, cu rezultatul în W,


dacă d=0, respectiv cu rezultatul în f, dacă d=1. În lipsa precizării lui d, automat d=1.
Pseudocodul soluţiei este:

Pune f1 în W
Adunăm f2 cu W, rezultat în W
Pune W în f3.

Pentru a pune f1 în W avem disponibilă instrucţiunea:

MOVF f, d cu d=0.

Pentru a pune rezultatul final, aflat în acumulator, W, la locaţia f3, avem la dispoziţie
instrucţiunea:

MOVWF f cu f adresa fişierului.

Soluţia este deci:

MOVF f 1 , 0  
 solutie a) 
ADD WF f 2 , 0  solutie b)

MOVWF f 3 

Am neglijat în discuţia noastră două aspecte. Primul se referă la biţii de stare: cum
sunt aceştia modificaţi? Trebuie să avem grijă de ei? Al doilea aspect este: în ce stare dorim
să lăsăm, la terminarea operaţiilor, acumulatorul? (încărcat cu rezultatul final sau şters?).

Problema stărilor afectate

Operaţia de mişcare (deplasare, transfer) f  W afectează numai starea Z, nu şi


stările C şi DC (biţi de transport, “carry”). Prin urmare, la aplicarea instrucţiunii MOVF,
aceşti biţi pot rămâne, într-o stare oarecare, de la operaţiile precedente. Este deci prudent
ca, la început, acumulatorul să fie şters. Aceasta se face cu instrucţiunile:
26 Elemente de utilizare a micro-controlerelor
Horia-Nicolai Teodorescu

CLRW setează la 1 bitul Z, dar nu C, DC;


BCF f,b şterge bitul b din cuvântul de la locaţia f.

Folosind a doua operaţie şi ţinând cont că bitul “carry” de transport se află în registrul
de stare, ştergerea acestui bit se face prin:

BCF STATUS, C ; Clear carry

În cazul în care dorim să lăsăm acumulatorul liber, segmentul de program este:

CLRW
MOVF f1,0
ADDWF f2 ,0
MOVWF f3
CLRW

Exemplul 2: Media aritmetică a patru numere.

Considerăm patru numere, aflate la locaţiile f1, f2, f3 şi f4. Alegerea unui număr (4) ce
reprezintă putere a lui 2 nu este întâmplătoare. Pentru puteri ale lui 2, împărţirea (fără rest)
se reduce la deplasarea la dreapta cu un număr de ori egal cu puterea lui doi:

RRF f , d.

Ştergerea bitului de carry este obligatorie, atunci când se realizează împărţirea la 2


(înmulţirea cu 2) şi nu operaţia de deplasare la dreapta (respectiv la stânga), după cum se va
explica ulterior. Omiterea acestui aspect poate conduce la rezultate eronate.
O abordare a problemei este să adunăm toate numerele (de ex., mai jos, patru) şi să
împărţim apoi rezultatul la 4. Această metodă poate conduce însă la rezultate eronate. De
ex., 41 + 41 + 41 + 41 (H) va duce la o depăşire a capacităţii bitului carry, deci primul bit
semnificativ se pierde. Pentru a evita aceasta, este preferabil să facem două adunări a câte
două numere, iar după fiecare să facem divizarea, în final adunând rezultatele parţiale (care
nu pot duce la dublu transport carry) şi făcând o ultimă împărţire. Preţul plătit astfel este o
împărţire cu 2 suplimentară, dar rezultatul este întotdeauna corect, indiferent de depăşirile
la sume.

Despre sintaxa scrierii în fişiere .asm în MPLAB

La scrierea fişierelor .asm se va ţine cont de următoarele reguli:

“Prima coloană” (adică ce începe pe prima poziţie a unei linii) este destinată doar
etichetelor.
Ce se întâmplă altfel: va apare o avertizare (warning), care nu compromite rularea.
Avertizare este de forma:
Operaţii aritmetice şi logice realizate cu microcontrolere PIC. ALU şi regiştri 27

“Warning[205] I:\CURS_U-CONTROLLER_2005\MPLAB\HEAD_ADUN.H 10 : Found


directive in column 1. (PROCESSOR)”
sau:
”Warning[203] I:\CURS_U-CONTROLLER_2005\MPLAB\ADUNARI.ASM 20 : Found
opcode in column 1. (movlw)”
sau:
“Warning[207] I:\CURS_U-CONTROLLER_2005\MPLAB\ADUNARI.ASM 16 : Found
label after column 1. (Reg_1)”

Soluţii:
Se va lăsa un spaţiu înaintea unei directive sau a codului unei operaţii.
Nu se va lăsa spaţiu înaintea unei etichete.

Exemplu
Corect:

processor 16F84 ; tipul procesorului

org 0x07 ; locaţia de unde începe programul


acc equ 0 ; Definiţie de simbol
f equ 1 ; Definiţie

Dar nu:

Reg_1 equ H'10' ; Definiţie de registru de date la h'10'


movlw H'03' ; încărcăm constanta H'03' în w

Directivele pentru asamblor

Directivele precizează modul de lucru (specificaţii, controale privind asamblarea,


manipulare de date, asamblarea condiţionată), dar nu sunt coduri de operaţii. Sunt mai
multe categorii de directive. Aici deprindem doar directivele de control. Acestea sunt:

 processor indică tipul procesorului


 org (origin) indică începutul programului şi locaţia în memorie de unde începe
programul
 equ defineşte o constantă pentru asamblor (a equ 2 înseamnă “a este 2”)
 #include NUME indică includerea unui fişier cu numele NUME
 #define defineşte un text de substituţie (ca în C)
 #undefine elimină definiţia unui text de substituţie (ca în C)
 end indică sfârşitul programului
28 Elemente de utilizare a micro-controlerelor
Horia-Nicolai Teodorescu

Utilizarea unui asamblor în scrierea programelor

Prezentăm pe scurt câteva exemple de cod, cu detalii.

Problema 1. Adună două numere aflate în doi regiştri cu adrese cunoscute. Păstrează
rezultatul adunării în acumulator.

Program Adunare:
Adună_1.asm
;Adunare.asm este numele programului.
;Terminaţia (prefixul) .asm denotă faptul
;că fişierul este de tip asamblor.
;Programul adună două numere, aflate în doi regiştri cu
;adresă cunoscută, prestabilită.
;*************************************************
processor 16F84 ; această linie indică tipul procesorului
; pe care urmează să se ruleze programul
org 0010h ; locul de unde începe programul, în memorie
;
acc equ 0 ; Definiţie equ înseamnă “egal cu”.
; Programul face înlocuirea simbolului din stânga lui “equ”
; cu simbolul (sau şirul de simboluri din dreapta).
; Unii programatori preferă folosirea de litere mnemonice
; în locul cifrelor, pentru uşurinţa şi pentru
; claritatea programului. Metoda este recomandată!
; O regulă “de aur” spune că nu trebuie sacrificată în nici
; un caz claritatea codului pentru a micşora lungimea
; codului scris.
;
f equ 1 ; Definiţie de simbol
Reg_1 equ H'10' ; Definiţie de registru temporar la h'10'
Reg_2 equ H'15' ; alt registru de lucru la H'15'

; urmează programul propriu-zis


;***********************************************
; Mersul de lucru al programului:
; Se transferă valoarea din locaţia Reg_1 în acumulator.
; W (acumulatorul) va păstra acum primul operand şi permite
; aplicarea instrucţiunii de adunare (ADDWF) a conţinutului
; acumulatorului cu conţinutul celui de al doilea registru,
; Reg_2.

movf Reg_1,acc ; pune conţinutul lui Reg_1 în w


addwf Reg_2,acc ; adună la w conţinutul lui Reg_2
; cu rezultatul păstrat în acumulator
end
Operaţii aritmetice şi logice realizate cu microcontrolere PIC. ALU şi regiştri 29

Listarea de dezasamblare

Mediul MPLAB™ ne permite să vizualizăm ce se va scrie efectiv în memoria


program, inclusiv dacă s-au inclus fişierele header şi dacă au fost înlocuite corect
constantele. Pentru a vedea cum este transpus programul nostru în fişierul pentru maşină,
folosim din bara de meniuri comanda: View  Disassembly Listing. La această comandă,
se va deschide o nouă fereastră, în care se va vedea fişierul de dezasamblare. La programul
anterior au mai fost adăugate câteva instrucţiuni pentru salvarea rezultatelor adunării într-un
registru Reg_3. Ceea ce se obţine pentru programul nostru este fişierul:

------- I:\CURS_U-CONTROLLER_2005\MPLAB\ADUNĂRI.ASM --------------


1: adunări
2:
3: #include head_adun.h
4: #include basic04-comm.inc
5: ; Simbolul “;” notează un comentariu (linie ne-luată în
6: ; seamă la generarea codului maşină)
7: ; Adunare.asm este numele programului.
8: ; Terminaţia (prefixul) .asm denotă faptul
9: ; că fişierul este de tip asamblor.
10: ; Programul adună două numere, aflate în doi regiştri cu
11: ; adresa cunoscută, prestabilită.
12: ;
13: ; *************************************************
14: processor 16F84 ;această linie indică tipul procesorului
15: ; pe care urmează să se ruleze programul
16: org 0010h ; locul de unde începe programul, în memorie
17: ;
18: acc equ 0 ; Definiţie equ înseamnă “egal cu”.
19: ; Programul face înlocuirea simbolului din stânga lui “equ”
20: ; cu simbolul (sau şirul de simboluri din dreapta).
21: ; Unii programatori preferă folosirea de litere mnemonice
22: ; în locul cifrelor, pentru uşurinţa şi pentru
23: ; claritatea programului. Metoda este recomandată!
24: ; O regulă “de aur” spune că nu trebuie sacrificată în nici
25: ; un caz claritatea codului pentru a micşora lungimea
26: ; codului scris.
27: ;
28: f equ 1 ; Definiţie de simbol
29: ;
30: Reg_1 equ H'10' ; Definiţie de registru de date la h'10'
31: Reg_2 equ H'15' ; alt registru de date H'15'
32: Reg_3 equ H'14' ; al treilea registru de date (rezultat)
33: ; Reg_3 la h'14'
000010 3003 MOVLW 0x3 36: movlw H'03' ; încărcăm constanta H'03' în w
000011 090 MOVWF 0x10 37: movwf Reg_1 ; conţinutul lui w în Reg_1
38: ; nota: la fel ca movwf 10h, deoarece
30 Elemente de utilizare a micro-controlerelor
Horia-Nicolai Teodorescu

39: ; Reg_1 şi 10h sunt acelaşi lucru


000012 3014 MOVLW 0x14 40: movlw 14h ; pune 14h în w
000013 095 MOVWF 0x15 41: movwf Reg_2 ; conţinutul lui w în Reg_2,
42: ; conform cerinţei de păstrare pe mai departe
000014 710 ADDWF 0x10, acc 43: addwf Reg_1,acc ; adună w la valoarea din
44: ; Reg_1 cu rezultatul depus în Reg_1, conform setării d=acc
000015 094 MOVWF 0x14 45: movwf Reg_3 ; conţinutul lui w în Reg_3
45: ; conform cerinţei de păstrare în memorie a rezultatului

Vizualizarea memoriei

Pentru a vedea dacă şi cu ce se încarcă efectiv memoria de program, procedăm în felul


următor:
i) Din bara de meniu selectăm Debugger  Clear memory  Program memory.
Apoi în bara de meniu selectăm View  Program memory. Va apare o fereastră
cu conţinutul memoriei.

ii) Apoi compilăm proiectul (fişierul). După compilare, în fereastra pentru memoria
de program trebuie să apară scrise instrucţiunile din program, ca în fig. 5:

Program propriu-zis
Adresa de început a programului a
fost specificată prin instrucţiunea

Fig. 5. Fereastra cu conţinutul memoriei de program


Operaţii aritmetice şi logice realizate cu microcontrolere PIC. ALU şi regiştri 31

Vizualizarea conţinutului regiştrilor în MPLAB

Mediul MPLAB permite vizualizarea conţinutului regiştrilor memoriei şi urmărirea


apariţiei rezultatelor în memorie. Pentru aceasta, din bara de meniu se selectează: View 
File Registers. Se obţine o nouă fereastră cu conţinutul tuturor regiştrilor.

Fig. 6. Vizualizarea conţinutului regiştrilor

Rularea pas cu pas

Pentru aceasta, se selectează întâi din meniu Debugger  Clear Memory  All. Apoi
se dă comanda Build all. Din meniu, se selectează Debugger  Step into (sau F7), apoi F8,
în mod repetat. Astfel, se rulează pas cu pas programul şi se observă modificarea
conţinutului regiştrilor. Se constată dacă la sfârşitul rulării apare în registrul precizat
(Reg_3, în exerciţiu) rezultatul dorit (23 în zecimal, 17 în hexa).
32 Elemente de utilizare a micro-controlerelor
Horia-Nicolai Teodorescu

Din nou despre program

Programul de mai sus nu ne spune nimic cum s-au încărcat regiştrii Reg_1 şi Reg_2.
Pentru cazul în care aceşti regiştri trebuie încărcaţi chiar de către program, cu două numere
prestabilite, trebuie să efectuăm operaţii suplimentare (de transfer de valori constante în
acumulator, respectiv din acumulator în regiştri). Să considerăm următoarea problemă:

Problema 2. Adună două numere date prin program; reţine (încarcă) cele două numere
în doi regiştri cu adrese cunoscute, Reg_1 şi Reg_2. Păstrează rezultatul adunării în
acumulator, dar şi într-un registru Reg_3.

Soluţia problemei este următoarea:

 încărcăm din program primul operand (constanta, “literalul” ce reprezintă primul


operand) în acumulator; De notat că nu avem instrucţiune de încărcare direct în
fişier, din program;
 din acumulator, punem prima constantă într-un registru, Reg_1;
 încărcăm din program, în acumulator, al doilea operand;
 din acumulator, punem constanta a doua într-un registru, Reg_2;
 a doua constantă rămâne şi în acumulator şi deci, putem face direct:
- suma dintre conţinutul acumulatorului şi primul operand, accesibil în registru;
- rezultatul se transferă din acumulator într-un registru Reg_3.

Codul este, suplimentar faţă de exemplul anterior în privinţa definiţiei Reg_3:

w equ 0 ; folosite pentru a indica destinaţia operatiilor logice,


f equ 1 ; ca fiind acumulatorul (d=0), respectiv fişierul (d=1)

Reg_1 equ H'10' ; Definiţie de registru de date la h'10'


Reg_2 equ H'15' ; alt registru de date H'15'
Reg_3 equ H'14' ; al treilea registru de date (rezultat)
; Reg_3 la h'14'
movlw H'03' ; încărcăm constanta H'03' în w
movwf Reg_1 ; conţinutul lui w în Reg_1
movlw 14h ; pune 14h în w
movwf Reg_2 ; conţinutul lui w în Reg_2, conform cerinţei
; de păstrare pe mai departe
addwf Reg_1,w ; adună w la valoarea din Reg_1
; cu rezultatul depus în acc, conform setării w
movwf Reg_3 ; conţinutul lui w în Reg_3, conform cerinţei
; de păstrare în memorie a rezultatului
end
Operaţii aritmetice şi logice realizate cu microcontrolere PIC. ALU şi regiştri 33

Problema 3. Adună două valori date prin program şi scade din rezultat o a treia
valoare dată prin program. Rezultatul final este păstrat în acumulator. Valorile date prin
program sunt, în acest exemplu, H’03’, H’32’ şi H’92’.
Deşi problema nu impune o păstrare în memorie, rezolvarea problemei necesită
folosirea unor regiştri de păstrare a unor valori temporare:

w equ 0 ; folosite pentru a indica destinaţia operaţiilor logice


f equ 1 ; ca fiind acumulatorul (d=0), respectiv fişierul (d=1)

TempR_1 equ H'10' ; Adresă prim registru temporar, h'10'


TempR_2 equ H'11' ; al doilea registru temporar, H'11'
TempR_3 equ H'12' ; al treilea registru temporar la h’12’

movlw H'03' ; pune valoarea H'03' în w


movwf TempR_1 ; pune conţinut w în TempR_1
movlw 32h ; pune 32h în w
movwf TempR_2 ; pune conţinut w în TempR_2
addwf TempR_1,f
; adună conţinutul lui w cu cel al TempR_1
; cu rezultatul pus în TempR_1, indicat de f.
movlw 92h ; pune valoarea 92h în w
movwf TempR_3 ; pune conţinut w în TempR_3
movf TempR_1,0 ; pune rezultat adunare (din TempR_1) în w
subwf TempR_3,w ; scade w din Temp_R_3, rezultat în w
end

Modul de lucru

1. Se vor recapitula cunoştinţele despre structura ALU şi registrul acumulator.


2. Se vor învăţa instrucţiunile noi din referat.
3. Se vor scrie programele date ca exemplu şi se vor compila, urmărind dacă apar
erori.
4. Se vor urmări fişierele dezasamblate precum şi conţinutul memoriei, în ferestrele
respective. Se vor copia în referat părţile esenţiale din aceste ferestre.
5. Se vor scrie programe pentru problemele din exerciţii, având grijă ca programele
să fie bine documentate.
6. Se va întocmi referatul de laborator.

TEMĂ

Să se scrie un proiect cu un fişier tip .asm, două fişiere .inc şi un fişier .h. În fişierul
header se vor include următoarele informaţii:
 Numele programului
 Numele realizatorului (numele Dvs.)
 grupa
 data scrierii
 Revendicarea de copyright ©
34 Elemente de utilizare a micro-controlerelor
Horia-Nicolai Teodorescu

Conţinutul referatului

Referatele de laborator se întocmesc individual şi reflectă activitatea în cadrul orei de


laborator şi acasă (rezolvarea temelor).
Referatele de laborator vor fi aduse la fiecare laborator şi vor fi depuse pe catedră,
pentru verificare şi notare.
Referatele de laborator vor fi păstrate în dosare, urmând a fi predate spre notare la
sfârşitul semestrului.
În antet, fiecare referat va include următoarele date: numele studentului, grupa, nr. şi
titlul lucrării de laborator.
Fiecare referat va include următoarele:

i) Rezultatele obţinute în oră.


ii) O scurtă discuţie a exerciţiilor avute ca temă.
iii) Programele scrise de dvs. ca rezolvare a exerciţiilor.
iv) Rezultatele compilării (dacă e necesar).
v) Răspunsurile la exerciţiile teoretice (dacă există).

Referinţe

[1]. MICROCHIP Inc., MPLAB C18 C Compiler Getting Started,


http://kevin.org/frc/c18_getting_started.pdf
[2]. http://www.talkingelectronics.com/html/PIC-for-Beginners.html
[3]. H.N. Teodorescu, Note de curs, Disciplina Microcontrolere, 2003-2006

S-ar putea să vă placă și