Download as pdf or txt
Download as pdf or txt
You are on page 1of 19

Hacettepe Robot Topluluu

PIC Assembly Dersleri

2. Ders: alma Mant ve


Komutlar

HUNRobotX - PIC Assembly Dersleri

2. Ders: alma Mant ve


Komutlar
Yazan: Kutluhan Akman, Dzenleyen: Canol Gkel - 5 Haziran 2007

PIC'in alma Mant zerine...

Geen derste PIC'i altrmak iin gerekli olan minimum donanmdan bahsetmitik. Beslemeleri
balamak (+5V, 0V), reset bacan +5V'a balamak ve osilatr bacaklarnn balantlarn
yapmak PIC'i altrmak iin yeterliydi. imdi biraz daha ayrntl inceleyeceiz, PIC
komutlarna ve register (yazma) mantna giri yapacaz, PIC'in iinde neler olduunu biraz
daha ayrntl olarak reneceiz.
Eer Microchip firmasnn herhangi bir mikrodenetleyicisini kullanacaksnz data sheet'ler %90
ihtimalle sizin iin yeterli olacaktr. Eer ngilizceniz varsa bir denetleyiciyi renmek iin tek
yapmanz gereken oturup data sheet'i okumak ve uygulamalar yapmaktr. Zaten yazacanz
program snrlayan genelde denetleyicinin yetenekleri deil sizin yeteneklerinizdir. Bunu yle
aklayaym: lemcinin arpma komutu olmayabilir, o zaman siz dier komutlarn birleimi
cinsinden arpma fonksiyonunu yazmalsnz; ilemcinin analog/saysal eviricisi olmayabilir, siz
haricen kullanabilmelisiniz...
lk derste PIC'in iinde sabit disk yerine geen, programn sakland bir program hafzas var
demitik, imdi onu inceleyelim.

2. Ders: alma Mant ve Komutlar

ekil 1

