pic assembly de macro kullanımı

Başlatan counter, 24 Nisan 2006, 22:09:52

counter

merhaba. ben macrolara takıldım ve bir türlü çıkamadım işin içinden inşallah yardımcı olursunuz. ben macroyu yazıyorum.metin editöründe  ve sonra örneğin macro.inc diye kayıt ediyroum mpasm suite içine.  sonra giriyorum MPASM SUITE  içine yazdığım macro dosyası orada şimdilik sorun yok. MACRO.INC DOSYASININ özelliklerine BAkıyorum metin belgesi olarak gözüküyor. BEN ONU INC OLARAK KAYDETMİŞTİM.  daha önce kayıtlı olanların özelliklerine girdiğimde  INC dosyası yazıyor.ben mplab 7.30 kullanjıyom, orda HEADER FILES tan ekleyeyim dedim ama yaptığım makroyu göremiyorum, yani onu mplab inc olarak görmüyor.
MAKROYU KAYDETME İŞLEMLERİNİ ADIM ADIM ANLATIRSANIZ ÇOK FAYDALI OLMUŞ OLACAKSINIZ. başınızıda ağrıttım kusurA  bakmayın ama yardımCı olursanız sevinirim, herkese çalışmalarında başarılar. allah zihin açıklıği versin hepimize :)

ground

Sorun dosya uzantısından kaynaklanıyor..

dosya kaydederken yaptığın örneğin xxxx.inc dosyasıysa bunu kaydederken tırnak içine koy..  

Alıntı Yap"xxxx.inc"
Birde uzantıları gizleyi kaldırın..

⌒╮'╭⌒╮⌒╮.
╱◥██◣                  
| 田︱田田|              
╬╬╬╬╬╬╬╬╬

Picproje - Sözde değil özde paylaşım..

supermakarna

proje oluştururken macro dosyanı proje klasöründe olmasına dikkat et aynı klasörde değilse aynı klasöre almayı bi dene istersen

XX_CİHAN_XX

ASSEMBLY'DE MAKRO KULLANIMI
 
Makro işlemi birçok programda bulunan özelliklerden biridir. Makro özelliğini kullanarak sık yapılan işler basitleştirilebilir. Mplab'da iki çeşit makro bulunmaktadır. Bunlardan biri tuş hareketlerini kaydeden makro özelliği diğeri de toplu komut dosyası oluşturmak için kullanılan makrodur. Biz burada ikinci türden olan makro ile ilgileneceğiz.

Makro yukardada bahsettiğimiz gibi yapılan işlemlerin basitleştirilmesi için kullanılır. Makrolar sayesinde kendi anlayabileceğiniz komutları yaratabilirsiniz.Makronun yazım biçimi en basit şekli ile aşağıdaki gibidir:

macro macro adı veri1,veri2,veri3...verin

komutlar

endm

Örneğin PORTA'dan okuduğunuz veriye 3 ekleyip PORTC'ye ve 5 ekleyip PORTB'ye yazıyorsunuz ve bu işlemi programınızın birçok yerinde kullanıyorsunuz. Böyle bir programcık aşağıdaki gibidir:

MOVF PORTA,0

ADDLW D'3'

MOVWF PORTC

MOVF PORTA,0

ADDLW D'5'

MOVWF PORTB

görüldüğü gibi programımız altı satırdan oluşmakta. Bunu sürekli yazmak yerine bir makro haline getirerek bu işlemi basitleştirebiliriz.

MACRO OKU_YAZ

MOVF PORTA,0

ADDLW D'3'

MOVWF PORTC

MOVF PORTA,0

ADDLW D'5'

MOVWF PORTB

ENDM

makromuzun adı OKU_YAZ oldu. Artık programımız içinde sürekli yukarıdaki komutları yazmak yerine sadece OKU_YAZ dediğimiz an. Komutlar otomatik olarak üretilecektir. Burada dikkat edilemesi gereken yukarıdaki makro bloğunu OKU_YAZ komutunu kullanmadan önceki satırlara ilave etmeliyiz. Eğer makro program içinde kullanılmaz ise hafızada yer kaplamaz.

Şimdi burada diyebilirsinizki buna ne gerek var ben bunu altprogram olarak yazar ve CALL komutu ile çağırabilirim. Tabii bu da mümkündür. Ancak makronun avantajı hem okunaklı bir program yazmak için kullanılabilmesidir, hem de programımız aşağıdaki gibi olduğu zaman daha avantajlı olmasıdır.

Yukarıdaki programımız eğer şöyle olsa idi PORTA'dan okunan bilgiye değişken sayılar eklenip PORTB ve PORTC'ye yazmak istese idik makromuz aşağıdaki gibi olacaktı.

MACRO OKU_YAZ A,B

MOVF PORTA,0

ADDLW A

MOVWF PORTC

MOVF PORTA,0

ADDLW B

MOVWF PORTB

ENDM



Artık bu makronun kullanımı şu şekilde olacaktır:

OKU_YAZ 4,7 .........;PORTA'dan okunan veriye 4 ekleyip PORTC'ye, 7 ekleyip PORTB'ye

