You are on page 1of 102

Elektronski fakultet u Niu

Katedra za elektroniku
Predmet: Mikroprocesorski sistemi
prof. dr Mile Stojev

SIMULACIJA PIC MIKROKONTROLERA


PREKO SOFTVERA PIC SIMULATOR IDE

Student:
Ranko Prokopovi
10609

SADRAJ

1.
2.
3.
4.
5.
6.
7.
8.
9.

Uvod.........................................................................................3
Opis mikrokontrolera PIC16F877.............................................4
Asembler za PIC mikrokontrolere...........................................13
PIC simulator IDE...................................................................30
Primeri....................................................................................46
Laboratorijske vebe..............................................................99
Zakljuak...............................................................................100
Literatura...............................................................................101
CV.........................................................................................102

1. Uvod
Misao vodilja autora ovog seminarskog rada bila je da studentima priblii program PIC
Simulator IDE, koji je razvio Vladimir oo iz Zemuna. U pitanju je simulator velikog broja
mikrokontrolera 12F i 16F serija. Detaljnije informacije o pomenutom programu su
dostupne na sajtu http://www.oshonsoft.com/pic.html, a koriste ga brojni renomirani
koledi i fakulteti.
U radu je dat kratak opis mikrokontrolera PIC16F877, pregled menija PIC Simulator IDE,
napisano je 8 primera u asembleru, uraena su 3 jednostavna i 3 naprednija primera kao i
4 dopunska primera. Na kraju su u Laboratorijskoj vebi dati zadaci za samostalan rad
studenata tanije, omogueno je da studenti samostalno isprogramiraju neke
jednostavne aplikacije.
Nadam se da e naredni opis programa PIC Simulator IDE naii na dobar prijem kod
studenata i da e ih zaintrigirati da koriste PIC mikrokontrolere.

2. OPIS MIKROKONTROLERA PIC16F877


2.1. OSNOVNE KARAKTERISTIKE MIKROKONTROLERA
PIC16F877 je Microchip-ov 8-bitni CMOS mikrokontroler baziran na flash
tehnologiji.To znai da u samom ipu postoji programska memorija koja se upisuje i brie
elektrinim putem, to je daleko naprednije od brisanja EPROM-a UV zracima.
RISC arhitektura omoguuje odvojene magistrale 8-bitnih podataka i 14-bitne
programske memorije, pa je mogue da se pribavlja naredna instrukcija dok se izvrava
tekua (eng. pipelining). Sve instrukcije traju jednako (osim u sluaju grananja programa) i
zavre se za etiri ciklusa oscilatora. Dakle, ako je oscilator konfigurisan na 4 MHz, dobija
se da ciklus instrukcije iznosi 1 s.
Jezgro mikrokontrolera PIC16F877 proizvodi se u 40-pinskom (DIP) ili u 44pinskim kuitima (QFP i PLCC), Slika 2-1.

Slika 2-1. Kuita u koja se pakuje PIC16F877 (a. DIP-40, b.PLC-44, c.TQFP-44)
Sa blok dijagrama kojeg daje Microchip (Slika 2-2) moe se ustanoviti da se
koncepcija ovog mikrokontrolera ne razlikuje mnogo od koncepcije RISC mikrokontrolera
drugih proizvoaa prisutnih na tritu. Uoavaju se standardne komponente:
Flash programska memorija 8 kilorei
RAM (File Registers) 368 bajtova
Aritmetiko-logika jedinica (ALU)
Akumulator (Working Register)
Hardverski magacin (Stack) sa 8 nivoa
EEPROM memorija podataka 256 bajtova
Razne periferne jedinice (portovi, tajmeri, A/D konvertor, USART,...)

PIC16F877 podrava tehniku prekida (eng. interrupts). Postoji ukupno 14 izvora


prekida, to spoljanjih, to unutranjih. Svaki prekid nema sopstveni interapt-vektor,
ve postoji jedinstvena adresa (0x0004) od koje se nastavlja izvravanje programa
kada se dogodi bilo koji od njih. Tada je na programeru da prozivanjem zastavica/markera
pojedinih prekida (eng. interrupt flags polling) ustanovi ko trai prekid i uputi program
na izvravanje odgovarajue rutine za obradu. Adresa na koju se program treba vratiti po
obradi prekida uva se automatski u hardverskom magacinu i u programski broja
vraa izvravanjem instrukcije RETFIE.

Slika 2-2. Arhitektura mikrokontrolera


Ono to mikrokontrolere izdvaja od ostalih procesora jeste prisustvo raznih
specijalnih kola koja se trebaju izboriti sa potrebama real-time aplikacija. Ovaj
mikrokontroler poseduje niz osobina potrebnih da se maksimizuje pouzdanost sistema,
minimizuje cena kroz eliminaciju eksternih komponenti, omogue reimi niske potronje
energije, pruanje zatite programskog kda. Upotreba navedenih resursa definie se
u programatorskom softveru upisom odgovarajue konfiguracione rei u registar CONFIG.
Taj registar je dostupan samo u toku upisa programa u mikrokontroler i drugaije se ne
moe adresirati.
Meu ponuenim karakteristikama postoji mogunost izbora etiri tipa oscilatora,
mogunost upotrebe Power-up (PWRT) i Oscilator Start-up (OST) tajmera, te
eventualno korienje Power-on (POR) i/ili Brown-out (BOR) reseta. Poveanju

pouzdanosti kroz spreavanje zalaska programa u mrtve petlje pomae upotreba


Watchdog tajmera (WDT). Zatitu kda od neeljenog itanja prua opcija code protection.
Za ureaje sa baterijskim napajanjem interesantna mogunost je Sleep Mode, reim
sa smanjenom potronjom energije, kada se program ne izvrava, ali rade neke periferne
jedinice koje mogu probuditi mikrokontroler. Tada je potronja mikrokontrolera ispod 1
A.

Slika 2-3. Mapa programske memorije


Napajanje se dovodi na pinove VDD, a masa na pinove VSS. Noice OSC1 i
OSC2 slue za prikljuenje oscilatorskih komponenti (RC-kolo ili rezonator), odnosno
prikljuenje eksternog oscilatora kao bolje, ali skuplje varijante. Osim za reset-kolo pin
1 (MCLR/VPP) ima ulogu u toku procesa programiranja mikrokontrolera. Ostalih 33
pina predstavljaju I/O linije. Oni su grupisani u pet portova (PORT A, B, C, D i E) i
svaki od njih je individualno konfigurabilan kao izlazni ili kao ulazni. Osim opte
namene, veina pinova ima i specifinu svrhu koja se programski dodeljuje u sluaju
korienja nekih specijalnih periferija mikrokontrolera (brojaa, serijske komunikacije,
A/D konvertora i dr.)
Na kraju ovog uvoda treba napomenuti da su Microchip PIC mikrokontroleri
dominantni u odnosu na konkurentne relativno visokom strujom koju moe propustiti I/O
pin (25 mA). Takoe, ova familija mikrokontrolera poseduje veoma irok opseg napona
napajanja koji se protee od 2,0 V do 5,5 V.

2.2. MEMORIJSKA MAPA MIKROKONTROLERA


Strukturu memorije kod PICmicro mikrokontrolera ine tri odvojena bloka:

Programska memorija
Memorija podataka
EEPROM memorija podataka.

Odvojeno od navedenih memorijskih blokova egzistira zasebna struktura magacin


(stack), koja se sastoji od osam 13-bitnih registara. Stek pointer se ne moe itati i
upisivati. Prilikom izvrenja instrukcije CALL ili prilikom poziva prekida mikrokontrolera,
adresa sledee instrukcije se stavlja na magacin. Ponovno vraanje starog sadraja
programskog brojaa izaziva izvrenje instrukcije RETURN, RETFIE ili RETLW. Magacin
radi na principu cirkularnog bafera, to znai da se u njega moe staviti osam razliitih
adresa, a da pokuaj unoenja devete izaziva brisanje prve i tako redom. Programski
se ne moe utvrditi da li je dolo do prepunjavanja magacina.
Organizacija programske memorije
PIC16F877 mikrokontroleri imaju 13-bitni programski broja (PC) koji moe da
adresira memorijski prostor od 8k programskih rei od 14 bita. Reset vektor je 0x0000 i od
njega poinje izvravanje programa. Interapt vektor je 0x0004. Mapa programske
memorije i magacin prikazani su dijagramom na Slici 2-3.
Organizacija memorije podataka
Memorija za podatke je izdeljena u vie celina banki (eng. banks), a sastoji se od
registara opte namene (General Purpose Registers) i registara specijalne funkcije
(Special Function Registers). U jednom od specijalnih registara, tzv. STATUS registru
postoje dva bita RP1 i RP0 koji slue za odabir eljene banke podataka po principu:

Svaka banka moe da sadri do 128 registara (0x7F). Nie lokacije u banci
zauzimaju specijalni registri, a ostatak prostora popunjavaju registri opte namene
implementirani kao statiki RAM. Neki specijalni registri koji se esto koriste mapirani
su u sve banke da bi se omoguio bri pristup i redukcija kda.
Mapa registara procesora PIC16F877A prikazana je na Slici 2-4. Nekoliko
specijalnih registara su registri jezgra, usko povezani sa funkcionisanjem CPU. Ostali
registri su vezani za periferne module i slue njihovom upravljanju i kontroli statusa.
Sledi opis nekoliko najvanijih i najee korienih registara jezgra:
- Programski broja (PC) odreuje adresu instrukcije u programskom fleu koja e
sledea biti pribavljena. Re je o 13-bitnom registru. Simboliko ime nieg bajta je PCL. To
je registar koji se moe i upisivati i iitavati. Teih pet bita programskog brojaa
smeteni su u izolovani registar PCH kojem se pristupa samo preko lea PCLATH
mapiranom u internom RAM-u na adresi 0x0A.
- STATUS registar je veoma bitan i zato je predvieno da se moe adresirati iz bilo
koje banke. On pokazuje status aritmetiko-logike jedinice, reset status mikrokontrolera i

Slika 2-4. Registarska mapa mikrokontrolera


sadri bite za selekciju banki internog RAM-a. Od navedenih flegova posebno treba
izdvojiti Zero bit (Z) koji se postavlja kad je rezultat aritmetike operacije jednak nuli i bit
prenosa (eng. Carry - C).
- Registar OPTION_REG se koristi za konfiguraciju preskalera za tajmer 0 ili
Watchdog, za upravljanje tajmerom 0, selekciju ivice okidanja eksternog interapta, te za
omoguenje Pull-up otpornika na portu B.
- INTCON je registar za manipulisanje sistemom prekida mikrokontrolera. Pored
bita za omoguenje svih prekida (GIE) i bita za omoguenje perifernih prekida (PEIE), u
ovom registru su interapt-flegovi i biti omoguenja prekida tajmera 0, spoljanjeg
prekida na pinu RB0/INT i prekida porta B na promenu stanja. Osim ova tri osnovna
prekida postoji jo 11 periferijskih prekida. Bitovi za njihovo omoguenje nalaze se u
registrima PIE1 i PIE2, a korespondentni flegovi, vesnici interapta, u registrima PIR1 i
PIR2. Ovi se flegovi setuju im se ispuni uslov interapta bez obzira na stanje njihovog bita
omoguenja, a po izvrenju servis rutine potrebno ih je softverski resetovati.
- Kada je re o registrima jezgra ne treba zaboraviti par FSR (File Select Register) i
INDF (Indirect File), koji slue za indirektno adresiranje memorije podataka. Bilo koja
instrukcija koja se obraa INDF registru, u stvari, indirektno pristupa onoj lokaciji
internog RAM-a ija je adresa trenutno u registru FSR.
- Konano, treba spomenuti registar PCON (Power Control Register). U PIC16F877
ovaj registar sadri samo dva bita. Pomou bita POR detektuje se razlika izmeu Poweron reseta i reseta izazvanih drugim uzrokom. Drugi bit (BOR) slui kao indikacija
8

Brown-out stanja (nedozvoljeni naponski nivoi u napajanju mikrokontrolera), zbog kojeg se


takoe moe desiti reset.
Interni EEPROM za podatke
Ova memorija sadri 256 bajtova. Ukoliko je potrebno neke podatke sauvati i po
ukidanju napajanja mikrokontrolera, treba ih prethodno zapisati u interni EEPROM.
2.3. OPIS PERIFERNIH JEDINICA
I/O portovi
Za vezu mikrokontrolera sa svetom oko sebe zadueni su ulazno/izlazni portovi. Ima
ih pet i oznaeni su slovima od A do E. Nejednake su irine, pa tako port E ine
samo tri pina, port A est, a ostala tri porta su osmopinski.
Neki pinovi I/O porta su povezani sa nekom perifernom funkcijom mikrokontrolera.
Jedino ako je odgovarajua periferna jedinica neupotrebljena, mogue je njen pin
koristiti kao I/O liniju opte namene. Konfiguracija smera portova vri se upisom
konfiguracionog bajta u pripadajui TRIS registar po pravilu da nula ini pin izlaznim, a
jedinica ulaznim.
Svaki port poseduje odgovarajui registar (PORTX) preko kojeg se programski
pristupa I/O pinovima. Upis u neki od tih registara inicirae upis u le tog porta, a
njegovo itanje rezultirae itanjem logikih stanja direktno sa pinova. Sve instrukcije
upisivanja su tzv. read-modify-write instrukcije. To znai da se pri upisu u port prvo
oitaju stanja pinova, izvri modifikacija, a potom ispravljena vrednost smesti u le porta.
Nema velike razlike u elektrinoj konstrukciji navedenih pet portova. Port B se od
ostalih razlikuje interesantnom opcijom koju nude etiri njegova via bita. Ukoliko se setuje
bit RBIE u registru INTCON, svaka promena stanja na ovim pinovima izazvae prekid
mikrokontrolera.
Port A
PortA je 6-bitni (RA5 RA0) bidirekcioni port (podaci mogu da se alju u oba smera).
Sadraj registra TRISA odreuje smer pinova na portu, da li je pin ulazni ili izlazni. PortA
ima mogunost analogno-digitalne konverzije i prvenstveno se koristi u te svrhe. U
mikrokontroleru je integrisan 10-bitni A/D konvertor sa 8 ulaznih kanala ali se u ove svrhe
koriste i svi pinovi porta E kao i pinovi porta A sem pina RA4. Pin RA4 je sa otvorenim
drejnom i moe da se koristi za ulazni takt tajmera TIMER0.
RA0/AN0
RA1/AN1
RA2/AN2
RA3/AN3/Vref
RA4/T0CKI
RA5/AN4/SS

I/O (ulaz/izlaz)
I/O (ulaz/izlaz)
I/O (ulaz/izlaz)
I/O (ulaz/izlaz)
I/O (ulaz/izlaz)
I/O (ulaz/izlaz)

ili analogni ulaz


ili analogni ulaz
ili analogni ulaz
ili analogni ulaz ili referentni napon Vref
ili eksterni ulazni takt za tajmer TIMER0
ili analogni ulaz ili SS (Slave Select) ulaz za sinhroni serijski port

Port B
Port B je 8-bitni bidirekcioni port. Svakom pinu porta korespondira odgovarajui bit
u registru TRISB kojim se definie smer (ulaz ili izlaz). Svi pinovi ovog porta poseduju
pullup otpornike. Ovi otpornici mogu da se ukljue jednim kontrolnim bitom. To se postie
postavljanjem odgovarajueg bita na '0'. Pull-up otpornici se automatski iskljuuju kada se
pin definie kao izlazni. Otpornoci su iskljueni i kod Power-on reseta. etiri pina ovog
porta (RB7 do RB4) imaju mogunost generisanja prekida. Jedino pinovi definisani kao
ulazni imaju mogunost uzrokovanja prekida.
RB0/INT
RB1
RB2
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD

I/O (ulaz/izlaz) ili eksterni ulaz prekida (interupt)


I/O (ulaz/izlaz)
I/O (ulaz/izlaz)
I/O (ulaz/izlaz) ili LVP (Low Voltage Programming) pin za programiranje
I/O (ulaz/izlaz) sa opcijom interrupt-on-change
I/O (ulaz/izlaz) sa opcijom interrupt-on-change
I/O (ulaz/izlaz) sa opcijom interrupt-on-change ili In-Circuit debager pin. Takt za serijsko
programiranje
I/O (ulaz/izlaz) sa opcijom interrupt-on-change ili In-Circuit debager pin. Podaci za serijsko
programiranje

Port C
Port C je 8-bitni bidirekcioni port. Ovaj port je poseban po tome to ima ugraen
USART modul koji slui za serijsku komunikaciju (sa raunarom ili drugim mikrokontrolerom). Modulu USART se pristupa preko pinova RC7 i RC6. Ove pinove treba softverski
konfigurisati da budu u funkciji USART modula.
RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
RC2/CCP1
RC3/SCK/SCL
RC4/SDI/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT

I/O (ulaz/izlaz) ili izlaz oscilatora za TIMER1 ili ulaz takta za TIMER1
I/O (ulaz/izlaz) ili ulaz oscilatora za TIMER1 ili ulaz Capture2/izlaz Compare2/izlaz
PWM2 (Pulse With Modulation)
I/O (ulaz/izlaz) ili ulaz Capture1/izlaz Compare1/izlaz PWM1
ovaj pin moe da slui za sinhroni serijski takt reima rada SPI (Serial Peripheral
Interface) kao i I2C (Inter-Integrated Circuit)
ovaj pin moe da slui kao pin podataka za SPI i I2C modove
I/O (ulaz/izlaz) ili serijski sinhroni izlaz podataka
I/O (ulaz/izlaz) ili USART asinhroni transmiter ili sinhroni takt
I/O (ulaz/izlaz) ili USART asinhroni risiver ili sinhroni podaci (data)

Port D
Port D je 8-bitni bidirekcioni port. Ovaj port moe da se konfigurie kao paralelni
mikroprocesorski port (parallel slave port PSP).
Port E
Port E je 3-bitni bidirekcioni port. Ima mogunost A/D konverzije. Pinovi mogu da se
konfiguriu kao analogni ili digitalni, kao kod porta A.
Tajmeri
Ove se periferije koriste za merenje vremena i brojanje eksternih dogaaja.
Ugraena su tri tajmerska modula (TMR 0,1,2) od kojih svaki ima svoje specifinosti.
Tajmer0 je jednostavni 8-bitni broja koji generie interapt pri prelasku sa 0xFF na
0x00 (overflow). Poseduju ga svi nii PICmicro procesori i ovde je zadrana
10

