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/