ASM makro kullanımı ile ilgili bilgiler

Başlatan alisumer, 11 Aralık 2022, 01:56:13

alisumer

mevcut for next makrosu bu yapı için uygun olmadığından yeni bir forr makrosu yazdım eski next makrosunu diğeri ile ortak kullanabiliyor sadece R11 v.s değişkenleri her banktan ulaşılabilen 0x7a ve 0x7b adresleri ile değiştim ikisini de atıyorum
FORR    MACRO    ?0,?1  ;R10,R11
    ;LOCAL R12,R13
        MOVFW    ?1 ;R11     
        MOVWF    0X7A
        MOVLW    ?0 ;R10    
        SUBWF    0X7A ,F
        MOVF    PCL    ,W
        MOVWF    0X7B
        ENDM

NEXT	MACRO		  
		MOVF	0X7B ,W
		DECFSZ  0X7A	
	    MOVWF   PCL 
		ENDM
Hep meraktan

alisumer

#46
;NEXTION ekran veri yazma makrosu
;NEXT_WRT n,0  ;n= verinin türü 0= verinin id'si
;NEXT_WRT t,0            == t0.txt="abcd123"0xff0xff0xff
;NEXT_WRT g,1            == g0.txt="abcd123"0xff0xff0xff
;NEXT_WRT n,2            == n0.val="1" "2" "3"0xff0xff0xff      (0-...)    (32bit uzunluk)
;NEXT_WRT j,3            == j0.val="1" "2" "3"0xff0xff0xff    (0-100)
;NEXT_WRT z,4            == z0.val="1" "2" "3"0xff0xff0xff    (0-360)
;NEXT_WRT p,5            == p0.pic="1" "2" "3"0xff0xff0xff    (0-...) (hafıza kısıtı resim sayısı)
;/////////kullanımı:///////////////
SAYI İÇİN:
NEXT_WRT "n","0"
PRINTN NUM,4,0     
NEXT_END "n"
txt VERİLERi İÇİN:
NEXT_WRT "t","0"
PRINTA "a"
NEXT_END "t"
;/////////////////////////
;NEXT_WRT t,0
;MOVLW "a"
;CALL    GONDER                    ;seri giden veri : t0.txt="ali"0xff0xff0xff
;MOVLW "l"                        ;aslında tüm veriler ascii formatında gittiğinden 
;CALL    GONDER                    ;txt için ayrıca "" işareti kullanması ekranın 
;MOVLW "i"                        ;yazı mı yoksa başka birşeymi olduğunu anlaması için (sanırım)
;CALL    GONDER
;NEXT_END t 
;*************************************************************************************************
NEXT_WRT MACRO ?0,?1
LOCAL YAZ_A,SOR
    GOTO    SOR
YAZ_A:
    MOVWF ADR2    
    PRINTF ADR2,1
    RETURN
SOR:
    IF ?0=="t"
    MOVLW    "t"                            ;düz yazı için
    CALL    YAZ_A
    MOVLW    ?1                            ; t0.txt="AliSümer"0xff0xff0xff
    CALL    YAZ_A
    MOVLW    "."
    CALL    YAZ_A
    MOVLW    "t"
    CALL    YAZ_A
    MOVLW    "x"
    CALL    YAZ_A
    MOVLW    "t"
    CALL    YAZ_A
    MOVLW    "="
    CALL    YAZ_A
    MOVLW    0X22
    CALL    YAZ_A
