You are on page 1of 12

Aplicaţii hardware şi software cu microcontrolerul PIC 12F675 Lecţia nr.

Lecţia nr. 4

APLICAŢII DE BAZĂ RULATE ÎN SIMULATOR

În lecţia nr. 4 sunt dezvoltate o serie de aplicaţii specifice microcontrolerului


PIC 12F675. Proiectele acestor aplicaţii vor fi construite în mediul de programare MPLAB
iar verificarea/rularea lor se va face în regim de simulare utilizând programul MPLAB SIM.

4.1. INTRODUCERE
Reamintim că dezvoltarea unei aplicaţii utilizând mediul de programare MPLAB, se
face în două etape distincte, şi anume:
• Într-o primă etapă trebuie construit un proiect al aplicaţiei, pe baza unei
organigrame elaborate în prealabil şi cu includerea fişierului sursă scris în limbaj
de asamblare. Proiectul trebuie să aibă un nume şi un folder propriu, în care se
vor găsi toate fişierele proiectului.
• În etapa a doua se va rula programul într-unul din cele două moduri:
1. Rulare în simulator, folosind comenzile de simulare/depanare ale
simulatorului MPLAB SIM, pentru verificarea corectitudinii logicii de
programare şi efectuarea unor eventuale corecţii. În acest mod se vor selecta,
desigur, doar acele comenzi a căror execuţie satisface cerinţele aplicaţiei.
2. Rularea programului aplicaţiei pe un suport hardware (de exemplu PICkit 1
FLASH Starter Kit).
Observaţie: Aplicaţiile din această lucrare vor fi rulate în regim de simulare, pentru
verificarea corectitudinii şi depanării lor, dacă este cazul.

4.2. PROGRAME APLICATIVE


În cele ce urmează vor fi realizate câteva proiecte care vizează executarea unor
operaţii aritmetice, operaţii logice şi generarea unor temporizări cu buclă de întârziere.
Fişierele sursă de program vor fi scrise în limbaj de asamblare, folosind setul de instrucţiuni
al microcontrolerelor PIC.
În acest scop, pentru fiecare aplicaţie, va fi elaborată organigrama programului
conform căreia va fi apoi editat fişierul sursă. Fişierele create şi cele generate de program
vor fi salvate în folderul de proiect creat pentru acest tip de aplicaţii: D:\LAB_MC_PIC.

APLICAŢIA 1 – OPERAŢII ARITMETICE


Cu un program scris în limbaj de asamblare ne propunem să rezolvăm următoarea
problemă: Să se înscrie într-o locaţie de memorie (de exemplu la adresa 0x40) rezultatul
operaţiilor aritmetice:
#20H – ((<0x30> + <0x31>) – #52H)
unde <0x30> înseamnă conţinutul locaţiei de memorie a cărei adresă este 30H iar <0x31>
este conţinutul locaţiei de memorie a cărei adresă este 31H.

35
Aplicaţii hardware şi software cu microcontrolerul PIC 12F675 Lecţia nr. 4

Exemplu numeric
Pentru obţinerea unui rezultat numeric concret, se vor încărca în locaţiile de memorie
de la adresele 30H şi 31H constantele: 20H şi 26H. Cu aceste valori rezultatul operaţiei va
fi:
20H – ((20H + 26H) – 52H) = 20H – (46H – 52H) = 2CH

Elaborarea organigramei şi a programului sursă


În rezolvarea problemei, se va ţine seama de ordinea operaţiilor. În cazul acesta,
rezultatul operaţiei va putea fi înscris după execuţia a trei etape succesive, descrise în
organigrama din figura 4.1.
Aplicaţia.1

W <0x30> + <0x31>

W W – 0x52

<0x40> 0x20-W

End

Figura 4.1. Organigrama aplicaţiei 1


