ASM Macroları

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.....

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

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..

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...

     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..

topladeg macro sayibir,sayiiki  ;  
       movf sayibir,0
       addwf sayiiki,1
       endm
toplasay macro sayibir,sayiiki  ;  
       movlw sayibir
       addlw sayiiki
       endm

değ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
     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ğin
 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...