ENDIF
    IF ?0=="g"
    MOVLW    "g"                            ;kayan yazı için
    CALL    YAZ_A
    MOVLW    ?1                            ;g0.txt="AliSümer"0xff0xff0xff
    CALL    YAZ_A
    MOVLW    "."
    CALL    YAZ_A
    MOVLW    "t"
    CALL    YAZ_A
    MOVLW    "x"
    CALL    YAZ_A
    MOVLW    "t"
    CALL    YAZ_A
    MOVLW    "="
    CALL    YAZ_A
    MOVLW    0X22
    CALL    YAZ_A
    
    endif
    IF    ?0=="n"                            ;numara için
    MOVLW    "n"
    CALL    YAZ_A                        ;n0.val="1""2""3"0xff0xff0xff
    MOVLW    ?1                            ;gönderilen sayılar BCD ile decimal e çevrilip
    CALL    YAZ_A                        ;sonrasında ASCII formatına sokulmalı
    MOVLW    "."                            ;örnek: 
    CALL    YAZ_A                        ;movlw .12        
    MOVLW    "v"                            ;movwf a    ;a=12        
    CALL    YAZ_A                        ;BCD a,2    ;a=1,(a+1)=2                
    MOVLW    "a"                            ;BCD makrosu içinde sayılara 0x30 ekleyerek ascii dönüşümü yapıyorum 
    CALL    YAZ_A                        ;ASCII = 0X31,0X32
    MOVLW    "l"
    CALL    YAZ_A
    MOVLW    "="
    CALL    YAZ_A
    endif
    IF    ?0=="p"                            ;resim için
    MOVLW    "p"
    CALL    YAZ_A
    MOVLW    ?1
    CALL    YAZ_A
    MOVLW    "."
    CALL    YAZ_A
    MOVLW    "p"
    CALL    YAZ_A
    MOVLW    "i"
    CALL    YAZ_A
    MOVLW    "c"
    CALL    YAZ_A
    MOVLW    "="
    CALL    YAZ_A
    endif
    IF ?0=="j"                            ;durum çubuğu için
    MOVLW    "j"
    CALL    YAZ_A
    MOVLW    ?1
    CALL    YAZ_A
    MOVLW    "."
    CALL    YAZ_A
    MOVLW    "v"
    CALL    YAZ_A
    MOVLW    "a"
    CALL    YAZ_A
    MOVLW    "l"
    CALL    YAZ_A
    MOVLW    "="
    CALL    YAZ_A
    endif
    
    IF ?0=="z"                            ;İBRE için
    MOVLW    "z"
    CALL    YAZ_A
    MOVLW    ?1
    CALL    YAZ_A
    MOVLW    "."
    CALL    YAZ_A
    MOVLW    "v"
    CALL    YAZ_A
    MOVLW    "a"
    CALL    YAZ_A
    MOVLW    "l"
    CALL    YAZ_A
    MOVLW    "="
    CALL    YAZ_A
    endif
            
    ENDM    
;/////////////////////////////NEXTION MESAJ BİTİRME SİNYALİ/////////////////////////
    NEXT_END MACRO ?0
    LOCAL ROT,YAZ_A,SON
    GOTO    SON
YAZ_A:
    MOVWF ADR2    
    PRINTF ADR2,1
    RETURN
SON:
    IF (?0=="t")||(?0=="g")
    MOVLW    0X22                        ; 0x22= " işareti
    CALL    YAZ_A                        ; txt ve kayan yazı için 
endif                                    ; komut sonuna ve veri sonuna konmalı 
    MOVLW    0X03                        ; nextion veri alma komut kuralı
    MOVWF    R1                            ; t0.txt="AliSümer"0xff0xff0xff
    MOVLW    0XFF                        ; g0.txt="abcdef"0xff0xff0xff
ROT:
    CALL    YAZ_A
    DECFSZ    R1
    GOTO    ROT

    ENDM    

;NEXTION_READ MACRO ?0,?1

;NEXTION_READ MACRO ?0,?1
    
NEXTION ekrana veri yazma makroları tüm özellikler dahil edilmedi şu an ama en çok kullanılan komponentlerin verileri yazılabilir oldu.kullanımı hakkında bilgi makro içinde gerekli yerlere not edildi
NEXTION ekran tüm komutların ASCII kod karşılığını gönderir ve gene ASCII gelen veriler ile işlem yapar (dikkat ederseniz makroda tüm komutlar da ascii olarak işleniyor) herhangi bir sayıyı gönderdiğinizde ekranda ya hiç birşey göremezsiniz yada eğer gönderdiğiniz yazı komponenti ise sadece ascii karşılığı olan anlamsız sembolleri görürsünüz.
Hep meraktan

alisumer