Pentru a putea scrie programul sursă conform acestei organigrame, reamintim că în
prima parte a fişierului trebuie declarate resursele hardware: tipul microcontrolerului,
configurare hardware şi registrele speciale definite de utilizator. Pentru această aplicaţie
vom defini registrele:
o CT1 şi CT2 în care se vor găsi constantele operaţiei,
o REZ_INTERM şi REZ_FINAL pentru rezultate intermediare, respectiv rezultatul
final.
Programul sursă al aplicaţiei este următorul:
;Operaţii aritmetice
;Programul va executa operaţia aritmetică
; 0x20 – ((<0x30> + <0x31>) – 0x52)
;şi va depune rezultatul în registrul de la adresa 0x40
list p=12f675 ;Directiva de definire a procesorului
#include <p12f675.inc>
errorlevel -302 ;Elimină mesajul de tip 302 din fişierul de tip listă
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF &
_PWRTE_ON & _INTRC_OSC_NOCLKOUT
;Directiva '__CONFIG' pentru configurarea perifericelor în fişierul sursă.
;Reamintim semnificaţia biţilor de configurare utilizaţi în directivă:
; CP - Cod Protection,
; WDT - WatchDog Timer,
; BODEN - Brown-Out Detect ENable,
; PWRTE - PoWeR-up Timer Enable,

36
Aplicaţii hardware şi software cu microcontrolerul PIC 12F675 Lecţia nr. 4

; INTRC_OSC_NOCLKOUT - INTernal RC_OSCilator


; MCLRE - Master CLeaR Enable
; CPD - Data Code Protection
;Definirea unor registre specifice aplicatiei cu directiva CBLOCK
cblock 0x30
CT1 ;Registrul CT1 va avea adresa 0x30 si va conţine
; o constantã implicatã în operaţie
CT2 ;Reg CT2 va avea adresa 0x31 şi conţine
; o a doua constantã implicatã în operaţie
endc
cblock 0x40
REZ_FINAL ;Registrul REZ va avea adresa 0x40 si va conţine rezultatul final
REZ_INTERM ;Registrul REZ va avea adresa 0x41 si va conţine rezultatul
; intermediar
endc
;Definirea variabilelor de program cu directiva DEFINE
#define Bank0 0x00 ;Definirea variabilei Bank0 (atribuirea unei valori simbolului Bank0)
#define Bank1 0x80 ;Definirea variabilei Bank1
;Initialize: secvenţa de iniţializare SFR-urilor şi a celor de uz general
org 0x005 ;Adresa de Start a memoriei program
Initialize
; call 0x3FF ;Restabilirea factorului de calibrare - instrucţiune comentariu
; necesară în cazul utilizării simulatorului
clrf REZ_FINAL
clrf REZ_INTERM
banksel Bank1 ;Selectare Bank 1
movwf OSCCAL ;Încărcarea registrului OSCCAL cu valoarea factorului de calibrare
movf CT1,0
addwf CT2,0 ;Prima etapă: Rezultatul operaţiei <0x30> + <0x31>, în W
movwf REZ_INTERM ;Se transferă acest rezultat parţial în REZ_INTERM
movlw 0x52
subwf REZ_INTERM,1
;A doua etapă: executarea scăderii cu constanta 52H
movlw 0x20
subwf REZ_INTERM,0
movwf REZ_FINAL ;A treia etapă: Din rezultatul precedent se scade 20H iar valoarea
; obţinută se salvează în registrul REZ
end

Construirea proiectului şi rularea programului


Pentru realizarea acestui proiect de aplicaţie, se vor efectua următoarele operaţii de
programare:
1. Se editează fişierul sursă al aplicaţiei cu MPLAB Editor, care se deschide din meniul
File, comanda New.
2. Se va salva cu nume.asm, de exemplu, op_aritm.asm, în folderul de proiect. Dacă acest
folder nu a fost creat într-o fază precedentă, poate fi creat tot acum, cu numele, de
exemplu, Aritm.
3. Se vor parcurge toate operaţiile premergătoare construirii proiectului aplicaţiei, începând
cu comanda Project Wizard:
• Selectarea microcontrolerului PIC 12F675, în fereastra Select a device.
• Selectarea limbajului de programare (Assambler) şi locaţiei acestuia se face în
fereastra Select a language toolsuite.

37
Aplicaţii hardware şi software cu microcontrolerul PIC 12F675 Lecţia nr. 4

