PIC ASSEMBLY VE MAKROLAR

Transkript

PIC ASSEMBLY VE MAKROLAR
PIC ASSEMBLY VE
MAKROLAR
Abdullah UNUTMAZ – Ağustos 2009
HUNROBOTX–MAKALELER
Pic Assembly ve Makrolar
#DEFIE
#DEFINE anahtar sözcüğü ile kendi tanımladığımız değişkenler, yada include dosyalarında
tanımlanmış olan, adlandırılmış olan adresler kullanacağımız programı daha kolay yazıp
gerek başkasının daha kolay anlaması, gerekse uzun bir sürenin ardından programa tekrar
bakmamız gerektiğinde, yazdığımız kodları daha rahat anlamamız için adlarda değişiklikler
yapabiliriz.
Örneğin ;
#DEFINE
#DEFINE
INPUT
OUTPUT
PORTB,1
PORTB,2
Diyerek yeniden adlandırdığımız PORTB’nin 1.ve 2. bitlerini programın ilerleyen
bölümlerinde kendi koyduğumuz isimlerini PORTB,1 ve PORTB,2 yerine kullanabiliriz.
Ayrıca böyle bir yaklaşımda mesela değişik zamanlarda belirli bir mantığa göre çalışan
makineler yada robotlar yaptığımızda kullandığımız microchipin değişik pinlerini dahi input
ve output olarak kullanacağımız zaman kodun birçok yerinde değişşiklik yapmak yerine
sadece programımız başında tanımladığımız bu anahtar sözcüğü değiştirerek sorunu
çözebiliriz.
#ICLUDE
#INCLUDE anahtar sözcüğü programlayıcıya daha önceden yazılmış bir programı ve
programında kullanacağı özel, belki evrensel, keywordleri ekleme imkanı sağlayan önemli bir
koddur.
Örnek verecek olursak;
#INCLUDE
#INCLUDE
<p16f876.inc>
<subprogram.asm>
COSTAT
CONSTANT keywordü sayesinde programcı programın ilerleyen safhalarında değişmesini
istemediği değişkenleri tanımlama imkanına sahiptir.
Örenk;
CONSTANT
CONSTANT
<sabit ismi>=<sabitin sayısal değeri>
DELAY=150
HUNROBOTX–MAKALELER
VARIABLE
VARIABLE keywordü ile yazmış olduğumuz programda değişkenler tanımlayabilir ve bu
değişkenlere göre koşul cümleleri tanımlayabiliriz.
Örnek;
VARIABLE
VARIABLE
<isim>=<sayısal değer>
COUNTER=150
SET
SET keywordü ile bir registerı mesela sayaç olarak atayabilirsiniz, ancak daha sonra aynı
fonksiyonu kullanarak tutulan registerı değiştirebilirsiniz.
Örnek;
<kullanılacak isim> SET <registerın adresi>
counter
SET h’10’
.
.
.
counter
SET h’01’
EQU
EQU fonksiyonu neredeyse SET ile aynıdır, bir farkla, EQU ile atama ancak birkere
yapılabilir.
Örnek verecek olursak;
<register ismi>
EQU <register adresi>
register
EQU h’05’
ORG
ORG keywordü ile programın chipin belleğinde hangi adresten itibaren kaydedildiğini
belirleyebiriz. Ayrıca kesme alt programının başlangıç adresini belirler.
Örnek;
ORG
h’00’
ED
END programın bittiğini assemblerın anlamasını sağlar. Kullanmak mecburidir, aksi halde
hata kaçınılmaz olur. Bütün kodlar bittikten sonra yazılır, yani alt programların da
yazılmasından sonra eklenir.Örneğin;
.
.
.
END
HUNROBOTX–MAKALELER
Koşul Đfadeleri
IF-EDIF
IF ,eğer, ifadesi bir değişkenin değerine, belki net olarak bilinmesi durumunda bir portun
değerine göre işlem yapmak için kullanılabilir. Örneğin;
IF
COUNTER<100
INCF
COUNTER,F
GOTO
START
ELSE
GOTO
FINISH
ENDIF
Yukarıdaki örnekte ELSE ifadesi de dikkati çekiyor, ELSE ise IF ile araştırılan koşulun
sağlanmadığı her durumda işlevlik kazanarak execution oluyor.
NOT : #DEFINE
INPUT
PORTB,1
;şeklinde bir tanımlama yapınca
.
.
.
IF
INPUT==1 ;derleme esnasında hata verir
;”illegal character (,)
WHILE-EDW
WHILE ifadesinden sonra sağlanması gereken şart yazılır, mesela;
WHILE
a<10 dediğimizde, ”a 10’dan küçük olduğu sürece” ifadesini bilgisayarın
anlayabileceği bir dile çevirmiş oluruz.
Kullanımı;
Örnek;
WHILE <condition>
WHILE
A<50
.
A=A+1
.
ENDW
.
ENDW
IFDEF-EDIF
DEFINE ile oluşturulan koşul ifadelerini test ederken kullanmak için geliştirilmiştir.
Örnek;
#define
condition
.
.
.
Đfdef condition
.
.
.
Endif
a==1
HUNROBOTX–MAKALELER
IFDEF-EDIF
IFNDEF, if not defined, ifadesini kullanarak da şart cümlesi oluşturabiliriz. Bu ifdef’in tam
tersi şekilde çalışır. Yani #DEFINE aracılığıyla tanımlanan koşul ifadesi #UNDEFINE
keywordü ile silinmiş ise yada öyle bir koşul ifadesi hiçbir zaman oluşturulmamışsa IFNDEF
koşul ifadesi sağlanır , yani “true” olur, “ifndef-endif” bloğu içinde kalan koda göre işlem
yapılır.
Örnek;
#define
#define
.
.
.
#undefine
.
.
.
Đfndef
.
.
.
Else
.
.
.
Endif
input portb,1
inputcondition
input==1
inputcondition
inputcondition
CBLOCK-EDC (Constants Block)
CBLOCK ifadesi parametreye belirli bir sabit değer atadıktan sonra devam eden her
parametreye bir öncesinin bir fazlası değer atayan bir nevi sabit dizisi elde etme yöntemidir.
Örnek;
CBLOCK
h’01’
bir , iki, uc ;bir=h’01’
ENDC
; iki=h’02’,uc=h’03’
DB (Defining One Byte Data)
Bellekte belirtilen adreslere verileri sırasıyla yazmaya yarayan fonksiyondur.
Örnek;
DB ‘T’,h’12’,’a’,’b’,h’0f’
HUNROBOTX–MAKALELER
DE (Defining the EEPROM)
EEPROM hafızasına belirtilen adresten itibaren veri yazmak için kullanılır.Đlk defa
tanımlanırken sadece EEPROM hedefli olarak yazılan bu fonksiyon istenilen bellek türünün
istenilen adresine veri kaydı için kullanılabilir.
Örnek;
ORG h’2100’
DE “data”,0
DT ( Data Table )
DT fonksiyonu ile oluşturulan tablo her işlenilişinde W ,workin register’a , 8086 ve 8085 gibi
dillerde A, yani accumulator’ın yerini tutar, kaldığı parametrenin değerini aktarır.
Örnek;
DT bir,iki,uc
Makrolar
Makrolar daha yüksek seviyeli programlama dillerindeki , mesela c gibi , fonksiyonların
işlevini assemblyde görmektedir. Makrolar programcıya bir kodu sadece bir kere makro
olarak ifade ettikten sonra sadece o makroyu çağırarak istediği yerde kullanabilme olanağı ve
,mesela, aradan uzun bir süre geçtiğinde unuttuğu programı daha kolay okumasını ,eğer b,r
grup olarak proje yapılıyorsa diğer üyeler için kodun okunma kolaylığını sağlar.
Nasıl ifade edildiklerine gelince ;
<makro ismi> MACRO [<argüman1>,<argüman2>,<argüman3>,…,<argümanN>]
;argüman sayısı ihtiyaca bağlı olarak değişicektir hiçbir argüman kullanılmayabilir de
…
…
…
ENDM
Makroların kod içinde ifade edildikleri yere gelince , öncelikle unutulmamalıdır ki , daha ileri
düzey programlama dilleriyle çalışmış kişiler “Main” fonksiyonunun dışında fonksiyonların
tanımlanmalarıyla makroların tanımlanmasını karıştırmamalıdır, END ifadesinden sonra
yazılan kodlar assembler tarafından algılanmayacaktır, dolayısıyla oluşturulan makrolar
mutlaka bu ifadeden önce yer almalıdır. Ayrıca makrolar asıl program dosyamızın dışında
başka bir “.asm” uzantılı program dosyasında ifade edildikten sonra bu makro dosyasını
#INCLUDE komutuyla programımıza eklememizle de kullanıma açılmış olur.
Bu kullanımı normalde assembly komutları içerisinde yer almayan çarpma işlemi için kendi
yazacağımız bir makroyu kullanmak için gözlemlyebiliriz ;
HUNROBOTX–MAKALELER
; -------------carpma.asm-----------------;
toplam set
0xC0
carpma
macro
sayi , defa
; “carpma” isimli makromuzu
; “toplam”=“sayi”x”defa” işlemi için tanımlıyoruz
movfw 0xc0
CarpimDongu
addwf
toplam,f
decfsz
defa
goto
CarpimDongu
endm
end
----------------------------------------------------------------------------------------------------------------#INCLUDE ”carpma.asm”
…
…
…
carpma
3,5
…
…
…
end
Gibi bir program güzel bir örnek olacaktır.
Bağlantılar
http://robot.ee.hacettepe.edu.tr/

Benzer belgeler