Tweet

Pic Assembly ve Makrolar

Hazırsanız Başlıyoruz =)

#DEFINE
#DEFINE anahtar sözcüğü ile kendi tanımladığımız değiskenler, yada include dosyalarında
tanımlanmıs olan, adlandırılmıs olan adresler kullanacağımız programı daha kolay yazıp
gerek baskası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ğisiklikler
yapabiliriz.[...]
Örneğin ;
#DEFINE INPUT PORTB,1
#DEFINE OUTPUT 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 yaklasımda mesela değisik zamanlarda belirli bir mantığa göre çalısan
makineler yada robotlar yaptığımızda kullandığımız microchipin değisik pinlerini dahi input
ve output olarak kullanacağımız zaman kodun birçok yerinde değissiklik yapmak yerine
sadece programımız basında tanımladığımız bu anahtar sözcüğü değistirerek sorunu
çözebiliriz.

#INCLUDE
#INCLUDE anahtar sözcüğü programlayıcıya daha önceden yazılmıs bir programı ve
programında kullanacağı özel, belki evrensel, keywordleri ekleme imkanı sağlayan önemli bir
koddur.
Örnek verecek olursak;
#INCLUDE <p16f876.inc>
#INCLUDE <subprogram.asm>
CONSTANT
CONSTANT keywordü sayesinde programcı programın ilerleyen safhalarında değismesini
istemediği değiskenleri tanımlama imkanına sahiptir.
Örenk;
CONSTANT <sabit ismi>=<sabitin sayısal değeri>
CONSTANT DELAY=150

VARIABLE
VARIABLE keywordü ile yazmıs olduğumuz programda değiskenler tanımlayabilir ve bu
değiskenlere göre kosul cümleleri tanımlayabiliriz.
Örnek;
VARIABLE <isim>=<sayısal değer>
VARIABLE COUNTER=150
SET
SET keywordü ile bir registerı mesela sayaç olarak atayabilirsiniz, ancak daha sonra aynı
fonksiyonu kullanarak tutulan registerı değistirebilirsiniz.
Ö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 baslangıç adresini belirler.
Örnek;
ORG h?00?

END
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

Kosul İfadeleri
IF-ENDIF
IF ,eğer, ifadesi bir değiskenin değerine, belki net olarak bilinmesi durumunda bir portun
değerine göre islem 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 arastırılan kosulun
sağlanmadığı her durumda islevlik kazanarak execution oluyor.
NOT : #DEFINE INPUT PORTB,1 ;seklinde bir tanımlama yapınca
.
.
.
IF INPUT==1 ;derleme esnasında hata verir
;?illegal character (,)
WHILE-EDW
WHILE ifadesinden sonra sağlanması gereken sart 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 çevirmis oluruz.
Kullanımı; Örnek;
WHILE <condition> WHILE A<50
. A=A+1
. ENDW
.
ENDW
IFDEF-ENDIF
DEFINE ile olusturulan kosul ifadelerini test ederken kullanmak için gelistirilmistir.
Örnek;
#define condition a==1
.
.
.
ifdef condition
.
.
.
Endif

IFDEF-EDIF
IFNDEF, if not defined, ifadesini kullanarak da sart cümlesi olusturabiliriz. Bu ifdef?in tam
tersi sekilde çalısır. Yani #DEFINE aracılığıyla tanımlanan kosul ifadesi #UNDEFINE
keywordü ile silinmis ise yada öyle bir kosul ifadesi hiçbir zaman olusturulmamıssa IFNDEF
kosul ifadesi sağlanır , yani ?true? olur, ?ifndef-endif? bloğu içinde kalan koda göre islem
yapılır.
Örnek;
#define input portb,1
#define inputcondition input==1
.
.
.
#undefine inputcondition
.
.
.
&#272;fndef inputcondition
.
.
.
Else
.
.
.
Endif
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? ; iki=h?02?,uc=h?03?
ENDC
DB (Defining One Byte Data)
Bellekte belirtilen adreslere verileri sırasıyla yazmaya yarayan fonksiyondur.
Örnek;
DB ?T?,h?12?,?a?,?b?,h?0f?

DE (Defining the EEPROM)
EEPROM hafızasına belirtilen adresten itibaren veri yazmak için kullanılır.&#272;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 olusturulan tablo her islenilisinde 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
islevini 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ğisicektir 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ısmıs kisiler ?Main? fonksiyonunun dısında fonksiyonların
tanımlanmalarıyla makroların tanımlanmasını karıstırmamalıdır, END ifadesinden sonra
yazılan kodlar assembler tarafından algılanmayacaktır, dolayısıyla olusturulan makrolar
mutlaka bu ifadeden önce yer almalıdır. Ayrıca makrolar asıl program dosyamızın dısında
baska 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ıs olur.
Bu kullanımı normalde assembly komutları içerisinde yer almayan çarpma islemi için kendi
yazacağımız bir makroyu kullanmak için gözlemlyebiliriz ;

; -------------carpma.asm-----------------;
toplam set 0xC0
carpma macro sayi , defa ; ?carpma? isimli makromuzu
; ?toplam?=?sayi?x?defa? islemi için tanımlıyoruz
movfw 0xc0
CarpimDongu
addwf toplam,f
decfsz defa
goto CarpimDongu
endm
end
-----------------------------------------------------------------------------------------------------------------
#INCLUDE ?carpma.asm?
?
?
?
carpma 3,5
?
?
?
end


ozuha

29 Aralik 2009 17:17

İlgili Olabilecek Makaleler


Yorumlar (0)




Ziyaretçi olarak yorum yazamazsınız. Üye olmak için tıklayın Üye iseniz giriş yapın.



MENÜ » FORUM
Menü » Takip et
RSS Facebook Twitter Friendfeed
Sık Kullanılanlar Google Yahoo Live
Menü » Paylaş
E-Posta ile gönder Twitter Facebook Friendfeed
Buzz Stumbleupon Delicious Digg