PIC ile alrken 2'lik 10'luk ve 16'lk say sistemlerini kullanacaz. 10'luk sistem zaten gnlk
hayatta kullandmz sistem ve "yeni balayanlara temel dersler" diye verdiimiz dkmanlarda
say sistemleri ayrntl olarak anlatld. 2'lik sistem de PIC'in kulland sistem, nk PIC'de
sadece 0 ve 1 var diye bahsetmitik. Ben size szl olarak "00110101" says ile "01101101"
saysn toplayn desem bunlar aklda tutmanz bile ok zor ama onun yerine bu saylarn 16'lk
karl olan, "35" ile "6D" heksadesimal (16'lk sistemdeki saylara byle denir) saylarn
toplayn desem cok daha rahat anlalr olur. Bir saynn sa tarafna "h" harfi koymak ya da
saynn sol tarafna "0x" (sfr ve x karakterleri) koymak o saynn heksadesimal olduunu belirtir.
Bir dier 16'lk sistem avantaj da 2'lik sistemden 16'lk sisteme evirmenin kolay oluudur. 2'lik
say sistemindeki saylar sa taraftan balayp 4'erli gruplarsnz ve her grubu ayr ayr 16'lk
sisteme evirirsiniz bylece heksadesimal say kat kaleme ya da hesap makinasna ihtiya
kalmadan bulunabilir. Ayn ilemi tersten dnp 16'lk sistemi 2'li sisteme evirirken de
kullanabiliriz. Daha ayrntl bilgi iin say sistemleri notuna baknz.
PIC'de genellikle adres isimleri heksadesimal olarak belirtilir (ekilde 1 numara ile gsterilmitir).
Program hafzas yukardan aaya satrlar eklinde oluur (ekilde 4 numara ile gsterilmitir) ve
her satrda 1 komut saklanr. Siz eer 10 komut yazdysanz, siz aksini belirtmediiniz srece
komutlarnz program hafzasnda en st satrdan (0000h) balayarak ilk 10 satra yazlr.
Eer yazlm rnek bir programa bakacak olursak komut satrlarnn en bana ORG komutu

HUNRobotX - PIC Assembly Dersleri

konulduunu grrz. Bu komut programn program hafzasna yazlrken hangi program hafzas
satrndan itibaren yazlmaya balayacan bildirir. Mesela biz ORG 0x000 komutu verince
komutlarmz program hafzasnda heksadesimal 0. adresten balayarak yazlr. Eer biz ORG
0x004 yazarsak ORG komutundan sonraki yazdmz satrlar program hafzasna heksadesimal 4.
adresten itibaren yazlmaya balar. imdi bunun bize ne kazandrdn aklayacaz.
Bizim PIC'in bir reset baca var ve eer bu bacak 1 seviyesinde (+5 Volt) olursa reset olmaz ama
eer bu bacak 0 seviyesinde (0 Volt) olursa PIC reset olur demitik. imdi gelelim reset'in
anlamna. Reset demek programnzn baa dnmesi demektir, baa dnmesi demek de programn
program hafzasnda 0000h adresinden itibaren tekrar okunmaya balamas demektir. Yani 0000h,
zellikli bir program satrdr. Bir zellikli satrmz da 0004h satrdr (ekilde 3 numara ile
gsterilmitir). Bu satrn ismi "kesme adresi"dir. lemciniz bir kesme durumunda bu adrese
gider. Peki kesme nedir? Normal program ak ierisinde, isterseniz programnzn aknn
bozulmasna neden olabilecek ncelikler belirleyebilirsiniz, bu ncelikler oluunca ilemci btn
ilerini brakr ve sizin 0004h adresine yazdnz alt program ncelikli olarak iler. Sonra kald
yerden ana program ilemeye devam eder. Burada program ak kesildii iin (Mustafa'nn
deyimi ile reklam arasna girildii iin) bu olaya kesme denir. Kesme olutuunda programmz 4.
adrese ynelecek ve oradaki komutlar ilemeye balayacaktr. Yani ORG 0x004 komutundan
sonraki satrlar ilenecektir kesme olutuunda.
imdi diceksiniz ki daha program yazmay anlatmadan programn nereye yklendiini
anlatyosun, kesme diye bii anlatyosun. Siz de haklsnz ama bu bilgiler de dursun bir kenarda,
lazm olacak program yazarken. Gelelim program yazmak iin gerekli dier eylere.
PIC ile bir program yazmak iin komutlar ve yazmalar bilmek yeterlidir. 16F84 iin sadece 35
adet komut ve 15 adet zel fonksiyon yazmac (special function register, SFR) ile 1 adet
akmlatr (ak/working register/wreg/W) vardr. Bizim iin en nemli olan, kaydedici komutlar
incelerken de fark edeceiniz gibi, W yani working register'dr. W, 8 bitlik bir yazmatr, yani
ayn anda sadece 8 bitlik veriyi saklayabilir ve Seyfullah'n deyimi ile ilemci ile bellek arasnda
elilik grevi grr.

2. Ders: alma Mant ve Komutlar

ekil 2

ekil-2'de genel kullanm amal bellek adresleri ve SFR'ler gzkyor, sanrm bellein ne
olduu gznzde acck canland. 0Ch adresinden 4Fh adresine kadar olan ksm genel amal
bellek (general purpose register, GPR) olarak kullanlyor. Bunu program memory ile
kartrmayn, program memory PIC iindeki baka bir para, bu baka bir para. Bu ksm 2
bank'tan oluuyor, bank 0 ve bank 1. Bank 0'da 00h'tan 0Bh adresine kadar SFR'ler, 0Ch'tan 4Fh
adresine kadar da GPR'ler tutulurken, bundan sonraki ksm ise kullanlmyor. Bank 2'de ise
SFR'ler 80h'tan balayp 8B adresine kadar devam ederken buradan aas kullanlmyor, yani
16F84'te bank 1'de GPR bulunmuyor. Ama bank 1'deki GPR'a ulamak isterseniz bank 0'dakine
ulayorsunuz. Yani bank 0'n GPR ksm bank 1'e yansyor.
Bu GPR'ler nasl kullanlyor imdi ona geleceiz
(Bi ay molas)
Geldik. Belleklerde de tpk program hafzasnda olduu gibi sol tarafta ve sa tarafta yazan

HUNRobotX - PIC Assembly Dersleri

heksadesimal saylar her satrn adresini gosteriyor. Program memory'deki her satr (adres) 14
bitten oluur ama bellek adresleri 8 bitten oluur (bu nemli bir ayrnt). Yani genel amal
kullandnz adreslerin (satrlarn) her birisinde en fazla 8 bitlik bilgi saklayabilirsiniz. Mesela 4
say alp karlatrp en byn bulacaksnz. 8 bitlik 2'li say sisteminde yazlabilecek en
byk say "11111111"dir. Bu saynn desimal (10'luk sistem) karl 255'tir. Sizin 1. saynz
255'ten bykse o zaman sadece 1 adet bellek adresi kullanarak sayy saklayamazsnz. Her bir
satra yazabileceiniz en byk say 255'tir. Programda kullanacanz, gelitireceiniz tekniklerle
satrlar yan yana kullanabilirsiniz. Mesela 2 satr yan yana kullanrsanz yazabileceiniz en
byk say "1111111111111111" olur. Bu saynn desimal karl ise 65535'dir.
Bellekler ve SFR'ler 8 bitliktir dedik. SFR'yi tanmlamann da zaman geldi de geiyor bile:
SFR'ler siz programnzda ilem yaparken baz zel durumlar kontrol etmeye ve/veya baz
ayarlar yapmaya yarayan bellek adresleridir. Nasl ki program memory'de zel ilemi olan 2
adres vard (0004h ve 0000h), bellek adreslerinde de bank 0 ve bank 1'de ilk 12 adres zel
fonksiyonlar iin ayrlmtr. Mesela aritmetiksel ilemlerden sonra sonucun veya + olduunu
kontrol etmek isteyebilirsiniz ya da PIC'in bir baca ile bir LED yakmak isterken baka bir
bacana dme balamanz gerekebilir. Baka rnekler de vermek gerekirse PIC'in iindeki
dahili sayc modln kullanmak istiyorsanz onun ayarlarn ilgili yazma vastas ile yaparsnz;
ayn ekilde kesmeleri de ilgili kesme yazmac ile ayarlarsnz. Daha nce bahsettiimiz PORTB
de aslnda bir yazmatr. Bazen komutlar ilerken bellek adreslerinden "file" diye de
bahsedeceiz.
Bir de yukarda bahsedilen working register'mz (W) var. Mikrodenetleyici iindeki ilemci,
bellek ve program hafzas fiziksel olarak da ayr eylerdir. Bunlar arasndaki balant da PIC
iindeki baka yardmc donanmlar ile yaplr. Bu ksm ayrnt olduu iin girmiyorum, bize de
bu ayrntlar ileride zaten gerekli olmayacak. lemci, bellek ile ilgili yapaca birok ilemi W
vastas ile yapar. Mesela bir file'n (yazmacn, register'n) iine direk bir bilgi ykleyemezsiniz.
ncelikle W'ya atarsnz sonra da bunu W'dan file'a atarsnz. Diyelim ki PORTA'nn iindeki
saysal bilgiyi 1 azaltp PORTB'ye atmak istiyoruz. O zaman rnek komutlar u ekilde olacaktr:
Not 1: Aadaki komutlar ileride daha ayrntl olarak anlatlacaktr.
Not 2: ; (noktal virgl) iaretinden sonra gelen yazlar derleyici tarafndan dikkate alnmaz ve bu
yzden programlarda yorum yazmak amacyla kullanlr.
MOVFW PORTA
MOVWF REG1
DECF

REG1

MOVFW REG1

;
;
;
;
;
;
;
;

MOVe File to Working register. Burada file PORTA


oluyor. Yani PORTA, Working register'a tanyor
MOVe Working register to File. Burada file REG1 diye
tanmlanm herhangi bir general purpose register
DECrement File. Register'n ieriini 1 azaltyoruz,
Burada register dediimiz REG1
MOVe File to Working register. REG1 ismini verdiimiz
ve sadece PORTA'nn bilgisini tayp 1 azaltmak iin

2. Ders: alma Mant ve Komutlar

MOVWF PORTB

; kullandmz adresi imdi geri W'ya tayacaz


; bylece W'dan PORTB'ye atayabileceiz
; MOVe Working register to File. File burada PORTB oldu

Not: Program yazarken sonradan tanmlanan hereyde (register, satr etiketi gibi) byk/kk
harf duyarll vardr. Yani REG1 yazmac ile reg1 yazmac hatta Reg1 yazmac birbirlerinden
hep farkl yazmalardr.
Komutlar anlamaya baladka en son akladm olay daha net kavrayacaksnz.

PIC Assembly Komutlar


Assembly dilinde her komut ngilizce bir manann ksaltlmdr ve bu komut aslnda 2'lik
sistemde 6'bitlik bir sayy temsil eder. Eer bu komutla birlikte bir sabit say falan da
kullanlacaksa (komut gerektiriyorsa) o zaman program memory'ye bu sabit ile yazlrlar.
(program memory'de her komut iin 14 bit ayrldn sylemitik)

ekil 3

ncelikle bit ilem komutlarndan balayalm anlatmaya. Bit ilem komutlarnda her komut bir
yazmacn sadece 1 biti ile ilgili ilem yapar. Programda bir yazmacn bir bitini belirtmek iin ilk
olarak yazmacn ismini yazarz sonra da virgl koyup kanc bit ile ilgili ilem yapmak
istediimizi yazarz. Mesela PORTA yazmacnn 3. biti ile ilem yapacaksak PORTA, 3 yazarz.
Bir de komutlara gelmeden nce yazmalara ve baz belirli bitlere isim vermeyi renelim.
Yazmalarn ierii ile ok oynayacamzdan dolay program srasnda yazmalara birok defa
ulamamz gerekecektir. Her seferinde bir yazmaca adresi ile seslenmek zor olur nk adres
aklayc olmadndan programn okunabilirlii azalr, programc da hangi adresi ne iin
kullandn unutacaktr. Bu yzden rnein bir saya bilgisini tutacamz bellek adresini
program iinde SAYAC diye arabilmemiz iin EQU komutu yaratlmtr. Bu komut ile
yaratacamz isimlerin ierii program boyunca tarafmzdan srekli deitirilebileceinden
dolay bunlara programlama dnyasnda "deiken" ismi de verilir.
Bu komutun kullanmn bir rnekle grelim. Mesela 0x30 adresine SAYAC ismini vermek iin
programa yle bir satr ilave ederiz:

HUNRobotX - PIC Assembly Dersleri


SAYAC

EQU

0x30

; Bildiiniz gibi bana 0x eklenen saylar


; heksadesimal oluyordu

Artk belleimizdeki 0x30 adresini program iinde SAYAC yazarak da kullanabiliriz. Ayn
ekilde bitlere de istedigimiz ismi vermemiz mmkndr. Bunun iin "#DEFINE" nilemci
komutu kullanlr. PORTA'nn 0. bitine bir LED balam olalm ve bit komutlarn kullanarak bu
LED'i sndrmek istiyoruz diyelim. Bu ilem iin
BCF

PORTA, 0

demek yerine PORTA, 0' "LED" diye tanmlayp ondan programn geri kalannda artk LED diye
bahsedebiliriz:
#DEFINE

LED

PORTA, 0

Birazdan bunlarn kullanmna da rnek vereceiz. imdi esas komutlara gelirsek...


BCF (Bit Clear File)
Herhangi bir yazmacn istedigimiz bitini "0" yapar. O bitin nceki deeri nemli deildir.
BSF (Bit Set File)
Herhangi bir yazmacn istediimiz bitini "1" yapar. O bitin nceki deeri nemli deildir.
Bu rendiimiz ilk iki komutu bir rnekte kullanalm:
BCF

PORTA, 3

BSF
BSF

REG1, 0
HASAN, 7

;
;
;
;
;
;

PORTA'nn 3. bitinin 16F84'n 2. bacan temsil


ettiini geen ders renmitik. Burada da o baca 0
yapyoruz
REG1 bizim sonradan tanmladmz herhangi bir GPR.
HASAN da REG1 gibi bir GPR, adn REG1 deil de HASAN
koymuuz.

BCF komutunu u ekilde daha nceden tanmladmz bir bit ile de kullanabiliriz:
BCF

LED

BTFSS (Bit Test File, Skip if Set)


Bu komutu istediimiz bir biti test etmek iin kullanyoruz. Eer bit 0 ise program akmz hi
birey olmam gibi bir alt satra geiyor. Eer bitimiz set edilmi ise (yani 1 ise, yani elektronik
iin dnrsek +5V seviyesinde ise), o zaman bir alt satr atladktan sonra program ilemeye
devam ediyor.
rnek: PORTB, 0'a bir dme, PORTA, 0'a ise bir LED takl olsun ve dmenin takl olduu
bacaa dme baslmad taktirde 0, basld taktirde 1 geliyor olsun. Eer 1 gelirse (dmeye
baslrsa) LED yaklacak.

2. Ders: alma Mant ve Komutlar


#DEFINE
#DEFINE

DUGME PORTB, 0
LED
PORTA, 0

BTFSS BUTON
GOTO $-1
BSF
LED

BTFSC (Bit Test File, Skip if Clear)


Bu komut ise ayn 1 satr atlama ilemini kontrol edilen bit 0 ise yapyor.
GOTO (GO TO)
Programn bu komuta geldiinde istediimiz yere dallanmasn salar. Bu yer bir satr etiketi ile
belirtilebilecei gibi bu yerin ka satr aas ya da yukars olaca da sylenebilir.
rnek:
GOTO

BEKLE

; Banda "BEKLE" yazan satra (yani BEKLE etiketine


; sahip satra) dallanr ve program oradan devam eder

"$" karakteri PIC Assembly dilinde programn o an olduu yeri belirtir. Yani
GOTO

eklinde bir komut yazmakla


BEKLE
GOTO BEKLE

yazmak arasna fark yoktur. Programn 10 satr yukarya (nceye) dallanmasn istersek $
iaretinin yanna "-0A" yazabiliriz. Yani $ (bulunduu satr) - 0A (heksadesimal 10 says)
Eger 10 satr aa gitmesini istersek + iaretini kullanrz:
GOTO $ + 0A

Sadece yorumlardan oluan ya da bo satrlar bu sayya dahil deildir. Eer program yazarken
heksadesimal saylar ile uramak istemiyorsanz sayynn sol tarafna "D" harfi koyarak saynn
desimal olduunu "B" harfi koyaraksa binary (2'li sistemdeki saylara verilen isim) bir say
olduunu belirtebilirsiniz. Bu kullanmda sayy da ayrca tek trnak iinde yazmanz
gerekmektedir.
GOTO
GOTO

$ + D'15'
$ + B'00001111'

Bu 2 komut ayn ii yapyor ama 1.'de desimal, 2.'de ise binary say kullanlyor. Ama
heksadesimal bir say kullanacaksanz programda saylarn bana "H" yazmanza gerek yok

HUNRobotX - PIC Assembly Dersleri

nk programda tm saylar varsaylan olarak heksadesimal'dir.


imdi sra geldi byte oriented komutlara yani byte ilem komutlarna. 8 bitin toplam 1 byte eder.
Dolays ile 16F84'n her bellek adresi 1 byte'lktr. Adndan da anlalabilecei gibi byte oriented
komutlar da btn byte' deitirebilecek ya da etkileyebilecek komutlardr. Bundan nceki bit
oriented komutlarda sadece 1 biti deitiriyor ya da kontrol ediyorduk, imdi 1 byte'lk bellek
adresinin 1 satrndaki bitlerin alayn tek seferde deitirebilecek ya da kontrol edebiliceiz.

ekil 4

Arkadalar yukardaki grafik ve ekillerin hepsi orijinal PIC16F84 data sheet'inde bulunmaktadr.
Ben de btn bilgilerimi oradan rendim, yani ana kaynak oras. Dolays ile burada aklnza
gelip de cevabn bulamadnz hereyi oradan bulabilirsiniz, orada da bulamazsanz
HUNRobotX birebir grmeler ile ya da forum zerinden sizin sorularnz itina ile
cevaplayacaktr. Neyse reklam arasndan sonra devam edelim.
nce yukardaki tabloyu okumay renelim. Aslnda ok basit birazck incelerseniz kendiniz de
zebilirsiniz. En bataki komuttan balayalm.
ADDWF f, d (ADD Working register and File then write it into destination)
File ne demekti renmitik, register yani bellekteki adresler demekti. W ne demekti onu da
renmitik, working register. Yani bu komut W'nun ierii ile istediimiz herhangi bir yazmacn
ieriini topluyor. Ama komutun kullanmnda ADDWF f, d yazyordu, hadi komutu anladk F ile

2. Ders: alma Mant ve Komutlar

W toplanyor peki topladktan sonra bu toplam nereye yazyor? Burada "d" destination yani
toplamn yazlaca hedef manasna geliyor, "d" yerine "f" ya da "w" yazabiliriz her komut iin.
Eer w yazarsak toplam W'ya eer f yazarsak toplam f'ye yani mevzubahis hangi yazma ise ona
yazlr.
rnek:
ADDWF REG1, f

ADDWF REG1, w

;
;
;
;
;
;

Burada W ile REG1 toplanr ve sonuc f'ye yani REG1'e


atlr. W'nun ierii deimez. REG1, EQU ile
tanmlanm herhangi bir GPR adresidir
Burada W ile REG1 toplanr ve sonuc W'ya atlr
W'nun eski deeri silinir ve yerine yeni deer
yazlr. REG1'in ierii ise deimez

Bu komutu sadece komutlar anlamaya rnek olarak verdim, imdi komutlar tek tek
inceleyeceiz ama daha kolay anlalmas bakmndan yukardaki listedeki sra ile gitmeyeceiz.
MOVLW

k (MOVe Literal into Working register)

k, literal (sabit say) demektir D'3', D'5', D'34', D'155', H'3A', 0xFF, B'00110001' gibi... Bu komut
da vereceiniz herhangi bir sabit sayy working register'a atmaya yaryor.
MOVWF

f (MOVe Working register into File)

Bu komut W'nun ieriini belirteceiniz yazmaca atyor.


rnek: SAYAC adnda bir yazma tanmlayalm sonra W iine atayacamz bir sabit sayy bu
yazmacn iine yerletirelim:
SAYAC

EQU

MOVLW D'10'
MOVWF SAYAC

MOVF

0x30

; SAYAC deikenini tanmladk


; 10 saysn W'nun iine attk
; W'nun ieriini SAYAC yazmacna atadk

f, d (MOVe File)

Bu komutta dikkat edilmesi gereken bir ey d'yi kullanmann anlamsz olacadr. "d" yerine f
yazarsanz yine kendi iine tamaya calaca iin bir anlam olmayacaktr, yani "d" yerine w
yazlmak zorundadr.
pucu: MOVFW komutunu MOVF komutu yerine kullann hatta MOVF komutunu hi
renmeyin. ki komut da belirttiiniz bir f'yi W'ya tamaya yarar.
ADDLW

k (ADD Literal to Working register)

W ile bir sabit sayy toplar ve sonucu W'ya yazar.


rnek: SAY1 ve SAY2 yazmalarndaki saylar toplayp SAY3 yazmacna yazalm ve zerine de

HUNRobotX - PIC Assembly Dersleri

10 ekleyelim. SAY1, SAY2'nin daha nceden tanmlandn ve ilerine sabit saylar atandn
varsayalm.
MOVFW
ADDWF
ADDLW
MOVWF

SAY1
SAY2, w
D'10'
SAY3

;
;
;
;

SAY1'i W'ya attk


W ile (W'nun iinde SAY1 vard) SAY2'yi topladk
Sabit say olan 10 ile W'nun ieriini topladk
Ve sonucu SAY3 yazmac iine attk

CLRF f (CLeaR File)


Bahsi geen yazmacn ieriini 0x00 yapmak iin yani temizlemek iin kullanlr.
CLRW (CLeaR Working register)
Working register'n ieriini temizlemek iin kullanlr.
NOP (No OPeration)
Bu komuta gelindiinde 1 ilem sresince hibir ilem yaplmaz ve bir sonraki satra geilir.
INCF f (INCremet File)
Bahsi geen yazmacn ieriini 1 arttrmak iin kullanlr. Eer yazmacn ierii 255 ise 1
arttrdmz zaman sonucun 256 olmas gerekir, fakat yazmalar 8 bitlik olduklar iin 256
saysn saklayacak yerleri yoktur (B'1 0000 0000' = D'256'). O zaman sonu ne olacak sorusunun
cevab 0, yani 256 says ile 0 saysnn arasnda bir fark yoktur yazma olarak. Dolays ile
mod(256)'da ilem yapm oluyoruz.
DECF f (DECrement File)
Bahsi geen yazmacn ieriini 1 azaltr. Eer yazma ierii 0 ise, nceki komutta da 256 ile 0'n
fark yok demitik. Bunun sonucu olarak ierii 0 olan bir yazmacn ieriini 1 azaltrsak yeni
deeri 255 olur.
DECFSZ

f (DECrement File Skip if Zero)

Bahsi geen yazmacn ieriini 1 azaltr ve yazmacn ieriini kontrol eder. Eer yazmacn yeni
ierii 0 ise bir sonraki satr atlar, ilemez.
INCFSZ

f (INCrement File Skip if Zero)

Bahsi geen yazmacn ieriini 1 arttrr ve bu arttrma sonucu yeni ierik deeri 0 olursa (yani
256 olursa) sonraki 1 satr ihmal eder ve ilemez.
rnek: Diyelim ki benim PIC'imin bir bacana LED (PORTA, 3), bir baka bacana da
(PORTB, 0) dme bal, benim istediim alma biimi ise yle: Eer dmeye basmyorsam
LED yanmasn, eer dmeye basyorsam LED srekli yanp snsn. Fakat biliyorum ki ilemci
1 komutu 1 mikrosaniyede iliyor ve bu kadar hzl olduundan dolay srekli BCF ve BSF

2. Ders: alma Mant ve Komutlar

komutlarn arka arkaya kullanrsam gzm yanp snmeleri alglayamaz.


#DEFINE
#DEFINE

DUGME PORTB, 0
LED
PORTA, 3

BASLA
BTFSS
GOTO
BSF
BCF
GOTO

DUGME
$ - 1
LED
LED
BASLA

Yukardaki program sanki alrm gibi durmasna ramen PIC'in bu ilemleri 5-6
mikrosaniyede bitirecek olmasndan dolay sonu alamayz. Dolays ile yakma ve sndrme
satrlar arasna bir bekleme zaman koymalyz, yani program LED'i yaktktan sonra biraz
beklemeli ve yle sndrmeli, sndrdkten sonra da biraz beklemeli ve yle yakmal.
lemcinin her komutu 1 mikrosaniyede ilediini geen derste grmtk. Yukarda da NOP
komutunun hibir ilem yapmadan 1 mikrosaniye ilemciyi beklettiini biliyoruz. Ama 1
mikrosaniyelik bekleme bizim iimize yaramaz, alt alta yzlerce NOP yazmak da kullanl deil.
O yzden bir saya oluturmal ve yazacamz komutlar tekrar ettirerek (ilemciye bo bo say
saydrarak) zaman harcatmalyz.
Yukarda DECFSZ komutunu grmtk. Mesela imdi yazacamz programda SAYAC diye bir
yazma tanmlayalm ve onun vastas ile gecikme yapalm.
SAYAC
#DEFINE
#DEFINE

EQU
0x1A
DUGME PORTB, 0
LED
PORTA, 3

BASLA
BTFSS DUGME
;
GOTO $ - 1
;
BSF
LED
;
MOVLW D'200'
;
MOVWF SAYAC
;
NOP
; lem yapma
NOP
; lem yapma
DECFSZ
SAYAC ;
;
GOTO $ - 3
;
;
BCF
LED
; SAYAC
MOVLW D'200'
;
MOVWF SAYAC
NOP
NOP

DUGME'den gelen veri 1 ise 1 satr atla


Deilse geri dn
DUGME 1 ise LED'i yak
W'ya desimal 200 saysn ykle
W'yu SAYAC'a at. SAYAC'n yeni deeri 200 oldu

SAYAC' 1 azalt, 0 ise 1 satr atla deilse alttaki


satr ile
Eer sayac'n 1 azaltlm deeri 0 deilse 3 satr
yukar ge
0 olunca LED'i sndr
Yukardaki gecikme satrlarnn ayns

HUNRobotX - PIC Assembly Dersleri


DECFSZ
SAYAC
GOTO $ - 3
GOTO BASLA ; SAYAC 0 olunca BASLA satrna dn ve tekrar DUGME'yi
; kontrol et.

Gelelim dier bir aritmetik ilem komutumuz olan SUB'a.


SUBLW
k (SUBtract W from Literal), SUBWF
write the result into destination)

f, d (SUBtract W from File then

karma ilemi yapmak iin SUBLW ve SUBWF olmak zere 2 komutumuz bulunuyor. Bu
komutlarda kartlan taraf hep W. Nereden kartlacann cevab ise komutta. SUBLW
komutunda herhangi bir sabit saydan W kartlyor, SUBWF komutunda ise herhangi bir
yazmacn ieriinden W kartlyor.
PIC'te mantk ilemleri yapmak iin komutlar bulunmakta ve bu komutlar bizim iimizi birok
konuda kolaylatrmaktadr. Mantk kaplarndan ve bunlarn yapt ilemlerden temel elektrik ve
elektronik dersinde gereken bilgiler verilecek. imdi gelelim bu komutlara ve ne i iin nasl
kullanldklarna.
Not: Burada anlatlmayan RLF ve RRF komutlar ders 3'te ayrntl olarak anlatlacaktr.
SWAPF

f, d (SWAP File then write the result into destination)

Bahsi geen yazmacn ilk 4 biti ile son 4 bitinin yerlerini deitirir.
rnek:
SWAPF REG1, f
; REG1 diye tanmlanm olan yazmacn ilk 4 biti ile son 4
bitini yer deitir.

PIC'te mantk kaplarndan 4 tanesi bulunmaktadr. NOT (DEL, tersleme), OR (VEYA,


toplama), AND (VE, arpma) kaplar ile XOR (ZELVEYA) kaps bulunur.
COMF

f, d (COMPlement File then write the result into destination)

Belirtilen yazmacn ieriindeki 1'leri 0, 0'lar 1 yapar. Yani yazma ieriinin tersini alr. Bir
nevi NOT ilevi grr. Her bit iin NOT ilemini gerekletirir.
erii 10001110 olan DENEME isimli bir yazmacmz olsun.
COMF DENEME, f

komutunu kullanacak olursak DENEME yazmacnn tersi alnacak ve destination olarak yine
yazma gsterildiinden yeni ierik 01110001 olacaktr. Eer
COMF DENEME, w

2. Ders: alma Mant ve Komutlar

yazsaydk yani destination olarak W'yu gsterseydik o zaman deneme isimli yazmacn ierii
deimeyecekti nk tersi alnm olan ierik W'ya yazlacakt.
ANDWF f, d (AND Working register and File then write the result into destination)
Belirtilen yazma ile W'yu mantksal VE ilemine tutar. Hatrlayacanz gibi VE ilemine tabi
tutulan 2 bitten birisi bile 0 ise sonu 0 olurken eer ikisi de 1 ise sonu 1 oluyordu.
ANDWF

DENEME, w

lemini yapacak olursak (DENEME ve W iin kafadan ilk deerler belirledim.)


01110001 DENEME yazmacnn ilk ierii
10011100 W'nun ilk ierii
01110001 DENEME'nin uyguladmz ilemden sonraki ierii
00010000 W'nun uyguladmz ilemden sonraki ierii
lem yapldktan sonra kayt yeri olarak W gsterildii iin sonu W'ya atld. Bu ilemin amacn
u ekilde basite dnebiliriz: Bir evimiz var ve evde 8 adet lamba yanyor. Ben bunlardan
belirlediim birka tanesini sndrmek istiyorum (o an yanyor olmas veya snk olmas ile
ilgilenmiyorum). Bu lambalarn yanmas da DENEME yazmacnn ieriine bal olsun. Yani
DENEME yazmacnn 0. bitinde 1 varsa 0. lamba yanyor, 0 varsa 0. lamba snk, ayn ey dier
bitler iin de geerli. Eer 3., 5. ve 0. lambalarn snklnden emin olmak istiyorsam W'nun
iine 11010110 yklerim ve DENEME yazmac ile VE ilemine tutarm.
ANDLW

k (AND a Literal and Working register then write the result into destination)

Bu komut VE ilemini bir sabit say ile W arasnda yapar ve sonucu W'ya yazar.
IORWF f, d (Inclusive OR Working register and File then write the result into destination)
Bu komut ise mantk ilemlerinden VEYA'y yerine getirir. Hatrlayacanz gibi VEYA
ileminde ileme tutulan bitlerden herhangi birisi 1 ise sonu 1, ancak her ikisi de 0 ise sonu 0
oluyordu. Bu komutu da odadaki lambalar yakmak iin kullandmz dnebiliriz.
Lambalardan yakmak istedikerimize karlk gelen bitlerin ieriine 1 ykleriz ve geri kalanlarn
ieriine de 0 ykleriz. 1 ile VEYA ilemine tutulanlar yanar, geri kalanlarn konumunda
deiiklik olmaz.
rnek:
IORWF DENEME, f

; DENEME ile W'yu VEYA ilemine tutar sonucu yine DENEME'nin


; iine atar.

01110001 DENEME'nin ilk ierii

HUNRobotX - PIC Assembly Dersleri

10010011 W'nun ilk ierii


11110011 DENEME'nin uyguladmz ilemden sonraki ierii
10010011 W'nun uyguladmz ilemden sonraki ierii
IORLW

k (Inclusive OR a Literal and Working register)

VEYA ilemini sabit bir say ile W arasnda yapar.


rnek:
IORLW

D'23'

;
;
;
;

Desimal olarak belirtilen 23 says ile W'nun ieriini


VEYA ilemine tutuyoruz. Bu ilemi kolay anlamak iin
ncelikle 23 desimal saysn binary olarak yazalm:
D'23' = B'00100011'

00100011 23'n binary karl


10011100 W'nun ilk ierii
10111111 W'nun uyguladmz ilemden sonraki ierii
XORWF

f, d (XOR Working register and File then write the result into destination)

Veee ite sra geldiii son mantk ilemimizzzz ZELVEYA ilemineee. Bu ilem mantk ilemleri
iinde aklda tutulmas en zorudur, niye bilmiyorum aslnda ok kolaydr. Bu ilem farkll
seven bir ilemdir. Eer giriler birbirinden farkl olursa (zaten ne kadar farkl olabilir, 1 ve 0'dan
baka bii yok elimizde) sonu 1 oluyor, eer giriler ayn ise, yani iki say da 0 veya 1 ise sonu
0 oluyor. Bu komut da W ve belirtilen yazmacn ieriini alr, ZELVEYA ilemine tutar. "d"
yerine w yazlmsa sonucu W'ya, f yazlmsa sonucu bahsi geen yazmaca atar.
XORLW

k ( XOR a Literal and Working register)

Bir sabit say ile W'yu ZELVEYA ilemine tutar, sonucu da W'ya atar.
Bu komut pratikte ok iimize yaryor. Mesela bir yazmacn iinde 13 says olup olmadn
merak ediyoruz. O zaman nce o yazmacn ieriini W'ya atp sonra W'yu 13 sabit says ile
XORLW ilemine tutarz ve sonucun 0 olup olmadna bakarz. Eer sonu 0 ise saymz 13
demektir.
pucu: Ayn ilemi W'ya 13 saysn ykleyip XORWF ilemini uygulayarak da yapabiliriz.
Bu komutun baka bir kullanm alan ise durumunu deitirmek istediimiz bitlerledir. Mesela
PORTA, 2'ye LED baladk ve bu LED'i yanyorsa sndrmek, snkse yakmak istiyoruz. Bu
durumda bu biti 1 ile ZELVEYA ilemine tabi tutarz. PORTA, 2'de 1 varsa ayn olduklarndan
sonuc "0" olur, eer 0 varsa farkl olduklarndan sonu "1" olur.

2. Ders: alma Mant ve Komutlar

rnek: W'nun iine 36 ykleyip SAYI isimli yazmala W'yu XOR ilemine tutalm.
MOVLW
XORWF

D'36'
SAYI, w

; W'nun iine 36 ykledik


; SAYI isimli yazmala W'yu XOR yaptk

imdi bunun sonularn inceleyelim. SAYI isimli yazmacn iinde nceden B'00011011'
saysnn olduunu varsayalm.
00011011 SAYI'nn ilk ierii
00110100 W'nun ilk ierii
00011011 SAYI'nn uyguladmz ilemden sonraki ierii
00101111 W'nun uyguladmz ilemden sonraki ierii
imdi SAYI yazmacnn ieriinin de nceden 36 olduunu varsayalm.
00110100 SAYI'nn ilk ierii
00110100 W'nun ilk ierii
00110100 SAYI'nn uyguladmz ilemden sonraki ierii
00000000 W'nun uyguladmz ilemden sonraki ierii
Grdnz gibi SAYI yazmac ile W'nun ierii ayn olduundan sonu 0 oldu.
Yardmc Komutlar
PIC'te sayfaya komutlar yazmaya balamadan nce baz yardmc komutlar kullanmamz
gerekebilir. Bunlarn bazlarndan yukarda bahsettik (EQU, #DEFINE ve ORG gibi). Dierleri
ise unlar:
list: Kullandnz PIC eidini belirtmeye yarar. Kullanm u ekildedir:
list

p=16F84A

__CONFIG (CONFIGuration): Bu komut ile ilemcinin baz zelliklerini ayarlarsnz. Aada


komutun tam yazm ekli ve komut hakkndaki aklamalar belirtilmitir.
__CONFIG

_CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

_CP_OFF (Code Protect OFF): Buraya OFF yerine ON da yazabilirsiniz. Bu komut ile
ilemcinize yazdnz kodu bakalarnn okuyabilip okuyamayacan belirlersiniz.
_WDT_OFF (Watch Dog Timer OFF): Watch Dog Timer'n ak m kapal m olacan
belirlemenize yarar, Watch Dog Timer'n ne olduunu ileride greceksiniz.
_PWRTE_ON: lemcinin alta kendisine reset atmasna yarar, OFF veya ON olabilir.

HUNRobotX - PIC Assembly Dersleri

_XT_OSC: Devrede kullandnz osilatr tipini belirtmenize yarar. Dierlerinden farkl olarak 4
farkl deer alabilir: RC, XT, LP, HS.
RC: silatr olarak sadece 1 diren 1 de kapasitrden oluturduumuz bir devre kullandmz
belirtir.
XT: Devrelerimizde hep bu deeri kullanacaz. Devreye kristal + 2 kapasitr baladmz
belirtmeye yarar. Bu osilatr tipi en hassas osilatr tipidir.

Balantlar
http://robot.ee.hacettepe.edu.tr/
http://www.microchip.com/

You might also like