• Introducerea unui nume şi a unei locaţii pentru proiect, în fereastra Name your
Project. În exemplul nostru folderul de proiect este Aritm, iar numele proiectului să
fie Apl_1.
• Includerea în proiect a fişierului sursă, în fereastra Add any existing files your
project, se realizează astfel:
o Se va selecta numele şi locaţia fişierului sursă scris în limbaj de asamblare, în
exemplul nostru op_aritm.asm din folderul Aritm,
o Se apasă butonul Add pentru includerea acestuia în proiect.
3. Se va construi proiectul, cu comanda Build All din meniul Project sau cu butonul .
4. Se rulează programul aplicaţiei în simulator. Vom utiliza programul de simulare
MPLAB SIM care se lansează în execuţie cu comanda: Debugger → Select Tool →
MPLAB SIM. Pentru verificarea execuţiei corecte a operaţiilor aritmetice din exemplul
numeric, se vor executa următoarele comenzi de simulare:
• Se deschide fereastra File Registers din meniul View în care se va seta conţinutul
locaţiilor de memorie de la adresele 30H şi 31H cu valorile din exemplul numeric,
adică 20H respectiv 26H, astfel:
o Se marchează valoarea 00 de la adresa 0x30,
o Se scrie noua valoare, în exemplul nostru 20,
o Se validează înscrierea cu tasta ENTER.
o Se procedează similar pentru încărcarea valorii 26H la adresa următoare (0x31).
• Se deschide fereastra Watch din meniul View în care se selectează pentru afişare
registrele PCL, WREG, CT1, CT2, REZ_FINAL, REZ_INTERM.
• Se deschide fereastra Disassemby Listing din meniul View, pentru urmărirea
execuţiei liniilor de program.
• Se resetează PC cu comanda Reset sau cu butonul .
• Se rulează programul. Recomandăm pentru această aplicaţie rularea programului cu
întrerupere controlată, după executarea fiecăreia din cele trei etape. Pentru aceasta, se
vor defini trei breakpoint-turi la adresele 0x0B, 0x0E şi 0x10, în fereastra de
dezasamblare, Disassembly Window. Această operaţie se realizează astfel:
o Se selectează comanda Breakpoints din meniul Dedugger,
o În fereastra deschisă de comandă, se tastează în câmpul Break at adresele
respective,
o Se validează cu tasta ENTER.
Ca urmare, în Disassembly Window apare semnul breakpoint-ului (litera B pe o
bulină roşie) în dreptul liniilor de program având adresele respective.
Observaţie: Există şi o comandă scurtă pentru definirea unor puncte de întrerupere,
mai uşor de folosit, şi anume dublu click cu butonul mouse-ului în dreptul liniei
respective.
Acum, pentru rularea programului se vor executa succesiv comenzile:
• Se apasă butonul (Run). Execuţia programului se va opri la adresa 0x0B;
• Se apasă din nou butonul . Execuţia programului se va opri la adresa 0x0E;

38
Aplicaţii hardware şi software cu microcontrolerul PIC 12F675 Lecţia nr. 4

• Se apasă pentru ultima oară butonul Run pentru execuţia ultimei etape a
programului.
• Se apasă butonul (Step Into) pentru execuţia ultimei instrucţiuni.
Observaţie: La fiecare etapă de execuţie a programului se va urmări modificarea
conţinutului registrelor în Watch Window conform cu acţiunea instrucţiunilor
executate.

APLICAŢIA 2 – OPERAŢII LOGICE


Aplicaţia pe care ne propunem s-o dezvoltăm tratează efectuarea unor operaţii logice
între trei biţi, situaţi pe poziţii diferite (bit 7, bit 5 şi bit 3) în trei registre din memoria RAM
a microcontrolerului (OP1, OP2, OP3) şi stocarea rezultatului într-un al patrulea registru
(REZ), pe poziţia bit 0. Concret, dorim să procesăm următoarea operaţie logică:
(OP1.7 OR OP2.5) XNOR OP3.3 → REZ.0
Pentru verificarea corectitudinii programului, vom exemplifica operaţia, la rularea în
simulator, cu următoarele valori binare:
OP1.7 = 1; OP2.5 = 0; OP3.3 = 1.
Rezultatul obţinut va trebui să fie: REZ.0 = 1.
Pentru cele patru registre implicate în operaţie se vor alege adresele 51, 52, 53 şi 54
în bancul 0 din memoria RAM a microcontrolerului.

