MACRO Kullanımı

Başlatan Hiram, 09 Kasım 2007, 19:12:23

Hiram

16f84A 'da yazdığım programda macro kullanmayı denedim.
Aşağıdaki gibi programın başında makro oluşturdum
                      Kontr macro bit,go,wait,go2
      BTFSS   bit
      GOTO   go
      BCF   bit
      CALL   wait   
      GOTO   go2
      endm


Program içerisinde yazdığım makroyu aşağıdaki şekilde kullandım

Kontr RL,ON,BEKLE,KIZIL

Tanımsız sembol hatası veriyor ve BCF bit satırı için Miising arguments hatası.

Konu hakkında fikirlerinizi bekliyorum
Teşekkür ederim



Aşağıdaki hataları veriyor;

Error[127]   H:\DENEME\MUTFAK2.ASM 80 : Too many arguments
Error[113]   H:\DENEME\MUTFAK2.ASM 19 : Symbol not previously defined (bit)
Error[128]   H:\DENEME\MUTFAK2.ASM 19 : Missing argument(s)
Error[113]   H:\DENEME\MUTFAK2.ASM 20 : Symbol not previously defined (go)
Error[113]   H:\DENEME\MUTFAK2.ASM 21 : Symbol not previously defined (bit)
Error[128]   H:\DENEME\MUTFAK2.ASM 21 : Missing argument(s)
Error[113]   H:\DENEME\MUTFAK2.ASM 22 : Symbol not previously defined (wait)
Error[113]   H:\DENEME\MUTFAK2.ASM 23 : Symbol not previously defined (go2)
Halting build on first failure as requested.
BUILD FAILED: Fri Nov 09 18:55:45 2007

arslan74

GOTO komutu belirtilen adrese gider. Ama senin macronda go belirtilen adres tanımlanmamış. Aynı şekilde go2 adresi ve wait alt programıda mecud edil bu yüzden bunları bulamadığı için hata veriyor.

Selamlar

Hiram

arslan74


Kontr RL,ON,BEKLE,KIZIL

Program içerisinde komutu yukarıdaki şekilde kullanıyorum.Makroda belirttiğim değişkenlerin yerini RL,ON,BEKLE,KIZIL almış olmuyor mu?

Makrodaki  değişkenleri nasıl tanımlayacağım?

Daha açıklayıcı şekilde yardımcı olursan sevinirim.

İlgilendiğin için teşekkür ederim.
Saygılar

arslan74

Alıntı yapılan: "Hiram"arslan74


Kontr RL,ON,BEKLE,KIZIL

Program içerisinde komutu yukarıdaki şekilde kullanıyorum.Makroda belirttiğim değişkenlerin yerini RL,ON,BEKLE,KIZIL almış olmuyor mu?

Makrodaki  değişkenleri nasıl tanımlayacağım?

Daha açıklayıcı şekilde yardımcı olursan sevinirim.

İlgilendiğin için teşekkür ederim.
Saygılar

Merhaba,

Öncelikle Macro komutlarını kullanmadan önce, Normal ASM ile komut yazmayı iyi öğrenmende fayda var.
ASM program yazmayı bilmeden, Marco yapmaya çalışırsan şimdiki gibi ASM ait cok basit hataların anlamlarını bilemiyeceksin.

CALL wait


bu kodun anlamı wait diye bir alt program dallanır.

GOTO go2


Bu kodun anlamı ise go2 etiketine gider.

Ama senin koduna ne wait alt programı nede go2 etiketi gözüküyor.

Kodda olmayan bir yerede gitmek tabiki hataya neden olacak.

Selamlar

Hiram

Arslan hocam
ya siz beni anlamadınız ya da ben anlatamadım

call ve goto komutlarının ne anlama geldiğini biliyorum

Kontr makrosunu programım içerisinde kullandığımda

KIZIL altprogramı go2 'in yerini,Bekle altprogramı wait'in yerini,on go'nun yerini almayacak mı?