kompatibilnost s njima. Izvor takta za tajmer 0 moe biti bilo interni sistemski sat (Fosc/4),
bilo spoljanji generator takta spojen na pin RA4/T0CKI. Mogue je podesiti da se broja
inkrementira na rastuu ili opadajuu ivicu spoljanjeg signala.
U sadejstvu sa modulom tajmera 0 moe se koristiti programabilni preskaler (delilac
frekvencije) sa odnosima deljenja od 1:2 do 1:256. Ukoliko deljenje nije potrebno
preskaler se dodeli watchdog tajmeru.
Kada je preskaler u upotrebi maksimalna frekvencija eksternog izvora iznosi 50 MHz
to je vee od maksimalne frekvencije samog mikrokontrolera.
Tajmer 1 je 16-bitni i osposobljen je da radi kao broja/mera vremena. Ima tri
izvora takta: sistemski sat (Fosc/4), spoljanji takt ili spoljanji kristal.
Broja eksternih dogaaja moe da se sinhronizuje sa internim oscilatorom, a postoji
i asinhroni nain rada koji omoguuje da se broja inkrementira i u sleep reimu.
Preskaliranje je upotrebljivo sa vrednostima deljenja 1:1, 1:2, 1:4 i 1:8.
Tajmer 2 je 8-bitni tajmer sa programabilnim preskalerom i postskalerom. Moe da
bude tajmer/broja opte namene. Meutim, potreban je CCP modulu prilikom generisanja
PWM signala, te modulu za sinhronu serijsku komunikaciju (SSP) kao Baud Rate
generator. U kooperaciji sa tajmerom 2 koristi se registar PR2 (Period Register). Kada se
vrednost brojaa izjednai sa vrednou upisanom u registar PR2, generie se
odgovarajui interapt.
CCP moduli
CCP je skraenica za Compare/Capture/PWM. PIC16F877 poseduje dva ovakva
modula koji mu pomau da se lake nosi sa raznim zahtevima real-time aplikacija.
U modu Capture kada se desi dogaaj na pinu RC2/CCP1 16-bitna vrednost
tajmera 1 preslikava se u registre CCPR1H:CCPR1L. Istovremeno se setuje
korespondentni interapt fleg u registru PIR1. Da bi ova operacija bila uspena
tajmer1 mora raditi u tajmerskom modu ili modu sinhronizovanog brojanja.
U modu Compare 16-bitna vrednost registra CCPR1 se stalno poredi sa
vrednou para registara tajmera 1. Kada doe do izjednaenja mogue je da se pin
RC2/CCP1 setuje, resetuje ili ostane nepromenjen, to se ranije podesi odgovarajuim
konfiguracionim bajtom upisanim u registar CCP1CON. I u ovom sluaju se setuje interapt
fleg CCP1IF.
U modu PWM (Pulse Width Modulation) pin RC2/CCP1 proizvodi irinskoimpulsni modulisani signal rezolucije do 10 bita.
Period PWM signala odreuje se upisom u PR2 registar po formuli:
PWM_period = [(PR2)+1] 4 Tosc TMR2_preskaler.
Vreme ispune (Duty Cycle Time) menja se upisom u registar CCPR1L i dva bita
registra CCP1CON (bitovi 5 i 4). Time je omoguena maksimalno 10-bitna rezolucija
PWM izlaza. Formula za proraun je:
PWM_Duty_Cycle = (CCPR1L:CCP1CON<5:4>) Tosc TMR2_preskaler.

11

Ostale periferije
Ovde e ukratko biti pomenuti jo nekoliko periferijskih modula koje PIC16F877
poseduje.
S obzirom na kontinualnost pojava u spoljanjem svetu, teko je upravljati bilo kojim
procesom bez digitalizacije analognih veliina. Na veinu zahteva moe odgovoriti 10bitni, 8-kanalni A/D konvertor konstruisan na principu sukcesivnih aproksimacija.
Mikrokontroler je deo mree elektronskih sklopova koji meusobno komuniciraju i
razmenjuju podatke. U tu svrhu, on je opremljen sa tri hardverska komunikaciona modula.
Prvi meu njima je SSP modul (Synchronous Serial Port), koji slui za komunikaciju
sa serijskim EEPROM-ima,
pomerakim
registrima,
displej-drajverima, A/D
konvertorima, itd. Ovaj modul moe raditi u jednom od dva moda:

Serial Peripheral Interface (SPI),


Inter-Integrated Circuit (I2C).

Drugi
serijski
komunikacioni modul je USART (Universal
Synchronous
Asynchronous Receiver Transmiter). On uglavnom slui za povezivanje sa personalnim
raunarom, ali to nije njegova jedina mogunost primene. USART se moe konfigurisati
u neki od sledeih modova rada:

Asinhroni rad (full duplex),


Sinhroni master rad (half duplex),
Sinhroni slave rad (half duplex).

Osim serijskih, postoji i jedan paralelni komunikacioni modul. Re je o modulu PSP


(Parallel Slave Port). On slui da se PIC16F877 direktno povee na 8-bitnu
magistralu podataka drugog mikroprocesora. Eksterni procesor tada koristei linije Read
(RD) i Write (WR) moe da ita i upisuje PORTD registar kao svaki drugi 8-bitni le.

12

3. Asembler za PIC mikrokontrolere


Asemblerske instrukcije se izvravaju tokom etiri taktna intervala, izuzev instrukcija
grananja ije izvravanje traje due. Primera radi, ako interni oscilator mikrokontrolera radi
na frekvenciji 4 MHz, izvrenje standardne instrukcije traje 1s.
Instrukcije mikrokontrolera su prikazane u narednoj tabeli.

MNEMONIK

OPIS

OPERACIJA

MARKERI

CIK

PRIM.

1
1
1
1
1
1

1, 2

C, DC, Z
C, DC, Z
C, DC, Z
C, DC, Z
Z
Z
Z
Z
Z
Z
Z
Z
Z

1
1
1
1
1
1
1
1
1
1
1
1
1

1, 2

C
C

1
1
1
1

1, 2
1, 2
1, 2
1, 2

UPIS PODATAKA
MOVF f, d
MOVWF f
MOVLW k
CLRF
CLRW
SWAP f, d

prepii f u d
prepii W u f
upii konstantu u W
upii 0 u f
upii 0 u W
prepii unakrsno niblove iz f u
d

f ->d
W ->f
k -> W
0 -> f
0 -> W
f(7:4),(3:0)->d(3:0),(7:4)

Z
Z
Z

2
1, 2

ARITMETIKA I LOGIKA
ADDWF f
ADDLW k
SUBWF f, d
SUBLW k
INCF f, d
DECF f, d
IORWF f, d
ANDWF f, d
XORWF f, d
IORLW k
ANDLW k
XORLW k
COMF f, d

saberi W i f
saberi W sa konstantom
oduzmi W od f
oduzmi W od konstante
uveaj f
umanji f
logiko ILI W sa f
logiko I W sa f
logiko iskljuivo ILI W sa f
logiko ILI W sa konstantom
logiko I W sa konstantom
logiko ILI W sa konstantom
komplementiraj f

f + W -> d
k + W -> W
f - W -> d
k - W -> W
f + 1 -> d
f -1 -> d
f v W -> d
f ^ W -> d
f xor W -> d
k v W -> W
k ^ W -> W
k xor W -> W
f -> d

1, 2
1,
1,
1,
1,
1,

2
2
2
2
2

1, 2

OPERACIJE SA BITOVIMA
BCF f, b
BSF f, b
RLF f, d
RRF f, d

resetuj bit b u f
setuj bit b u f
rotiraj f nalevo kroz CARRY
rotiraj f nadesno kroz CARRY

0 -> f(b)
1 -> f(b)

UPRAVLJANJE TOKOM PROGRAMA


BTFSC f, b
BTFSS f, b
INCFSZ f, d
DECFSZ f, d
GOTO k
CALL k
RETURN
RETLW k
RETFIE

0
1

test bit b u f, preskoi ako je


test bit b u f, preskoi ako je
uveaj f, preskoi ako je 0
umanji f, preskoi ako je 0
skoi na adresu
pozovi potprogram
povratak iz potprograma
povratak sa konstantom u W
povratak iz interapta

skip if f(b) = 0
skip if f(b) = 1
f + 1 -> d, skip if Z = 1
f - 1 -> d, skip if Z = 1
k -> PC
PC -> TOS, k -> PC
TOS -> PC
k -> W, TOS -> PC
TOS -> PC, 1 -> GIE

1(2)
1(2)
1(2)
1(2)
2
2
2
2
2

3
3
1,2,3
1,2,3
1,2,3

OSTALO
NOP
CLRWDT
SLEEP

bez operacije
inicijalizuj watchdog tajmer
prelazak u reim male
potrone

0 -> WDT, 1 -> -TO, 1-> PD


0 -> WDT, 1 -> -TO, 0 ->PD

1
1
1

13

S obzirom da mikrokontroleri serije PIC16Fxxx imaju RISC arhitekturu, operiu sa svega


35 asemblerskih instrukcija koje moemo podeliti u pet grupa:

instrukcije koje operiu sa podacima


aritmetiko-logike instrukcije
instrukcije koje operiu sa bitovima
instrukcije koje upravljaju tokom programa
ostale instrukcije.

Slovom f obeleava se lokacija u RAM-u i, s obzirom da u instrukciji postoji samo 7 bitova


za tu adresu, moemo da adresiramo samo 128 lokacija. Zato je potrebno obratiti panju
na ko-joj adresi se nalazi registar kome pristupamo i odgovarajuim postavljanjem bito
RP0 usmeriti se na odgovarajuu banku registara.
Slovom d je obeleeno odredite, tj. mesto na koje e biti usmeren rezultat operacije. To
nije neki novi registar ve jednostavno oznaava da li e rezultat biti smeten u
akumulator (W registar) ili u RAM ija adresa se nalazi u samoj instrukciji, to u tom
sluaju znai da se operacija izvrava nad nekom RAM lokacijom (f) i da se rezultat
smeta na isto mesto. Ako se za d stavi 0, rezultat se upisuje u W, a za d=1 rezultat se
smesta u registar (RAM loakciju). U sluaju da se u naredbi izostavi ova nula ili jedinica,
asembler e podrazumevati da rezultat ide u f (znai kao da je upisana jedinica) i
istovremeno e generisati upozorenje.
Pored sintakse i opisa naredbi, vidite kolone "markeri" i "cik"; flegovi (markeri) su, u stvari,
bitovi u odreenim registrima koji oznaavaju stanje nakon neke instrukcije. C, DC, Z,
inv.PD (-PD) i inv.TO (-TO) su prvih pet bitova STATUS registra, a iz tabele se vidi tano
koja naredba utie na koji marker. Kolona cik pokazuje koliko ciklusa traje jedna naredba,
a broj u zagradi pokazuje koliko traje ukoliko je uslov ispunjen.
Kada pogledamo tabelu, vidimo da naredbe za poreenje ne postoje. Pa kako emo onda
da uporedimo dva broja? Jedan nain je oduzimanjem ta dva broja i proverom stanja
markera: ako su ta dva broja jednaka, bie setovan Z marker; ako smo oduzeli manji broj
od veeg, C marker e biti setovan, u suprotnom e biti resetovan (zato to se oduzimanje
obavlja kao sabiranje sa negativnom vrednou, pa je C marker invertovan kod
oduzimanja).
Takoe, ne postoje ni uslovni skokovi oni su zamenjeni uslovnim preskocima, tj. testira
se odreeni bit, pa se prva sledea naredba preskae ako je uslov ispunjen.
MICROCHIP-ov asembler MPASM ima ve ugraenje pseudo-naredbe kojima je
mogue izvriti uslovne skokove (npr. BNZ "branch if not zero" - skoi ako nije nula), ali
treba obratiti panju da je to u stvari grupa naredbi (tanije dve), a ne jedna, pa to treba
uzeti u obzir kada se rauna trajanje takve naredbe.
Legenda
f
bilo koja memorijska lokacija u mikrokontroleru ili registar opte namene
W akumulator
b
bit pozicija u 'f' registru/lokaciji
d
odredini bajt
label labela (njima se obeleavaju pojedini delovi programa)
TOS vrh magacina (magacin = eng. stack)
[]
opcija
<> bit pozicija unutar registra

14

Sada emo za svaku od sledeih 35 instrukcija prikazati njenu sintaksu, opis i prikazati
efekte koja ona proizvodi. Uz svaku instrukciju je priloen primer, kao i broj rei i ciklusa za
izvrenje.

A.1 MOVLW
A.2 MOVWF
A.3 MOVF
A.4 CLRW
A.5 CLRF
A.6 SWAPF
A.7 ADDLW
A.8 ADDWF
A.9 SUBLW
A.10 SUBWF
A.11 ANDLW
A.12 ANDWF
A.13 IORLW
A.14 IORWF
A.15 XORLW
A.16 XORWF
A.17 INCF
A.18 DECF
A.19 RLF
A.20 RRF
A.21 COMF
A.22 BCF
A.23 BSF
A.24 BTFSC
A.25 BTFSS
A.26 INCFSZ
A.27 DECFSZ
A.28 GOTO
A.29 CALL
A.30 RETURN
A.31 RETLW
A.32 RETFIE
A.33 NOP
A.34 CLRWDT
A.35 SLEEP

A.1 MOVLW

Konstanta se upisuje u akumulator (Write constant in W register)

Sintaksa:
MOVLW k
Opis:
8-bitna konstanta k se upisuje u akumulator W
Operacija: k (W)
Operand:
0 k 255
Marker:
Br. rei:
1
Br. ciklusa: 1
Primer A1
MOVLW 0x2A
;Posle ove instrukcije u akumulatoru W je vrednost 2Ahex.
15

Sadraj akumulatora se upisuje u registar/lokaciju (Copy W to f)

A.2 MOVWF
Sintaksa:
Opis:
Operacija:
Operand:
Marker:
Br. rei:
Br. ciklusa:

MOVWF f
Sadraj akumulatora W se upisuje u f registar/lokaciju
W (f)
0 f 127
1
1

Primer A2
MOVWF REG
A.3 MOVF

;Na lokaciju REG se upisuje vrednost iz akumulatora W

Sadraj registra f se upisuje u registar/lokaciju d (Copy f to d)

Sintaksa:
Opis:

MOVF f,d
Sadraj registra f se smeta na lokaciju koju odreuje operand d
Ako je d=0 sadraj se smeta u akumulator (W)
Ako je d=1 lokacija sam registar f
Opcija d=1 se koristi sa testiranje sadraja registra f zbog toga to
izvravanje ove instrukcije utie na Z marker STATUS registra
Operacija: f (d)
Operand:
0 f 127
d [0,1]
Marker:
Z
Br. rei:
1
Br. ciklusa: 1
Primer A.3:
MOVF FSR,0
Pre instrukcije:
Posle instrukcije:

;U akumulator W se smeta sadraj registra FSR


FSR = 0xC2
W = 0x00
W = 0xC2
Z=0

A.4 CLRW U akumulator W se upisuje 0 (ili sadraj akumulatora W se brie)


Sintaksa:
Opis:

CLRW
Sadraj akumulatora W se izjednaav a sa 0 (nulom) a Z marker u
STATUS registru se postavlja na jedinicu (1)
Operacija: 0 (W)
Operand:
Marker:
Z
Br. rei:
1
Br. ciklusa: 1
PrimerA.4:
CLRW
Pre instrukcije:
W = 0x55
Posle instrukcije: W = 0x00
Z=1
16

A.5 CLRF

U registar f se upisuje 0 (ili sadraj registra f se brie)

Sintaksa:
Opis:

CLRF f
Sadraj registra f se izjednaava sa nulom, a Z marker u STATUS
registru se postavlja na jedinicu
Operacija: 0 f
Operand:
0 f 127
Marker:
Z
Br. rei:
1
Br. ciklusa: 1

Primer A.5:
CRLF STATUS
Pre instrukcije:
Posle instrukcije:

A.6 SWAPF

;Brie se sadraj registra STATUS


STATUS=0xC2
STATUS=0x00
Z=1

Menja se mesto podataka u registru

Sintaksa:
Opis:

SWAPF f, d
Gornja i donja polovina registra f zamenjuju mesta
Ako je d = 0 rezultat se smeta u akumulator W
Ako je d = 1 rezultat se smeta u registar f
Operacija: f<0:3> d<4:7> ; f<4:7> d<0:3>
Operand:
0 f 127
Marker:
Br. rei:
1
Br. ciklusa: 1
Primer A.6:
SWAP REG,1

Pre instrukcije:
Posle instrukcije:
A.7 ADDLW

;Gornja i donja polovina registra REG e zameniti mesta


i rezultat e biti upisan u isti taj registar REG
REG = 0xF3
REG = 0xF3
W = 0x3F

Sadraj akumulatora W se sabira sa konstantom

Sintaksa:
Opis:

ADDLW k
Sadraj akumulatora W se sabira sa 8-mo bitnom konstantom k i
rezultat se smeta u akumulator W
Operacija: (W) + k W
Operand:
0 k 255
Marker:
C, DC, Z
Br. rei:
1
Br. ciklusa: 1

PrimerA.7:
ADDLW 0x15 ;Sadraju akumulatora W dodaj 15
17

Pre instrukcije:
Posle instrukcije:
A.8 ADDWF

W = 0x10
W = 0x25

Sadraj akumulatora W dodaj registru f

Sintaksa:
Opis:

ADDWF f, d
Sadraj akumulatora W saberi (dodaj) sa sadrajem registra f
Ako je d = 0 rezultat se smeta u akumulator W
Ako je d = 1 rezultat se smeta u registar f
Operacija: (W) + (f) d
d [0,1]
Operand:
0 f 127
Marker:
C, DC, Z
Br. rei:
1
Br. ciklusa: 1
Primer A.8:
ADDWF FSR, 0

Pre instrukcije:
Posle instrukcije:
A.9 SUBLW

;Sadraj registra FSR dodaj sadraju akumulatora W i