#47
nextion ekrandan veri göndermek biraz size kalmış birşey o yüzden makro paylaşmayacağım fakat
örneğin:
prints "ETE",0 // 0 yazdığımız verinin tamamını  alır
prints h0.val,1// 1 ise tek byte gönderir
printh ff          // printh hex gönderir
printh ff
printh ff
kodu karşılığında seri kanaldan  tanımlama verisi ETE olan ve ardından anlamlı verinin gönderildiği sonunda da 3 tane ff giden bir veri bloğu yollayabilirsiniz bu forumda alışmış olduğumuz veriye daha bir benzer wait "ETE" ile bekleyebilirsiniz örneğin gelecek veriyi;
ayrıcanextionun bir de get komutu var ki o da şöyledir ve her kullanılan komponent için bir benzersiz kod üretir içerisinde yapılan işleme ait byte id 4 byte veri ve 3 ff kodu içerir kontrolü daha zordur.aşağıda iki ekrandan MCU ya giden veriyi karşılaştırır bir resim atıyorum

71 32 00 00 00 FF FF FF  get h0.val sonucu giden 50 verisi
45 54 45 32 FF FF FF    prints "ETE",0 ile başlayan kendi tasarladığımız veri formatında 50 verisi
tabiki kendi tasarladığımız veriyi MCU tarafında karşılamak daha bir kolay  ve sonuna başına koyacağımız süslemelerin uzunluğunu da kendimiz belirleyebiliyoruz.yani progres barın 0-100 arası sınırlandırılmış verisini 4 byte göndermek zorunda değiliz
altta da seri olarak bağladım picden gelen veri ve ekrandan pic e giden verinin simulasyon ekranında işlenmesi görülüyor.gelen ve giden verilerin ascii ve hex karşılıkları daha net anlaşılır.
                         


Hep meraktan

alisumer

#48
nextion haberleşmesi için bolca kullanmak zorunda olduğunuz (ASM için) BCD dönüşümü için alttaki mesajda paylaştığım sub.asm dosyasının güncel halini değiştirin ve diğer kapattığım bütün BCD ilişkili kodları açmanız gerekiyor.
Alıntı yapılan: alisumer - 21 Ocak 2024, 15:54:23buda kütüphane dosyası (sub.asm) math.asm

bcd kısmını aynı makroda ASCII ye de döndürmek için alttaki gibi bir ekleme yaptım
bu hali ile ürettiği her rakamı ascii koda dönüştürür
;*** 32 BIT SIGNED BINARY TO DECIMAL ***
;REGA -> DIGITS 1 (MSD) TO 10 (LSD) & DSIGN
;DSIGN = 0 if REGA is positive, 1 if negative
;Return carry set if overflow
;Uses FSR register
bin2dec:    
    clrf    MTEMP        ;Reset sign flag
    call    absa        ;Make REGA positive
    skpnc
    return                ;Overflow
    call    clrdig        ;Clear all digits
    movlw    D'32'        ;Loop counter
    movwf    MCOUNT
b2dloop:    
    rlf    REGA0,f        ;Shift msb into carry
    rlf    REGA1,f
    rlf    REGA2,f
    rlf    REGA3,f
    movlw    DIGIT10
    movwf    FSR        ;Pointer to digits
    movlw    D'10'        ;10 digits to do
    movwf    DCOUNT
adjlp:
    rlf    INDF,f        ;Shift digit and carry 1 bit left
    movlw    D'10'
    subwf    INDF,w        ;Check and adjust for decimal overflow
    skpnc
    movwf    INDF
    decf    FSR,f        ;Next digit
    decfsz    DCOUNT,f
    goto    adjlp
    decfsz    MCOUNT,f    ;Next bit
    goto    b2dloop
    btfsc    MTEMP,0        ;Check sign
    bsf    DSIGN,0        ;Negative
    clrc
    ;CONVERT TO ASCİİ
    MOVLW    0x30
    ADDWF    DIGIT1,F
    ADDWF    DIGIT2,F
    ADDWF    DIGIT3,F
    ADDWF    DIGIT4,F
    ADDWF    DIGIT5,F
    ADDWF    DIGIT6,F
    ADDWF    DIGIT7,F
    ADDWF    DIGIT8,F
    ADDWF    DIGIT9,F
    ADDWF    DIGIT10,F
    return
Hep meraktan

Powered by EzPortal