Sizden ricam makro yazımıyla ilgili örnek eğer elinizde mevcutsa yazabilir misiniz?
Böyle daha iyi anlaşabilicez.
Saygılar

Hiram

Eğer makromu aşağıdaki gibi tanımlarsam
Kontr macro RL,ON,BEKLE,KIZIL
BTFSS RL
GOTO ON
BCF RL
CALL BEKLE
GOTO KIZIL
endm


ve program içerisinde
Kontr RL,ON,BEKLE,KIZIL

bu şekilde kullanırsam bir sorun yok.
Ama o zaman makro tanımlamanın bi anlamı kalmıyor.
Tanımladığım makroyu sadece programın bi yerinde kullanabilmiş oluyorum.


Kontr macro bit,go,wait,go2
BTFSS bit
GOTO go
BCF bit
CALL wait
GOTO go2
endm


Burada belirtilen değişkenler
Kontr RL,ON,BEKLE,KIZIL  yazdığımda

Bit...........RL
go.......ON
Wait.........BEKLE
go2..........KIZIL
 ile eşleşmeyecek mi?

CLR

@Hiram

Önce hangi durumlarda macro yazılır bunu öğrenmelisin. Macro, programda sürekli tekrar eden ama herbiri birbirinden farklı olan durumlarda veya asm kodları yerine türkçe ifadeler kullanmak için veya kolay hatırlamak için kullanılır. Macro ile altprogramlar karıştırılmamalıdır.

örnek 1: burada işlemcinin portunu ve asm kodu yerine hatırlamayı kolaylaştırmak için kullanıyorum.

        RS485_RD	MACRO
	BCF			RS485_SLCT				; Data alınır
	ENDM
	
	RS485_WR	MACRO
	BSF			RS485_SLCT				; Data gönderilir
	ENDM


    Program içinde rs485'den veri okuyacağım zaman 
    RS485_RD     
    data göndereceğimde
    RS485_WR           ; yazıyorum

örnek 2: Mesela burda yine TMR1'in bitleri hatırlamak yerine macro kullanıyorum

        TMR1	MACRO	BITS
	IF   	  0==BITS		   ; CLR
	BCF	PIR1,TMR1IF		;Tmr1 overflow flag clear edilir	
	ENDIF
	IF   	  1==BITS		   ; ON
	BSF	T1CON,TMR1ON	    ; Tmr1 On yapılır
	ENDIF
	IF	  2==BITS		  ; OFF
	BCF	T1CON,TMR1ON	   ; Tmr1 OFF yapılır
	ENDIF
	ENDM

Program içinde aşağıdaki gibi yazdığımda 
       TMR1     ON       ; TMR1 on olur
       TMR1     OFF      ; off olur
       TMR1     CLR     ; TMR1 interrupt flag'i clear ederim

 yine çok kullandığım bir macro, LCD'ler için

; LCD karekter adresleri için macro : 
; LCD_ADRES	1,1  için	; 1 .satır 1.digite gider
; LCD_ADRES	1,3  için	; 1 .satır 3.digite gider
; LCD_ADRES	2,1  için	; 2 .satır 1.digite gider

	LCD_ADRES	MACRO	SATIR,ADRES 
	IF	SATIR==1
	MOVLW		7FH	; 7F+1=80H 1. satır adres başlangıcı
	ELSE
	MOVLW		0BFH	; 0BF+1=0C0H 2. satır adres başlangıcı
	ENDIF
	ADDLW		ADRES	;80H  veya 0C0H ile ADRES değerini toplar
	CALL		   LCD_KOMUT_YAZ
	ENDM
Knowledge and Experience are Power

Hiram

İlginiz için teşekkürler arkadaşlar.
Daha önce forumda da makro konusu güzel anlatılmış.

Aşağıda linki mevcut.

https://www.picproje.org/index.php/topic,9582