smesti rezultat u akumulator W
W = 0x17
FSR = 0xC2
W = 0xD9
FSR = 0xC2

Oduzmi sadraj akumulatora W od konstante

Sintaksa:
Opis:

SUBLW k
Sadraj akumulatora W se oduzima od konstante k i rezultat se
smeta u akumulator W
Operacija: k (W) W
Operand:
0 k 255
Marker:
C, DC, Z
Br. rei:
1
Br. ciklusa: 1

18

Primer A.9:
SUBLW 0x03

;Od konstante 3 oduzmi vrednost u akumulatoru W

Pre instrukcije:
Posle instrukcije:

W = 0x01, C = x, Z = x
W = 0x02, C = 1, Z = 0

Pre instrukcije:
Posle instrukcije:

W=0x03, C=x, Z=x


W=0x00, C=1, Z=1

Rezultat = 0

Pre instrukcije:
Posle instrukcije:

W=0x04, C=x, Z=x


W=0xFF, C=0, Z=0

Rezultat < 0

Rezultat > 0

A.10 SUBWF

Oduzimanje sadraja akumulatora W od sadraja registra f

Sintaksa:
Opis:

SUBWF f,d
Sadraj akumulatora W se oduzima od sadraja registra f
Ako je d = 0 rezultat se smeta u akumulator W
Ako je d = 1 rezultat se smeta u registar f
Operacija: (f) (W) d
Operand:
0 f 127
d [0,1]
Marker:
C, DC, Z
Br. rei:
1
Br. ciklusa: 1

Primer A.10:
SUBWF REG, 1

;Od sadraja registra REG se oduzima sadraj


akumulatora W i rezultat se smeta u REG

Pre instrukcije:
Posle instrukcije:

REG = 3, W = 2, C = x, Z = x
REG = 1, W = 2, C = 1, Z = 0

Pre instrukcije:
Posle instrukcije:

REG=2, W=2, C=x, Z=x


REG=0, W=2, C=1, Z=1

Pre instrukcije:
Posle instrukcije:

REG = 1, W = 2, C = x, Z = x
REG = 0xFF, W = 2, C = 0, Z = 0

A.11 ANDLW

Rezultat > 0
Rezultat = 0
Rezultat < 0

Logika I operacija nad W i konstantom k

Sintaksa:
Opis:

ANDLW k
Vri se operacija logiko I nad sadrajem akumulatora W i konstante k
Rezultat se smeta u akumulator W
Operacija: (W) .AND. k W
Operand:
0 k 255
Marker:
Z
Br. rei:
1
Br. ciklusa: 1
Primer A.11:
ANDLW 0x5F
;Izvri logiku I operaciju nad sadrajem
akumulatora W i konstante 5F

Pre instrukcije:
Posle instrukcije:
A.12 ANDWF
Sintaksa:
Opis:
Operacija:

W = 0xA3
W = 0x03

; 0101 1111 (0x5F)


; 1010 0011 (0xA3)
0000 0011 (0x03)

Logika I operacija nad W i f registrima


ANDWF f,d
Vri se logika I operacija nad registrima W (akumulator) i f
Ako je d = 0 rezultat se smeta u akumulator W
Ako je d = 1 rezultat se smeta u registar f
(W) .AND. f d
19

Operand:

0 f 127
d [0,1]
Marker:
Z
Br. rei:
1
Br. ciklusa: 1
Primer A.12:
ANDWF FSR, 1

Pre instrukcije:
Posle instrukcije
A.13 IORLW

;Izvri logiku I operaciju nad sadrajima registara


W i FSR i rezultat smesti u FSR
W = 0x17, FSR=0xC2
W = 0x17, FSR=0X02

; 0001 0111
; 1100 0010
; 0000 0010

(0x17)
(0xC2)
(0x02)

Logika ILI operacija nad W i konstantom k

Sintaksa:
Opis:

IORLW k
Logika ILI operacija se izvrava nad sadrajem akumulatora W i nad
8-mo bitnom konstantom k i rezultat se smeta u akumulator W
Operacij:
(W) .OR. k W
Operand:
0 k 255
Marker:
Z
Br. rei:
1
Br. ciklusa: 1

Primer A.13:
IORLW 0x35
Pre instrukcije:
Posle instrukcije:
A.14 IORWF
Sintaksa:
Opis:

;Izvri logiku ILI operaciju nad sadrajem


akumulatora W i konstantom 35
W = 0x9A
W = 0xBF
Z=0

Logika ILI operacija nad registrima W i f

IORWF f, d
Logika ILI operacija se izvrava nad sadrajima registara W
(akumulator) i f
Ako je d = 0 rezultat se smeta u akumulator W
Ako je d = 1 rezultat se smeta u registar f
Operacija: (W) .OR. (f) d
Operand:
0 f 127
d [0,1]
Marker:
Z
Br. rei:
1
Br. ciklusa: 1
Primer A.14:
IORWF REG,0
;Izvri logiku ILI operaciju nad sadrajima W akumulatora i
registra REG, rezultat smesti u W
Pre instrukcije:
REG = 0x13, W = 0x91
Posle instrukcije: REG = 0x13, W = 0x93
Z=0
20

A.15 XORLW

Logika XOR (iskljuivo ILI) operacija nad sadrajem W i konstante

Sintaksa:
Opis:

XORLW k
Logika XOR operacija se izvrava nad sadrajem akumulatora W i
konstantom k, rezultat se smeta u akumulator W
Operacija: (W) .XOR. k W
Operand:
0 k 255
Marker:
Z
Br. rei:
1
Br. ciklusa: 1
Primer A.15:
XORLW 0xAF

Pre instrukcije:
Posle instrukcije:

A.16 XORWF

;izvri logiku operaciju XOR nad sadrajem akumulatora W i


konstantom 0xAF
W = 0xB5
W = 0x1A

; 1010 1111
; 1011 0101
; 0001 1010

(0xAF)
(0xB5)
(0x1A)

Logika XOR operacija nad sadrajima registara W i f

Sintaksa:
Opis:

XORWF f, d
Logika XOR operacija se izvrava nad sadrajima registara W i f
Ako je d = 0 rezultat se smeta u akumulator W
Ako je d = 1 rezultat se smeta u registar f
Operacija: (W) .XOR. (f) d
Operand:
0 f 127
d [0,1]
Marker:
Z
Br. rei:
1
Br. ciklusa: 1
Primer A.16:
XORWF REG, 1
Pre instrukcije:
Posle instrukcije:
A.17 INCF
Sintaksa:
Opis:
Operacija:
Operand:
Marker:
Br. rei:

;Izvri logiku XOR operaciju nad registrima W iREG, rezultat


smesti u registar REG
REG = 0xAF, W = 0xB5
REG = 0x1A, W = 0xB5

; 1010 1111
; 1011 0101
; 0001 1010

(0xAF)
(0xB5)
(0x1A)

Inkrementiraj (poveaj) sadraj registra f


INCF f, d
Poveaj saraj registra f za jedan
Ako je d = 0 rezultat smesti u akumulator W
Ako je d = 1 rezultat smesti u registar f
(f) + 1 d
0 f 127
d [0,1]
Z
1
21

Br. ciklusa: 1
Primer A.17:
INCF REG, 1

;Poveaj sadraj registra REG za 1 i smesti rezultat u registar


REG

Pre instrukcije:
Posle instrukcije:
A.18 DECF

REG = 0xFF
Z=0
REG = 0x00
Z=1

Dekrementiraj (umanji) sadraj registra f

Sintaksa:
Opis:

DECF f, d
Sadraj registra f umanji za 1
Ako je d = 0 rezultat smesti u akumulator W
Ako je d = 1 rezultat smesti u registar f
Operacija: (f) 1 d
Operand:
0 f 127
d [0,1]
Marker:
Z
Br. rei:
1
Br. ciklusa: 1

Primer A.18:
DECF REG, 1

;Umanji sadraj registra REG za 1 i smesti rezultat u registar


REG

Pre instrukcije:

REG = 0x01
Z=0
Posle instrukcije: REG = 0x00
Z=1
A.19 RLF
Rotiraj sadraj registra f na levo preko CARRY-a
Sintaksa:
Opis:

RLF f, d
Sadraj registra f se rotira za jedno mesto na levo preko markera
(markera) C (CARRY)
Ako je d = 0 rezultat smesti u akumulator W
Ako je d = 1 rezultat smesti u registar f
Operacija: (f<n>) d<n+1>, f<7> C, C d<0>
Operand:
0 f 127
d [0,1]
Marker:
C
Br. rei:
1
Br. ciklusa: 1

Primer A.19:
RLF REG, 0
Pre instrukcije:

22

;Rotiraj sadraj registra REG u levo za 1 i rezultat smesti u


akumulator W
REG = 1110 0110
C=0

Posle instrukcije:
A.20 RRF
Sintaksa:
Opis:

REG = 1110 0110


W = 1100 1101
C=1
Rotiraj sadraj registra f na desno preko CARRY-a

RRF f, d
Sadraj registra f se rotira za jedno mesto na desno preko markera
(markera) C (CARRY)
Ako je d = 0 rezultat smesti u akumulator W
Ako je d = 1 rezultat smesti u registar f

Operacija:
Operand:

(f<n>) d<n-1>, f<0> C, C d<7>


0 f 127
d [0,1]
Marker:
C
Br. rei:
1
Br. ciklusa: 1

Primer A.20:
RRF REG, 0
Pre instrukcije:
Posle instrukcije:

A.21 COMF

;Rotiraj sadraj registra REG za 1 mesto na desno i rezultat


smesti u akumulator W
REG = 1110 0110
W=x
C=0
REG = 1110 0110
W = 0111 0011
C=1

Komplementiraj sadraj registra f

Sintaksa:
Opis:

COMF f, d
Sadraj registra f se komplementira
Ako je d = 0 rezultat smesti u akumulator W
Ako je d = 1 rezultat smesti u registar f
Operacija: ( f ) d
Operand:
0 f 127
d [0,1]
Marker:
Z
Br. rei:
1
Br. ciklusa: 1
Primer A.21:
COMF REG, 0
Pre instrukcije:
Posle instrukcije:

;Komplementiraj sadraj registra REG i rezultat smesti u


akumulator W
REG = 0x13
REG = 0x13
W = 0xEC

; 0001 0011
; komplement
; 1110 1100

(0x13)
(0xEC)

23

A.22 BCF

Resetuj bit b u registru f

Sintaksa:
Opis:
Operacija:
Operand:

BCF f, b
Resetuje se bit na poziciji b u registru f
0 f<b>
0 f 127
0b7
Marker:
Br. rei:
1
Br. ciklusa: 1
Primer A.22:
BCF REG, 7

;Resetuj bit na poziciji 7 u registru REG

Pre instrukcije:
Posle instrukcije:

REG = 0xC7
REG = 0x47

A.23 BSF

; 1100 0111
; 0100 0111

(0xC7)
(0x47)

Postavi bit b u registru f

Sintaksa:
Opis:
Operacija:
Operand:

BSF f, b
Postavi bit na poziciji b u registru f
1 f<b>
0 f 127
0b7
Marker:
Br. rei:
1
Br. ciklusa: 1
Primer A.23:
BSF REG, 7

;Postavi bit na poziciji 7 u registru REG

Pre instrukcije:
Posle instrukcije:

REG = 0x07
REG = 0x17

A. 24 BTFSC
Sintaksa:
Opis:

; 0000 0111
; 1000 0111

(0x07)
(0x17)

Proveri bit b u registru f, ako je jednak 0 preskoi narednu instrukciju

BTFSC f, b
Ako je bit b u registru f jednak 0, onda se preskae izvrenje naredne
instrukcije. Ako je bit b jednak 0, za vreme izvrenja tekue instrukcije,
onda se izvrenje naredne instrukcije stopira,pa se tada izvrava NOP
instrukcija to ini da tekua instrukcija ima 2 ciklusa
Operacija: Preskoi narednu instrukciju ako je (f<b>) = 0
Operand:
0 f 127
0b7
Marker:
Br. rei:
1
Br. ciklusa: 1 ili 2 u zavisnosti od bita b
Primer A.24:
LAB_01
BTFSC REG, 1
; proveri bit broj 1 u registru REG
LAB_02
.........................
;preskoi ovu liniju ako je bit jednak 0
LAB_03
.........................
;skoi na ovu liniju ako je bit jednak 1
24

Pre instrukcije:
Posle instrukcije:

Programski broja je bio na adresi LAB_01


Ako je prvi bit u registru REG nula onda programski broja
pokazuje na adresu LAB_03
Ako je prvi bit u registru REG jedinica onda programski broja
pokazuje na adresu LAB_02
Proveri bit b u registru f, ako je jednak 1 preskoi narednu
instrukciju

A.25 BTFSS
Sintaksa:
Opis:

BTFSS f, b
Ako je bit b u registru f jednak 1, onda se preskae izvrenje naredne
instrukcije. Ako je bit b jednak 1, za vreme izvrenja tekue instrukcije,
onda se izvrenje naredne instrukcije stopira,pa se tada izvrava NOP
instrukcija to ini da tekua instrukcija ima 2 ciklusa
Operacija: Preskoi narednu instrukciju ako je (f<b>) = 1
Operand:
0 f 127
0b7
Marker:
Br. rei:
1
Br. ciklusa: 1 ili 2 u zavisnosti od bita b
Primer A.25:
LAB_01
LAB_02
LAB_03
Pre instrukcije:
Posle instrukcije:

A.26 INCFSZ

BTFSS REG, 1
.........................
.........................

; proveri bit broj 1 u registru REG


;preskoi ovu liniju ako je bit jednak 1
;skoi na ovu liniju ako je bit jednak 0

Programski broja je bio na adresi LAB_01


Ako je prvi bit u registru REG jedinica onda programski broja
pokazuje na adresu LAB_03
Ako je prvi bit u registru REG nula onda programski broja
pokazuje na adresu LAB_02

Inkrementiraj registar f za 1, preskoi narednu instrukciju ako je


rezultat jednak nuli

Sintaksa:
Opis:

INCFSZ f, d
Sadraj registra f se uveava za 1
Ako je d = 0 rezultat smesti u akumulator W
Ako je d = 1 rezultat smesti u registar f
Ako je rezultat jednak nuli, sledea instrukcija se izvrava kao NOP,
tako da tekua instrukcija ima 2 ciklusa
Operacija: (f) + 1 d
Operand:
0 f 127
d [0,1]
Marker:
Br. rei:
1
Br. ciklusa: 1 ili 2 u zavisnosti od rezultata
Primer A.26:
LAB_01
INCFSZ REG, 1 ; uveaj sadraj REG za 1
LAB_02
.........................
;preskoi ovu liniju ako je jednak 0
LAB_03
.........................
;skoi na ovu liniju ako je jednak 1
25

Pre instrukcije:
Posle instrukcije:

A.27 DECFSZ

Programski broja je pokazivao na adresu LAB_01


REG = REG + 1, i ako je sada REG=0 programski broja e
pokazivati na adresu LAB_03. U suprotnom e pokazivati na
adresu LAB_02

Dekrementiraj registar f za 1, preskoi narednu instrukciju ako je


rezultat jednak nuli

Sintaksa:
Opis:

DECFSZ f, d
Sadraj registra f se umanjuje za 1
Ako je d=0 rezultat smesti u akumulator W
Ako je d=1 rezultat smesti u registar f
Ako je rezultat jednak nuli, narednainstrukcija se izvrava kao NOP,
tako da tekua instrukcija ima 2 ciklusa
Operacija: (f) - 1 d
Operand:
0 f 127
d [0,1]
Marker:
Br. rei:
1
Br. ciklusa: 1 ili 2 u zavisnosti od rezultata
Primer A.27:
LAB_01
LAB_02
LAB_03

Pre instrukcije:
Posle instrukcije:

A.28 GOTO
Sintaksa:
Opis:
Operacija:
Operand:
Marker:
Br. rei:
Br. ciklusa:

; umanji sadraj REG za 1


;preskoi ovu liniju ako je jednak 0
;skoi na ovu liniju ako je jednak 1

Programski broja je pokazivao na adresu LAB_01


CNT = CNT -1, i ako je sada CNT = 0 programski broja e
pokazivati na adresu LAB_03. U suprotnom e pokazivati na
adresu LAB_02.

Skoi (idi) na adresu


GOTO k
Bezuslovni skok na adresu k
k PC<10:0>, (PCLATH<4:3>) PC<12:11>
0 k 2048
1
2

Primer A.28:
LAB_00
.
.
.
LAB_01
Pre instrukcije:
Posle instrukcije:

26

DECFSZ CNT, 1
.........................
.........................

GOTO LAB_01

; skoi na adresu LAB_01

.......................
Programski broja pokazuje adresu LAB_00
Programski broja pokazuje adresu LAB_01

A. 29 CALL

Pozovi program

Sintaksa:
Opis:

CALL k
Instrukcija poziva potprogram. Prvo se povratna adresa (PC+1)
smeta u magacin, onda se 11-to bitn direktni operand k, koji sadri
adresu potprograma, smeta u programski broja
Operacija: (PC) + 1 TOS (Top Of Stack vrh magacina)
k PC<10:0>, (PCLATH<4:3>) PC<12:11>
Operand:
0 k 2048
Marker:
Br. rei:
1
Br. ciklusa: 2
Primer A.29:
LAB_01
.
.
LAB_02

Pre instrukcije:
Posle instrukcije:
A.30 RETURN
Sintaksa:
Opis:
Operacija:
Operand:
Marker:
Br. rei:
Br. ciklusa.

;pozovi potprogram LAB_02


.

........................

Programski broja je pokazivao adresu LAB_01


TOS = x
Programski broja je pokazivao adresu LAB_02
TOS = LAB_01

Povratak iz potprograma
RETURN
Sadraj iz vrha magacina (TOS) se smeta u programski broja
TOS PC (Program Counter programski broja)
1
2

Primer A.30:
RETURN
Pre instrukcije:
Posle instrukcije:
A.31 RETLW

CALL LAB_02

PC = x
TOS = x
PC = TOS
TOS = TOS 1

Povratak iz potprograma, konstanta se smeta u akumulator W

Sintaksa:
Opis:

RETLW k
8-mo bitna konstanta k se smeta u akumulator W. Vrednost iz vrha
magacina (TOS) se smeta u programski broja
Operacija: (k) W; TOS PC
Operand:
0 k 255
Marker:
Br. rei:
1
Br. ciklusa: 2

27

Primer A.31:
RETLW 0x43
Pre instrukcije:
Posle instrukcije:

A.32 RETFIE

W=x
PC = x
TOS = x
W = 0x43
PC = TOS
TOS = TOS 1

Povratak iz interapta (prekida)

Sintaksa:
Opis:

RETFIE
Povratak iz potprograma. Vrednost iz vrha magacina (TOS) se smeta
u programski broja (PC). Interapti (prekidi) su dozvoljeni
postavljanjem GIE bita (Global Interrupt Enable).
Operacija: TOS PC, 1 GIE
Operand:
Marker:
Br. rei:
1
Br. ciklusa. 2

Primer A.32:
RETFIE
Pre instrukcije:
Posle instrukcije:
A.33 NOP

PC = x
GIE = 0
PC = TOS
GIE = 1

Bez operacija (instrukcija)

Sintaksa:
NOP
Opis:
Ne izvrava nikakvu operaciju i ne utie na markere
Operacija: Operand:
Marker:
Br. rei:
1
Br. ciklusa. 1
Primer A.33:
NOP
Pre instrukcije:
Posle instrukcije:

A.34 CLRWDT
Sintaksa:
Opis:

28

PC = x
PC = x + 1

Iniciraj Watchdog tajmer


CLRWDT
Watchdog tajmer se resetuje. Preskaler ovog tajmera se takoe
resetuje, takoe se postavljaju i statusni bitovi TO i PD .

Operacija:

0 WDT
0 WDT preskaler
1 TO
1 PD
Operand:
PD , TO
Marker:
Br. rei:
1
Br. ciklusa. 1
Primer A.34:
CLRWDT
Pre instrukcije:
Posle instrukcije:

A.35 SLEEP

WDT broja = x
WDT preskaler = 1:128
WDT broja = 0x00
WDT preskaler broaj = 0
TO = 1
PD = 1
WDT preskaler = 1:128
Stanje pripravnosti (STAND BY mod)

Sintaksa:
Opis:

SLEEP
Procesor prelazi u reim niske potronje. Oscilator se zaustavlja.
PD (Power Down) statusni bit se resetuje. TO (Time Out) bit se
postavlja. WDT (Watchdog Timer) tajmer i njegov preskaler se
resetuju.
Operacija: 0 WDT
0 WDT preskaler
1 TO
0 PD
Operand:
Marker:
PD , TO
Br. rei:
1
Br. ciklusa. 1
Primer A.35:
SLEEP
Pre instrukcije:
Posle instrukcije:

WDT broja = x
WDT preskaler = x
WDT broja = 0x00
WDT preskaler = 0
TO = 1
PD = 0

29

4. PIC Simulator IDE


PIC Simulator IDE je aplikacija koju koriste projektanti u razvoju sistema sa PIC
mikrokontro-lerima, a karakterie je njena laka upotreba u WINDOWS okruenju.
Pomenuta aplikacija ima integrisan simulator (emulator), BASIC kompajler, asembler,
disasembler i debager.
Glavni aplikacioni prozor prikazuje statuse svih internih registara datog mikrokontrolera, instrukciju koja je poslednja izvrena i instrukciju koja e se sledea izvriti, taktni interval i
broja instrukcija kao i realno vreme trajanja simulacije.
Komande u FILE meniju

Clear memory Ova komanda vri resetovanje simulatora i postavlja ga u poetno stanje
(inicijalno stanje), prazni bafere programske FLASH memorije i EEPROM memorije
podataka.
Load program Ova komanda uitava programski fajl u bafer FLASH memorije PIC
simulatora. Programski fajl mora biti u formatu HEX. Uitani (pokrenuti) programski fajl
moe ponovo brzo da se uita tako to se selektuje pointerom na njegovom tasteru u
glavnom programskom interfejsu (prozoru) ili pritiskom tastera SPACE na tastaturi.
Save memory Ova komanda omoguava da se sauva sadraj bafera programske
FLASH memorije i podataka EEPROM memorije, i to u fajlu HEX.

30

Komande menija SIMULATION


(Omoguava korisnicima pokretanje i zaustavljanje simulacije)
Start Ovom komandom se pokree simulacioni mod i poinje izvrenje instrukcija sa
poetkom u lokaciji 0000H programske memorije.

Step Ova komanda omoguava da se simulacija izvri korak po korak, ali se prethodno
mora podesiti da e simulacija da se odvija korak po korak. Pritiskom tastera F2 na
tastaturi izvrava se naredna instrukcija.
Stop Ovom komandom se zaustavlja simulacija i zatim se prezentuju informacije o
ukupnom broju izvrenih instrukcija, trajanju simulacije i ukupnom realnom vremenu
simulacije u taktnim intervalima i s, i sve to na nivou PIC mikrokontolera.

31

Komande menija RATE


(Omoguava korisnicima izbor brzine simulacije. Ova opcija je dostupna i u toku izvrenja
simulacije)

Step by step Ovom komandom se omoguuje korisniku da sam odreuje vreme izmeu
dve susedne instrukcije. Korisnik pritiskom odreenog tastera pokree izvrenje naredne
instrukcije. Kada se simulator nalazi u ovom modu (Step by step), mogue je menjati
vrednosti u svim specijalnim funkcijama i registrima opte upotrebe, programskim
brojaima i radnim registrima, tako to se selektuje odgovarajue ime ili vrednost polja na
programskom interfejsu. Vrednost u SFR registrima moe da se menja alternativno
zamenom pojedinanih bitova grafike reprezentacije i ova osobina moe da se koristi i pri
drugim brzinama simulacije. Kada se odabere ova brzina simulacije (Step by step) na
programskom interfejsu e se pojaviti nova stavka u glavnom meniju (Main menu) koja
omoguava lak pristup komandi Step iz menija Simulation. Dodatna prednost je
omoguena programima generisanim u integrisanom BASIC kompajleru. Komanda 'Run
To Next Basic Statement' e pokrenuti simulaciju na brzini Extremely Fast sve dok se ne
dostigne sledea naredba u BASIC-u, a onda se simulacija automatski prebacuje na reim
Step by step.
Slow Ovom komandom se zadaje brzina simulacije od 1500 ms izmeu instrukcija.
Normal Ovom komandom se zadaje brzina simulacije od 250 ms izmeu instrukcija.
Fast Ovom komandom se zadaje brzina simulacije od oko 50 ms izmeu instrukcija.
Extremely fast Kada se postavi ova komanda, interval izmeu instrukcija je veoma mali
i brzina simulacije linearno zavisi od brzine rada raunara.
Ultimate (No refresh) Ovom komandom se glavni prozor simulatora ne osveava to
znaajno ubrzava izvrenje simualcije. Ova brzina simulacije treba da se koristi u
kombinaciji sa Breakpoint Manager da bi se rutine sa velikim kanjenjem simulirale to
bre.

32

Komande menija Tools

Program Memory Editor Ova komanda omoguuje pristup Flash memoriji PIC
simulatora. Mogue je runo uneti operacione kodove instrukcije tako to se selektuje linija
na displeju na eljenoj lokaciji.

33

EEPROM Memory Editor Ova komanda otvara EEPROM memoriju PIC simulatora. Ako
je ovaj prozor otvoren, osveavae se u toku simulacije. Vrednost na bilo kojoj
memorijskoj lokaciji se moe izmeniti jednostavnim selektovanjem iste.

Hardware Stack Viewer Pregled magacina (Stack) mikrokontrolera.

34

Microcontroller View Ova komanda otvara prozor sa odabranim PIC mikrokontrolerom


i njegovim rasporedom pinova. Grafiki su prikazana logika stanja svih pinova i ona se
mogu menjati manuelno jednostavnim selektovanjem na interfesju. Mogue je menjati i
analogne vrednosti na svim U/I pinovima koji su i konfigurisani kao analogni. Ako je ovaj
prozor otvoren on e se osveavati tokom simulacije.

Alternative SFR Viewer Ova komanda otvara prozor za specijalne funkcionalne registre
(SFR) koji su podloni promenama veliine.

35

Disassembler PIC Simulator IDE ima integrisani disasembler koji se pokree ovom
naredbom. Proces disasembliranja se inicira automatski samim otvaranjem ovog prozora.
Uvek se poinje od adrese 0000H. Kada se proces zavri disasembler izbacuje izlazni
listing. Ovaj listing se moe sauvati na hard disku korisnik mora uneti ime izlaznog fajla,
a ek-stenzija je LST.

Breakpoints Manager Ovom komandom se aktivira integrisani debager, kojim se


nadgleda izvravanje instrukcija programa. Mogue je definisati do 10 Breakpoint-a (taak
u kojima se zaustavlja izvrenje programa).

36

Assembler Ovom opcijom/komandom se aktivira asemblerski prozor u kojem je mogue


uneti novi program ili prepraviti ve postojei. Posle procesa asembliranja, generie se
HEX fajl koji je jedini razumljiv mikrokontroleru.

BASIC Compiler Ovom opcijom/komandom se aktivira BASIC kompajler u kojem moe


da se programira mikrokontroler. Dodatne informacije su date u tekstu BASIC Compiler
Refe-rence Manual.

37

Interactive Assembler Editor Ovom opcijom se aktivira prozor koji omoguava


poetnicima da napiu jednostavne asemblerske rutine interaktivno bez pamenja
mnemonika individualnih instrukcija PIC mikrokontrolera.

8 x LED Board Ovom opcijom se aktivira niz od 8 LED dioda koje je mogue povezati
na bilo koje pinove. Mogua je promena boje LED (crvena, uta, zelena).

38

Keypad Matrix Ovom opcijom se aktivira tastatura 4x4

LCD Module Ovom opcijom se aktivira LCD modul (koji prikazuje tekst).

Graphical 128x64 LCD Module Ovom opcijom se aktivira grafiki LCD modul. Pre
korienja, neophodno je podesiti parametre u Setup-u.

39

Hardware UART Simulation Interface Ovom opcijom se aktivira UART interfejs za


komunikaciju sa UART modulom mikrokontrolera.

PC's Serial Port Terminal Ovom opcijom se aktivira softverski alat nezavisan od
simulatora i moe se koristiti za komunikaciju stvarnih/fizikih PIC mikrokontrolera i
serijskog porta raunara.

40

Software UART Simulation Interface Ovom opcijom se aktivira UART interfejs za


komunikaciju sa emuliranim UART modulom mikrokontrolera koji ne poseduju hardverski
UART modul.

Oscilloscope Ovo je moan alat u okviru simulatora preko kojeg mogu da se prate
promene signala na maksimalno 4 pina mikrokontrolera.

41

Signal Generator Ovom opcijom je mogue aktivirati do 4 nezavisna generatora


signala.

7-Segment LED Displays Panel Ovom opcijom se aktivira 7-segmentni displej.

External Modules Ovom opcijom je mogue ukljuiti do 5 eksternih modula.

42

Watch Variables Aktiviranjem ove opcije tokom simulacije se prate promene varijabli
koje se koriste u programu.

Komande menija Options:


Save Positions Ukoliko se ova opcija selektuje, pozicije prozora na ekranu bie
zapamene.
Select Microcontroller Izbor mikrokontrolera sa liste.

43

Change Clock Frequency Izbor frekvencije takta


Reset Simulation Statistics Brisanje programskog brojaa, brojaa instrukcija i
vremena simulacije.
Change EEPROM Write Time Ovom opcijom se menja vreme taktnih intervala koji se
koriste za upis u EEPROM. Default-na vrednost je 1000 taktnih intervala.
Change A/D Conversion Time Promena vremena A/D konverzije. Default-na vrednost
je 100 taktnih intervala.
Change UART Transmit/Receive Time Promena vremena slanja/prijema kod UART
modula A/D konverzije. Default-na vrednost je 100 taktnih intervala.
Configuration Bits Promena konfiguracionih bitova mikrokontrolera.

Change FLASH/EEPROM Ova komanda se koristi za promenu vrednosti


neprogramiranih lokacija FLASH i EEPROM memorije mikrokontrolera sa 1 na 0, ili
obrnuto. U prvom sluaju neprogramirane lokacije e uzeri vrednost 3FFFh (kod FLASHa) i FFh (kod EEPROM-a). U drugom sluaju, neprogramirane vrednosti se postavljaju na
nule, za obe memorije.
Infinite Loop Stops Simulation Biranjem ove opcije,, simulator e automatski zaustaviti
proces simulacije u sluaju kada broja beskonane petlje dostigne krajnju vrednost.
Basic Program Tracking Ukoliko je ova opcija aktivna, mogue je praenje izvravanje
instrukcija u BASIC-u tokom simulacije (preko markera).
Show Confirmation Boxes Ako je ova opcija aktivna, posle svake akcije e korisnik biti
obavetavan o njenim parametrima i uspenosti.

44

Show RAM Memory Usage Information Ukoliko je ova opcija aktivan, korisnik e biti
obaveten o zauzeu RAM memorije posle kompajliranja programa u BASIC-u.
Use Simple Editor in Basic Compiler and Assembler Ako je ova opcija aktivna,
koriste se jednostavni editori BASIC i asemblerskog kompajlera.
Preserve Input States on Simulation Start Ako je ova opcija aktivna, stanja na
digitalnim i analognim ulazima u prozoru Microcontroller View nee biti resetovana kada
simulacija ponovo zapone.
Change Color Theme promena boja u prozorima aplikacije.

Lista simuliranih periferala:


- Digitalne I/O linije,
- EEPROM memorija podataka,
- itanje programske FLASH memorije,
- Prekidi,
- Timer0 Modul,
- Timer1 Modul (bitovi T1OSCEN i \T1SYNC u T1CON se ignoriu),
- Timer2 Modul,
- Komparator,
- A/D Konvertor,
- Izvor referentnog napona,
- Hardverski UART Modul,
- CCP Moduli.
Napomene:
- Watchdog tajmer nije simuliran (CLRWDT instrukcija se izvrava kao NOP).
- Power-down mod nije simuliran (SLEEP instrukcija zaustavlja simulaciju).

45

5. Primeri
U ovom odeljku bice dato nekoliko primera na kojima moe da se vidi sutina rada
mikrokontrolera, kao i znaaj simulatora koji predstavlja bitan alat za projektante. Primeri
e biti dati u nekoliko grupa, od jednostavnijih primera ka sloenijim. U poslednjem odeljku
mogu se nai i jednostavni zadaci koji slue za proveru znanja studenata u ovoj oblasti.
5.1. Elementarni primeri
Ovi primeri su najjednostavnijeg oblika i slue za upoznavanje asemblera.
EP1. Treba sabrati brojeve a=22 (16h) i b=111 (6Fh) i rezultat sabiranja smestiti na
memorijsku lokaciju broja a (a + b a).
a EQU
b EQU
MOVLW
MOVWF
MOVLW
MOVWF
ADDWF

0x20
0x21
0x6F
0x21
0x16
0x20
0x21,W

MOVWF 0x20
L0001: GOTO L0001
END

;adresa broja a je 20h


;adresa broja b je 21h
;vrednost broja b se smeta u akumulator
;sadraj akumulatora se smeta na lokaciju 21h
;vrednost broja a se smeta u akumulator
;sadraj akumulatora se smeta na lokaciju 20h
;vrsi se sabiranje vrednosti u akumulatoru i broja
;b koji se nalazi na lokaciji 21h
;rezultat se smeta na lokaciju 20h

Program se izvrava za 36 taktna intervala ili 9s (nema instrukcija grananja)

46

EP2. Od broja b=111 (6Fh) oduzeti broj a=22 (16hx). Rezultat oduzimanja smestiti na
memorijsku lokaciju broja a (b - a a).
a EQU 0x20
b EQU 0x21
MOVLW 0x6F
MOVWF 0x21
MOVLW 0x16
MOVWF 0x20
SUBWF 0x21,W
MOVWF 0x20
L0001: GOTO L0001
END

;adresa broja a je 20h


;adresa broja b je 21h
;u akumulator se smeta vrednost broja b
;sadraj akumulatroa se smeta na lokaciju 21h
;u akumulator se smeta vrednost broja a
;sadraj akumulatora se smeta na lokaciju 20h
;vrsi se oduzimanje vrednosti broja b i vrednosti u
;akumulatoru i rezultat smestamo na lokaciju 20h

Program se izvrava za 36 taktna intervala ili 9s (nema instrukcija grananja)


EP3. Izvriti zamenu binarnih vrednosti brojeva a=11110000 i b=01010101 korienjem
XOR operacije.
Logiki, primer se reava u sledea 3 koraka:
1. a = a xor b
2. b = b xor a
3. a = a xor b.

(a = 11110000 XOR 01010101 = 10100101)


(b = 01010101 XOR 10100101 = 11110000)
(a = 10100101 XOR 11110000 = 01010101)

47

a EQU 0x20
b EQU 0x21
MOVLW %11110000
MOVWF 0x20
MOVLW %01010101
MOVWF 0x21
XORWF 0x20
MOVF 0x20,W
XORWF 0x21
MOVF 0x21,W
XORWF 0x20
L0001: GOTO L0001
END

;adresa broja a je 20h


;adresa broja b je 21h
;upisivanje binarne vrednosti broja a
;preko akumulatora
;upisivanje binarne vrednosti broja b
;preko akumulatora
;XOR operacija (20h)XOR(W) (20h)
;upisivanje vrednosti sa (20h) u akumulator
;XOR operacija (21h)XOR(W) (21h)
;upisivanje vrednosti sa (20h) u akumulator
;XOR operacija (20h)XOR(W) (20h)

Program se izvrava za 48 taktnih intervala ili 12s (nema instrukcija grananja)


EP4. Kreirati program koji vri upis broja x = 0x82 na lokaciju registra opte namene
0x2E.
x EQU 0x2E
MOVLW 0x82
MOVWF 0x2E
L0001 GOTO L0001
END

48

;Adresa broja x je 0x2E


;Vrednost x je 0x82 i upisuje
;se preko akumulatora

