PIC ASM Macroları
Makro Yazım kuralları
Pikyaz asm(Assembly) kitaplıkları kullanmaktadır.. Ve Kitaplıklarda tüm komutlar birer asm. makrosudur.
Makrolar asm dosyası içinde tam yolu ve dosya ismi ile tanımlanmalıdır..
"include /home/ulusoy/Pikyaz/ktp/5110/makro.asm"
şeklinde.....
Asm dosyası içinde config açıklamalarından hemen sonra tanımlama yapılmalı... asm dosyasının en sonunda yaptığımızı varsayarsak, tanımlanan makroları kullanamayız... Temel kural: bir makroyu kullanmadan onu tanımlamalıyız.....
Makrolar asm dosyası içinde tam yolu ve dosya ismi ile tanımlanmalıdır..
"include /home/ulusoy/Pikyaz/ktp/5110/makro.asm"
şeklinde.....
Asm dosyası içinde config açıklamalarından hemen sonra tanımlama yapılmalı... asm dosyasının en sonunda yaptığımızı varsayarsak, tanımlanan makroları kullanamayız... Temel kural: bir makroyu kullanmadan onu tanımlamalıyız.....
Makro nedir? Makrolar sürekli tekrarlanan kodları birazfarklı olarak bir kere yazıp bunları ister normal asm sayfasına istersekte ayrı dosya olarak kaydedip, istediğimiz zaman kullanabildiğimiz hazır kodlardır..
call komutu ile yaptığımız çağrıdan temel farkı istersek referans verebiliriz.
örneğin sayibir ve sayiiki adında değişkeni referans alan toplama makrosu yazalım..
topla macro sayibir,sayiiki ;
movf sayibir,0
addwf sayiiki,1
endm
ilk dikkat etmemiz gereken şey makroya bir ad veriyoruz . ikinci olarak "macro" yazarak tanımlıyoruz.. üçüncü olarak referansları yazarken arayab virgül koyuyoruz... son olarak makro mutlaka endm komutuyla bitirilir... Asm kodlar içinde bu macro şöyle kullanılır..
include 18f2550.inc
.......
cblock
rkm1
rkm2
endc
.....
movlw .12
movwf rkm1
movlw .23
movwf rkm1
topla rkm1,rkm2
include 18f2550.inc
.......
cblock
rkm1
rkm2
endc
.....
movlw .12
movwf rkm1
movlw .23
movwf rkm1
topla rkm1,rkm2
Makrolarda adın yazıldığı ilk kod boşluksuz olarak yazılır. diğer kod satırlarında boşluk bulunmalıdır..
Eğer makro içinde goto komutu ile bir noktaya atlanacaksa gidilecek yerde boşluksuz yazılır. örnek2
abc makro sayi,deger
local atla ,atla2
btfss sayi,7 ; sayinin yedinci biti bir mi?..
goto atla ; 1 se atla ya git.
movf sayi,0 ;sayı değişkenini oku..
movwf deger ; deger referansına yaz..
goto atla2
atla
clrf sayi ; sayıyı temizle
clrf deger ; degeri temizle
atla2
endm
Bu makroda dikkat etmemiz gereken şey atla ve atla2 etiketleridir. Bunlar "local" olarak makro adından sonra tanımlanmalıdır.. macrolarda noktalı virgül koyup açıklamalarımız yazabiliriz.. açıklamalar derlenmiyecektir..
Makrolar bir iki satır olabileceği gibi sayfalarca da olabilir... Örneğin rlf veya rrf kodu 18f pic lerde kullanılmaz.
ve 16f picler için yazılmış kodlarda bu sorun olur..
Makrolar bir iki satır olabileceği gibi sayfalarca da olabilir... Örneğin rlf veya rrf kodu 18f pic lerde kullanılmaz.
ve 16f picler için yazılmış kodlarda bu sorun olur..
rlf macro deg,kay
rlcf deg,kay
endm
rrf macro deg,kay
rrcf deg,kay
endm
Bu makrolar ile 18f asm kodu içinde rlf ve rrf komutlarını rahatlıkla kullanabiliriz...
rlf sayi,1
rrf sayi,0
gibi...
variable _deger
Bu değişkeni sadece o sayfada bulunan makrolarda kullanabiliriz.. Asm kodlarını yazdığımız sayfa ayrı ise bu değişkeni orada kullanamayız...
değişken toplatacaksak
topladeg ab,cb
sayı toplatacaksak
toplasay 12,23
şeklinde kullanırız..
bu macroyu asm kod içinde şöyle kullanırız..
kontrol PORTB,1 ; Portb 1 i kontrol et..
Burada bir parantez açalım..Asm sayfasında da makrolarda da ; 16f pic lerde sadece PORT bulunur.. portlar giriş çıkış olarak ayarlanır..
18f piclerde ise port sadece girişi lat ise çıkışı tanımlar.. yani bir pini test edeceksek port kullanırız.
Eğer bir ledi yakacaksak lat kullanırız.
btfsc porta,2 ; Porta2 yi test et
bsf lata,1 ; Porta1 i yüksek yap..(ledi yak)
Eğer btfsc lata,2 veya bsf porta,1 yazsaydık kod hatalı sonuç verir...
Parantezi kapattık....
atla#v(sayi)
yazarak sayiya verilen her değer için yeni bir etiket oluşturmuş oluruz...
Peki yeni etiketlere ne zaman gerek duyarız? Özellikle döngülerde....Makroyu kendi içinde döngüye sokmak için yer#v(sayı) kodu kullanılır. Döngülerde bu durum sık yaşanır.. for döngüsü ile bazı işlemler yapmasını for döngüsünden çıkış için se belli bir komuta gitmesini sağlıyabiliriz...
örneğin makro kısmında
test macro pin,sayi
BTFSS PORTA,pin ;PORTA,pin i test et
goto bitti#v(sayi) ; 1 se bittiye git..
endm
testson macro btsy
bitti#v(sayi)
endm
asm dosyasında
test 1,1 ; PORTA1 1 se aşağıdakileri yap..
clrf LATB
bsf LATB,1
bekle 100
bcf LATB,1
testson
şeklinde kullanabiliriz.. testson komutu gönderene kadar olan işlemler yapılır...
rlcf deg,kay
endm
rrf macro deg,kay
rrcf deg,kay
endm
Bu makrolar ile 18f asm kodu içinde rlf ve rrf komutlarını rahatlıkla kullanabiliriz...
rlf sayi,1
rrf sayi,0
gibi...
Makrolarda Değişkenler..
Makro sayfasının en başına o sayfadaki makrolarda kullanacağımız değişkenleri bildiririz..variable _deger
Bu değişkeni sadece o sayfada bulunan makrolarda kullanabiliriz.. Asm kodlarını yazdığımız sayfa ayrı ise bu değişkeni orada kullanamayız...
Makrolarda Değişken ve Sayı farkı
Makro gelen referansın değişkenmi sayımı olduğunu bilmez.. bu yüzden bu konuya dikkat etmek gerekiyor..
topla macro sayibir,sayiiki ;
movf sayibir,0
addwf sayiiki,1
endm
Bu makroyu yazdığımız zaman asm kodu içinde 12 ve 23 sayılarını toplatmak için
"topla 12,23 "
yazarsak hatalı sonuç elde ederiz..
çünkü makrodaki
"movf sayıbir,0"
satırı bir değişkeni okuması gerekmektedir... 12 ve 23 sayılarını toplamak yerine pic deki 12 ve 23 nolu kütüğü okuyup toplar...
Bu yüzden değişken macrosu ve sayı macrosu yazarak sorunu çözeriz..
Bu makroyu yazdığımız zaman asm kodu içinde 12 ve 23 sayılarını toplatmak için
"topla 12,23 "
yazarsak hatalı sonuç elde ederiz..
çünkü makrodaki
"movf sayıbir,0"
satırı bir değişkeni okuması gerekmektedir... 12 ve 23 sayılarını toplamak yerine pic deki 12 ve 23 nolu kütüğü okuyup toplar...
Bu yüzden değişken macrosu ve sayı macrosu yazarak sorunu çözeriz..
topladeg macro sayibir,sayiiki ;
movf sayibir,0
addwf sayiiki,1
endm
toplasay macro sayibir,sayiiki ;
movlw sayibir
addlw sayiiki
endmdeğişken toplatacaksak
topladeg ab,cb
sayı toplatacaksak
toplasay 12,23
şeklinde kullanırız..
Makroda If komutu
if komutu sadece sayısal değeri kontrol eder..
kontrol macro pin
if (pin == 0) ; pin değeri 0 sa
bsf LATA,0 ; porta,0 ı yüksek(5V) yap
endif1
if (pin == .1) ; pin 1 se
bcf LATA,0 ; porta,0 ı düşük(0V) yap
endif
kontrol macro pin
if (pin == 0) ; pin değeri 0 sa
bsf LATA,0 ; porta,0 ı yüksek(5V) yap
endif1
if (pin == .1) ; pin 1 se
bcf LATA,0 ; porta,0 ı düşük(0V) yap
endif
endm
bu macroyu asm kod içinde şöyle kullanırız..
kontrol PORTB,1 ; Portb 1 i kontrol et..
Burada bir parantez açalım..Asm sayfasında da makrolarda da ; 16f pic lerde sadece PORT bulunur.. portlar giriş çıkış olarak ayarlanır..
18f piclerde ise port sadece girişi lat ise çıkışı tanımlar.. yani bir pini test edeceksek port kullanırız.
Eğer bir ledi yakacaksak lat kullanırız.
btfsc porta,2 ; Porta2 yi test et
bsf lata,1 ; Porta1 i yüksek yap..(ledi yak)
Eğer btfsc lata,2 veya bsf porta,1 yazsaydık kod hatalı sonuç verir...
Parantezi kapattık....
#v nedir ne işe yarar?
Yeni etiket oluşturmada #v eki kullanılır. örneğinatla#v(sayi)
yazarak sayiya verilen her değer için yeni bir etiket oluşturmuş oluruz...
Peki yeni etiketlere ne zaman gerek duyarız? Özellikle döngülerde....Makroyu kendi içinde döngüye sokmak için yer#v(sayı) kodu kullanılır. Döngülerde bu durum sık yaşanır.. for döngüsü ile bazı işlemler yapmasını for döngüsünden çıkış için se belli bir komuta gitmesini sağlıyabiliriz...
örneğin makro kısmında
test macro pin,sayi
BTFSS PORTA,pin ;PORTA,pin i test et
goto bitti#v(sayi) ; 1 se bittiye git..
endm
testson macro btsy
bitti#v(sayi)
endm
asm dosyasında
test 1,1 ; PORTA1 1 se aşağıdakileri yap..
clrf LATB
bsf LATB,1
bekle 100
bcf LATB,1
testson
şeklinde kullanabiliriz.. testson komutu gönderene kadar olan işlemler yapılır...