Elaborarea organigramei şi a programului sursă


Pentru elaborarea organigramei, vom avea în vedere următoarele:
• În setul de instrucţiuni al microcontrolerului nu există instrucţiuni de procesare
logică pe bit. Prin urmare, putem efectua doar operaţii logice între registre;
• În aceste condiţii va trebui ca biţii de interes (bit 7 din registru OP1, bit 5 din OP2
şi bit 3 din OP3) să aibă aceeaşi poziţie în registrul din care sunt citiţi. Aceasta se
va obţine printr-o operaţie de rotire (spre stânga sau spre dreapta) a registrelor;
• În cazul nostru, vom roti registrul OP1 de două ori spre dreapta şi OP3 de două
ori spre stânga. După această operaţie, cele trei variabile logice OP1.7, OP2.5 şi
OP3.3 se vor afla pe poziţia bit 5 în toate cele trei registre;
• Rezultatul operaţiei logice se va forma în poziţia bitului 5 din registrul REZ.
Pentru aducerea rezultatului în poziţia bitului 0 (conform cu cerinţele din enunţ),
se va roti conţinutul acestuia de cinci ori spre dreapta.
Cu aceste precizări, organigrama acestei aplicaţii va fi cea din figura 4.2. Conform
acesteia, programul devine:

39
Aplicaţii hardware şi software cu microcontrolerul PIC 12F675 Lecţia nr. 4

Aplicaţia 2

Se roteşte spre dreapta de


două ori registrul OP1

Se execută
(Op1 OR OP2) W

Se roteşte spre stânga de


două ori registrul OP3

Se execută
(W XNOR OP3) REZ

Se roteşte spre dreapta de


cinci ori registrul REZ

End

Figura 4.2.Organigrama aplicaţiei 2


;Operaţii logice
;Programul va executa următoarele operaţii logice
; (OP1.7 OR OP2.5) XNOR OP3.3
; şi va depune rezultatul în registrul REZ de la adresa 0x54 pe poziţia bit 0
list p=12f675 ;Directiva de definire a procesorului
#include <p12f675.inc>
errorlevel -302 ;Elimină mesajul de tip 302 din fişierul de tip listă
errorlevel -305
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF &
_PWRTE_ON & _INTRC_OSC_NOCLKOUT
;Directiva '__CONFIG' pentru configurarea perifericelor în fişierul sursă
;Definirea unor registre specifice aplicaţiei cu directiva CBLOCK
cblock 0x51
OP1 ;Registrul OP1 va avea adresa 0x51
OP2
OP3
REZ
endc
;Definirea variabilelor de program cu directiva DEFINE
#define Bank0 0x00 ;Definirea variabilei Bank0 (atribuirea unei valori simbolului Bank0)
#define Bank1 0x80 ;Definirea variabilei Bank1
;Initialize: secvenţa de iniţializare SFR-urilor şi a celor de uz general
org 0x005 ;Adresa de Start a memoriei program
Initialize
; call 0x3FF ;Restabilirea factorului de calibrare - instrucţiune comentariu
; necesară în cazul utilizării simulatorului.
clrf REZ
banksel Bank1 ;Selectare Bank 1
movwf OSCCAL
banksel Bank0

40
Aplicaţii hardware şi software cu microcontrolerul PIC 12F675 Lecţia nr. 4

movf OP2,0 ;Se trece în W conţinutul registrului OP2


bcf STATUS,0 ;Se resetează bitul Carry, care va fi folosit în operaţia de rotire
rrf OP1
rrf OP1
iorwf OP1,0
bcf STATUS,0
rlf OP3
rlf OP3
xorwf OP3
comf OP3,0
movwf REZ
bcf STATUS,0
rrf REZ
rrf REZ
rrf REZ
rrf REZ
rrf REZ
end

Construirea proiectului şi rularea programului