EP5. Kreirati program koji vri upis brojeva x = 0x42, y =0xAACC i u =0xB1 sukcesivno
poev od lokacije 0x20 u registrima opte namene.
x EQU 0x20
y EQU 0x21
u EQU 0x23
MOVLW 0x42
MOVWF 0x20
MOVLW 0xCC
MOVWF 0x21
MOVLW 0xAA
MOVWF 0x22
MOVLW 0xB1
MOVWF 0x23
L0001: GOTO L0001
END

;Adresa broja x je 0x20


;Adrese broja y su 0x21 i 0x22 (u pitanju je rec)
;Adresa broja u je 0x22
;Vrednost x se upisuje preko akumulatora

;Vrednost y se upisuje preko akumulatora

;Vrednost u se upisuje preko akumulatora

EP6. Kreirati program koji sukcecivno prikazuje sledea stanja Porta B: 0x55, 0xAA i
0x00.
(Za praenje stanja Porta B aktivirati opciju ToolsMicrocontroler View.)
BSF STATUS,RP0
CLRF 0x06
BCF STATUS,RP0
MOVLW 0xAA
MOVWF 0x06
MOVLW 0x55
MOVWF 0x06
CLRF 0x06
L0001: GOTO L0001
END

;Port B je izlazni

;Port B uzima vrednost 0xAA


;Port B uzima vrednost 0x55
;Port B uzima vrednost 0x00

EP7. Kreirati program koji sukcecivno prikazuje sledee rezultate:


Port B = PortD PortC i Port B = PortD + PortC.

(Stanja Portova C i D zadati proizvoljno. Za praenje stanja Porta B i definisanja


heksadecimalnih vrednosti Porta C i Porta D treba aktivirati opciju ToolsMicrocontroler
View.)

BSF STATUS,RP0
CLRF 0x06
BCF STATUS,RP0
BSF STATUS,RP0
MOVLW 0xFF
MOVWF 0x07
BCF STATUS,RP0
BSF STATUS,RP0
MOVLW 0xFF
MOVWF 0x08
BCF STATUS,RP0
MOVF 0x07,W
SUBWF 0x08,W
MOVWF 0x06
MOVF 0x08,W
ADDWF 0x07,W
MOVWF 0x06
L0001: GOTO L0001
END

;Port B je izlazni

;Port C je ulazni

;Port D je ulazni

;Operacija PORTB = PORTD - PORTC

;Operacija PORTB = PORTD + PORTC

49

EP8. Napisati program koji prikazuje sledei rezultat: Port B = PortC XOR PortD.
(Stanja Portova C i D zadati proizvoljno. Za praenje stanja Porta B i definisanja
heksadecimalnih vrednosti Porta C i Porta D treba aktivirati opciju
ToolsMicrocontroler View.)
R0L EQU 0x20
BSF STATUS,RP0
CLRF 0x06
BCF STATUS,RP0
BSF STATUS,RP0
MOVLW 0xFF
MOVWF 0x07
BCF STATUS,RP0
BSF STATUS,RP0
MOVLW 0xFF
MOVWF 0x08
BCF STATUS,RP0
MOVF 0x07,W
MOVWF R0L
MOVF 0x08,W
XORWF R0L,W
MOVWF 0x06
L0001: GOTO L0001
END

50

;adresa promenljive R0L je 20h


;Port B je izlazni

;Port C je ulazni

;Port D je ulazni

;Operacija PORTB = PORTC Xor PORTD

Program se izvrava za 92 taktnih intervala ili 23s (nema instrukcija grananja)

5.2.

Jednostavni primeri

Potrudiemo se da u narednim redovima ilustrujemo proces uitavanja programa i


simulaciju nekoliko struktura (brojaa, A/D konvertora, memorija). Osnova za navedene
strukture bie mikrokontroler PIC16F877. Uz svaki primer priloiemo algoritam i
asemblerski program.
JP1. Broja
Preko programa PIC Simulator IDE realizovati broja koji broji od 0 do 255 (binarno) i od
255 do 0 (binarno). Indikacija treba da budu LED povezane na Port B mikrokontrolera
PIC16F877.
Listing programa u Basic-u:
Dim a As Byte ;definisanje promenljive a
TRISB = %00000000 ;pinovi Porta B su izlazi
Symbol display = PORTB ;prikaz na Portu B
;Preko sledece dve For petlje formiramo brojanje
;unapred (1.ciklus) i unazad (2.ciklus)
For a = 0 To 255 ;Brojanje unapred
display = a
Next a
For a = 0 To 255 ;Brojanje unazad
display = 255 - a
Next a

51

Listing asemblerskog programa:


R0L EQU 0x20

R0H EQU 0x21


R1L EQU 0x22
R1H EQU 0x23
R2L EQU 0x24
R2H EQU 0x25
R3L EQU 0x26
R3H EQU 0x27
R4L EQU 0x28
R4H EQU 0x29
R5L EQU 0x2A
R5H EQU 0x2B
ORG 0x0000
BCF PCLATH,3
BCF PCLATH,4
GOTO L0001
ORG 0x0004
RETFIE
L0001:
a EQU 0x2C
BSF STATUS,RP0
CLRF 0x06
BCF STATUS,RP0

;Prvih 12 registara opste namene(od adrese 0x20 do


;adrese 0x2B) PIC Simulator rezervise za 4-bajtne
;promenljive R0-R5

;poetak programske sekvence

;Dim a As Byte 'definisanje promenljive a'


;adresa promenljive a je 2Ch
;TRISB = %00000000 'pinovi Porta B su izlazni'

;Symbol display = PORTB 'prikaz na Portu B'


display EQU 0x6 ;adresa 'display'-a je 0x6
; Preko sledece dve For petlje formiramo
; brojanje unapred (1.ciklus) i unazad
; (2.ciklus)
; Brojanje unapred
; For a = 0 To 255
CLRF 0x2C
L0002:
MOVF 0x2C,W
SUBLW 0xFF
BTFSS STATUS,C
GOTO L0003
; display = a
MOVF 0x2C,W
MOVWF 0x06
; Next a
MOVLW 0x01
ADDWF 0x2C,F
BTFSS STATUS,C
GOTO L0002
L0003:
MOVLW 0x1F
ANDWF STATUS,F
;Brojanje unazad
;For a = 0 To 255
CLRF 0x2C
L0004:
MOVF 0x2C,W
SUBLW 0xFF

52

BTFSS STATUS,C
GOTO L0005
; display = 255 - a
MOVF 0x2C,W
SUBLW 0xFF
MOVWF 0x06
; Next a
MOVLW 0x01
ADDWF 0x2C,F
BTFSS STATUS,C
GOTO L0004
L0005:
MOVLW 0x1F
ANDWF STATUS,F
; kraj programa
L0006:

GOTO L0006
; kraj listinga

END

53

Algoritam programa Brojac

54

Slika 1. Osnovni prozor programa PIC Simulator IDE


Prvi korak posle startovanja programa podrazumeva izbor mikrokontrolera, to se
ostvaruje aktiviranjem opcije Select microcontroller iz menija Options (Options Select
microcontroller). To je prikazano na Slici 2. U narm sluaju je to PIC16F877.
Drugi korak podrazumeva podeavanje frekvencije (Options Change Clock Frequency).
U naem sluaju frekvencija takta mikrokontrolera treba da bude 4MHz (Slika 3).

Slika 2. Izbor mikrokontrolera

55

Slika 3. Izbor frekvencije takta


Na Slici 4 je prikazano kako je mogue direktno uitati postojei heksadecimalni fajl u
simulator (brojac.hex), ukoliko postoji. Posle ovoga, mogue je odmah prei na korak
prikazan na Slici 8. Meutim, radi postupnosti i edukacije studenata, ovde emo proces
uitavanja fajla uraditi postupno.
Naredni korak podrazumeva uitavanje asemblera, a to se ostvaruje aktiviranjem opcije
Assembler u okviru menija Tools (ToolsAssembler), to je ilustrovano na Slici 5.
U okviru prozora Assembler treba iz menija File aktivirati opciju Open, tj. izvriti uitavanje
asemblerskog fajla Brojac.asm. Ovo je ilustrovano na Slici 6.
Napomena: Asemblerski i heksadecimalni fajl ve postoje, tj. kreirani su i treba ih samo
uitati. Na kraju ovog poglavlja je dat listing asemblerskog fajla.
Sada treba izvriti postupak prevoenja asemblerskog (asm) fajla u heksadecimalni (hex).
Heksadecimalni fajl brojac.hex treba uitati u simulator. Oba procesa se ostvaruju aktiviranjem opcije Assemble & Load u okviru menija Tools (Tools Assemble & Load ).
Ilustracija je data na Slici 7.
Posle prevoenja i uitavanja treba podesiti brzinu u meniju Rate. Na predlog je da bude
Extremely Fast, mada u zavisnosti od brzine raunara i/ili line procene moete birati
brzine Fast ili Ultimate. Ukoliko elite izvravanje instrukcija korak po korak, birajte opciju
Step by Step. Ilustracija je data na Slici 8.
Na Slici 9 je prikazano aktiviranje prozora Microcontroller View, iz menija Tools.
Na isti nain treba aktivirati i prozor 8 x LED Board. Sada treba podesiti da LED budu
prikljuenje na Port B i da budu poreanje u opadajuem nizu (od PB7 do PB0). To se
ostvaruje klikom na odgovarajui prozor pridruen LED diodi. Isto tako, mogu je izbor
crvene, ute ili zelene LED.
Startovanje procesa simulacije programa brojac.hex ostvaruje se aktiviranjem opcije Start
iz menija Simulation (Slika 11). Sada je mogue pratiti na LED promenu stanja Porta B od
0 do 255 i natrag, tj. 00000000 00000001...11111111... 00000001 00000000.
Proces je jednociklusan. Ukoliko se ujedno eli i praenje izvrenja asemblerskih
instrukcija, treba aktivirati opciju Breakpoints Manager iz menija Options (Slika 12).

56

Slika 4. Uitavanje heksadecimalnog fajla

Slika 5. Uitavanje asemblera

57

Slika 6. Uitavanje asemblerskog fajla

58

Slika 7. Prevoenje asemblerskog fajla

Slika 8. Podeavanje brzine simulacije

59

Slika 9. Aktiviranje prozora Microcontroller View

Slika 10. Izgled aktivnih relevantinh prozora pred poetak simulacije

60

Slika 11. Uitavanje asemblerskog fajla

Slika 12. Praenje izvravanja asemblerskog programa (koda)


JP2. Upis podataka u EEPROM mikrokontrolera
Preko programa PIC Simulator IDE realizovati upisivanje podataka u prve 32
adrese/lokacije EEPROM memorije mikrokontrolera PIC16F877. Upis treba da bude takav
da se na memorijske lokacije upisuju heksadecimalne vrednosti njihovih adresa (npr. na
adresu 0x00 treba upisati vrednost 0x00, na 0x01 vrednost 0x01 itd.). Pratiti upis tokom
izvrenja programa u editoru EEPROM memorije (ToolsEEPROM memory editor).
Listing programa u Basic-u:
Dim a As Byte
;definisanje promenljive a
For a = 0 To 31 ;Petlja za popunjavanje prvih 32 lokacija EEPROM - a
Write a, a
;na memorijskoj lokaciji a upisati vrednost a
Next a

Listing asemblerskog programa:


R0L EQU 0x20
R0H EQU 0x21
R1L EQU 0x22
R1H EQU 0x23

; poetak
;Prvih 12 registara opste namene (od adrese 0x20 do
;adrese 0x2B) PIC Simulator rezervise za 4-bajtne
;promenljive R0-R5

61

R2L EQU 0x24


R2H EQU 0x25
R3L EQU 0x26
R3H EQU 0x27
R4L EQU 0x28
R4H EQU 0x29
R5L EQU 0x2A
R5H EQU 0x2B
ORG 0x0000
BCF PCLATH,3
BCF PCLATH,4
GOTO L0001
ORG 0x0004
RETFIE
L0001:
a EQU 0x2C
CLRF 0x2C
L0002:
MOVF 0x2C,W
SUBLW 0x1F
BTFSS STATUS,C
GOTO L0003

;poetak programske sekvence

;Dim a As Byte 'definisanje promenljive a'


;adresa promenljive a je 0x2C
;Petlja za popunjavanje prve 32 lokacije EEPROM - a

;Write a, a 'na memorijskoj lokaciji a upisati


;vrednost a
MOVF 0x2C,W
BSF STATUS,RP1
MOVWF EEADR
BCF STATUS,RP1
MOVF 0x2C,W
BSF STATUS,RP1
MOVWF EEDATA
BSF STATUS,RP0
BCF EECON1,EEPGD
BSF EECON1,WREN
MOVLW 0x55
MOVWF EECON2
MOVLW 0xAA
MOVWF EECON2
BSF EECON1,WR
L0004:
BTFSC EECON1,WR
GOTO L0004
BCF EECON1,WREN
BCF STATUS,RP1
BCF STATUS,RP0
BCF PIR2,EEIF
;Next a
MOVLW 0x01
ADDWF 0x2C,F
BTFSS STATUS,C
GOTO L0002
L0003:
MOVLW 0x1F
ANDWF STATUS,F
; kraj programa
L0005:
GOTO L0005
; kraj listinga
END

62

Algoritam upisa podataka u EEPROM memoriju mikrokontrolera

Kao u Primeru 1, student treba da izabere da li e direktno uitati heksadecimalni fajl (Upis
u memoriju.hex) ili e to uiniti preko asemblerskog fajla (Upis u memoriju.asm), njegovog
prevoenja i uitavanja u program. Treba izabrati mikrokontroler PIC16F877 i frekvenciju
4MHz (ako je potrebno, tj. ako nije ve tako podeeno).
Da bi se pratio upis, neophodno je aktivirati editor EEPROM memorije (ToolsEEPROM
memory editor) i, ako je potrebno, aktivirati opciju Clear (koja se nalazi unutar prozora) u
cilju brisanja prethodnog sadraja.
Treba podesiti brzinu (RateExtremely Fast) i pokrenuti simulaciju (SimulationStart). U
okviru editora EEPROM memorije moe se pratiti popunjavanje memorijskih lokacija.
Kao i u prethodnom primeru, mogue je pratiti izvravanje asemblerskim instrukcija
aktiviranjem opcije Breakpoints Manager iz menija Options.

63

Slika 13. Praenje upisa u EEPROM memoriju mikrokontrolera


JP3. A/D konverzija napona
Preko programa PIC Simulator IDE ostvariti merenje jednosmernog napona na pinu PA0
mikrokontrolera PIC16F877 koji se zadaje preko potenciometra. Indikacija treba da bude
na LED diodama koje su povezane na Port B mikrokontrolera.
(Napomena: Mikrokontroler PIC16F877 ima integrisan 8-kanalni 10-bitni A/D konvertor,
kojem je mogue pristupiti sa 5 pinova Porta A i sva 3 pina Porta E. Ovde je od interesa
samo pin PA0, poto e na njega biti povezan potenciometar.)
Listing programa u Basic-u:
;Dodeljivanje novog naziva za
;startni bit A/D konverzije
;Dodeljivanje novog naziva za Port B, na kome
;ce se prikazivati rezultati A/D konverzije
;definisanje Porta B kao izlaznog
;definisanje Porta A kao ulaznog
;postavljanje takta A/D konverzije na interni
;izvor
;definisanje pinova Porta A kao analognih
;Ukljucivanje ADC modula mikrokontrolera

Symbol ad_start = ADCON0.GO_DONE


Symbol display = PORTB
TRISB = %00000000
TRISA = %111111
ADCON0 = 0xc0
ADCON1 = 0h
High ADCON0.ADON
main:
Gosub getadresult
display = ADRESH
Goto main
End
getadresult:
High ad_start
While ad_start
Wend
Return

64

;Glavni program
;skok na potprogram za konverziju
;prikaz rezultata A/D konverzije
;ponovi beskonacnu petlju
;Potprogram koji vrsi A/D konverziju
;start A/D konverzije
;sacekati dok se konverzija ne zavrsi

Listing asemblerskog programa:


R0L EQU 0x20
;Prvih 12 registara opste namene (od adrese 0x20 do
R0H EQU 0x21
;adrese 0x2B) PIC simulator rezervie za 4-bajtne
;promenljive R0-R5
R1L EQU 0x22
R1H EQU 0x23
R2L EQU 0x24
R2H EQU 0x25
R3L EQU 0x26
R3H EQU 0x27
R4L EQU 0x28
R4H EQU 0x29
R5L EQU 0x2A
R5H EQU 0x2B
;poetak programske sekvence
ORG 0x0000
BCF PCLATH,3
BCF PCLATH,4
GOTO L0003
ORG 0x0004
RETFIE
L0003:
;Dodeljivanje novog naziva za startni bit A/D konverzije
;Symbol ad_start = ADCON0.GO_DONE
;adresa'ad_start' je 0x1F,2
;Dodeljivanje novog naziva za Port B, na kome ce se
;prikazivati rezultati A/D konverzije
;Symbol display = PORTB
display EQU 0x6 ;adresa'display' je 0x6
BSF STATUS,RP0 ;TRISB = %00000000 'definisanje Porta B kao
CLRF 0x06
;izlaznog
BCF STATUS,RP0
BSF STATUS,RP0 ;TRISA = %111111 'definisanje Porta A kao ulaznog
MOVLW 0x3F
MOVWF 0x05
BCF STATUS,RP0
MOVLW 0xC0
;ADCON0 = 0xc0 postavlj. takta A/D konverzije na
;interni izvor
MOVWF 0x1F
BSF STATUS,RP0 ;ADCON1 = 0h definisanje pinova Porta A kao
;analognih
CLRF 0x1F
BCF STATUS,RP0
BSF 0x1F,0
;High ADCON0.ADON 'Ukljucivanje ADC modula
;mikrokontrolera
;main: Glavni program
L0001:
CALL L0002
;Gosub getadresult skok na potprogram za konverziju
;display = ADRESH 'prikaz rezultata A/D konverzije
MOVF 0x1E,W
MOVWF 0x06
GOTO L0001
;Goto main 'ponovi beskonacnu petlju
;End
L0004:
GOTO L0004
;Potprogram koji vrsi A/D konverziju
;getadresult:
L0002:
;High ad_start 'start A/D konverzije

65