OKU_YAZ 1,2 .........;PORTA'dan okunan veriye 1 ekleyip PORTC'ye, 2 ekleyip PORTB'ye

görüldüğü gibi bu makro ile OKU_YAZ komutunun parametrelerini değiştirerek programımızda kullanabilmekteyiz.

MAKROLARIN VERİMLİ KULLANIMI

Makroların en büyük dezavantajı birçok satırdan olşan bir bloğu makro yaptığımız zaman bunun CALL komutuna göre bir avantajı kalmamaktadır. Çünkü makro her yazıldığında program hafızasının o kısmına sizin yerinize makro bloğunun içindeki kodları yazmaktadır. Bu da çok mantıksız olmaktadır. Örneğin 50 byte'tan oluşan bir rs232 altprogramınız var ve bunu makro yaptınız. Sizin yerinize veri alanına yazdığınız 8 bitlik veriyi yolluyor.Ve makro şu şekilde

RS232 veri

Bu makroyu programınızda birkaç defa kullanıyor iseniz. Her kullandığınızda 50 byte program hafızanız gidecektir. 3 kez kullandığınızda 150 byte boşuna gitmiş olucaktır. Burada şöyle bir teknik kullanmak çok mantıklıdır. Makroyu ikiye bölerek verim artırılır. Yani Altprogramı çağıran makro ve alt program bloğu. Yukarıdaki örneğimize dönersek 50 byte'dan oluşan bir 8 bitlik veriyi yollayan RS232 makromuz var. Bunu aşağıdaki gibi ikiye böldüğümüz takdirde makronun hafızda kapladığı alan azalacaktır.Aşağıdaki makro bloğunu text editöründe yazıp uzantısı Mrs232.inc olarak kaydedelim.



*********************MAKRO******************

Macro rs232 veri

movlw veri

call rs232program

endm

*********************************************

Daha sonra RS232program kısmınıda text editöründe yazıp LRS232.inc olarak kaydedin. Bu kaydettiğiniz *.inc uzantılı iki dosyayı C:\Program Files\Microchip\MPASM Suite altına kopyalayın. Artık bu modülleri tüm programlarınızda kullanabilirsiniz. Bu biçimde yazılmış örnek bir program aşağıdaki gibi olabilir.

#include P16f628.inc

#include MRS232.inc ;rs232 MAKROSU
__CONFIG _LVP_OFF & _MCLRE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT

org 00
GOTO START
ORG 0X12
START
MOVLW H'00'
BANKSEL TRISB
MOVWF TRISB
MOVWF TRISA ; PORTB VE PORTA ÇIKIŞ YAPILIR
BANKSEL PORTB
MOVLW H'00'
MOVWF PORTB
MOVLW 0x07
MOVWF CMCON ;KOMPARATÖR KAPATILIR

rs232 'A' ; A harfi RS232 den yollanır

nop

nop

RS232 'x' ;x harfi yollanır

#include LRS232.inc ; rs232 programının olduğu dosya



MAKRONUN LCD UYGULAMASINDA KULLANIMI  
Bu makro uygulamasında aşağıdaki işlemler gerçekleştirilebilir. Sadece 3 adet register kullanır. LCD 4 bit modunda çalışır ve bacak bağantıları aşağıdaki gibidir. Programlar 4 Mhz'e göre yazılmıştır.

RB0--->D4
RB1--->D3
RB2--->D2
RB3--->D1
RA0--->ENABLE
RA1--->RS
RA2--->RW

LCD Makrosu ile kullanılabilecek komutlar şunlardır

KOMUT_YAZ H'X'
KARAKTER YAZ 'X'
LCD_HAZIRLA
LCD_CLEAR
CUMLE_YAZ "XXXXX",karaktersayısı...............maximum 255
IMLEC_POZ D'X' ...... İLK SATIR 0-63 İKİNCİ SATIR 64-128

aşağıdaki dosyalar C:\Program Files\Microchip\MPASM Suite altına kopyalanmalıdır

register.INC...................altprogram ve makroların kullandığı registerler (İşlemciye göre burdan adresler değiştirilebilir)
LLCD.INC.......................LCD altprogramının olduğu dosya...programın istenilen yerine konabilir
MLCD.INC.......................LCD Makrosunun olduğu dosya....programın başına konmalıdır
mdelay0.5ms.inc...............0.5Ms gecikme yapan makro....programın başına konmalıdır
Ldelay0.5ms.inc...............0.5ms gecikme yapan altprogram dosyası..programın istenilen yerine konabilir



Buradaki makrolar ile yazılmış örnek program aşağıdaki kadar basit olabilir.

include P16f628.inc

#INCLUDE REGISTER.INC ; ............................MAKROLARIN KULLANDIĞI REGİSTERLER
#include mdelay0.5ms.inc ;............................0.5MS GECİKME MAKROSU
#include mlcd.inc ;.......................................LCD MAKROSU
__CONFIG _LVP_OFF & _MCLRE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT

org 00
GOTO START
ORG 0X12
START
MOVLW H'00'
BANKSEL TRISB
MOVWF TRISB
MOVWF TRISA ; .........................PORTB VE PORTA ÇIKIŞ YAPILIR
BANKSEL PORTB
MOVLW H'00'
MOVWF PORTB
MOVLW 0x07
MOVWF CMCON ;........................KOMPARATÖR KAPATILIR
LCD_HAZIRLA ;...........................LCD HAZIRLANIR
YENIDEN
LCD_CLEAR ;..............................LCD TEMİZLENİR
IMLEC_POZ D'7'
KARAKTER_YAZ 'M'
KARAKTER_YAZ 'E'
KARAKTER_YAZ 'R'
KARAKTER_YAZ 'H'
KARAKTER_YAZ 'A'
KARAKTER_YAZ 'B'
KARAKTER_YAZ 'A'
IMLEC_POZ D'67'
CUMLE_YAZ "WWW.DIYOT.COM",15

#include Ldelay0.5ms.inc ;.................0.5MS ALTPROGRAMI
#include Llcd.inc ;.............................LCD ALTPROGRAMI
END
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

bsivgin

XX_CİHAN_XX arkadaşımız yukarıdaki açıklamayı eski hali ile kopyalamış. Eski halinde hızlı yazmaktan yanlışlık bulunmakta sonradan onu düzeltmiştim.

YANLIŞ OLAN;

macro macro adı veri1,veri2,veri3...verin

komutlar

endm


DOĞRU OLAN;

macro adı macro  veri1,veri2,veri3...verin

komutlar

endm

Kaynak: http://www.diyot.com/makro.html

Saygılarımla
Bülent ŞIVGIN
www.diyot.com

XX_CİHAN_XX

Uyardıgın ıcın teşekkürler bende sımdı fark ettım ;)
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

counter

sorunu sanırım halletim sayenizde arkdaşlar.  çok teşekkür ediyroum sizlere

ground arkdaşımın dediği  talamtları yaptım. birde macro dosyamı ben METİN BELGESİ  ile yazmıştım.

şimdi ise donatılardaki NOT DEFTERİ ile hazırladım. "BANK.INC"  şeklinde kaydettim(MPASM SUITE KLASÖRÜNÜN İÇİNE)

BU ŞEKLDE TANITABİLDİM BANK DOSYASINI

BİR DE YAPTIĞIM DİĞER BİR hata ise komutları küçük harflerle yazıyordum. şimdi ise BÜYÜK HARFLER KULLANDIM.

programı derledim. erleme işlemi başarılı oldu ama hata mesajları verdi. program çalışıyor ama. neden bu hata mesajlarnı verdi anlamadım
bu hata mesajları aşağıya yazdım
bir bakıp soruun neden kaynaklandığını sölerseniz :)
çok iyi olur..

Warning[205] C:\PIC DENEME KLASöRü\IKI.ASM 1 : Found directive in column 1. (LIST)
Warning[205] C:\PIC DENEME KLASöRü\IKI.ASM 2 : Found directive in column 1. (INCLUDE)
Warning[205] C:\PIC DENEME KLASöRü\IKI.ASM 3 : Found directive in column 1. (INCLUDE)
Warning[203] C:\PIC DENEME KLASöRü\IKI.ASM 6 : Found opcode in column 1. (CLRF)
Warning[206] C:\PIC DENEME KLASöRü\IKI.ASM 8 : Found call to macro in column 1. (BANK1)
Warning[203] C:\PIC DENEME KLASöRü\IKI.ASM 9 : Found opcode in column 1. (CLRF)
Message[302] C:\PIC DENEME KLASöRü\IKI.ASM 9 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Warning[203] C:\PIC DENEME KLASöRü\IKI.ASM 10 : Found opcode in column 1. (MOVLW)
Warning[203] C:\PIC DENEME KLASöRü\IKI.ASM 11 : Found opcode in column 1. (MOVWF)
Message[302] C:\PIC DENEME KLASöRü\IKI.ASM 11 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Warning[206] C:\PIC DENEME KLASöRü\IKI.ASM 12 : Found call to macro in column 1. (BANK0)
Warning[203] C:\PIC DENEME KLASöRü\IKI.ASM 14 : Found opcode in column 1. (MOVLW)
Warning[203] C:\PIC DENEME KLASöRü\IKI.ASM 15 : Found opcode in column 1. (MOVWF)
Warning[205] C:\PIC DENEME KLASöRü\IKI.ASM 20 : Found directive in column 1. (END)
Loaded C:\pic deneme klasörü\iki.COD.
BUILD SUCCEEDED: Wed Apr 26 21:50:55 2006


herkese kolay gelsin :))

bsivgin

komutları hem küçük hem büyük harf ile yazabilirsin;
bunun için MPLAB'da project menusunde build option seçeneğinden project seçeneğinden MASM assembler tabından disable case sensitive seçeneği çekli olmalı. Böylece derleme yaparken büyü küçük harfine bakılmaz. Ayrıca sizin programınızda verilen warning lerin bir önemi yok BUILD Succeded demişse olay tamamdır.Bu warning lerin bir kısmını şu komutu kullanarak engelleyebilirsin

errorlevel      -302    ;Eliminate bank warning


Saygılarımla
Bülent ŞIVGIN
www.diyot.com