1. Se vor parcurge toate operaţiile programare pentru construirea proiectului aplicaţiei.
2. Se face testarea/depanarea programului aplicaţiei în simulator, care se lansează în
execuţie cu comanda deja cunoscută: Debugger → Select Tool → MPLAB SIM.
• Se deschide fereastra Watch din meniul View în care se selectează pentru afişare
registrele PCL, WREG, STATUS, OP1, OP2, OP3, REZ.
• Se deschide fereastra Disassemby Listing din meniul View, pentru urmărirea
execuţiei liniilor de program.
• Se setează valorile cu care se încarcă registrele pentru exemplul propus, după cum
urmează:
o 0x80 pentru OP1 (OP1.7 = 1),
o 0x00 pentru OP2 (OP2.5 = 0),
o 0x08 pentru OP3 (OP3.3 = 1).
Setarea acestor valori se face fie în fereastra File Registers (care se deschide cu
View), fie chiar în fereastra Watch. Vom face aceste setări în fereastra Watch astfel:
o se marchează locul unde urmează să se execute modificarea cu dublu click mouse
pe câmpul valorii curente a registrului,
o se tastează noua valoare,
o se validează cu tasta ENTER.
• Se resetează PC cu comanda Reset sau cu butonul .
o Se rulează programul. Recomandăm pentru această aplicaţie rularea programului
pas cu pas (cu butonul – Step Into).
o În fereastra Watch se vor urmări valorile registrelor folosite în program şi se va
verifica că la terminarea execuţiei programului valoarea registrului REZ este
F7H, adică bitul de interes REZ.0 = 1.

Exerciţiu individual
Refaceţi simularea programului şi pentru alte valori ale biţilor implicaţi în operaţie
urmărind dacă rezultatul este cel corect.

41
Aplicaţii hardware şi software cu microcontrolerul PIC 12F675 Lecţia nr. 4

APLICAŢIA 3 – BUCLĂ DE TEMPORIZARE


În numeroase aplicaţii este necesar să realizăm anumite temporizări prin programarea
microcontrolerului, dar fără să utilizăm timer-ul. O astfel de temporizare se poate realiza
prin parcurgerea de un anumit număr de ori a unui număr de linii de program (buclă) şi
calcularea duratei totale de execuţie.
Cunoscând durata de execuţie a fiecărei instrucţiuni (furnizată de constructor), se va
putea calcula cu exactitate durata de parcurgere a buclei iar apoi, în funcţie de întârzierea
cerută, se va putea determina de câte ori este necesar să fie parcursă bucla pentru obţinerea
respectivei întârzieri. Pentru o mai bună înţelegere a celor de mai sus, se va considera
următoarea secvenţă de program:
movlw 0x20
movwf TEMP ;Se încarcă registrul TEMP, definit de utilizator în prealabil,
; cu constanta 20h (32D)
Decr
nop ;Instrucţiune de pauză (inoperantă)
nop
decfsz TEMP,f ;Decrementează registrul TEMP şi sari instrucţiunea
; următoare dacă conţinutul lui este 0
goto Decr ;Dacă nu, execută salt la Decr
end

Instrucţiunile specifice unui microprocesor se execută în unul sau mai multe cicluri
maşină. Un ciclu maşină reprezintă intervalul de timp (măsurat în perioade ale generatorului
de tact) în care se execută o operaţie elementară. În cazul microcontrolerului PIC 12F675,
un ciclu maşină cuprinde 4 impulsuri de tact, astfel încât rezultă că durata ciclului maşină
este de 1 μs (la frecvenţa oscilatorului de 4 MHz).
Din Datasheet-ul circuitului rezultă că instrucţiunile utilizate în secvenţa de program
de mai sus se execută într-un ciclu maşină, mai puţin instrucţiunea de salt goto Decr care se
execută în două cicluri maşină. Instrucţiunea decfsz TEMP,f se execută în 2 μs doar când se
execută saltul (conţinutul registrului TEMP este 0), altfel şi aceasta se execută tot în 1 μs.
Având în vedere cele de mai sus, putem calcula durata de execuţie a programului,
astfel:
[2 + (2 + 1 + 2) ⋅ 31 + (2 + 2)] ⋅ 1 μs = 161
Pentru o tratare sistematizată a modului cum se calculează durata unui program,
introducem următoarele notaţii:
NB – numărul care indică de câte ori este parcursă bucla,
NIB – numărul de cicluri maşină în care sunt executate instrucţiunile cuprinse în buclă
NEB – numărul de cicluri maşină în care se execută instrucţiunile din afara buclei
TM – durata unui ciclu maşină
N – numărul total de cicluri maşină în care se execută programul
Cu aceste notaţii, durata programului se calculează cu formula:
T = N · TM = (NEB + NB · NIB) · TM.
În cazul exemplului de mai sus, avem:
NEB = 6; NIB = 5; NB = 31 şi TM = 1 μs.
Rezultă că timpul în care se execută programul este:

42
Aplicaţii hardware şi software cu microcontrolerul PIC 12F675 Lecţia nr. 4

T = (6 + 31 · 5) · 1 μs = 161 μs.

Aplicaţie practică
Să se scrie un program care să asigure o temporizare de 1 ms.
O variantă de rezolvare după exemplu de mai sus ar fi:
NIB = 4; NEB = 4; NB = 249D.
Cu aceste date calculăm durata programului:
T= (4 + 249 · 4) · 1 μs = 1000 μs.
Programul sursă este următorul:
;Program de exemplificare pentru obţinerea unei temporizări
list p=12f675
#include <p12f675.inc>
errorlevel -302
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF &
_PWRTE_ON & _INTRC_OSC_NOCLKOUT
#define Bank0 0x00
#define Bank1 0x80
cblock 0x20
TEMP
endc
ORG 0x005
Initialize
; call 0x3FF ;Restabilirea factorului de calibrare – instrucţiune comentariu
; necesară în cazul utilizării simulatorului.
BANKSEL Bank1 ;Selectare BANK1
movwf OSCCAL ;Actualizare factor de calibrare oscilator
movlw 0x0F9
movwf TEMP ;Se încarcă TEMP cu constanta 0F9h (249D)
Bucla
nop ;Instrucţiune de pauză (inoperantă)
decfsz TEMP,f ;Decrementează registrul TEMP şi sari instrucţiunea
; următoare dacă conţinutul lui este 0
goto Bucla ;Dacă nu, salt la Bucla
nop
end

1. Se vor parcurge toate operaţiile de programare pentru construirea proiectului aplicaţiei.


2. Se face testarea/depanarea programului aplicaţiei în simulator, care se lansează în
execuţie cu comanda deja cunoscută: Debugger → Select Tool → MPLAB SIM.
Pentru a putea verifica că execuţia programului se face în timp de 1 ms, se va utiliza
comanda Stopwatch din meniul Debugger. Se va deschide fereastra Stopwatch care afişează
numărul de cicluri maşină (Instruction Cycles) şi timpul în care se execută. În această
fereastră este bine să se seteze opţiunea de lucru Clear Simulation Time on Reset pentru ca
momentul de început a fiecărei operaţii de rulare în simulator să fie 0 s.
Recomandăm ca pentru testarea acestei aplicaţii să se definească un breakpoint la
adresa 7H (în fereastra Disassembly listing în dreptul ultimei instrucţiuni nop) iar aranjarea
ferestrelor de lucru să se facă ca în figura 4.3 pentru a putea urmări simultan variabilele de
program specifice.

43
Aplicaţii hardware şi software cu microcontrolerul PIC 12F675 Lecţia nr. 4

Figura 4.3. Ferestre de lucru la verificarea aplicaţiei 3


Rularea programului se va face:
• pas cu pas (Step Into), pentru câteva instrucţiuni verificând durata de execuţie în
fereastra Stopwatch;
• în mod continuu cu comanda Run (butonul ); execuţia se va opri la adresa
punctului de întrerupere;
• pas cu pas, pentru execuţia ultimei instrucţiuni.

Exerciţiu individual
Realizaţi un proiect similar pentru întârzieri de 50 ms, respectiv 100 ms.

APLICAŢIA 4 – SCRIEREA UNEI CONSTANTE ÎNTR-O ZONĂ A MEMORIEI RAM