BSF 0x1F,2
;While ad_start sacekati dok se konverzija ne zavrsi
L0005:
BTFSS 0x1F,2
GOTO L0006
;Wend
GOTO L0005
L0006:
MOVLW 0x1F
ANDWF STATUS,F
;Return
RETURN
;kraj programa
L0007:
GOTO L0007
; kraj listinga
END

Student treba da izabere da li e direktno uitati heksadecimalni fajl (AD konverzija.hex) ili
e to uiniti preko asemblerskog fajla (AD konverzija.asm), njegovog prevoenja i
uitavanja u program. Treba izabrati mikrokontroler PIC16F877 i frekvenciju 4MHz (ako je
potrebno, tj. ako nije ve tako podeeno).
Sada treba ukljuiti pregled mikrokontrolera sa rasporedom pinova (Microcontroler View) i
LED diode (8 x LED board). Oba grafika interfejsa se biraju u meniju Tools.
Zatim treba podesiti brzinu (RateExtremely Fast) i pokrenuti simulaciju
(SimulationStart). Klikom na pin PA0 aktivira se potenciometar na kojem se zadaje
vrednost napona (0-1023 koraka). Prikaz 8-bitne digitalne rei, koja je rezultat A/D
konverzije, prikazuje se na LED diodama (koje treba da budu povezane na Port B u
opadajuem nizu od PB7 do PB0).
Naravno, mogue je pratiti izvravanje asemblerskim instrukcija (aktiviranjem opcije
Breakpoints Manager), kao i stanja varijabli (aktiviranjem opcije Watch Variables). Obe
opcije su iz menija Options.
(Napomena: Iako mikrokontroler PIC16F877 poseduje 10-bitni A/D konvertor, zbog toga
to u simulatoru postoji samo 8 LED dva najnia bita rezultata A/D konverzije se
odbacuju, ime se gubi na rezoluciji).

66

Program i potrpogram za A/D konverziju

Slika 13. Praenje A/D konverzije

67

5.3.

Napredniji primeri realizovani PIC simulatorom

NP1. Izraunavanje izraza


Preko programa PIC Simulator IDE realizovati izraunavanje vrednosti izraza y = (a+b) x,
pri emu su vrednosti lanova izraza sledee: a=224, b=120 i x=48. Koristiti mikrokontroler
PIC16F877 na frekvenciji 4MHz. Pratiti stanja varijabli, registara i izvravanje
asemblerskih instrukcija.
Naziv fajla je Sabiranje i mnoenje.
Listing programa u Basic-u:
Byte
Byte
Byte
Word

broja a
broja b
broja x
rezultata y

a
b
x
y

a
b
x
y

224
;dodeljivanje vrednosti brojevima a, b i c
120
48
(a + b) * x ;izracunavanje rezultata

=
=
=
=

As
As
As
As

;definisanje
;definisanje
;definisanje
;definisanje

Dim
Dim
Dim
Dim

Listing asemblerskog programa:


R0L EQU 0x20
R0H EQU 0x21
R1L EQU 0x22
R1H EQU 0x23
R2L EQU 0x24
R2H EQU 0x25
R3L EQU 0x26
R3H EQU 0x27
R4L EQU 0x28
R4H EQU 0x29
R5L EQU 0x2A
R5H EQU 0x2B
ORG 0x0000
BCF PCLATH,3
BCF PCLATH,4
GOTO L0001
ORG 0x0004
RETFIE
L0001:
a EQU 0x2C
b EQU 0x2D
x EQU 0x2E
y EQU 0x2F
MOVLW 0xE0
MOVWF 0x2C
MOVLW 0x78

68

;Prvih 12 registara opste namene (od adrese


;0x20 do adrese 0x2B) PIC Simulator rezervise
;za 4-bajtne promenljive R0-R5

; Dim a As Byte definisanje broja a


;adresa broja a je 2Ch
;Dim b As Byte definisanje broja b
;adresa broja b je 2Dh
;Dim x As Byte definisanje broja x
;adresa broaj x je 2Eh
;Dim y As Word definisanje rezultata y
;adresa rezultata z je 2Fh
;dodeljivanje vrednosti brojevima a, b i c
;a = 224
;b = 120

MOVWF 0x2D
MOVLW 0x30
MOVWF 0x2E
MOVF 0x2C,W
ADDWF 0x2D,W
MOVWF 0x2F
CLRW
BTFSC STATUS,C
ADDLW 0x01
ADDLW 0x00
MOVWF 0x30
MOVF 0x2F,W
MOVWF R3L
MOVF 0x30,W
MOVWF R3H
MOVF 0x2E,W
MOVWF R1L
CLRF R1H
CALL M001
MOVWF 0x2F
MOVF R2H,W
MOVWF 0x30

;x = 48
;y = (a + b) * x 'izracunavanje rezultata

; kraj programa
L0002:

GOTO L0002
; rutina mnoenja

M001: MOVLW 0x10


MOVWF R4L
CLRF R0H
CLRF R0L
M002: RRF R3H,F
RRF R3L,F
BTFSS STATUS,C
GOTO M003
MOVF R1L,W
ADDWF R0L,F
MOVF R1H,W
BTFSC STATUS,C
INCFSZ R1H,W
ADDWF R0H,F
M003: RRF R0H,F
RRF R0L,F
RRF R2H,F
RRF R2L,F
DECFSZ R4L,F
GOTO M002
MOVF R2L,W
RETURN
; kraj listinga
END

69

Slika 14. Praenje operacije izraunavanja izraza


Student treba da izabere da li e direktno uitati heksadecimalni fajl (Sabiranje i mnozenje.
hex) ili e to uiniti preko asemblerskog fajla (Sabiranje i mnozenje.asm), njegovog prevoenja i uitavanja u program. Treba izabrati mikrokontroler PIC16F877 i frekvenciju 4MHz
(ako je potrebno, tj. ako nije ve tako podeeno).
Sada treba ukljuiti posmatranje varijabli, podesiti brzinu (RateStep by Step) i pokrenuti
simulaciju (SimulationStart). Mogue je pratiti kako se menjaju varijable i stanja
registara.
Napomena: Konaan rezultat izraza je 16512DEC, odnosno 4080HEX i on se zapisuje na
lokacije GPR-a 024h i 025h.

70

NP2. Upisivanje i iitavanje podataka EEPROM-a mikrokontrolera


Preko programa PIC Simulator IDE izvriti upisivanje i itanje sadraja EEPROM memorije
mikrokontrolera PIC16F877 koji je podeen na frekvenciju 4MHz. Upisati prvih 128
lokacija po modelu b = 128 + a gde je a vrednost adrese, a b podatak (na primer, na
adresi 00h upisuje se podatak 80h=128DEC=10000000BIN). Pratiti upis u EEPROM editoru,
a itanje na LED koje treba da budu povezane na Port B mikrokontrolera.
Naziv fajla je Upis u memoriju.
Predlog je da brzina simulacije bude Ultimate.
Listing programa u Basic-u:
Dim a As Byte ;eeprom adresa
Dim b As Byte ;eeprom podatak
TRISB = %00000000 ;definisanje pinova Porta B kao izlaznog
Symbol display = PORTB ;prikaz stanja na LED na Portu B
For a = 0 To 127
b = 128 + a ;vrednost koja se upisuje na adresi a
Write a, b
;upis u EEPROM memoriju
Next a
For a = 0
WaitMs 1
Read a, b
display =
Next a
WaitMs 5
display =

To 127
;pauza 1ms, kako bi se uocio proces
;Citanje podatka b sa adrese a
b ; prikaz na Portu B
;Sledeca adresa
' pauza 5ms
0 ' prikaz 0=(00000000)b na Portu B

Listing asemblerskog programa:


R0L EQU 0x20
R0H EQU 0x21
R1L EQU 0x22
R1H EQU 0x23
R2L EQU 0x24
R2H EQU 0x25
R3L EQU 0x26
R3H EQU 0x27
R4L EQU 0x28
R4H EQU 0x29
R5L EQU 0x2A
R5H EQU 0x2B
ORG 0x0000
BCF PCLATH,3
BCF PCLATH,4
GOTO L0001
ORG 0x0004
RETFIE
L0001:
a EQU 0x2C
b EQU 0x2D
BSF STATUS,RP0
CLRF 0x06

;Prvih 12 registara opste namene (od adrese 0x20 do


;adrese 0x2B) PIC Simulator rezervise za 4-bajtne
;promenljive R0-R5

;Dim a As Byte eeprom adresa


;adresa a je 0x2C
;Dim b As Byte 'eeprom podatak
;adresa b is 0x2D
;TRISB = %00000000 definisanje pinova Porta B kao
;izlaznog

71

BCF STATUS,RP0
;Symbol display = PORTB prikaz stanja na LED na
;Portu B
display EQU 0x6 ;adresa'display' je 0x6
;For a = 0 To 127 proi kroz celu EEPROM memoriju
CLRF 0x2C
L0002:
MOVF 0x2C,W
SUBLW 0x7F
BTFSS STATUS,C
GOTO L0003
MOVLW 0x80
;b = 128 + a vrednost koja se upisuje na adresu a
ADDWF 0x2C,W
MOVWF 0x2D
MOVF 0x2C,W
;Write a, b upis u EEPROM memoriju
BSF STATUS,RP1
MOVWF EEADR
BCF STATUS,RP1
MOVF 0x2D,W
BSF STATUS,RP1
MOVWF EEDATA
BSF STATUS,RP0
BCF EECON1,EEPGD
BSF EECON1,WREN
MOVLW 0x55
MOVWF EECON2
MOVLW 0xAA
MOVWF EECON2
BSF EECON1,WR
L0004:
BTFSC EECON1,WR
GOTO L0004
BCF EECON1,WREN
BCF STATUS,RP1
BCF STATUS,RP0
BCF PIR2,EEIF
;Next a
MOVLW 0x01
ADDWF 0x2C,F
BTFSS STATUS,C
GOTO L0002
L0003:
MOVLW 0x1F
ANDWF STATUS,F
;For a = 0 To 127 upis se vrsi u prvih 128 lokacija
CLRF 0x2C
L0005:
MOVF 0x2C,W
SUBLW 0x7F
BTFSS STATUS,C
GOTO L0006
;WaitMs 1
pauza 1ms, kako bi se uocio proces
MOVLW 0x01
MOVWF R0L
CLRF R0H
CALL W001
MOVF 0x2C,W
;Read a, b Citanje podatka b sa adrese a
BSF STATUS,RP1
MOVWF EEADR
BSF STATUS,RP0

72

BCF EECON1,EEPGD
BSF EECON1,RD
NOP
BCF STATUS,RP0
MOVF EEDATA,W
BCF STATUS,RP1
MOVWF 0x2D
;display = b

prikaz na Portu B

MOVF 0x2D,W
MOVWF 0x06
;Next a

Sledeca adresa

MOVLW 0x01
ADDWF 0x2C,F
BTFSS STATUS,C
GOTO L0005
L0006:
MOVLW 0x1F
ANDWF STATUS,F
;WaitMs 5

pauza 5ms

MOVLW 0x05
MOVWF R0L
CLRF R0H
CALL W001
;display = 0

prikaz 0=(00000000)b na Portu B

CLRF 0x06
; kraj programa
L0007:

GOTO L0007
; rutina kasnjenja

W001: MOVF R0L,F


BTFSC STATUS,Z
GOTO W002
CALL W003
DECF R0L,F
NOP
NOP
NOP
NOP
NOP
GOTO W001
W002: MOVF R0H,F
BTFSC STATUS,Z
RETURN
CALL W003
DECF R0H,F
DECF R0L,F
GOTO W001
W003: MOVLW 0x0C
MOVWF R2H
W004: DECFSZ R2H,F
GOTO W004
NOP
NOP
MOVLW 0x12
MOVWF R1L
W005: DECFSZ R1L,F
GOTO W006
CALL W007
CALL W007
NOP

73

NOP
RETURN
W006: CALL W007
GOTO W005
W007: MOVLW 0x0D
MOVWF R2L
W008: DECFSZ R2L,F
GOTO W008
NOP
RETURN
; kraj listinga
END

Slika 15. Praenje operacije upisa u EEPROM mikrokontrolera

74

Slika 16 Praenje operacije itanja iz EEPROM-a mikrokontrolera


NP3. Prikazivanje A/D konverzije na LCD modulu
Preko programa PIC Simulator IDE izvriti dvokanalnu A/D konverziju (sa pinova PA0 i
PA1
mikrokontrolera
PIC16F877),
a
vrednosti
dobijenih
napona
sa
prateim/odgovarajuim tek-stom (Napon na pinu PAx iznosi _.__ V) prikazivati na LCD
modulu, naizmenino.
Naziv fajla je LCD prikaz.
Predlog je da brzina simulacije bude Ultimate.
(Napomena: Na pinovima PA0 i PA1 su povezani posebni potenciometri.)
Listing programa u Basic-u:
Define ADC_CLOCK = 3 ;pocetna vrednost je 3
Define ADC_SAMPLEUS = 10 ;default-na vrednost je 20
Define LCD_BITS = 8
;dopustene vrednosti su 4 i 8 - broj interfejsnih
;linija za podatke
Define LCD_DREG = PORTB
Define LCD_DBIT = 0 ;0 ili 4 za 4-bitni interfejs

75

Define
Define
Define
Define
Define

LCD_RSREG = PORTD
LCD_RSBIT = 1
LCD_EREG = PORTD
LCD_EBIT = 3
LCD_RWREG = PORTD

;postavi na 0, ako se ne koristi, 0 je


;default-na
Define LCD_RWBIT = 2 ;postavi na 0, ako se ne korist; 0 je default-na
Define LCD_COMMANDUS = 2000 ;kasnjenje posle LCDCMDOUT, default-na
;vrednost je 5000
Define LCD_DATAUS = 50 ;kasnjenje posle LCDCOUT, default-na vrednost je
;100
Define LCD_INITMS = 2
;kasnjenje posle LCDCIN, default-na vrednost je
;100
;posledenje tri Define naredbe postavljaju
;vrednosti pogodne za simulaciju
;one treba da budu izostavljene kada su u
;pitanju realne aplikacije
Dim an0 As Word
Dim an1 As Word
Dim x0 As Word
Dim x1 As Word
Dim x2 As Word
Dim x3 As Word
Dim x4 As Word
Dim x5 As Word
;definisanje pinova Porta A kao ulaznih
TRISA = 0xff
ADCON1 = 0
;definisanje pinova Porta A kao analognih
Lcdinit
loop:

;inicijalizacija LCD modula

Adcin 0, an0
x0 = (5 * an0) / 1023
x1 = (48 * ((an0 + 2) - (x0 * 205))) / 100
Lcdcmdout LcdClear
;brisanje LCD displeja
Lcdout "Napon na pinu A0" ;tekst prve linije
Lcdcmdout LcdLine2Home ;postavljanje kursora na pocetak 2.linije
Lcdout "iznosi: ", #x0, ".", #x1, "V" ;nacin formatiranja teksta
;2.linije
WaitMs 2
;kasnjenje 2ms
Adcin 1, an1
x2 = (5 * an1) / 1023
x3 = (48 * ((an1 + 2) - (x2 * 205))) / 100
Lcdcmdout LcdClear
;brisanje LCD displeja
Lcdout "Napon na pinu A1" ;tekst prve linije
Lcdcmdout LcdLine2Home ;postavljanje kursora na pocetak 2.linije
Lcdout "iznosi: ", #x2, ".", #x3, "V" ;nacin formatiranja teksta
;2.linije
WaitMs 2
;kasnjenje 2ms
Goto loop ;beskonacna petlja

76

Listing asemblerskog programa:


R0L EQU 0x20
R0H EQU 0x21
R1L EQU 0x22
R1H EQU 0x23
R2L EQU 0x24
R2H EQU 0x25
R3L EQU 0x26
R3H EQU 0x27
R4L EQU 0x28
R4H EQU 0x29
R5L EQU 0x2A
R5H EQU 0x2B
ORG 0x0000
BCF PCLATH,3
BCF PCLATH,4
GOTO L0002
ORG 0x0004
RETFIE
L0002:

an0 EQU 0x2C


an1 EQU 0x2E
x0 EQU 0x30
x1 EQU 0x32
x2 EQU 0x34

;Prvih 12 registara opste namene (od adrese 0x20 do


;adrese 0x2B) PIC Simulator rezervise za 4-bajtne
;promenljive R0-R5

;poetak programske sekvence

;1: Define ADC_CLOCK = 3 'pocetna vrednost je 3


;2: Define ADC_SAMPLEUS = 10 'default-na vrednost
;je 20
;3: Define LCD_BITS = 8 'dopustene vrednosti su 4 i
;8 - broj interfejsnih linija za podatke
;4:Define LCD_DREG = PORTB
;5: Define LCD_DBIT = 0 '0 ili 4 za 4-bitni
;interfejs
;6: Define LCD_RSREG = PORTD
;7: Define LCD_RSBIT = 1
;8: Define LCD_EREG = PORTD
;9: Define LCD_EBIT = 3
;10: Define LCD_RWREG = PORTD 'postavi na 0, ako se
;ne koristi 0 je default-na
;11: Define LCD_RWBIT = 2 'postavi na 0, ako se ne
;korist 0 je default-na
;12: Define LCD_COMMANDUS = 2000 'kasnjenje posle
;LCDCMDOUT, default-na vrednost je 5000
;13: Define LCD_DATAUS = 50 'kasnjenje posle
;LCDCOUT, default-na vrednost je 100
;14: Define LCD_INITMS = 2 'kasnjenje posle
;LCDCIN,default-na vrednost 100
;15: posledenje tri Define naredbe postavljaju
;vrednosti pogodne za sim.
;16: one treba da budu izostavljene kada su u
;pitanju realne aplikacije
;17: Dim an0 As Word
;adresa 'an0' je 0x2C
;18: Dim an1 As Word
;adresa 'an1' je 0x2E
;19: Dim x0 As Word
;adresa 'x0' je 0x30
;20: Dim x1 As Word
;adresa 'x1' je 0x32
;21: Dim x2 As Word
;adresa 'x2' je 0x34

77

x3 EQU 0x36
x4 EQU 0x38
x5 EQU 0x3A

;22: Dim x3 As Word


;adresa 'x3' je 0x36
;23: Dim x4 As Word
;adrsea 'x4' je 0x38
;24: Dim x5 As Word
;adresa 'x5' je 0x3A
;25: TRISA = 0xff 'definisanje pinova Porta A kao
;ulaznih

BSF STATUS,RP0
MOVLW 0xFF
MOVWF 0x05
BCF STATUS,RP0
;26: ADCON1 = 0 'definisanje pinova Porta A kao
;analognih
BSF STATUS,RP0
CLRF 0x1F
BCF STATUS,RP0
;27:
;28: Lcdinit 'inicijalizacija LCD modula
BCF 0x08,3
BCF 0x08,1
BCF 0x08,2
BSF STATUS,RP0
BCF 0x08,3
BCF 0x08,1
BCF 0x08,2
CLRF 0x06
BCF STATUS,RP0
MOVLW 0x02
MOVWF R0L
MOVLW 0x00
MOVWF R0H
CALL W001
MOVLW 0x33
CALL LC02
MOVLW 0x33
CALL LC02
MOVLW 0x33
CALL LC02
MOVLW 0x38
CALL LC02
MOVLW 0x0C
CALL LC02
MOVLW 0x01
CALL LC02
;29: petlja
L0001:
;30:
;31: Adcin 0, an0
BSF STATUS,RP0
BSF ADCON1,ADFM
MOVLW 0x00
BCF STATUS,RP0
MOVWF R0L
CALL A001
BSF STATUS,RP0
MOVF ADRESL,W

78

BCF STATUS,RP0
MOVWF 0x2C
MOVF ADRESH,W
MOVWF 0x2D
;32: x0 = (5 * an0) / 1023
MOVLW 0x05
MOVWF R3L
CLRF R3H
MOVF 0x2C,W
MOVWF R1L
MOVF 0x2D,W
MOVWF R1H
CALL M001
MOVWF 0x30
MOVF R2H,W
MOVWF 0x31
MOVF 0x30,W
MOVWF R0L
MOVF 0x31,W
MOVWF R0H
MOVLW 0xFF
MOVWF R1L
MOVLW 0x03
MOVWF R1H
CALL D001
MOVWF 0x30
MOVF R0H,W
MOVWF 0x31
;33: x1 = (48 * ((an0 + 2) - (x0 * 205))) / 100
MOVF 0x2C,W
ADDLW 0x02
MOVWF 0x32
MOVF 0x2D,W
BTFSC STATUS,C
ADDLW 0x01
ADDLW 0x00
MOVWF 0x33
MOVF 0x30,W
MOVWF R3L
MOVF 0x31,W
MOVWF R3H
MOVLW 0xCD
MOVWF R1L
CLRF R1H
CALL M001
MOVWF 0x3C
MOVF R2H,W
MOVWF 0x3D
MOVF 0x3C,W
SUBWF 0x32,W
MOVWF 0x32
MOVF 0x3D,W
BTFSS STATUS,C
ADDLW 0x01
SUBWF 0x33,W
MOVWF 0x33
MOVLW 0x30
MOVWF R3L

79

CLRF R3H
MOVF 0x32,W
MOVWF R1L
MOVF 0x33,W
MOVWF R1H
CALL M001
MOVWF 0x32
MOVF R2H,W
MOVWF 0x33
MOVF 0x32,W
MOVWF R0L
MOVF 0x33,W
MOVWF R0H
MOVLW 0x64
MOVWF R1L
CLRF R1H
CALL D001
MOVWF 0x32
MOVF R0H,W
MOVWF 0x33
;34: Lcdcmdout LcdClear 'brisanje LCD displeja
MOVLW 0x01
CALL LC02
;35: Lcdout "Napon na pinu A0" 'tekst prve linije
MOVLW 0x4E
CALL LC01
MOVLW 0x61
CALL LC01
MOVLW 0x70
CALL LC01
MOVLW 0x6F
CALL LC01
MOVLW 0x6E
CALL LC01
MOVLW 0x20
CALL LC01
MOVLW 0x6E
CALL LC01
MOVLW 0x61
CALL LC01
MOVLW 0x20
CALL LC01
MOVLW 0x70
CALL LC01
MOVLW 0x69
CALL LC01
MOVLW 0x6E
CALL LC01
MOVLW 0x75
CALL LC01
MOVLW 0x20
CALL LC01
MOVLW 0x41
CALL LC01
MOVLW 0x30
CALL LC01
;36: Lcdcmdout LcdLine2Home 'postavljanje kursora
;na pocetak 2.linije

80

MOVLW 0xC0
CALL LC02
;37: Lcdout "iznosi: ", #x0, ".", #x1, "V" 'nacin
;formatiranja teksta 2.linije
MOVLW 0x69
CALL LC01
MOVLW 0x7A
CALL LC01
MOVLW 0x6E
CALL LC01
MOVLW 0x6F
CALL LC01
MOVLW 0x73
CALL LC01
MOVLW 0x69
CALL LC01
MOVLW 0x3A
CALL LC01
MOVLW 0x20
CALL LC01
MOVF 0x30,W
MOVWF R2L
MOVF 0x31,W
MOVWF R2H
CALL LC21
MOVLW 0x2E
CALL LC01
MOVF 0x32,W
MOVWF R2L
MOVF 0x33,W
MOVWF R2H
CALL LC21
MOVLW 0x56
CALL LC01
;38: WaitMs 2

kasnjenje 2ms

MOVLW 0x02
MOVWF R0L
CLRF R0H
CALL W001
;39: Adcin 1, an1
BSF STATUS,RP0
BSF ADCON1,ADFM
MOVLW 0x01
BCF STATUS,RP0
MOVWF R0L
CALL A001
BSF STATUS,RP0
MOVF ADRESL,W
BCF STATUS,RP0
MOVWF 0x2E
MOVF ADRESH,W
MOVWF 0x2F
;40: x2 = (5 * an1) / 1023
MOVLW 0x05
MOVWF R3L
CLRF R3H
MOVF 0x2E,W
MOVWF R1L

81

MOVF 0x2F,W
MOVWF R1H
CALL M001
MOVWF 0x34
MOVF R2H,W
MOVWF 0x35
MOVF 0x34,W
MOVWF R0L
MOVF 0x35,W
MOVWF R0H
MOVLW 0xFF
MOVWF R1L
MOVLW 0x03
MOVWF R1H
CALL D001
MOVWF 0x34
MOVF R0H,W
MOVWF 0x35
;41: x3 = (48 * ((an1 + 2) - (x2 * 205))) / 100
MOVF 0x2E,W
ADDLW 0x02
MOVWF 0x36
MOVF 0x2F,W
BTFSC STATUS,C
ADDLW 0x01
ADDLW 0x00
MOVWF 0x37
MOVF 0x34,W
MOVWF R3L
MOVF 0x35,W
MOVWF R3H
MOVLW 0xCD
MOVWF R1L
CLRF R1H
CALL M001
MOVWF 0x3C
MOVF R2H,W
MOVWF 0x3D
MOVF 0x3C,W
SUBWF 0x36,W
MOVWF 0x36
MOVF 0x3D,W
BTFSS STATUS,C
ADDLW 0x01
SUBWF 0x37,W
MOVWF 0x37
MOVLW 0x30
MOVWF R3L
CLRF R3H
MOVF 0x36,W
MOVWF R1L
MOVF 0x37,W
MOVWF R1H
CALL M001
MOVWF 0x36
MOVF R2H,W
MOVWF 0x37
MOVF 0x36,W

82

MOVWF R0L
MOVF 0x37,W
MOVWF R0H
MOVLW 0x64
MOVWF R1L
CLRF R1H
CALL D001
MOVWF 0x36
MOVF R0H,W
MOVWF 0x37
;42: Lcdcmdout LcdClear 'brisanje LCD displeja
MOVLW 0x01
CALL LC02
;43: Lcdout "Napon na pinu A1" 'tekst prve linije
MOVLW 0x4E
CALL LC01
MOVLW 0x61
CALL LC01
MOVLW 0x70
CALL LC01
MOVLW 0x6F
CALL LC01
MOVLW 0x6E
CALL LC01
MOVLW 0x20
CALL LC01
MOVLW 0x6E
CALL LC01
MOVLW 0x61
CALL LC01
MOVLW 0x20
CALL LC01
MOVLW 0x70
CALL LC01
MOVLW 0x69
CALL LC01
MOVLW 0x6E
CALL LC01
MOVLW 0x75
CALL LC01
MOVLW 0x20
CALL LC01
MOVLW 0x41
CALL LC01
MOVLW 0x31
CALL LC01
;44: Lcdcmdout LcdLine2Home 'postavljanje kursora
;na pocetak 2.linije
MOVLW 0xC0
CALL LC02
;45: Lcdout "iznosi: ", #x2, ".", #x3, "V" 'nacin
;formatiranja teksta 2.linije
MOVLW 0x69
CALL LC01
MOVLW 0x7A
CALL LC01
MOVLW 0x6E
CALL LC01

83

MOVLW 0x6F
CALL LC01
MOVLW 0x73
CALL LC01
MOVLW 0x69
CALL LC01
MOVLW 0x3A
CALL LC01
MOVLW 0x20
CALL LC01
MOVF 0x34,W
MOVWF R2L
MOVF 0x35,W
MOVWF R2H
CALL LC21
MOVLW 0x2E
CALL LC01
MOVF 0x36,W
MOVWF R2L
MOVF 0x37,W
MOVWF R2H
CALL LC21
MOVLW 0x56
CALL LC01
;46: WaitMs 2 'kasnjenje 2ms
MOVLW 0x02
MOVWF R0L
CLRF R0H
CALL W001
;47:
;48: Goto loop 'beskonacna petlja
GOTO L0001
; kraj programa
L0003:

GOTO L0003
; rutina mnoenja

M001: MOVLW 0x10


MOVWF R4L
CLRF R0H
CLRF R0L
M002: RRF R3H,F
RRF R3L,F
BTFSS STATUS,C
GOTO M003
MOVF R1L,W
ADDWF R0L,F
MOVF R1H,W
BTFSC STATUS,C
INCFSZ R1H,W
ADDWF R0H,F
M003: RRF R0H,F
RRF R0L,F
RRF R2H,F
RRF R2L,F
DECFSZ R4L,F
GOTO M002
MOVF R2L,W
RETURN

84

D001: MOVLW 0x10


MOVWF R3L
CLRF R2H
CLRF R2L
D002: RLF R0H,W
RLF R2L,F
RLF R2H,F
MOVF R1L,W
SUBWF R2L,F
MOVF R1H,W
BTFSS STATUS,C
INCFSZ R1H,W
SUBWF R2H,F
BTFSC STATUS,C
GOTO D003
MOVF R1L,W
ADDWF R2L,F
MOVF R1H,W
BTFSC STATUS,C
INCFSZ R1H,W
ADDWF R2H,F
BCF STATUS,C
D003: RLF R0L,F
RLF R0H,F
DECFSZ R3L,F
GOTO D002
MOVF R0L,W
RETURN

;rutina deljenja

; rutina kanjenja
W001: MOVF R0L,F
BTFSC STATUS,Z
GOTO W002
CALL W003
DECF R0L,F
NOP
NOP
NOP
NOP
NOP
GOTO W001
W002: MOVF R0H,F
BTFSC STATUS,Z
RETURN
CALL W003
DECF R0H,F
DECF R0L,F
GOTO W001
W003: MOVLW 0x0C
MOVWF R2H
W004: DECFSZ R2H,F
GOTO W004
NOP
NOP
MOVLW 0x12
MOVWF R1L
W005: DECFSZ R1L,F
GOTO W006
CALL W007

85

CALL W007
NOP
NOP
RETURN
W006: CALL W007
GOTO W005
W007: MOVLW 0x0D
MOVWF R2L
W008: DECFSZ R2L,F
GOTO W008
NOP
RETURN
; rutina kanjenja - Byte Argument
X001: MOVLW 0x0A
SUBWF R4L,F
BTFSS STATUS,C
RETURN
GOTO X002
X002: MOVLW 0x06
SUBWF R4L,F
BTFSS STATUS,C
RETURN
GOTO X002
; rutina kanjenja - Word Argument
Y001: MOVLW 0x10
SUBWF R4L,F
CLRW
BTFSS STATUS,C
ADDLW 0x01
SUBWF R4H,F
BTFSS STATUS,C
RETURN
GOTO Y002
Y002: MOVLW 0x0A
SUBWF R4L,F
CLRW
BTFSS STATUS,C
ADDLW 0x01
SUBWF R4H,F
BTFSS STATUS,C
RETURN
GOTO Y002
; Adcin rutina
A001: RLF R0L,F
RLF R0L,F
RLF R0L,F
MOVLW 0x38
ANDWF R0L,F
MOVLW 0xC1
IORWF R0L,W
MOVWF ADCON0
MOVLW 0x0A
MOVWF R4L
CALL X001
BSF ADCON0,GO
A002: BTFSC ADCON0,GO
GOTO A002
BCF PIR1,ADIF

86

BCF ADCON0,ADON
RETURN
LC01: BSF 0x08,1
BCF 0x08,2
MOVWF 0x06
BSF 0x08,3
NOP
BCF 0x08,3
MOVLW 0x32
MOVWF R4L
CALL X001
RETURN
LC02: BCF 0x08,1
BCF 0x08,2
MOVWF 0x06
BSF 0x08,3
NOP
BCF 0x08,3
MOVLW 0xD0
MOVWF R4L
MOVLW 0x07
MOVWF R4H
CALL Y001
RETURN
LC21: BSF R3H,7
MOVLW 0x27
MOVWF R1H
MOVLW 0x10
CALL LC22
MOVLW 0x03
MOVWF R1H
MOVLW 0xE8
CALL LC22
CLRF R1H
MOVLW 0x64
CALL LC22
CLRF R1H
MOVLW 0x0A
CALL LC22
MOVF R2L,W
GOTO LC23
LC22: MOVWF R1L
MOVF R2H,W
MOVWF R0H
MOVF R2L,W
MOVWF R0L
CALL D001
MOVF R0L,W
BTFSS STATUS,Z
BCF R3H,7
BTFSC R3H,7
RETURN
LC23: ADDLW 0x30
CALL LC01
RETURN

; Lcdout rutina

; Lcdcmdout rutina

; Lcdout Decimal Conversion rutina

; kraj listinga
END

87

Slika 17. Praenje A/D konverzije preko LCD modula

88

5.4.

Dopunski primeri

Naredni primeri pokazuju kako se realizuju IF i FOR petlje.


DP1. Bie prikazan primer koji demonstrira primenu IF i FOR petlje varijabla j uzima
vrednost 0 ako je 0 < i 2, odnosno 5-i ako je i >2.
BASIC:
Dim i As Byte
Dim j As Byte

;Definisanje i kao bajta (8-bitna rec)


;Definisanje j kao bajta (8-bitna rec)
;FOR i IF petlja

For i = 0 To 5
If i > 2 Then
j = 5 - i
Else
j = 0
Endif
Next i
ASEMBLER:
R0L EQU 0x20
R0H EQU 0x21
R1L EQU 0x22
R1H EQU 0x23
R2L EQU 0x24
R2H EQU 0x25
R3L EQU 0x26
R3H EQU 0x27
R4L EQU 0x28
R4H EQU 0x29
R5L EQU 0x2A
R5H EQU 0x2B
BCF PCLATH,3
BCF PCLATH,4
GOTO L0001
ORG 0x0004
RETFIE

;Prvih 12 registara opste namene(od adrese 0x20 do


;adrese 0x2B) PIC Simulator rezervise za 4-bajtne
;promenljive R0-R5. Konkretno, u ovom primeru nema
;potrebe za koriscenjem ovih promenljivih, ali
;programer softvera je predvideo rezervisanje
;prvih 12 registara za smestanje medjurezultata

;Resetovanje bitova 3 i 4 u PCLATH-u

;Povratak iz prekida
;Povratak iz interapta

L0001:

i EQU 0x2C

j EQU 0x2D

CLRF 0x2C
L0002:

MOVF 0x2C,W
SUBLW 0x05

;1: Dim i As Byte 'Definisanje i kao bajta (8-bitna


;rec)
;adresa promenljive i je 0x2C
;2: Dim j As Byte 'Definisanje j kao bajta (8-bitna
;rec)
;adresa promenljive j je 0x2D
;3: 'FOR i IF petlja
;4: For i = 0 To 5
;Vrednost na adresi 2Ch je obrisana, tj. 0
;Kao sto je napomenuto, poredjenje da li je
; promenljiva i dostigla vrednost 5 postize se
; oduzimanjem
;U akumulator se smesta vrednost sa adrese 2Ch (to
;je promenljiva i)
;Od vrednosti 05h (to je 5DEC)oduzima se vrednost

89

BTFSS STATUS,C

;koja je u akumulatoru. Rezultat se smeta u W


;Ispituje se status C flega koji ima vrednost 1
;dok je i5

GOTO L0003
;5: If i > 2 Then
;Ispituje da li je i>5 na isti nacin kao prethodno
;ispitivanje
MOVF 0x2C,W
SUBLW 0x02
BTFSC STATUS,C
GOTO L0004
MOVF 0x2C,W
SUBLW 0x05

MOVWF 0x2D

; 6: j = 5 - i
;U akumulator se smesta vrednost sa adrese 2Ch
;(to je promenljiva i)
;Od vrednosti 02h (to je 2DEC)oduzima se vrednost
;koja je u akumulatoru
; Rezultat se smesta u akumulator
;Rezultat iz akumulatora se smesta na adresu 2Dh
; (to je adresa promenljive j)
; 7: Else

GOTO L0005
L0004:
MOVLW 0x1F
ANDWF STATUS,F
CLRF 0x2D

; 8: j = 0
;U suprotnom, stanje na adresi 2Dh (to je promen;ljiva j) je 0
; 9: Endif

L0005:
MOVLW 0x1F
ANDWF STATUS,F

MOVLW 0x01
ADDWF 0x2C,F

; 10: Next i
; Inkrementiranje promenljive
; U akumulator se smesta vrednost 1
; Vrednost sa adrese 2Ch (adresa promenljive i)
;se sabira sa stanjem akumulatora smesta se na
;adresu 2Ch