PRIN ADRESARE INDIRECTĂ
Cu această aplicaţie dorim să exemplificăm modul de utilizare al registrelor folosite
în adresarea indirectă a memoriei RAM, adică a registrelor FSR (File Select Register) şi
INDF (Indirect File).
Concret, ne propunem să iniţializăm cu valoarea 0 locaţiile de memorie având
adresele cuprinse între 30H si 4FH şi apoi încărcarea aceloraşi locaţii cu valoarea 0AAH).
Pentru elaborarea programului reamintim că adresarea indirectă a memoriei RAM a
microcontrolerului PIC 12F675 (care au adrese cuprinse între 20H şi 6FH) se face prin
intermediul registrului INDF a cărui adresă curentă se păstrează într-un alt registru cu
funcţii speciale denumit FSR.
Programul aplicaţiei este următorul:
;Încărcarea locaţiilor de memorie având adresele cuprinse între 30H si 4FH cu constanta 0AAH,
; după ce această zonă de memorie a fost iniţializată cu valoarea 0.

44
Aplicaţii hardware şi software cu microcontrolerul PIC 12F675 Lecţia nr. 4

list p=12f675 ;Directiva de definire a procesorului


#include <p12f675.inc>
errorlevel -302 ;Elimină mesajul de tip 302 din fişierul de tip listă
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF &
_PWRTE_ON & _INTRC_OSC_NOCLKOUT

org 0x005 ;Adresa de Start a memoriei program


Initialize
; call 0x3FF ;Restabilirea factorului de calibrare
clrf FSR
bsf STATUS,RP0 ;Selectare Bank 1
movwf OSCCAL ;Încărcarea registrului OSCCAL cu valoarea
; factorului de calibrare
bcf STATUS,RP0 ;Selectare Bank 0
movlw 0x30
movwf FSR ;Încarcă în FSR adresa de început a zonei de memorie
; care urmează să fie iniţializată
Init
clrf INDF ;iniţializează cu valoare 0 conţinutul registrului a cărui adresă
; se află în FSR
incf FSR ;Se încarcă în FSR următoarea adresă
movlw 0x50
subwf FSR,0
btfss STATUS,C ;Dacă adresa curentă este ≥50H,
; se va sări instrucţiunea următoare
goto Init
movlw 0x30
movwf FSR ;Se reîncarcă adresa de început a zonei de memorie care
; urmează să să fie înscrisă cu valoarea 0AAH
nop
Write
movlw 0x0AA
movwf INDF
incf FSR
movlw 0x50
subwf FSR,0
btfss STATUS,C
goto Write
nop
end

Observaţie: Instrucţiunile NOP de la sfârşitul secvenţei Init şi al secvenţei Write au


fost introduse pentru a putea folosi modul de rulare Animate, reducând astfel timpul
de execuţie, aşa cum se va vedea în continuare.
1. Se va construi proiectul acestei aplicaţii.
2. Se va lansa programul Debugger pentru aplicaţiei în simulator, în care:
• Se vor deschide ferestrele Disassemby Listing şi File Registers în care se va urmări
atât executarea liniilor de program cât şi modificarea conţinutului registrelor FSR
(adresa 04H) şi a registrelor din zona de lucru (adrese 30H … 4FH).

45
Aplicaţii hardware şi software cu microcontrolerul PIC 12F675 Lecţia nr. 4

• Se vor introduce două breakpoint-uri la adresele 13H şi 1BH.


• Se va rula programul astfel:
o pas cu pas până la secvenţa Init.
o Animate (se comandă cu butonul ) mod în care oprirea se va face la primul
breakpoint (ieşirea din secvenţa Init), adică la prima instrucţiune NOP din
program.
o se vor executa câteva instrucţiuni pas cu pas, apoi se va continua secvenţa Write
în mod Animate. Execuţia programului se va opri la al doilea bkp (adică la a doua
instrucţiune NOP din program).
• Se va urmări continuu în timpul rulării programului modificările din registrul FSR şi
din registrele RAM cu adrese cuprinse între 30H … 4FH.

Exerciţiu individual
Rulaţi programul aplicaţiei 3 în regim Animate.

46

You might also like