BTFSS STATUS,C
; Test bit C u STATUS, preskoi ako je 1
GOTO L0002
L0003:
MOVLW 0x1F
ANDWF STATUS,F ;logika I operacija nad sadrajem akumulatora
;(to je 0x1F) i STATUS registrom
L0006:
GOTO L0006
END
; Kraj programa

Na narednoj slici je prikazan izgled osnovnog prozora u toku izvrenja programa.


Kako bi se posmatrala izmena promenjivih/varijabli i i j, potrebno je aktivirati opcije Watch
Variables i Breakpoints Manager iz menija Options.
Moe da se primeti kako se vrednosti varijabli i i j smetaju na adresama 02Ch i 02Dh,
respektivno.
Predlog je da se simulacija izvrava korak po korak (Step by step).
Programi u BASIC-u i asembleru su smeteni u fajlovima DP1.bas i DP1.asm,respektivno.

90

Slika 20 Praenje izvrenja primera DP1


DP2. Bie prikazan primer koji demonstrira primenu FOR petlje vri se sabiranje
vrednosti i {0,1,2,3,4,5,6,7,8,9} sa brojem 3. Rezultat je promenljiva j.
BASIC:
Dim i As Byte
Dim j As Byte
For i = 0 To 9
j = i + 3
Next i

;Definisanje i kao bajta (8-bitna rec)


;Definisanje j kao bajta (8-bitna rec)
;FOR petlja
;Brojanje od 0 do 9
;Uvecanje vrednosti i za 3

ASEMBLER:
R0L EQU 0x20
R0H EQU 0x21
R1L EQU 0x22
R1H EQU 0x23
R2L EQU 0x24
R2H EQU 0x25
R3L EQU 0x26
R3H EQU 0x27
R4L EQU 0x28
R4H EQU 0x29
R5L EQU 0x2A
R5H EQU 0x2B
BCF PCLATH,3
BCF PCLATH,4
GOTO L0001
ORG 0x0004

;Prvih 12 registara opste namene (od adrese 0x20 do


;adrese 0x2B)PIC Simulator rezervise za 4-bajtne
;promenljive R0-R5. Konkretno, u ovom primeru nema
;potrebe za koriscenjem ovih promenljivih, ali
;programer softvera je predvideo rezervisanje
;prvih 12 registara za smestanje medjurezultata

;Resetovanje bitova 3 i 4 u PCLATH-u

91

RETFIE
L0001:

; Povratak iz prekida

;1: Dim i As Byte 'Definisanje i kao bajta (8-bitna rec)


i EQU 0x2C ;adrsa promenljive i je 0x2C
;2: Dim j As Byte 'Definisanje j kao bajta (8-bitna rec)
j EQU 0x2D ;adrsa promenljive j je 0x2D
;3: 'FOR petlja
;4: For i = 0 To 9 'Brojanje od 0 do 9
CLRF 0x2C ;Brisanje sadrzaja adrese 0x2C
L0002:
;Provera da li je promenljiva i dostigla vrednost 9
MOVF 0x2C,W
SUBLW 0x09
BTFSS STATUS,C
GOTO L0003
;5: j = i + 3 'Uvecanje vrednosti i za 3
MOVF 0x2C,W
;j = i + 3 'Uvecanje vrednosti i za 3
ADDLW 0x03
MOVWF 0x2D
; 6: Next i
MOVLW 0x01
;Inkrementiranje i tako sto se u akumulator
ADDWF 0x2C,F
;pribavi vrednost 1, a zatim sabere sa vrednou
; na lokaciji 0x2C
BTFSS STATUS,C
;Test bit C u STATUS, preskoi ako je 1
GOTO L0002
L0003:
MOVLW 0x1F
ANDWF STATUS,F ;logika I operacija vri se nad sadrajem
;akumulatora (to je 0x1F) i registra STATUS
; Kraj programa
L0004:
GOTO L0004
END

Na sledeoj slici je prikazan izgled osnovnog prozora na kraju izvrenja programa.


Kako bi se posmatrala izmena promenjivih/varijabli i i j, potrebno je aktivirati opciju Watch
Variables iz menija Options.
Moe da se primeti kako se vrednosti varijabli i i j smetaju na adresama 02Ch i 02Dh,
respektivno.
Predlog je da se simulacija izvrava korak-po-korak (Step by step). Za izvrenje programa
treba da se izvri 111 instrukcija koje se izvre za 135 s.
Programi u BASIC-u i asembleru su smeteni u fajlovima DP2.bas i DP2.asm, respektivno.

92

Slika 18 Praenje izvrenja primera 2


DP3. Bie prikazan primer koji demonstrira primenu 2 FOR petlje vri se izraunavanje
vrednost izraza u = x + 2y, gde je x {10,9,8} i y {220,221,222,...300}.
BASIC:
Dim x As Byte
Dim y As Word
Dim u As Word
For x = 10 To 8 Step -1
For y = 220 To 300
u = x + 2*y
Next y
Next x

;Prva FOR petlja


;Druga FOR petlja

ASEMBLER:
R0L
R0H
R1L
R1H
R2L
R2H
R3L
R3H

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

0x20
0x21
0x22
0x23
0x24
0x25
0x26
0x27

;Prvih 12 registara opste namene (od adrese 0x20 do


;adrese 0x2B) PIC Simulator rezervise za 4-bajtne
;promenljive R0-R5

93

R4L EQU 0x28


R4H EQU 0x29
R5L EQU 0x2A
R5H EQU 0x2B
ORG 0x0000
BCF PCLATH,3
BCF PCLATH,4
GOTO L0001
ORG 0x0004
RETFIE
L0001:
;1: Dim x As Byte 'Definisanje
x EQU 0x2C ;Za promenljivu x dodeljuje se
;2: Dim y As Word 'Definisanje
y EQU 0x2D ;Za promenljivu y dodeljuje se
;3: Dim u As Word 'Definisanje
;bitna rec)
u EQU 0x2F ;Za promenljivu u dodeljuje se
; 4:
;5: Prva FOR petlja
;6: For x = 10 To 8 Step -1
MOVLW 0x0A
MOVWF 0x2C
L0002:
MOVLW 0x08
SUBWF 0x2C,W
BTFSS STATUS,C
GOTO L0003
; 7: 'Druga FOR petlja
; 8: For y = 220 To 300
MOVLW 0xDC
MOVWF 0x2D
CLRF 0x2E
L0004:
MOVF 0x2D,W
MOVWF R0L
MOVF 0x2E,W
MOVWF R0H
MOVLW 0x01
MOVWF R1H
MOVLW 0x2C
CALL C006
BTFSS STATUS,Z
GOTO L0005
; 9: u = x + 2 * y
MOVLW 0x02
MOVWF R3L
CLRF R3H
MOVF 0x2D,W
MOVWF R1L
MOVF 0x2E,W
MOVWF R1H
CALL M001
MOVWF 0x2F
MOVF R2H,W
MOVWF 0x30
MOVF 0x2C,W
ADDWF 0x2F,W

94

x kao bajta (8-bitna rec)


adresa 0x2C
y kao reci (16-bitna rec)
adrese 0x2D i 0x2E
rezultata u kao reci (16adresa 0x2F

MOVWF
CLRW
BTFSC
ADDLW
ADDWF
MOVWF

0x2F

STATUS,C
0x01
0x30,W
0x30
; 10: Next y
MOVLW 0x01
ADDWF 0x2D,F
MOVLW 0x00
BTFSC STATUS,C
ADDLW 0x01
BTFSC STATUS,C
GOTO L0005
ADDWF 0x2E,F
BTFSS STATUS,C
GOTO L0004
L0005:
MOVLW 0x1F
ANDWF STATUS,F
; 11: Next x
MOVLW 0x01
SUBWF 0x2C,F
BTFSC STATUS,C
GOTO L0002
L0003:
MOVLW 0x1F
ANDWF STATUS,F
; Kraj programa
L0006:
GOTO L0006
; Rutina za mnozenje
M001: MOVLW 0x10
MOVWF R4L
CLRF R0H
CLRF R0L
M002: RRF R3H,F
RRF R3L,F
BTFSS STATUS,C
GOTO M003
MOVF R1L,W
ADDWF R0L,F
MOVF R1H,W
BTFSC STATUS,C
INCFSZ R1H,W
ADDWF R0H,F
M003: RRF R0H,F
RRF R0L,F
RRF R2H,F
RRF R2L,F
DECFSZ R4L,F
GOTO M002
MOVF R2L,W
RETURN
; Rutina za poredjenje
C001: MOVWF R1L
MOVLW 0x05
GOTO C007
C002: MOVWF R1L
MOVLW 0x02
GOTO C007

95

C003: MOVWF R1L


MOVLW 0x06
GOTO C007
C004: MOVWF R1L
MOVLW 0x03
GOTO C007
C005: MOVWF R1L
MOVLW 0x04
GOTO C007
C006: MOVWF R1L
MOVLW 0x01
GOTO C007
C007: MOVWF R4L
MOVF R1H,W
SUBWF R0H,W
BTFSS STATUS,Z
GOTO C008
MOVF R1L,W
SUBWF R0L,W
C008: MOVLW 0x04
BTFSC STATUS,C
MOVLW 0x01
BTFSC STATUS,Z
MOVLW 0x02
ANDWF R4L,W
BTFSS STATUS,Z
MOVLW 0xFF
RETURN
END

Na sledeoj slici je prikazan izgled osnovnog prozora u toku izvrenja programa.


Kako bi se posmatrala izmena promenjivih/varijabli x, y i u, potrebno je aktivirati opciju
Watch Variables iz menija Options.
Moe da se primeti kako se vrednost varijabli x smeta na adresu 02Ch, dok su za
varijable z i u po-trebne 4 naredne adrese (po dve za svaku), jer su iste definisane kao
rei. Meurezultati izraunavanja se smetaju na rezervisanim adresama (020h-02Bh).
Predlog je da se simulacija izvrava Extremely Fast. Programi u BASIC-u i asembleru su
smeteni u fajlovima DP3.bas i DP3.asm, respektivno.

96

Slika 18 Praenje izvrenja primera 3


DP4. Bie prikazan primer koji demonstrira primenu kanjenja. Port B mikrokontrolera
PIC16F877 treba definisati kao izlazni. Poetno stanje Porta B treba da bude 10101010,
posle 50 s treba da se promeni u 010101010, a posle dodatnih 50 s treba da je
00000000.
BASIC:
TRISB = %00000000
PORTB = %10101010
WaitUs 50
PORTB = %01010101
WaitUs 50
PORTB = %00000000

;svi pinovi PORTA B su izlazni


;pocetno stanje
;stanje posle 50us
;konacno stanje

ASEMBLER:
R0L EQU 0x20
R0H EQU 0x21
R1L EQU 0x22
R1H EQU 0x23
R2L EQU 0x24
R2H EQU 0x25
R3L EQU 0x26
R3H EQU 0x27
R4L EQU 0x28
R4H EQU 0x29
R5L EQU 0x2A
R5H EQU 0x2B
BCF PCLATH,3
BCF PCLATH,4
GOTO L0001
ORG 0x0004
RETFIE
L0001:
BSF STATUS,RP0
CLRF 0x06
BCF STATUS,RP0

MOVLW 0xAA
MOVWF 0x06

;Prvih 12 registara opste namene (od adrese 0x20 do


;adrese 0x2B)PIC Simulator rezervise za 4-bajtne
;promenljive R0-R5. Konkretno, u ovom primeru postoji
;potreba za koriscenjem R4L koji sadrzi informaciju
;o kasnjenju (50 us)

;Resetovanje bitova 3 i 4 u PCLATH-u

;Povratak iz prekida
;1: TRISB = %00000000 'svi pinovi PORTA B su izlazni
;Brisanje (resetovanje) Porta B koji ima adresu 0x06
; 2:
;3: PORTB = %10101010 'pocetno stanje (10101010bin=0xAA)
;Vrednost 0xAA se upisuje na Port B, cija je adresa 0x06

;4: WaitUs 50
MOVLW 0x32 (0x32=50DEC)
MOVWF R4L
;Informacija o kasnjenju se cuva u R4L
CALL X001
;Pozivanje rutine koja definise kasnjenje od 50us
;5: PORTB = %01010101 'stanje posle 50us (01010101bin=0x55)
MOVLW 0x55
MOVWF 0x06
;6: WaitUs 50 (0x32=50DEC)
MOVLW 0x32
MOVWF R4L
;Informacija o kasnjenju se cuva u R4L
CALL X001
;Pozivanje rutine koja definise kasnjenje od 50us
;7: PORTB = %00000000 'konacno stanje (00000000bin=0x00)
CLRF 0x06
; Brisanje (resetovanje) Porta B
;KRAJ PROGRAMA
L0002:
GOTO L0002
;Rutina kojom se definise kasnjenje
;Osnovno kasnjenje iznosi 1us tako da
;se 50us implementira preko dve FOR
;petlje obelezene labelama X001 i X002
X001: MOVLW 0x0A

97

SUBWF R4L,F
BTFSS STATUS,C ;Test bit C u STATUS, preskoi ako je 1
RETURN
;Povratak iz potprograma
GOTO X002
X002: MOVLW 0x06
;Povratak iz potprograma
SUBWF R4L,F
BTFSS STATUS,C
;Test bit C u STATUS registru, preskoi ako je 1
RETURN
; Povratak iz potprograma
GOTO X002
END

Na sledeoj slici je prikazan izgled osnovnog prozora u toku izvrenja programa.


Predlog je da se simulacija izvrava korak-po-korak (Step by step).
Kako bi se posmatrala izmena stanja Porta B, treba aktivirati opciju 8 x Led Board iz
menija Options.
Pinovi Porta B treba da budu sloeni u opadajuem redosledu kao na slici.
Moe da se primeti kako se vrednosti varijabli i i j smetaju na adresama 02Ch i 02Dh,
respektivno.
Za izvrenje programa treba da se izvri 82 instrukcija za 117 s. (Potrebno je vreme od
nekoliko s za inicijalizaciju mikrokontrolera).
Programi u BASIC-u i asembleru su smeteni u fajlovima DP4.bas i DP4.asm,
respektivno.

Slika 21 Praenje izvrenja primera 4

98

6. Laboratorijske vebe
1.

Napisati program koji vri upis broja a=52h na lokaciju registra opte namene 0x2F.

2.

Treba sabrati brojeve a=21 (15h), b=96 (60h) i c = 34 (22h) rezultat sabiranja
smestiti na memorijsku lokaciju broja b (a + b + c b).

3.

Od broja b=100 (64h) oduzeti a=20 (14h). Rezultat oduzimanja smestiti na


memorijsku lokaciju broja a (b - a b).

4.

Izvriti zamenu binarnih vrednosti brojeva x=11110011 i y=01111101 korienjem


XOR operacije.

5.

Napisati program koji sukcecivno prikazuje sledea stanja Porta C: 0x22, 0xF4 i
0x00. (Za praenje stanja Porta C aktivirati opciju ToolsMicrocontroler View.)

6.

Napisati program koji sukcecivno prikazuje sledee rezultate:


Port C = PortD PortB i Port C = PortD + PortB.
(Stanja Portova C i D zadati proizvoljno. Za praenje stanja Porta B i definisanja
heksadecimalnih vrednosti Porta C i Porta D treba aktivirati opciju
ToolsMicrocontroler View.)

7.

Napisati program koji prikazuje sledei rezultat: Port C = PortB OR PortD.


(Stanja Portova B i D zadati proizvoljno. Za praenje stanja Porta C definisanja
heksadecimalnih vrednosti Porta C i Porta D treba aktivirati opciju
ToolsMicrocontroler View.)

8.

Napisati program koji demonstrira IF petlju promenljive x i y uneti proizvoljno a


zatim veu od te dve vrednosti smestiti na lokaciju 0x2C

9.

Napisati program koji demonstrira primenu IF i FOR petlje varijabla j uzima


vrednost 0 ako je 0 < i 2, odnosno 4+i ako je i >2.

10.

Napisati program koji vri resetovanje bita na poziciji 6 u 8-mo bitnom broju koji se
proizvoljno unese

99

7. Zakljuak
U prethodnom tekstu ovog seminarskog rada je opisan softver PIC Simulator IDE, koji
slui za simulaciju veeg broja PIC mikrokontrolera 12F i 16F serija.
Najpre je detaljno opisano 8 primera u asembleru, da bi kasnije bilo detaljno opisano i
ilustrovano 6 primera sa mikrokontrolerom PIC16F877:

broja,
upis u EEPROM mikrokontrolera,
A/D konverzija preko mikrokontrolera,
izraunavanje izraza,
upis i itanje podataka u/iz EEPROM-a mikrokontrolera,
prikaz dvokanalne A/D konverzije na LCD modulu.

Mikrokontroler PIC16F877 je izabran zbog kontinuiteta, odnosno najvei deo studentskih


projekata (seminarskih radova) je realizovan korienjem ovog mikrokontrolera.
Primeri su savim dovoljni da se savlada sutina programiranja i simulacije mikrokontrolera
korienjem softvera PIC Simulator IDE.

100

8. Literatura
PIC16F877, Microchip, sajt http://www.microchip.com
PIC Simulator IDE, sajt http://www.oshonsoft.com/pic.html
Instrukcije u PIC BASIC-u, sajt http://milan.milanovic.org/skola
Instrukcije u asembleru za PIC, sajt http://mikroe.com

101

9. CV

Prezime:
Ime:
Adresa stanovanja:
E-mail adresa:
Brano stanje:
Datum roenja:
Nacionalnost:
Obrazovanje:
Kompletna ili stepenovana diploma:
Vozaka dozvola:
Poznavanje jezika
Poznavanje operativnih sistema i
programskih paketa
Posebna interesovanja
Sposobnosti
Napomene

102

Prokopovi
Ranko
Moe Pijade 5/11, Vladiin Han
bodraje@yahoo.com
Neoenjen
08.01.1982. godine
Gimnazija Jovan Skerli Vladiin Han
IV stepen
B kategorija
Engleski (dobro)
WINDOWS XP, PIC Simulator IDE
Pretraivanje Interneta, itanje strune
literature, automobili i tehnika
Radoznalost, preduzimljivost, snalaljivost
Nosilac Vukove diplome u osnovnoj i srednjoj
koli.

You might also like