Etepic

Diğer diller ve Derleyiciler => Assembly (ASM) => Konuyu başlatan: alisumer - 11 Aralık 2022, 01:56:13

Başlık: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 11 Aralık 2022, 01:56:13
bilindiği gibi ASM komut seti olarak basit fakat algoritma oluşturma açısından zor bir dil.şöyle açıklıyayım örneğin pic basic de a= b*c komutu asm karşılığı olarak zor ve asm için karmaşık bir algoritma çalıştırıyor sebebi ise çipin içerisinde gömülü olarak bir çarpıcı/bölücü bulunmaması bu yüzden bir döngü içerisinde çarpma işlemi yada bölme işlemi gibi donanımsal desteği olmayan (ki neredeyse hiç bir işlemcide yok) işlemlerde çarpan kadar çarpılanı toplayarak sonucu bulmak zorunda.bunun değişik yolları mevcut örneğin 2 tabanında aritmetik işlemleri youtube de aratırsanız birkaç değişik  yöntem bulabilirsiniz. Üst seviye diller ise bu algoritmaları yani daha önce geliştiriciler tarafından yazılan makroları kendi ide'lerine derleme esnasında o komutun karşılığı olarak ilgili kod satırına eklemeyi sağlıyorlar.iş buraya kadar üst seviye dillere bir puan fazla veriyor işleyişte ise bize yavşlık olarak ödünleşmeyi getiriyor.
bense burada ASM dilini üst seviye dili gibi hazır algoritmalar ile kullanmayı elimden geldiğince "video olmadan" anlatmaya çalışacağım tabi bikaç hilesini de göstereceğim.ilk hile ise hazırda kullanılan üst seviye dillerinin kendi kütüphanelerini ve makrolarını kendimize göre düzenleyerek kullanmak.buradaki örneğim bir çarpma işleminin pic basic kütüphanesini kullanılarak yapılmasını göstermek.oradan bir makra yapacağız;
ilk olarak C:\pbp dosyasında pbppic14.lib dosyasına dalıyoruz.yapmak istediğimiz çarpma işlemi olduğu için onun ile ilgili satırları arıyoruz."Math routines" başlığı altına "mull" komutu kullanılması halinde programa eklenecek satırlar mevcut ki onlar:
;****************************************************************
;* MUL        : 16 x 16 = 32 multiply                          *
;*                                                              *
;* Input      : R3 * R1                                        *
;* Output    : R2, W = low word                                *
;*            : R0, R2 + 1 = mid word                          *
;*            : R0 = high word                                  *
;*                                                              *
;* Notes      :                                                *
;****************************************************************

    ifdef MUL_USED
  LIST
MUL    movlw  16              ; For 16 shifts
        movwf  R4

        clrf    R0 + 1
        clrf    R0

mulloop rrf    R3 + 1, F
        rrf    R3, F
        btfss  STATUS, C
        goto    mull1          ; Skip add
        movf    R1, W          ; 16-bit add with carry out
        addwf  R0, F
        movf    R1 + 1, W
        btfsc  STATUS, C
        incfsz  R1 + 1, W
        addwf  R0 + 1, F
mull1  rrf    R0 + 1, F
        rrf    R0, F
        rrf    R2 + 1, F
        rrf    R2, F
        decfsz  R4, F
        goto    mulloop
        movf    R2, W          ; Get low byte to W
        goto    DONE
  NOLIST
DONE_USED = 1
    endif
  burada ifdef koşulu kafanızı karıştırmasın mplab ide de bu komutun karşılığı mevcut ama kendisi bir asm komutu değil sadece derleme esnasında define ile tanımladığımız ne ise ki burada mull diye tanımlanmış eğer bu tanımlamadaki gibi mull yazılırsa alttaki kod satırını derle demek koda dahil değil.ve biz de onu sileceğiz ve bu satırları makro olarak değiştireceğiz. geri kalanı resim ve kodları ekleyerek anlatmaya çalışayım.

    __CONFIG    0x002C
    LIST P = PIC16F690
    INCLUDE "p16f690.inc"
    INCLUDE    "PID.INC"
;    INCLUDE "CARPMA.ASM"
  ; INCLUDE "B:\2022\projeler\ASM CARPMA\LIB\pbppic14.asm"
  ;INCLUDE    "B:\2022\projeler\ASM CARPMA\LIB\PBPPIC14.INC"
    
    #define _C STATUS,0
    #define _Z STATUS,2
  ; #DEFINE PWM 0X60
 
ADO                EQU    0X20 
KONUM            EQU    0X28
ADO_KONUM    EQU    0X30
ADI_KON        EQU    0X34
HATA            EQU    0X38
HATA1            EQU    0X40
KP                EQU    0X4C
;KI                EQU    0X50
KD                EQU    0X58
PWM                EQU    0X60
PID_P            EQU    0X44
;PID_I            EQU    0X54
;PID_D            EQU    0X5C
HATA2          EQU    0X42
ADI                EQU    0X24
KON            EQU    0X2C
BOL              EQU    0X66



M                      EQU 0X65
TMP0            EQU 0X62
TMP1            EQU 0X63
TMP2            EQU    0X64




R0              EQU 0X70
R1              EQU 0X72
R2              EQU    0X50
R3              EQU 0X7C
R4                EQU 0x76
SONUC            EQU    0X78

STATUS_TEMP    EQU 0X80



    ORG    0X00
    GOTO    AYAR
    ORG        0X04
KESME:
    SWAPF    STATUS ,W
    MOVWF    STATUS_TEMP
    CLRWDT
    BCF    INTCON,GIE
    CLRF    STATUS
    MOVLW    0x40
    ANDWF    PORTB,F
    BTFSC    PORTC,6
    GOTO    L13
    INCFSZ KONUM,F
    GOTO    L14
    INCF    KONUM+1,F
L14:    
    GOTO    CIK  
L13:
    MOVLW    0x01
    SUBWF    KONUM,F
    BTFSC    STATUS,C
    GOTO    CIK
    
    DECFSZ    KONUM+1,F
    GOTO    CIK
    CLRF    KONUM+1
CIK:
    
    SWAPF    STATUS_TEMP ,W
    MOVWF    STATUS
    BCF    INTCON,RABIF
    RETFIE
AYAR:
    BSF    STATUS,RP0                        ;BANK1
    BCF    STATUS,RP1
    MOVLW    0x07
    MOVWF    PORTA
    MOVLW    0x00
    MOVWF    PORTC
    MOVLW    0x80
    MOVWF    PORTB
    MOVLW    0x82
    MOVWF    OPTION_REG
    MOVLW    0x70
    MOVWF    OSCCON
    MOVLW    0x60
    MOVWF    ADCON1
    BSF      PCON    ,5
    BCF    STATUS,RP0                        ;BANK0
    MOVLW    0x81
    MOVWF    ADCON0
    MOVLW    0x00
    MOVWF    PORTA
    MOVWF    PORTB
    MOVWF    PORTC
    MOVLW    0x05
    MOVWF    T2CON
;    BCF    STATUS,RP0
    BSF    STATUS,RP1                        ;BANK2
    MOVLW    0x03
    MOVWF    ANSEL
    MOVLW    0x00
    MOVWF    ANSELH
    BCF    CM1CON0,7
    BCF    CM2CON0,7
    MOVLW    0x80
    MOVWF    WPUB
    MOVWF    IOCB
    BSF    STATUS,RP0                        ;BANK1
    BCF    STATUS,RP1
    MOVLW    0xFE
    MOVWF    PR2
    BCF    STATUS,RP0                        ;BANK0


    MOVLW    0x80
    MOVWF    PWM1CON
    MOVLW    0x88
    MOVWF    INTCON
;    MOVLW    0x04
;    MOVWF    KP
;    MOVWF    KI
    CLRF    HATA1
    CLRF    HATA1+1
    CLRWDT
    MOVLW    .1
    MOVWF    TMP2
    MOVLW  .7
    MOVWF  M
        MOVLW  .63
    MOVWF  KP
    
BASLA:    
    CALL    AD
    CLRWDT
;    PID 
    MOVF    ADO+1,W
    XORWF    KONUM+1,W
    BTFSS    STATUS,Z
    GOTO    YON
    MOVF    ADO,W
    XORWF    KONUM,W
    BTFSS    STATUS,Z
    GOTO    YON1
    GOTO    DUR
YON:
    MOVF    ADO+1,W
    SUBWF    KONUM+1,W
    BTFSC    STATUS,C
    GOTO    GERI
    GOTO    ILERI
YON1:
    MOVF    ADO,W
    SUBWF    KONUM,W
    BTFSC    STATUS,C
    GOTO    GERI
    GOTO    ILERI

ILERI:
    BANKSEL PORTC
        

    BCF        PORTC,6
    BCF        PORTC,0
    BSF        PORTC,1
    BCF        PORTC ,4
    ;INCFSZ    RAMPA    ,F
    ;GOTO    $+3
;    MOVLW    0XF0
;    MOVWF    RAMPA
    MOVLW    0X0C
    SUBWF    CCP1CON ,W
    BTFSC    STATUS ,Z
    GOTO    $+3
    MOVLW    0X0C
    MOVWF    CCP1CON
    BSF    STATUS,RP0                    ;BANK2
    BSF    STATUS,RP1
    MOVLW    0x01
    MOVWF    PSTRCON
    BCF    STATUS,RP0                    ;BANK0
    BCF    STATUS,RP1
    CALL    MAKRO1
    
    MOVF    PWM ,W
    MOVWF    CCPR1L
    GOTO    BASLA
GERI:
    BANKSEL PORTC
;    PID        .2 ,.0,.0
    BSF    PORTC,6
    BCF        PORTC,5
    BSF    PORTC ,0
    BCF    PORTC ,1
;    INCFSZ    RAMPA    ,F
;    GOTO    $+3
;    MOVLW    0XFE
;    MOVWF    RAMPA
    MOVLW    0X0C
    SUBWF    CCP1CON ,W
    BTFSC    STATUS ,Z
    GOTO    $+3
    MOVLW    0X0C
    MOVWF    CCP1CON                    ;CCP1CON PWM ayarlarının yapıldığı modüldür bu hali ile tek kanal pwm kullanılacak şekilde ayarlanmıştır
    BSF    STATUS,RP0                    ;BANK2
    BSF    STATUS,RP1
    MOVLW    0x02
    MOVWF    PSTRCON                    ;PSTRCON 4 adet PWM çıkışını tek tek aktif edip kapataabildiğin kayıtçıdır bu değer ile 2 nolu çıkış pwm üretir
    CLRF        STATUS
    BCF        STATUS,RP0                    ;BANK0
    BCF        STATUS,RP1
    CALL    MAKRO1
    MOVF    PWM ,W
    MOVWF    CCPR1L
    GOTO    BASLA
DUR:
    MOVLW    0X00
    MOVF    CCP1CON
    BCF        PORTC,6
    BCF        PORTC,5
    BCF        PORTC,4
    CLRF        PWM
;    CLRF        PID_I
;    CLRF        PID_I+1
;    CLRF        PID_P
    CLRF        CCPR1L
    CLRF        CCPR1H
    GOTO    BASLA
AD:
    BCF    STATUS,RP0
    BCF    STATUS,RP1
;    BSF    ADCON0,GO_DONE
    CALL    PSE
L10:
    BTFSC    ADCON0,GO_DONE
    GOTO    L10
    MOVF    ADRESH,W
    MOVWF    ADO+1
    BSF    STATUS,RP0                    ;BANK1
    MOVF    ADRESL,W
    BCF    STATUS,RP0                    ;BANK0
    MOVWF    ADO
    BSF    ADCON0,GO_DONE
    BTFSS    TMP2    ,0
    GOTO    $+4
    DECF    TMP2
    CLRF    ADO
    CLRF    ADO+1
    MOVFW    ADO
    MOVWF    ADI
    MOVFW    ADO+1
    MOVWF    ADI+1
    BCF        STATUS    ,C
    RRF        ADI+1    ,F
    RRF        ADI        ,F
    BCF        STATUS    ,C
    RRF        ADI+1    ,F
    RRF        ADI        ,F
    RETURN
PSE:
    MOVLW    0x30
    MOVWF    TMP0
    MOVLW    0x02
    MOVWF    TMP1
L11:    
    DECFSZ TMP0,F
    GOTO    L11
    DECFSZ TMP1,F
    GOTO    L11

    RETURN
MAKRO1
    PID1  
    CARP KP, HATA, HATA+1
    MOVWF    PWM
    RETURN
    END

bu ana program

;previous_error = setpoint - process_feedback//önceki hata = ayar noktası - süreç geri bildirimi
;
;integral = 0
;start:
;  error          = setpoint - actual_position    //hata = ayar noktası - gerçek_pozisyon
;  integral       = integral + (error*dt)  //Hata ve bir önceki örneklemedeki hatalar toplanır
;  derivative     = (error - previous_error)/dt   //Hatadaki değişim miktarı belirlenir
;output   = (Kp*error) + (Ki*integral) + (Kd*derivative) //Çıkış bu değişkenlerin toplamıyla
;  previous_error = error                         //Her çevrimde o andaki hata değeri saklanır
;  wait(dt)                                       //Örnekleme zamanı kadar beklenir
;goto start 
;

PID1	 MACRO 	
    	MOVFW   KONUM
    	SUBWF   ADO     ,W     ; 0x38 = 0x20-0x28 
    	MOVWF   HATA
    	BTFSS   	_C
    	DECF    	ADO+1 ,F
    	MOVFW  KONUM+1
    	SUBWF   ADO+1   ,W
    	MOVWF  HATA+1

ENDM


;****************************************************************
;* MUL        : 16 x 16 = 32 multiply                           *
;*                                                              *
;* Input      : R3 * R1                                         *
;* Output     : R2, W = low word                                *
;*            : R0, R2 + 1 = mid word                           *
;*            : R0 = high word                                  *
;*                                                              *
;* Notes      :                                                 *
;****************************************************************
CARP  MACRO   R3,R1,R1+1

MUL       
		MOVFW	R3
		MOVWF	PID_P
		MOVFW	R3+1
		MOVWF	PID_P+1	 
		MOVLW   .16              ; For 16 shifts
        	MOVWF   R4
       	CLRF   	R0 + 1
        	CLRF    	R0
mulloop 
		BCF		_C
		RRF     	R3 + 1, F
       	RRF     	R3, F
        	BTFSS   	_C		;STATUS, C
        	GOTO    	mull1           	; Skip add
        	MOVF    	R1, W           ; 16-bit add with carry out
        	ADDWF   R0, F
        	MOVF    	R1 + 1, W
        	BTFSC   	_C			;STATUS, C
        	INCFSZ  R1 + 1, W
        	ADDWF   R0 + 1, F
mull1   
	  	RRF    R0 + 1, F
       	RRF     R0, F
        	RRF     R2 + 1, F
        	RRF     R2, F
        	DECFSZ  R4, F
        	GOTO    mulloop
        	MOVF    R2, W           ; Get low byte to W
  DONE   
  	  	BCF     STATUS, IRP     ; 1 Set FSR to bank 0/1
        	BCF    STATUS, RP1     ; 1 Show direct bank 0
        	BCF     STATUS, RP0     ; 1
	;	GOTO PID2
           	ENDM
	
    
buda kütüphane olarak kullandığım makrolar.
(https://i.ibb.co/QM0jMR6/Pl-EBjg-Ok-Qe.png) (https://ibb.co/QM0jMR6)
buda sağlaması
bu şekilde mokrolar ile rutin ayarları,algoritmaları v.s basit şekilde üst seviye diller gibi yazabiliyoruz mesela işlemciye spi haberleşme için gerekli ayarlamaları spibegin adı ile bir makro yapıp ana kod bloğunda sadece" spibegin" yazdığımızda  gerekli ayarların yapıldığı kod satırlarını programıza otomatik ekleyebiliyoruz. bununla ilgili içerisinde pid den tutunda 32bit çarpma bölme sin,cos gibi işlemlerin ayrıca "c" den araklayabilirsem işaretli sayılar ve onlarla işlemlerin olduğu bir kütüphane oluşturmaya başladım geliştirdikçe buradan da paylaşmayı düşünüyorum.
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 11 Aralık 2022, 03:40:12
(https://i.ibb.co/mRHXdTk/q-Rp-XMKh5-JF.png) (https://ibb.co/mRHXdTk)
burada da 32 bit çarpım yapılıyor gene aynı makro kullanılarak .Bildiğiniz gibi basic de 32 bitlik bu veriyi dışarı çıkaramıyorduk kütüphaneyi biraz düzenleyince artık bu veriyi 4 byte şeklinde çıkarmak mümkün
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: Serk@n - 11 Aralık 2022, 08:23:08
Emeğinize sağlık. Konuyla ilgili merak ettiğim bir husus var. ASM için kullanılan ide ortamı ve pice yükleme şekli farklı mıdır? Kabaca bir bilgi sahibi olmak için sormak istedim.
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 11 Aralık 2022, 08:42:00
Rogramı Pic e yükleme farklı olmaz hangi dili kullandığınızın bir önemi yok hepsinde aynı.derleme sonucunda oluşan hex dosyası yüksek seviye dillerde belli ölçüde kabarık olmak zorunda sadece. çünkü Universal şeklde bütün varyasyonlar da bir fonksiyon çalıştırılması gerekli bunu yapabilmek için sorgu üstüne sorgu yapmalılar .ASM de bu seçenek bizde tam olarak hangi çipi ve hangi makroları kullanacağımız belli olduğundan diğerlerinin varlığını kontrol etmek zorunda değiliz 
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 11 Aralık 2022, 20:14:43
pic C ve proton için asm kütüphanesi mevcutmu bilgisayarında kurulu olan varsa rica etsem lib ve makro dosyalarını paylaşabilirlermi.float ve işaretli sayılar ile makroları oradan araklarsam fena olur.
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 20 Aralık 2022, 11:11:23
	MOVFF MACRO R5,R6
	;R5 =BANK0--------R6 = BANK0
	IF      	(R5) < 0X80 && (R6) < 0X80
	
		BCF	STATUS	,RP0
		BCF	STATUS	,RP1		 	
		MOVF		R5	,W
		MOVWF	R6

	
	ENDIF

	;////////////R5 =BANK0--------R6 = BANK1/////////////////
	IF      	(R5) < 0X80 && (R6) > 0X7F&&(R6)<0X100 

		BCF	STATUS	,RP0
		BCF	STATUS	,RP1
		MOVF		R5	,W
		BSF	STATUS	,RP0
		MOVWF	R6
		BCF	STATUS	,RP0

	ENDIF
	;-------------------R5=BANK0--------R6=BANK2/////////////////
	IF      	(R5) < 0X80 && (R6) > 0XFF&&(R6)<0X180 
		BCF	STATUS	,RP0
		BCF	STATUS	,RP1
		MOVF		R5	,W
		BSF	STATUS	,RP1
		MOVWF	R6
		BCF	STATUS	,RP1
	ENDIF
	;-------------------R5=BANK0--------R6=BANK3/////////////////
	IF      (R5) < 0X80 && (R6) > 0X17F

		BCF	STATUS	,RP0
		BCF	STATUS	,RP1
		MOVF		R5	,W
		BSF	STATUS	,RP1
		BSF	STATUS	,RP0
		MOVWF	R6
		BCF	STATUS	,RP0
		BCF	STATUS	,RP1
	ENDIF		
;	;/////////////R5=BANK1-------R6=BANK0//////////////////
	IF      	(R5) > 0X7F&&(R5)<0X100 &&  (R6) < 0X80 
		BSF	STATUS	,RP0
		MOVF		R5	,W
		BCF	STATUS	,RP0
		MOVWF	R6		
	ENDIF
		;/////////////R5=BANK1-------R6=BANK1//////////////////
	IF      (R5) > 0X7F&&(R5)<0X100 && 	(R6) > 0X7F && (R6) < 0X100 
		BSF	STATUS	,RP0
		MOVF		R5	,W
		MOVWF	R6
		BCF	STATUS	,RP0
	ENDIF	
			;/////////////R5=BANK1-------R6=BANK2//////////////////
	IF     	(R5) > 0X7F&&(R5)<0X100 && (R6) > 0XFF && (R6) < 0X180 
		BSF	STATUS	,RP0
		MOVF		R5	,W
		BCF	STATUS	,RP0
		BSF	STATUS	,RP1
		MOVWF	R6
		BCF	STATUS	,RP0
		BCF	STATUS	,RP1		
	ENDIF
	;/////////////R5=BANK1-------R6=BANK3//////////////////
	IF      	(R5) > 0X7F&&(R5)<0X100 &&  (R6) > 0X17F
		BSF	STATUS	,RP0
		MOVF		R5	,W
		BSF	STATUS	,RP1
		MOVWF	R6
		BCF	STATUS	,RP0
		BCF	STATUS	,RP1
	ENDIF	
			;/////////////R5=BANK2-------R6=BANK0//////////////////
		
	IF      	(R5) > 0XFF && (R5) < 0X180 && (R6) < 0X80
		BSF	STATUS	,RP1
		MOVF		R5	,W
		BCF	STATUS	,RP1
		MOVWF	R6	
	ENDIF	
			;/////////////R5=BANK2-------R6=BANK1//////////////////
		
	IF      	(R5) > 0XFF&& (R5)< 0X180 && (R6) > 0X7F && (R6) < 0X100
		BSF	STATUS	,RP1
		MOVF		R5	,W
		BSF	STATUS	,RP0
		BCF	STATUS	,RP1
		MOVWF	R6
		BCF	STATUS	,RP0
	
	ENDIF		
			;/////////////R5=BANK2-------R6=BANK2//////////////////
	IF      (R5) > 0XFF&& (R5)< 0X180 && (R6) > 0XFF && (R6) < 0X180
		BSF	STATUS	,RP1
		MOVF		R5	,W
		MOVWF	R6
		BCF	STATUS	,RP1
	
	ENDIF	
;			;/////////////R5=BANK2-------R6=BANK3//////////////////
	IF      (R5) > 0XFF&& (R5)< 0X180 && (R6) > 0X17F
		BSF	STATUS	,RP1
		MOVF		R5	,W
		BSF	STATUS	,RP0
		MOVWF	R6
		BCF	STATUS	,RP1
		BCF	STATUS	,RP0
	
	ENDIF	
	;/////////////R5=BANK3-------R6=BANK3//////////////////
	
	IF      	(R5) > 0X17F && (R6) > 0X17F
		BSF	STATUS	,RP0
		BSF	STATUS	,RP1
		MOVF		R5	,W
		MOVWF	R6
		BCF	STATUS	,RP0		
		BCF	STATUS	,RP1
	ENDIF		
;	;/////////////R5=BANK3-------R6=BANK2//////////////////

	IF      (R5) > 0X17F && (R6) > 0XFF &&  (R6) < 0X180
		BSF	STATUS	,RP0
		BSF	STATUS	,RP1
		MOVF		R5	,W
		BCF	STATUS	,RP0
		MOVWF	R6
		BCF	STATUS	,RP1

	ENDIF		
;	;/////////////R5=BANK3-------R6=BANK1//////////////////
	IF      (R5) > 0X17F && (R6) > 0X7F &&  (R6) < 0X100
		BSF	STATUS	,RP0
		BSF	STATUS	,RP1
		MOVF		R5	,W
		BCF	STATUS	,RP1
		MOVWF	R6
		BCF	STATUS	,RP0	
	ENDIF										
	;/////////////R5=BANK3-------R6=BANK0//////////////////	
	IF      (R5) > 0X17F && (R6) < 0X80
		BSF	STATUS	,RP1
		BSF	STATUS	,RP0
		MOVF		R5	,W
		BCF	STATUS	,RP0
		BCF	STATUS	,RP1
		MOVWF	R6					
	ENDIF	
		ENDM
movff komutu kullanmak için kütüpane .işleyiş olarak movf ve ardından movwf komutunun kullanılmasını sağlıyor yani kod satırı derleme sonrası aynı hız oolarakta aynı .bize artısı ise  yazdığımız kodda     
MOVFF   ADRESH,ADO+1
MOVFF   ADRESL,ADO
şeklinde yazılabilmesi banklar arası geçiş vs makro içerisinde hallediliyor sadece görsel olarak kodumuz kısalıyor.şu an için sadece max 4 bank destekliyor gelişecek yeni versiyon picler için
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 20 Aralık 2022, 11:44:38
;;****************************************************************
;* MUL        : 16 x 16 = 32 multiply                           *
;*                                                              *
;* Input      : R3 * R1                                         *
;* Output     : R2, W = low word                                *
;*            : R0, R2 + 1 = mid word                           *
;*            : R0 = high word                                  *
;*                                                              *
;* Notes      :                                                 *
;****************************************************************
CARP  MACRO   R3,R3+1,R1,R1+1
 
MUL       
	 
	MOVLW   	.16              ; For 16 shifts
        	MOVWF   	R4
       	CLRF   	R0 + 1
        	CLRF    	R0
mulloop 
	BCF		STATUS, C
	RRF     	R3 + 1, F
       	RRF     	R3, F
        	BTFSS   	STATUS, C		;
        	GOTO    	mull1           	; Skip add
        	MOVF    	R1, W           ; 16-bit add with carry out
        	ADDWF   	R0, F
        	MOVF    	R1 + 1, W
        	BTFSC   	STATUS, C
        	INCFSZ  	R1 + 1, W
        	ADDWF   	R0 + 1, F
mull1 
	RRF    	R0 + 1, F
       	RRF     	R0, F
        	RRF     	R2 + 1, F
        	RRF     	R2, F  
        	DECFSZ  	R4, F
        	GOTO    	mulloop
  DONE   
  	CLRF		R3
  	CLRF		R3+1
  	CLRF		R1
  	CLRF		R1+1
 
           	ENDM
mull (çarpma) fonksiyonunun 32 bit sonuç veren hali.bu hali ile basic içinde de kullanılabiliyor asm kütüphanesi olarakta makro çıkışı makroya ait R0---R4  değişkenlerini sonucu istediğiniz değişkene attıktan sonra sıfırlamanız gerekiyor. başka bir çarpma için .birde asm de zaten ram adreslerini biz seçiyoruz ama basic'te kullanım için makroda kullanılan değişkenler için ram adreslerini belirtmemiz fena olmaz.ve basic için  makro kısmını silip ana kodu call komutu ile çağırmalıyız tabi
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 24 Aralık 2022, 23:17:32
malsef bir hada yaptım MOVFF komutunda yeni versiyonda bir sorun oluştu oda şudur ki bu işlemler daha derleme esnasında olduğu için kod çalışırken status register değerinin ne olacağı tam olarak anlaşılamayacağından if koşulu çoğu durumda hata vermeye başladı.donanımsal bir desteği de olmadığı için en azından 16 serisi çipler için uygun bir çözüm bulamadım o anki bankın hangisi olduğu yönünde.bu yüzden bu güncelleme çalışmadı fakat eski hali ile tekrar paylaşacağım o hali çalışıyor birde yeni versiyonu olacak oda MOVFF F1,F2 komutunun öncesinde ve sonrasında  gerek olursa bank değiştirme işlemini kendimiz yapmamız yani eğer F1 o an çalıştığımız banktan farklı bir bankta ise komut öncesi F1 in bankına geçmek eğer F2 farklı bankta ise zaten makro içerisinde gene ayarlanıyor olacak sadece girişte ve çıkışta hangi bankta işlem yapacağımıza biz karar vermiş olacağız.tabi bu bizim programımıza görselliği biraz kaybetme pahasınada olsa gerekli olmadığı halde bank değişme yavaşlığından kurtulma imkanı verecek
  ;     giriş        ram = ram
 

	MOVFF MACRO R5,R6
	;R5 =BANK0--------R6 = BANK0
	IF      	(R5) < 0X80 && (R6) < 0X80
	
		 	
		MOVF		R5	,W
		MOVWF	R6

	
	ENDIF

	;////////////R5 =BANK0--------R6 = BANK1/////////////////
	IF      	(R5) < 0X80 && (R6) > 0X7F&&(R6)<0X100 


		MOVF		R5	,W
		BSF	STATUS	,RP0
		MOVWF	R6


	ENDIF
	;-------------------R5=BANK0--------R6=BANK2/////////////////
	IF      	(R5) < 0X80 && (R6) > 0XFF&&(R6)<0X180 

		MOVF		R5	,W
		BSF	STATUS	,RP1
		MOVWF	R6

	ENDIF
	;-------------------R5=BANK0--------R6=BANK3/////////////////
	IF      (R5) < 0X80 && (R6) > 0X17F

		MOVF		R5	,W
		BSF	STATUS	,RP1
		BSF	STATUS	,RP0
		MOVWF	R6

	ENDIF		
;	;/////////////R5=BANK1-------R6=BANK0//////////////////
	IF      	(R5) > 0X7F&&(R5)<0X100 &&  (R6) < 0X80 

		MOVF		R5	,W
		BCF	STATUS	,RP0
		MOVWF	R6		
	ENDIF
		;/////////////R5=BANK1-------R6=BANK1//////////////////
	IF      (R5) > 0X7F&&(R5)<0X100 && 	(R6) > 0X7F && (R6) < 0X100 

		MOVF		R5	,W
		MOVWF	R6

	ENDIF	
			;/////////////R5=BANK1-------R6=BANK2//////////////////
	IF     	(R5) > 0X7F&&(R5)<0X100 && (R6) > 0XFF && (R6) < 0X180 

		MOVF		R5	,W
		BCF	STATUS	,RP0
		BSF	STATUS	,RP1
		MOVWF	R6
		
	ENDIF
	;/////////////R5=BANK1-------R6=BANK3//////////////////
	IF      	(R5) > 0X7F&&(R5)<0X100 &&  (R6) > 0X17F

		MOVF		R5	,W
		BSF	STATUS	,RP1
		MOVWF	R6

	ENDIF	
			;/////////////R5=BANK2-------R6=BANK0//////////////////
		
	IF      	(R5) > 0XFF && (R5) < 0X180 && (R6) < 0X80

		MOVF		R5	,W
		BCF	STATUS	,RP1
		MOVWF	R6	
	ENDIF	
			;/////////////R5=BANK2-------R6=BANK1//////////////////
		
	IF      	(R5) > 0XFF&& (R5)< 0X180 && (R6) > 0X7F && (R6) < 0X100
		MOVF		R5	,W
		BSF	STATUS	,RP0
		BCF	STATUS	,RP1
		MOVWF	R6

	
	ENDIF		
			;/////////////R5=BANK2-------R6=BANK2//////////////////
	IF      (R5) > 0XFF&& (R5)< 0X180 && (R6) > 0XFF && (R6) < 0X180

		MOVF		R5	,W
		MOVWF	R6

	
	ENDIF	
;			;/////////////R5=BANK2-------R6=BANK3//////////////////
	IF      (R5) > 0XFF&& (R5)< 0X180 && (R6) > 0X17F

		MOVF		R5	,W
		BSF	STATUS	,RP0
		MOVWF	R6

	
	ENDIF	
	;/////////////R5=BANK3-------R6=BANK3//////////////////
	
	IF      	(R5) > 0X17F && (R6) > 0X17F

		MOVF		R5	,W
		MOVWF	R6

	ENDIF		
;	;/////////////R5=BANK3-------R6=BANK2//////////////////

	IF      (R5) > 0X17F && (R6) > 0XFF &&  (R6) < 0X180

		MOVF		R5	,W
		BCF	STATUS	,RP0
		MOVWF	R6
	

	ENDIF		
;	;/////////////R5=BANK3-------R6=BANK1//////////////////
	IF      (R5) > 0X17F && (R6) > 0X7F &&  (R6) < 0X100

		MOVF		R5	,W
		BCF	STATUS	,RP1
		MOVWF	R6
		
	ENDIF										
	;/////////////R5=BANK3-------R6=BANK0//////////////////	
	IF      (R5) > 0X17F && (R6) < 0X80

		MOVF		R5	,W
		BCF	STATUS	,RP0
		BCF	STATUS	,RP1
		MOVWF	R6					
	ENDIF	
		ENDM
Buda bank seçimini kod ile yaptığımız versiyon. daha fazla görsellik için üsttekini daha fazla hız için buradakini include edebilirsiniz
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 27 Aralık 2022, 06:28:04
8 bit veriyi 16 bit Manchester koduna çevirmek için makro : komut "MNCOD var1" şeklinde ana kodda yer alır ise aşağıdaki kod derlenir .
;//////////////////////MANCHESTER KODU///////////////////////    
;///////// 8 BİT VERİYİ MENCHESTER KODUNA DÖNÜŞTÜRME///////
    
MNCOD MACRO R3
    MOVLW    0X8
    MOVWF    R1
        CLRF        R2
        CLRF        R2+1
    LL:
        
        BCF        STATUS    ,C
        RRF        R3        ,W
        RRF        R2+1
        RRF        R2
        ;MOVLW    0X80        ;G.E. Thomas STANDARDI İÇİN BU AÇILACAK
        ;XORWF    R2+1
        BCF        STATUS    ,C
    RRF        R3
        RRF        R2+1
        RRF        R2
    MOVLW    0X80        ;IEEE 802.3 STANDARDI İÇİN BU AÇILACAK
    XORWF    R2+1
        
    DECFSZ    R1
    GOTO        LL    
    ENDM
R2 ve R2+1 manchester kodunu verir.birçok ır kumanda, rf vericiler bu kodlama ile işlem yapar sanayide de kullanımı halen sürmekte. saat sinyali ile veriyi xor işlemi ile birleştirip tek sinyal hattı ile gönderdiği için senkron kayması yapmaz bu nedenle güvenlidir ayrıca kablo masrafı da azdır (örn: araba hava yastıkları bu iletişim yöntemini kullanır ).manchester kodunda iki standart varmış (elimde simens'in otomatik sigortası var plc haberleşmesini IEEE standardında yapıyor) aslında birbinin tersi şeklinde koddaki "movlw 0x80
xorwf R2+1" bloğunun yeri değiştirilerek sisteminize uygun olanı seçilebilir.
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 29 Aralık 2022, 22:17:19
;/////////////////////////MANCHESTER KODU BİNARY KODA ÇEVİRME///////////

MNCOD_IN    MACRO    R2 ,R2+1
    MOVLW      .8
    MOVWF      R1
    CLRF       R3
    CLRF       R3+1
    BCF        STATUS ,C
    RRF        R2+1
    RRF        R2
    RRF	       R3
    BCF	       STATUS ,C
    RRF        R2+1
    RRF        R2
    DECFSZ     R1
    GOTO       $-8
    
    ENDM
Buda 16 bit manchester IEEE 802.3 kodunu 8 bit e çevirir.kod içerisinde MNCOD_IN F, F+1 şeklinde manchester kodu girildiğinde R3 de binary kod kaydedilir
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 30 Aralık 2022, 10:43:57
Belirtmeyi unutmuşum Çarpma fonksiyonu 16x16 bit diye yazdım ama dilerseniz 8x16 yada 16x8 bit işlem de yapabilirsiniz.örn: CARP A, ,B,B1 şeklinde kullanılmayan byte yerini boş şekilde gene varmış gibi "virgülle" ayırırsak  işlemi gene yapar bu sefer 8x16 çarpar yada "CARP A, ,B, , "İşlemi 8x8 bit işlem yapar .Dikkat etmemiz gereken şey ise çarpma işlemine dahil etmeyeceğimiz boş virgülle ayırdığımız byte nin değerinin 0 olması gerekiyor .yani yukarıda yazmış olduğum 8x8 byte için A+1 ve B+1 registerlerinin değeri 0 olmalı hepsi bukadar.
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 30 Aralık 2022, 11:58:51
Bölme makrosu gene çarpmadaki gibi kurallar 16x16 yada 16x8 veya 8x8 byte işlem yapılabilir tabiki Pic basic ten araklama :o
;****************************************************************
;* DIV        : 16 x 16 (31 x 15) divide                        *
;*                                                              *
;* Input      : (R0,R0+1) / (R1,R1+1)                                        *
;* Output    : R0, R0+1  =    bolüm "SONUÇ"                          * 
;*            : R2 = remainder            kalan                    *
;*                                                              *
;* Notes      : R2 = R0 MOD R1                                  *
;****************************************************************
BOL MACRO    R0 ,R0+1 ,R1 ,R1+1
    CLRF    R2
    CLRF    R2+1
    BCF    STATUS,C

DIV32DIV 
        movlw  .16
        movwf  R5

divloop 
        rlf    R0 + 1, W
        rlf    R2, F
        rlf    R2 + 1, F
        movf    R1, W
        subwf  R2, F
        movf    R1 + 1, W
        btfss  STATUS, C
        incfsz  R1 + 1, W
        subwf  R2 + 1, F

        btfsc  STATUS, C
        goto    divok
        movf    R1, W
        addwf  R2, F
        movf    R1 + 1, W
        btfsc  STATUS, C
        incfsz  R1 + 1, W
        addwf  R2 + 1, F

        bcf    STATUS, C

divok  
        rlf    R0, F
        rlf    R0 + 1, F

        decfsz  R5, F
        goto    divloop
        
    
ENDM
güzel tarafı R2 kalanını 100 yada 1000 ile istediğimiz hassasiyete göre çarpıp tekrar bölene bölersek virgüllü sayıları da rahattlıkla gösterebiliriz hayırlı olsun.Örnek "BOL BOLUNEN,BOLUNEN+1,BOLEN,BOLEN+1"
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 30 Aralık 2022, 13:04:16
Bu güne kadar yazdığımız makroların çalıştığı örnek bir kod ve makro dosyası kod olarak
    __CONFIG    0x0024
    LIST P = PIC16F690
    INCLUDE "p16f690.inc"

    INCLUDE "KTPNE.INC"
  ; INCLUDE "B:\2022\projeler\ASM CARPMA\LIB\pbppic14.asm"
  ;INCLUDE    "B:\2022\projeler\ASM CARPMA\LIB\PBPPIC14.INC"
    #define _C STATUS,0
    #define _Z STATUS,2
  ; #DEFINE PWM 0X60
 ;    #DEFINE    KP

MANCH    EQU        0X20
SAYI        EQU        0X24
KERE        EQU        0X28
ADO        EQU        0X38
SAY        EQU        0X48
_TMP0        EQU        0X70
_TMP1        EQU        0X71
_TMP2        EQU        0X72

 R0        EQU        0X53
 R1        EQU        0X55
 R2        EQU        0X57 
 R3        EQU        0X59
 R4        EQU        0X5B 
 R5        EQU        0X5D 
 R6        EQU        0X60
 R7        EQU        0X62

       ORG        0X00
        GOTO        AYAR
        ORG            0X04

            
AYAR:
    BSF        STATUS,RP0                        ;BANK1
    BCF        STATUS,RP1
    MOVLW    0xFF
    MOVWF   TRISA
    MOVLW    0xFF
    MOVWF    TRISC
    MOVLW    0x00
    MOVWF    TRISB
    MOVLW    0x87
    MOVWF    OPTION_REG
    MOVLW    0x70
    MOVWF    OSCCON
   ; MOVLW    0x60
  ;  MOVWF    ADCON1
    ;BSF          PCON    ,5
    BCF        STATUS,    RP0                        ;BANK0
    MOVLW    0x00
    MOVWF    ADCON0
    MOVLW    0x00
    MOVWF    PORTA
    MOVWF    PORTB
    MOVWF    PORTC

    BSF        STATUS,RP1                        ;BANK2
    MOVLW    0x00
    MOVWF    ANSEL
    MOVLW    0x00
    MOVWF    ANSELH
    BCF        CM1CON0,7
    BCF        CM2CON0,7
    BANKSEL    PSTRCON
    CLRF    PSTRCON

    BCF        STATUS,RP1
    BCF        STATUS,RP0                        ;BANK0
     MOVLW    0X00
     MOVWF    INTCON
 
BASLA:
    CALL        VERI_AL
    MOVLW    .255
    MOVWF    MANCH
    MOVLW    .57
    MOVWF    KERE
    CARP         ADO, ,MANCH, 
    MOVFF    R2,SAYI
    MOVFF    R2+1,SAYI+1
    MOVFF    R0,SAYI+2
    MOVFF    R0+1,SAYI+3

    BOL    SAYI,SAYI+1 ,KERE,
    
    MOVFF    SAYI,SAY
    CALL        MNC
    MOVFF    R2, MANCH
    MOVFF    R2+1 ,MANCH+1

    MOVFF    SAYI+1,SAY
    CALL        MNC
    MOVFF    R2,MANCH+2
    MOVFF    R2+1,MANCH+3
    
;    MNCOD_IN    MANCH ,MANCH+1

    CALL        GONDER
    GOTO        BASLA
MNC:
    MNCOD    SAYI
    RETURN
VERI_AL:
    
    MOVFF    PORTC    , ADO

    RETURN
GONDER:
    MOVLW    0X20
    MOVWF    SAYI
    BCF    PORTB,7
    CALL    _50MS
    BSF    PORTB,7    
    CALL    _150MS
    BCF    PORTB,7
    CALL    _50MS
    BCF    STATUS ,C
    RRF    MANCH+3
    RRF    MANCH+2
    RRF    MANCH+1
    RRF    MANCH    
    RRF    PORTB
    CALL    _50MS
    DECFSZ    SAYI
    GOTO        $-8
    RETURN
_50MS:
    movlw       .218
            movwf       _TMP0
            movlw       .130
            movwf       _TMP1
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            MOVLW    0X80
    ANDWF    PORTB    ,F
            RETURN
           
            
  _150MS:
  
            movlw       .150
            movwf       _TMP0
            movlw       .134
            movwf       _TMP1
            movlw       .2
            movwf       _TMP2
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            decfsz      _TMP2,F
            goto        $-5
          
    RETURN
        
END
bu örnek kodumuz
 
;****************************************************************
;* MUL        : 16 x 16 = 32 multiply                           *
;*                                                              *
;* Input      : R3 * R1                                         *
;* Output     : R2, W = low word                                *
;*            : R0, R2 + 1 = mid word                           *
;*            : R0 = high word                                  *
;*                                                              *
;* Notes      :                                                 *
;****************************************************************
CARP  MACRO   R3,R3+1,R1,R1+1
 
MUL       
     
    MOVLW       .16              ; For 16 shifts
            MOVWF       R4
           CLRF       R0 + 1
            CLRF        R0
mulloop 
    BCF        STATUS, C
    RRF         R3 + 1, F
           RRF         R3, F
            BTFSS       STATUS, C        ;
            GOTO        mull1               ; Skip add
            MOVF        R1, W           ; 16-bit add with carry out
            ADDWF       R0, F
            MOVF        R1 + 1, W
            BTFSC       STATUS, C
            INCFSZ      R1 + 1, W
            ADDWF       R0 + 1, F
mull1 
    RRF        R0 + 1, F
           RRF         R0    ,F
            RRF         R2 + 1,F
            RRF         R2    ,F  
            DECFSZ      R4    ,F
            GOTO        mulloop
  DONE   
      CLRF        R3
      CLRF        R3+1
      CLRF        R1
      CLRF        R1+1
 
               ENDM

               
;****************************************************************
;* DIV        : 16 x 16 (31 x 15) divide                        *
;*                                                              *
;* Input      : R0 / R1                                         *
;* Output     : R0, R0+1  =     bolüm                           * 
;*            : R2 = remainder            kalan                     *
;*                                                              *
;* Notes      : R2 = R0 MOD R1                                  *
;****************************************************************
BOL MACRO    R0 ,R0+1 ,R1 ,R1+1
    CLRF    R2
    CLRF    R2+1
    BCF    STATUS,C

DIV32DIV 
        movlw   .16
        movwf   R5

divloop 
        rlf     R0 + 1, W
        rlf     R2, F
        rlf     R2 + 1, F
        movf    R1, W
        subwf   R2, F
        movf    R1 + 1, W
        btfss   STATUS, C
        incfsz  R1 + 1, W
        subwf   R2 + 1, F

        btfsc   STATUS, C
        goto    divok
        movf    R1, W
        addwf   R2, F
        movf    R1 + 1, W
        btfsc   STATUS, C
        incfsz  R1 + 1, W
        addwf   R2 + 1, F

        bcf     STATUS, C

divok   
        rlf     R0, F
        rlf     R0 + 1, F

        decfsz  R5, F
        goto    divloop
        movf    R0, W           ; Get low byte to W
    
ENDM
    
;////////////////////////// MOVFF KOMUTU////////////////////////////////////
     ;     giriş        ram = ram
 

    MOVFF MACRO R5,R6
    ;R5 =BANK0--------R6 = BANK0
    IF          (R5) < 0X80 && (R6) < 0X80             
        MOVF        R5    ,W
        MOVWF    R6    
    ENDIF

    ;////////////R5 =BANK0--------R6 = BANK1/////////////////
    IF          (R5) < 0X80 && (R6) > 0X7F&&(R6)<0X100 
        MOVF        R5    ,W
        BSF    STATUS    ,RP0
        MOVWF    R6
    ENDIF
    ;-------------------R5=BANK0--------R6=BANK2/////////////////
    IF          (R5) < 0X80 && (R6) > 0XFF&&(R6)<0X180 
        MOVF        R5    ,W
        BSF    STATUS    ,RP1
        MOVWF    R6
    ENDIF
    ;-------------------R5=BANK0--------R6=BANK3/////////////////
    IF      (R5) < 0X80 && (R6) > 0X17F
        MOVF        R5    ,W
        BSF    STATUS    ,RP1
        BSF    STATUS    ,RP0
        MOVWF    R6
    ENDIF        
;    ;/////////////R5=BANK1-------R6=BANK0//////////////////
    IF          (R5) > 0X7F&&(R5)<0X100 &&  (R6) < 0X80 
        MOVF        R5    ,W
        BCF    STATUS    ,RP0
        MOVWF    R6        
    ENDIF
        ;/////////////R5=BANK1-------R6=BANK1//////////////////
    IF      (R5) > 0X7F&&(R5)<0X100 &&     (R6) > 0X7F && (R6) < 0X100 
        MOVF        R5    ,W
        MOVWF    R6
    ENDIF    
            ;/////////////R5=BANK1-------R6=BANK2//////////////////
    IF         (R5) > 0X7F&&(R5)<0X100 && (R6) > 0XFF && (R6) < 0X180 
        MOVF        R5    ,W
        BCF    STATUS    ,RP0
        BSF    STATUS    ,RP1
        MOVWF    R6        
    ENDIF
    ;/////////////R5=BANK1-------R6=BANK3//////////////////
    IF          (R5) > 0X7F&&(R5)<0X100 &&  (R6) > 0X17F

        MOVF        R5    ,W
        BSF    STATUS    ,RP1
        MOVWF    R6
    ENDIF    
            ;/////////////R5=BANK2-------R6=BANK0//////////////////
        
    IF          (R5) > 0XFF && (R5) < 0X180 && (R6) < 0X80
        MOVF        R5    ,W
        BCF    STATUS    ,RP1
        MOVWF    R6    
    ENDIF    
            ;/////////////R5=BANK2-------R6=BANK1//////////////////
        
    IF          (R5) > 0XFF&& (R5)< 0X180 && (R6) > 0X7F && (R6) < 0X100
        MOVF        R5    ,W
        BSF    STATUS    ,RP0
        BCF    STATUS    ,RP1
        MOVWF    R6    
    ENDIF        
            ;/////////////R5=BANK2-------R6=BANK2//////////////////
    IF      (R5) > 0XFF&& (R5)< 0X180 && (R6) > 0XFF && (R6) < 0X180
        MOVF        R5    ,W
        MOVWF    R6    
    ENDIF    
;            ;/////////////R5=BANK2-------R6=BANK3//////////////////
    IF      (R5) > 0XFF&& (R5)< 0X180 && (R6) > 0X17F
        MOVF        R5    ,W
        BSF    STATUS    ,RP0
        MOVWF    R6    
    ENDIF    
    ;/////////////R5=BANK3-------R6=BANK3//////////////////    
    IF          (R5) > 0X17F && (R6) > 0X17F
        MOVF        R5    ,W
        MOVWF    R6
    ENDIF        
;    ;/////////////R5=BANK3-------R6=BANK2//////////////////

    IF      (R5) > 0X17F && (R6) > 0XFF &&  (R6) < 0X180
        MOVF        R5    ,W
        BCF    STATUS    ,RP0
        MOVWF    R6
    ENDIF        
;    ;/////////////R5=BANK3-------R6=BANK1//////////////////
    IF      (R5) > 0X17F && (R6) > 0X7F &&  (R6) < 0X100
        MOVF        R5    ,W
        BCF    STATUS    ,RP1
        MOVWF    R6        
    ENDIF                                        
    ;/////////////R5=BANK3-------R6=BANK0//////////////////    
    IF      (R5) > 0X17F && (R6) < 0X80
        MOVF        R5    ,W
        BCF    STATUS    ,RP0
        BCF    STATUS    ,RP1
        MOVWF    R6                    
    ENDIF    
        ENDM
;//////////////////////MANCHESTER KODU///////////////////////    
;///////// 8 BİT VERİYİ MENCHESTER KODUNA DÖNÜŞTÜRME///////
    
MNCOD MACRO R3
    MOVLW    0X08
    MOVWF    R1
        CLRF        R2
        CLRF        R2+1
  LL:
        
        BCF        STATUS    ,C
        RRF        R3        ,W
        RRF        R2+1
        RRF        R2
 ;       MOVLW    0X80        ;G.E. Thomas STANDARDI İÇİN BU AÇILACAK
 ;       XORWF    R2+1
        BCF        STATUS    ,C
    RRF        R3
        RRF        R2+1
        RRF        R2
    MOVLW    0X80        ;IEEE 802.3 STANDARDI İÇİN BU AÇILACAK
    XORWF    R2+1
        
    DECFSZ    R1
    GOTO        LL
    ENDM
;/////////////////////////MANCHESTER KODU BİNARY KODA ÇEVİRME///////////

MNCOD_IN    MACRO    R2 ,R2+1
    MOVLW    .8
    MOVWF    R1
    CLRF        R3
    CLRF        R3+1
    BCF        STATUS ,C
    RRF          R2+1
    RRF        R2
    RRF        R3
    BCF        STATUS ,C    
    RRF        R2+1
    RRF         R2    
    DECFSZ    R1
    GOTO        $-8
    
    ENDM
buda tüm kütüphanelerin olduğu makrolar.KTPNE.INC olarak aynı dosya içine kaydederseniz tanır
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 31 Aralık 2022, 14:20:34
ASM de "define" ve "ifdef" koşuluna örnek
ana programa "#define osc_8" diye bir tanımlama yapar ve makroda'da "ifdef osc_8
yazarsak 8 mhz için yaptığımız ayarları çalıştırabiliriz bir örnek verecek olursam
PAUSE    MACRO R0
    IFDEF    OSC_8
    IF    R0 == 1    
            movlw       .151
            movwf       _TMP0
            movlw       .3
            movwf       _TMP1
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            nop
            nop
            ENDIF
    
            IF    R0 == 2     
            movlw       .48
            movwf       _TMP0
            movlw       .6
            movwf       _TMP1
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            nop
            ENDIF


    IFDEF    OSC_16
    IF    R0 == 1        
            movlw       .48
            movwf       _TMP0
            movlw       .6
            movwf       _TMP1
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            nop
            ENDIF
            IF    R0 == 2
            movlw       .98
            movwf       _TMP0
            movlw       .11
            movwf       _TMP1
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            nop
endif
endif
endm

şeklinde yazarsak ana kodda #define osc_16 tanımlamasından sonra programın herhangi bir yerinde  pause 1 yazarsak 16 mhz için olan kodu derleyecektir.tüm olasılıklar için bir algoritma geliştirmeye çalışıyorum kütüphane çok uzun olacak yoksa gerçi bizim programımıza bir etkisi olmayacak ama yazmaktan sıkılacağım kesin .
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 09 Ocak 2023, 12:13:59
negatif sayılarla işlemler için bir teorim var C dilinden pek anlamadığımdan kütüphaneleri çözemedim fakat.bir ASM gerçeği var ki aslında programladığımız düşük seviye çiplerin hiç birinde "-" bir değerin karşılığı gerçek anlamda yok.normalde sayı - olunca en değerli bit kullanım dışı kalıyor o işaret için.yani -255 sayısı için 2 byte lik yerimizin olması gerekiyor bunun yerine .başında bir işaret kullanmak aslında bir asci karakteri bir başka registerde tutup ne olduğuna bakıp eksi karakteri kullanılmış ise ardından gelen değeri "comf" ile tersleyip yani 2 ye tümleyenini alıp 1 ekleyerek o negatif değeri bulabiliriz gene -255 i göstermek için 2 byte kullanmış oluyoruz fakat kullanımı daha bir kolay ve asıl işlem yaptığımız verinin üst biti 0 mı 1 mi diye bakıp işlem sonunda da onu görmezden gelip değerden ayırmak zorunda kalmayız gibi sanki .böyle olunca mevcut paylaştığım kütüphanelerde çarpma veya bölme işlemleri için negatif değerleri hesaplamak sorun olmuyor fakat koşulu kütüphane içine henüz yerleştiremedim.destek atarsanız yada farklı bir fikir teori varsa beraber çözelim.
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 02 Şubat 2023, 12:33:17
  program başında "radix dec" veya    "list r=dec " ifadesi ile program içerisinde vereceğimiz desimal 8 bitlik değerleri aşmadan şu tarz oynamalar yapabiliriz.böylelikle negatif sayıları dönüştürme işi ile uğraşmadan da işlemler yapabiliriz.NOT: radix belirtmeden varsayılan olarak aynı işlemleri HEX sayı sisteminde de yapabilirsiniz ama kontrolu güç olur böyle iyi   
include   "..........."
 list r=dec 

.........
BASLA:
    CLRF        STATUS
    MOVLW    -8*11               ; 0xA8 (-88) sayısını değişkenimize yazar yazar
    MOVWF    SAYI
    MOVLW    (28<<2)-42          ;0x46 (70) sayısını değişkene yazar 
    MOVWF    KERE
    ADDWF    SAYI    ,W  ;TOPLAMA SONUCUNU 0XEE(-18) ŞEKLİNDE BULUR
bu yazım şeklini meblab ide kabul ediyor tüm denemelerim doğru sonuç verdi işlem eper 8 biti aşarsa alt byte gene doğru değeri verir ama üst byte kaybolur.bu hali ile bile birçok problemimi çözüyor.
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 03 Şubat 2023, 15:45:47
32 Bit işaretli sayıları paket halinde değişkenlere yazmak için bir makro
#include p16F690.inc
RADIX    DEC                  :desimal sayılar ile işlem yapabilmek için gerekli
CBLOCK 0x20
Out0 :5 ;res 1 ;

ENDC
PAKET32 MACRO Var, Address ;Address meblab ide için Cblock yada udata kullanıldığında ram başlangıç adresidir(otm)
BANKSEL Address 
movlw Address 
movwf FSR                  ;fsr ye adresi yükler
movlw Var & H'FF'          ;en değersiz byte filtrelenip yazılır
movwf INDF                ;fsr nin işaretlediği adrese değeri yazar
movlw Var >>8 & H'FF'      ; Var 8 bit kaydırılır filtrelenip fsr 1 arttırılır(bir sonraki ram bölgesi yazılır)
incf FSR,F 
movwf INDF 
movlw Var >>16 & H'FF'
incf FSR,F 
movwf INDF 
movlw Var >>24 & H'FF'
incf FSR,F 
movwf INDF 

ENDM 
ORG 0
START 
PAKET32 12345678,Out0 ; PAKET32 -12345678,Out0 yazıldığında da negatif değeri yazabilir adreslere

goto START
END
yazılan değer en fazla 2.147.483.647 ile -2.147.483.648 arası olabilir
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 06 Şubat 2023, 21:40:44
TOGGLE	MACRO	PORT?,R0
		MOVLW	0X01<<R0
		XORWF	PORT?	,F
           ENDM
bir pinin durumunu terslemek için makro .program içerisinde örneğin "TOGGLE PORTA,5"  yazıldığında porta 5 pini durum değiştirir NOT: makro içerisindeki soru işaretine dokunmayın MEPLAB soru işaretini ana programda yazdığımızla değiştirir.
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 07 Şubat 2023, 01:35:17
;/////////////////////////////////////////////////////////////////	
	;EEPROM YAZMA
;/////////////////////////////////////////////////////////////////
WRITE	MACRO R3,R1
	BCF		INTCON	,GIE		;KESMELERİ KAPAR (ÖNEMKİ KESME OLMAMALI YAZMA ESNASINDA)
	BCF		PIR2		,EEIF	;PAYRAĞI İNDİR
	MOVF		R3		,W		;
	BANKSEL	EEADR
	MOVWF	EEADR			;BELİRTTİĞİMİZ ADRESİ EEADR E YAZ(YAZILACAK ADRESİ SEÇ)
	BANKSEL	R1
	MOVF		R1		,W		;
	BANKSEL	EEDAT
	MOVWF	EEDAT			;VERİYİ ADRESE YAZ
	BANKSEL	EECON1
	BCF		EECON1	,EEPGD	;eeprom veya program hafızası seçilebilir.burada eeprom seçili
	BSF		EECON1	,WREN	;yazmayı aç
	MOVLW	0X55
	MOVWF	EECON2			;yazma için rutin olan h55 ve hAA komutları eecon2 ye sırası ile yazılmalı
	MOVLW	0XAA
	MOVWF	EECON2			;eecon2 ye sırası ile yazılmalı
	BSF		EECON1	,WR		;yazmaya başla
	BTFSC	EECON1 	,WR
	GOTO		$-1			 	;bitene kadar takıl
	BANKSEL	PIR2		
	BTFSS	PIR2	 	,EEIF	;TAMAMLANINCA BAYRAK KALKAR DEVAM
	GOTO		$-1
	BANKSEL	EECON1
	BCF		EECON1	,WREN	;yazmayı kapat
	BCF		STATUS	,RP1
	BCF		STATUS	,RP0			;Bank 0
	BCF		PIR2		,EEIF	;BAYRAĞI İNDİR
	ENDM

;////////////////////////////////////////////////////////////////
	;EEPROM OKUMA
;////////////////////////////////////////////////////////////////
READ	MACRO	R3
	MOVF 	R3, W;
	BANKSEL 	EEADR
	MOVWF	EEADR		;Data Memory ;Address to read
	BANKSEL 	EECON1
	BCF		EECON1, EEPGD	;Point to DATA memory
	BSF		EECON1, RD	;EE Read
	BTFSC	EECON1, RD
	GOTO		$-1
	BANKSEL 	EEDAT
	MOVF		EEDAT, W		;W = EEDAT
	BANKSEL PORTA
	ENDM
program içerisinde kullanılacak örnek kodlar YAZMA İÇİN " WRITE 3,VAR" okuma için "READ 3" komutları ile eepromun 3.adresine VAR değişkeni yazılır.okuma komutu ile de 3. adresten kaydedilmiş veri "W" ye yazılır.bu hali ile basic komutuna benzedi biraz.
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 07 Şubat 2023, 02:01:49
ETE hocam bir sorum olacaktı iki butonum var ve birine bastığımda bir word değişkeni ardışık iki adrese ve diğerine bastığımda da ilk ikisinin ardından ilk adresten itibaren diğer bir word değişkeni yazdım örnek (0,1,2,3 adresleri gibi) bu adres başlangıcı olan sayıyı yani "0"ı da 255. adreste tuttum ve her yeni eprom kaydı sonrası bu adresi bir artırıp tekrar kaydettim program başında da adresi okuyarak hangi adresten kayda başlayacağımı bildim sonra de eeprom ömrünü uzatmak için saatlerce uğraşıp çok saçma bir yere vardığımı farkettim çünkü bu sefer de adresi tuttuğum 255.adresi hunharca kullanmış oldum :o.daha önce böyle bir paylaşım yapılmıştı ama bulamadım.çözüm hakkında yardımcı olurmusunuz.
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: ete - 07 Şubat 2023, 09:42:26
Sorunu anladım. Benzer işlerle daha öncede uğraşmıştım. Burada temel amaç eprom hafızalarına dengeli biçimde gerektiği kadar yazma yapılmasıdır. Sıfır adresi dışında kalanları dengeli kullanıyorsun ama sıfırı da bu arada aşırı şekilde kullanmış oluyorsun.
Ben son olarak şöyle bir mantık kullanmıştım. Senin örneğine benzeterek açıklayayım.

Sıfır nolu adresten kayıta başladık ve ilk 4 adrese değişkenlerini kayıt ettik.
Elimizde 1 sayac daha olacak. Bu sayac ilgili adreslere kac defa kayıt ettiğimizi tutacak. Tabiiki bu değerleride kayıt etmek zorunda kalacaksın. Bu durumda kayıt adedin 5 olacak. Böylece ilk 5 adrese kayıt yaptın ve sondaki adres(baştakide olabilir) kayıt adedin olacak. Bu adreslere en azından 100 kayıt yada toplamda 255 kayıt yapacağını düşünebilirsin.
Şimdi diyelimki adres kayıt limitini doldurdun. Yapılacak iş 0+5=5 nolu adresten itibaren yenilerini kayıt etmek ve 0-4 arasına 255 değerini yeniden yazmak olacak.
Böylece okuma yaparken 255 lerin bittiği yeri bulup onu kayıt altında tutman bir dahaki kayıtı oraya yapman yeterli olacaktır. 255 den küçük bir değer bulunmaz ise işin başında olduğunu anlayabilir ve sıfır nolu adresten işe başlarsın. Böylece adresleri dengeli şekilde tutabilirsin. Önceleri adres göstergesinide kayıt ediyordum ama sonradan fazla işe yaramadığına karar verip yanlızca kayıt adedini tutuyordum.
Bu iş akıl işidir. Bir başkası daha akıllıca bir yöntem bulabilir. Kafa yormak gerek. Amacımız eprom adreslerini dengeli şekilde kullanmak hep aynı adrese kayıt yapmamak. Düşünün bakalım.

Ete
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 07 Şubat 2023, 13:59:50
Anladım sanırım tek eksi yanı sisteme ilk enerji verildiğinde epromda ff harici ilk değeri bulana kadar okuma yapıp ilk baştaki 0-254 arası sınırladığım kayıt adedini bulana kadar bir gecikme olacak.teşekkürler hocam.
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: ete - 07 Şubat 2023, 14:58:05
Eprom okumasında bekleme yapılmıyor biliyorsun. Toplam 256 adres okunacak ki bu çok kısa sürede halledilir. Üstelik her açılışta belirli bir gecikme uygulandığınıda unutma. Onu minimumda (150ms dir) tutarsın gerisi 100 ms bile tutmaz diye düşünüyorum. Kısaca sorun olmaz. Ama emniyetli bir sistem bana kalırsa.

Ete
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 09 Şubat 2023, 04:15:19
Karşılaştırma fonksiyonları için makrolar.
;///////////////////DEĞER KIYASLAMASI//////////////////////////////////
;KULLANIMI= KARŞILAŞTIRILACAK HER BİR "WORD" DEĞERİ ARDIŞIK RAM BÖLGELERİNDE TUTULMALI 
;R4 VE R5 DEĞERLERİNİ ASCII DEĞERLER OLARAK İLGİLİ İŞARETLER OLARAK SEÇTİM 
;MAKRODA "=" SENBOLÜ KABUL EDİLMEDİĞİ İÇİN DEC KARŞILIĞI YAZILDI
;AMA ANA PROGRAMDA KULLANILABİLİR OLDU
;ÖRNEK KODLAR= KIYAS A,"<","=",B 
;			KIYAS A,"<"," ",B
;			KIYAS A,"="," ",B
;			BTFSS	R6	,0
;			GOTO	****
;			GOTO ****
;BOŞ BIRAKILAN SEMBOL YERİNE ASCII BOŞLUK BIRAKILMALI
;R6 ADRESİNİN İLK BİTİ TRUE/FALSE DÖNDÜRÜR 
;MAKRO ÇIKIŞI R6 , 0 BİTİ KONTROL EDİLEREK İŞLEM YAPILIR
;" > " YADA ">=" İŞARETİ İÇİN AYRI BİR İŞLEME GEREK YOK MEVCUT İŞLEMLERİN TERSİ OLDUĞUNDAN SADECE DEĞİŞKEN YERİ DEĞİŞECEK	
KIYAS	MACRO	R0,R4,R5,R2
	IF   R4 == "<" && R5 == 61
		MOVF		R0+1		,W			;IF Y <= ART THEN GOTO KAPA
		SUBWF	R2+1		,W			;
		BTFSS	STATUS	,C			;
		GOTO		YANLIS				;GOTO		SAG_KAPA
		BTFSS	STATUS	,Z
		GOTO		DOGRU				;GOTO		SAG_AC	
		MOVF		R0		,W								
		SUBWF	R2		,W
		BTFSS	STATUS	,C
		GOTO		YANLIS
		GOTO		DOGRU
		
	
		

		ENDIF
	IF   R4 == "<" && R5 == 32
		MOVF		R0+1		,W			;IF Y < ART THEN 
		SUBWF	R2+1		,W			;
		BTFSS	STATUS	,C			;
		GOTO		YANLIS					;GOTO		SAG_KAPA
		BTFSS	STATUS	,Z
		GOTO		DOGRU			;GOTO		SAG_AC	
		MOVF		R0		,W								
		SUBWF	R2		,W
		BTFSC	STATUS	,Z
		GOTO		YANLIS
		BTFSS	STATUS	,C
		GOTO		YANLIS
		GOTO		DOGRU
	
		ENDIF
		
	IF	R4 == 61 && R5 == 32		;IF A=B
		MOVF		R0+1		,W
		XORWF	R2+1		,W
		BTFSS	STATUS	,Z
		GOTO		YANLIS
		MOVF		R0		,W
		XORWF	R2		,W
		BTFSS	STATUS	,Z
		GOTO 	YANLIS
		GOTO		DOGRU
		ELSE

		GOTO	EXT
		ENDIF
YANLIS:
		BCF		R6		,0
		GOTO		EXT
DOGRU:							;GOTO		SAG_KAPA	
		BSF		R6		,0
		GOTO		EXT

EXT:
		ENDM    
	  
işaretleri ascii olarak kullanmak zorunda kalmam dışında iş görür tabi bide adı kıyas  ::) .ayrıca diğer dillerin karşılaştırma sonucu çıkardığı koddan çok daha kısa kod üretiyor.kullanımını kodun üzerinde başlık kısmında yapmaya çalıştım soru yada kodda bir sorun olursa bildirin lütfen.denemelerini yaptım hata bulamadım ama insanlık hali.
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 11 Şubat 2023, 18:39:58
programı işlemciye yazdığımız esnada eeprom'a veri yazmak içindir,program çalışması esnasında herhangi bir yazma yapmaz.program içerisinde rutin eprom yazma kodları ile tekraren değiştirilebilir tabiki.
        
        org      0x00
        basla:
        çalışan programlarımız
        ......
        .......
        goto basla
        ORG    0X2100         ; eepromun çoğu 16 f serisinde başlangıç adresi 
        DE  0, 0, 0, 0, 0, 0    ;ilk adresten başlayarak 5. adrese kadar 0 yazar
        END 
   
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 11 Şubat 2023, 19:31:57
aynı formatı gene ilgili adreslerinde örneğin org 0x800  kullanılarak bu sefer program hafızasına "data,da veya dw"komutları kullanılarak yazılabilir
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 16 Şubat 2023, 13:24:55
Klasik for-next döngüsü için bir makro "FOR 10,200" şeklinde kullanımı pic basic pro ya oldukça benzer oldu,işlevi ise  for dan sonraki kodu next makrosunu görene kadar çalıştırır next makrosunda fordaki verilen koşula bakar ona göre kodu yeniden tekrarlar yada bir altından devam eder.şu an için sadece 255 e kadar tekrar yapabiliyor,for ve next iki ayrı makro olarak çalışır
FOR	MACRO	R0,R2
		MOVLW	R2 	
		MOVWF	R4
		MOVLW	R0	
		SUBWF	R4	,F
FOR1:
		ENDM
		
NEXT	MACRO	
		DECFSZ	R4	,F
		GOTO		FOR1
		ENDM	
kullanımı ise
FOR 10,220
BSF PORTA ,0
NOP
BCF PORTA ,0
.........
........
NEXT
Bu kodda for next arasına yazdığımız kodun 210 kere tekrar etmesi sağlanır
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 24 Şubat 2023, 21:43:15
Map fonksiyonu için makro bildiğimiz arduino map fonksiyonu ile aynı çalışıyor hayırlı olsun :)
bir hata yapmışım düzeltip paylaşacağım
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 27 Şubat 2023, 14:18:04
Bölme fonksiyonu hata veriyordu düzelttim
MAP    MACRO    R0,R0+1,VAR,VAR1,VAR2,VAR3,ADDRESS ;address =VAR
 ;{
;return ((value - fS) * (tE - tS)) / ((fE - fS) + tS);
;map(value,fS, fE, tS,tE)
;map(512, 0, 1023,0, 2000)            ((512-0)*(2000-0)/(1023-0)+0)
    BANKSEL ADDRESS
    movlw    ADDRESS ;
    movwf    FSR                    ;fsr ye adresi yükler
    movlw    VAR & H'FF'            ;;en değersiz byte filtrelenip yazılır
    movwf    INDF                ;fsr nin işaretlediği adrese değeri yazar
    movlw    VAR >>8 & H'FF'        ;; Var 8 bit kaydırılır filtrelenip fsr 1 arttırılır(bir sonraki ram bölgesi yazılır)
    incf    FSR        ,F
    movwf    INDF

    MOVLW    VAR1 &0XFF
    INCF        FSR        ,F
    MOVWF    INDF
    MOVLW    VAR1>>8 & 0XFF
    INCF        FSR        ,F
    MOVWF    INDF
    
    MOVLW    VAR2 & 0XFF
    INCF        FSR        ,F
    MOVWF    INDF
    MOVLW    VAR2 >> 8 &0XFF
    INCF        FSR        ,F
    MOVWF    INDF

    MOVLW    VAR3 & 0XFF
    INCF        FSR        ,F
    MOVWF    INDF
    MOVLW    VAR3 >> 8 &0XFF
    INCF        FSR        ,F
    MOVWF    INDF
;*******************************************************************FONKSİYONLAR**************************    
    MOVF        R1        ,W
    SUBWF    R0        ,F
    BTFSS    STATUS    ,C
    INCF        R1+1        ,F    ;VALUE-FS
    MOVF        R1+1        ,W    ;SONUC    R0 
    SUBWF    R0+1        ,F
;///////////////////////////////
    MOVF        R3        ,W
    SUBWF    R4        ,W
    MOVWF    R5
    BTFSS    STATUS    ,C
    INCF        R3+1        ,F    ;TE-TS
    MOVF        R3+1        ,W    ;SONUC    R5 
    SUBWF    R4+1        ,W
    MOVWF    R5+1
;********************************
    MULL32    R5,R5+1,R0,R0+1            ;((value - fS) * (tE - tS))  ;SONUC= XSL-XSH    32BİT
    
    MOVF        R1        ,W                ;    60  62 64  66  68            ADRESLER
    SUBWF    R2        ,W
    MOVWF    R5                        ;        R0  R1 R2  R3  R4            DEĞİŞKENLER
    BTFSS    STATUS    ,C                ;    MAP    SAYI,0,1023,800,2200,R1        HARİTA
    INCF        R1+1        ,F                ;    (1023-0)+800                    İŞLEM
    MOVF        R1+1        ,W                ;    map(value,fS, fE, tS,tE)
    SUBWF    R2+1        ,W
    MOVWF    R5+1                        ;  R2 - R1 + R3
                                    ;((fE - fS) + tS);
    CLRF        R6                                ;SONUÇ = R2
    CLRF        R6+1
    BOL    XSL,XSL+1,XSH,XSH+1,R5,R5+1,R6,R6+1
    MOVF        R3        ,W
    ADDWF    XSL        ,F
    MOVF        R3+1        ,W
    BTFSC    STATUS    ,C
    INCF        XSL+1        ,F
    ADDWF    XSL+1        ,F
    BTFSC    STATUS    ,C
    INCFSZ    XSH
    GOTO    $+2
    INCF        XSH+1
    MOVF        XSL        ,W
    MOVWF    MAP_SNC
    MOVF        XSL+1    ,W
    MOVWF    MAP_SNC+1    
    MOVF        XSH    ,W
    MOVWF    MAP_SNC+2    
    MOVF        XSH    ,W
    MOVWF    MAP_SNC+3        
    
    ENDM    
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 27 Şubat 2023, 14:31:27
yeni bölme fonksiyonu bi kısmı araklama tabi :P işaretli 32 bit sayılarla işlem yapabiliyor 32/32=32 sonucu da 32 bit içinde saklıyor biraz zaman alıyor ama kısaltmanın yolunu buldum gibi deniyorum paylaşırım başarınca.MAP ile ilgili tüm makrolar 32 bit çarpma ve 32 bit bölme makrosundan ibaret.ikisi de aşağıda
;****************************************************************
;* MUL        : 16 x 16 = 32 multiply                           *
;*                                                              *
;* Input      : R3 * R1                                         *
;* Output     : R2, W = low word                                *
;*            : R0, R2 + 1 = mid word                           *
;*            : R0 = high word                                  *
;*                                                              *
;* Notes      :                                                 *
;****************************************************************
MULL32  MACRO   X1,X1+1,X2,X2+1

		
 
MUL3:       
	 
		MOVLW   	.16              ; For 16 shifts
        	MOVWF   	XX
       	CLRF   	XSH + 1
        	CLRF    	XSH
mulloop: 
		BCF		STATUS, C
		RRF     	X1 + 1, F
       	RRF     	X1, F
        	BTFSS   	STATUS, C		;
        	GOTO    	mull1           	; Skip add
        	MOVF    	X2, W           ; 16-bit add with carry out
        	ADDWF   	XSH, F
        	MOVF    	X2 + 1, W
        	BTFSC   	STATUS, C
        	INCFSZ  	X2 + 1, W
        	ADDWF   	XSH + 1, F
mull1: 
		RRF    	XSH + 1, F
       	RRF     	XSH	,F
        	RRF     	XSL + 1,F
        	RRF     	XSL	,F  
        	DECFSZ  	XX	,F
        	GOTO    	mulloop
DONE:   
  		CLRF		X1
  		CLRF		X1+1
  		CLRF		X2
  		CLRF		X2+1
 
          ENDM

               
;****************************************************************
;* DIV        : 16 x 16 (31 x 15) divide                        *
;*                                                              *
;* Input      : R0 / R1                                         *
;* Output     : R0, R0+1  =     bolüm                           * 
;*           	 : R2 = remainder            kalan                     *
;*                                                              *
;* Notes      : R2 = R0 MOD R1                                  *
;****************************************************************
;		----BÖLÜNEN---	 ----BÖLEN----
;*** 32 BIT SIGNED DIVIDE ***
;REGA / REGB -> REGA
;Remainder in REGC
;Return carry set if overflow or division by zero
;*** 32 BIT SIGNED DIVIDE ***
;REGA / REGB -> REGA
;Remainder in REGC
;Return carry set if overflow or division by zero
BOL	MACRO	D0,D1,D2,D3,B0,B1,B2,B3
divide:
	clrf		DD1		;Reset sign flag
	call	absa		;Make dividend (REGA) positive
	skpc
	call	absb		;Make divisor (REGB) positive
	skpnc
	return				;Overflow
	clrf		DR0		;Clear remainder
	clrf		DR1
	clrf		DR2
	clrf		DR3
	movlw	D'32'		;Loop counter
	movwf	DD
	;call	slac				;Purge sign bit

dvloop:
	call	slac		;Shift dividend (REGA) msb into remainder (REGC)
	movf		B3,w		;Test if remainder (REGC) >= divisor (REGB)
	subwf	DR3,w
	skpz
	goto	dtstgt
	movf		B2,w
	subwf	DR2,w
	skpz
	goto	dtstgt
	movf		B1,w
	subwf	DR1,w
	skpz
	goto	dtstgt
	movf		B0,w
	subwf	DR0,w
dtstgt:	
	skpc			;Carry set if remainder >= divisor
	goto	dremlt
	movf		B0,w		;Subtract divisor (REGB) from remainder (REGC)
	subwf	DR0,f
	movf		B1,w
	skpc
	incfsz	B1,w
	subwf	DR1,f
	movf		B2,w
	skpc
	incfsz	B2,w
	subwf	DR2,f
	movf		B3,w
	skpc
	incfsz	B3,w
	subwf	DR3,f
	clrc
	bsf		D0,0		;Set quotient bit

dremlt:
	decfsz	DD,f	;Next
	goto	dvloop
	btfsc	DD1,0		;Check result sign
	call	negatea		;Negative
	GOTO	DIVCIK
;/////////////////////////////////////////////////////////////////	
absa:
	rlf		D3,w
	skpc
	return			;Positive
negatea:
	movf		D3,w		;Save sign in w
	andlw	0x80

	comf		D0,f		;2's complement
	comf		D1,f
	comf		D2,f
	comf		D3,f
	incfsz	D0,f
	goto	nega1
	incfsz	D1,f
	goto	nega1
	incfsz	D2,f
	goto	nega1
	incf		D3,f
nega1:
	incf		DD1,f		;flip sign flag
	addwf	D3,w		;Return carry set if -2147483648
	return
;/////////////////////////////////////////////////////////////////
absb:
	rlf		B3,w
	skpc
	return				;Positive
negateb:
	movf		B3,w		;Save sign in w
	andlw	0x80
	comf		B0,f		;2's complement
	comf		B1,f
	comf		B2,f
	comf		B3,f
	incfsz	B0,f
	goto	negb1
	incfsz	B1,f
	goto	negb1
	incfsz	B2,f
	goto	negb1
	incf		B3,f
negb1
	incf		DD1,f		;flip sign flag
	addwf	B3,w		;Return carry set if -2147483648
	return
;///////////////////////////////////////////////////////////
slac:
	rlf		D0,f
	rlf		D1,f
	rlf		D2,f
	rlf		D3,f
slc:
	rlf		DR0,f
	rlf		DR1,f
	rlf		DR2,f
	rlf		DR3,f
	return
DIVCIK:
	ENDM
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 27 Şubat 2023, 14:35:11
örnek program
    __CONFIG    0x0024
    LIST P = PIC16F690
    INCLUDE "p16f690.inc"
   list r=dec 
    INCLUDE "KTPNE.INC"

    #define _C STATUS,0
    #define _Z STATUS,2
    #DEFINE	OSC_8
  ; #DEFINE PWM 0X60
 ;	#DEFINE	KP
;udata	

	CBLOCK 0X20
SAYI	:2	
KERE	:2
MAP_SNC:4	
	ENDC
R0		EQU		0X60
R1		EQU		0X62
R2		EQU		0X64 
R3		EQU		0X66
R4		EQU		0X68 
R5		EQU		0X6A 
R6		EQU		0X6C
R7		EQU		0X6E	
;BÖLME DEĞİŞLENKERLİ
	CBLOCK	0X50
D0	
D1	
D2	
D3
B0
B1
B2
B3
DR0
DR1	
DR2	
DR3			;0X5B
DD
DD1			;0X5D
	ENDC
;ÇARPMA DEĞİŞKENLERİ
	CBLOCK	0X70
X1	:2
X2	:2		
XSL	:2
XSH	:2
XX
	ENDC

   	ORG    	0X00
    	GOTO    	AYAR
    	ORG        	0X04

		
AYAR:
	BANKSEL	TRISA
    	MOVLW    	 0x00
    	MOVWF   	TRISA
    	MOVLW    	0xFF
   	MOVWF    	TRISC
    	MOVLW    	0x00
    	MOVWF    	TRISB
    	MOVLW    	0x82
    	MOVWF    	OPTION_REG
    	MOVLW    	0x70
    	MOVWF    	OSCCON
    	BCF    		STATUS,	RP0                        ;BANK0
    	MOVLW    	0x00
    	MOVWF    	ADCON0
    	MOVLW    	0x00
    	MOVWF    	PORTA
    	MOVWF    	PORTB
    	MOVWF    	PORTC
    	BSF    		STATUS,RP1                        ;BANK2
    	MOVLW    	0x00
    	MOVWF    	ANSEL
    	MOVLW    	0x00
    	MOVWF    	ANSELH
    	BCF    		CM1CON0,7
    	BCF    		CM2CON0,7
    	CLRF		WPUB
    	BSF		IOCB	,7
    	BANKSEL	PSTRCON
    	CLRF		PSTRCON
    	BCF    		STATUS,RP1
    	BCF    		STATUS,RP0                        ;BANK0
 	MOVLW	0X00
 	MOVWF	INTCON
	
 	CLRF		PORTA
 	CLRF		PORTB
 	CLRF		PORTC

BASLA:
	PAKET16	512,SAYI                   ; bu sayı denemelik örneğin analog okumayı simule ediyor
	MAP	SAYI,,0,1023,0,2000,R1     ;SAYI 2 byte olduğundan sayıdan sonraki iki virgül SAYI+1 yazmamak için 
	GOTO BASLA
	END
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 02 Mart 2023, 14:00:08
Bölme makrosu biraz daha hızlandı 32 bit için sürekli kaydır çıkar işlemi yapıyordu önceden şu an en değerli basamağı bulana kadar sadece kaydırıyor böylece gereksiz çıkarma işleminden kurtuluyor tabi sayının büyüklüğüne göre süre farkı değişmekle beraber küçük sayılarda neredeyse yarı yarıya hızlanma oluyor ancak bölünen sayı 32 bit değerinde olursa eski makro ile aynı hızda çalışır. ayrıca makroya BOL A,A+1... şeklinde yazma işi de kalktı gerekli reg alanını 4 byte ayarladığınız taktirde ilk register adresini verince 4 byte adresleniyor yani DIV32 A,B yapınca 32 bit /32 bitlik işlem yapabiliyor .
DIV32		MACRO	?,?0          ;? == A,A+1,A+2,A+3
                                      ;?0== B,B+1,B+2,B+3
divide:
	clrf		DD1		;Reset sign flag
	call	absa		;Make dividend (REGA) positive
	skpc
	call	absb		;Make divisor (REGB) positive
	skpnc
	return				;Overflow
	movlw	D'33'		;Loop counter
	movwf	DD
BASAMAK:
	CALL	TEST
	SKPC	
	GOTO BASAMAK
	CALL	GERIAL	
	
	clrf		DR0		;Clear remainder
	clrf		DR1
	clrf		DR2
	clrf		DR3
;	movlw	D'32'		;Loop counter
;	movwf	DD
	;call	slac				;Purge sign bit

dvloop:
	call		slac		;Shift dividend (REGA) msb into remainder (REGC)
	movf		?0+3,w		;Test if remainder (REGC) >= divisor (REGB)
	subwf		DR3,w
	skpz
	goto		dtstgt
	movf		?0+2,w
	subwf		DR2,w
	skpz
	goto		dtstgt
	movf		?0+1,w
	subwf		DR1,w
	skpz
	goto		dtstgt
	movf		?0,w
	subwf		DR0,w
dtstgt:	
	skpc			;Carry set if remainder >= divisor
	goto		dremlt
	movf		?0,w		;Subtract divisor (REGB) from remainder (REGC)
	subwf		DR0,f
	movf		?0+1,w
	skpc
	incfsz		?0+1,w
	subwf		DR1,f
	movf		?0+2,w
	skpc
	incfsz		?0+2,w
	subwf		DR2,f
	movf		?0+3,w
	skpc
	incfsz		?0+3,w
	subwf		DR3,f
	clrc
	bsf			? , 0		;Set quotient bit

dremlt:
	decfsz		DD,f	;Next
	goto		dvloop
	btfsc		DD1,0		;Check result sign
	call		negatea		;Negative
	GOTO		DIVCIK
;/////////////////////////////////////////////////////////////////	
absa:
	rlf			?+3,w
	skpc
	return			;Positive
negatea:
	movf		?+3,w		;Save sign in w
	andlw	0x80

	comf		?		,f		;2's complement
	comf		?+1		,f
	comf		?+2		,f
	comf		?+3,f
	incfsz		?	,f
	goto		nega1
	incfsz		?+1,f
	goto		nega1
	incfsz		?+2,f
	goto		nega1
	incf		?+3,f
nega1:
	incf		DD1,f		;flip sign flag
	addwf		?+3	,w		;Return carry set if -2147483648
	return
;/////////////////////////////////////////////////////////////////
absb:
	rlf		?0+3,w
	skpc
	return				;Positive
negateb:
	movf		?0+3,w		;Save sign in w
	andlw	0x80
	comf		?0	,f		;2's complement
	comf		?0+1,f
	comf		?0+2,f
	comf		?0+3,f
	incfsz		?0,f
	goto	negb1
	incfsz		?0+1,f
	goto	negb1
	incfsz		?0+2,f
	goto	negb1
	incf		?0+3,f
negb1
	incf		DD1,f		;flip sign flag
	addwf		?0+3,w		;Return carry set if -2147483648
	return
;///////////////////////////////////////////////////////////
slac:
	rlf		?,f
	rlf		?+1,f
	rlf		?+2,f
	rlf		?+3,f
slc:
	rlf		DR0,f
	rlf		DR1,f
	rlf		DR2,f
	rlf		DR3,f
	return
TEST:
	DECF	DD	,F
	rlf		?,f
	rlf		?+1,f
	rlf		?+2,f
	rlf		?+3,f
	RETURN
GERIAL:
	RRF		?+3,f
	RRF		?+2,f
	RRF		?+1,f
	RRF		?	,f
	RETURN
DIVCIK:
	ENDM
kullanımı için sonuç A registerine kaydedilir.
	CBLOCK 0X20
A	:4	
B	:4
        endc
BASLA:
        DIV32 A,B
        GOTO BASLA
END
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 13 Nisan 2023, 23:07:40
FOR NEXT ve TOGGLE makrosu daha işlevsel hale getirildi.makro içerisinde goto lable komutu ana programda birden fazla  çalıştırıldığında çakışmaya neden olduğundan dallanmalar PCL üzerinden tekrar düzenlendi
TOGGLE	MACRO	PORT?,?0
		MOVLW	0X01<<?0
		XORWF	PORT?	,F
           ENDM
;////////////////////////////////FOR-NEXT DÖNGÜSÜ///////////////////////////////
;KULLANIMI	"FOR 0,255"		; 255 TAKRAR YAPARAK FOR NEXT ARASINDAKİ KODU ÇALIŞTIRIR
;			KODLAR
;			......
;			NEXT
;*******************************************************************************
FOR	MACRO	R0,R2
		MOVLW	R2 	
		MOVWF	R4
		MOVLW	R0	
		SUBWF	R4		,F
		MOVF		PCL	,W
		MOVWF	R9
		ENDM		
NEXT	MACRO		
		MOVF		R9	,W
		DECFSZ	R4	,F
		MOVWF	PCL
		ENDM	
çalışma mantığı ile ilgili video ETE hocamın affına sığınarak
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 13 Nisan 2023, 23:26:02
belki de makro kullanımımızı en çok gerektirecek konulara geldik sabit modul ayarları (ADC,UART,SPI vb) gibi ayarların ve okumaların yapıldığı makrolarda sıra. şu an için ADC ve UART makrolarını yaptım hayırlı olsun.
;///////////////////////////////////////////////////////ADC////////////////////////////////////
;kullanımı            ADC_SET  şeklinde olup herhangi bir değişken içermez standart ayarları ana programda define ile belirttiğimiz osc değerine göre otomatik yapar 
; //////////////////10 bit sağa yaslı format kullanır .
ADC_SET  MACRO 
    BANKSEL    ANSEL            ;BANK2
    CLRF    ANSEL
    CLRF    ANSELH
    ;BANKSEL    ADCON0
    BCF    STATUS    ,RP1
    MOVLW    0X80
    MOVWF    ADCON0    
    IFDEF    OSC_4
    ;BANKSEL    ADCON1
    BSF    STATUS    ,RP0
    MOVLW    B'00010000        ; BÖLME ORANI  OSC YE BAĞLI
    MOVWF    ADCON1
    ENDIF
    IFDEF    OSC_8
    ;BANKSEL    ADCON1
    BSF    STATUS    ,RP0
    MOVLW    B'01010000
    MOVWF    ADCON1
    ENDIF    
    IFDEF    OSC_20
    ;BANKSEL    ADCON1
    BSF    STATUS    ,RP0
    MOVLW    B'00100000
    MOVWF    ADCON1
    IFNDEF    
    BSF    STATUS    ,RP0
    MOVLW    B'01110000
    MOVWF    ADCON1    
    ENDIF
    BCF    STATUS    ,RP0
    ENDM
;*********************** ADC_READ ///////////////////////////////////////
;kullanımı  "ADC_READ pin,değişken" şeklindedir Örnek    "ADC_READ    0,SAYI    "
;analog olarak ayarlanacak bacakların makro dışında tek ayarı bacakların giriş olarak ayarlanmasıdır
ADC_READ MACRO    ?0,?1
    BSF        ADCON0    ,0
    MOVLW        ?0    
    ANDLW    0X0F
    MOVWF    R9
    MOVWF    0X70
    MOVLW    0X01
    BSF        STATUS    ,RP1
    BCF        STATUS    ,C
    MOVWF    ANSEL
    MOVF        0X70        ,W
    BTFSC        STATUS    ,Z
    GOTO        $+5
    RLF        ANSEL        ,F
    RLF        ANSELH    ,F
    DECFSZ    0X70    ,F
    GOTO $-3
    BCF        STATUS    ,RP1
    BCF        STATUS    ,C
    RLF        R9    ,F
    RLF        R9    ,W        
;    BANKSEL    ADCON0
    IORWF        ADCON0
;    BSF        ADCON0    ,0
    FOR    0,4
    NOP
    NOP

    NEXT
    ;PAUSE 1
    BSF        ADCON0    ,1
    BTFSC        ADCON0    ,1        ; bayrak biti okumanın bittiğini kontrol etmek için izlenir
    GOTO    $-1
;    PAUSE    1
    MOVFF    ADRESL,?1
    MOVFF    ADRESH,?1+1
    ENDM
;///////////////////////////////////////////////////////////////////////////////
;///////////////////////UART_SET/////////////////////////////////////////////;
;kullanımı            "UART_SET    230400,8,0"      UART_SET    baud,bit,ters/düz  şeklindedir
;tüm asenkron ayarları makro içerisinde yapar bacakların giriş çıkışları dahil
UART_SET MACRO    VAR,VAR1,VAR2
        BANKSEL TXSTA  
        BCF    TRISB        ,7 ;tx
        BSF    TRISB        ,5    
        MOVLW  0X24              ; TXEN,BRGH
        MOVWF  TXSTA  
        IF    VAR2>0 
        BANKSEL    BAUDCTL
        MOVLW    0X18            ;İNVERTED
        MOVWF    BAUDCTL
        ELSE
        BANKSEL    BAUDCTL
        MOVLW    0X08
        MOVWF    BAUDCTL
      ;  CLRF    BAUDCTL            ;NONİNVERTED
        ENDIF        ;
        BANKSEL RCSTA          ;
        MOVLW 0X80            ;SPEN,CREN
        MOVWF RCSTA
        BANKSEL TRISA
        IFDEF    OSC_8
    IF VAR==9600
        MOVLW  .207              ;
        MOVWF  SPBRG
        ENDIF
        IF    VAR==10417
        MOVLW  .191          ;
        MOVWF  SPBRG
        ENDIF  
        IF    VAR==19200
        MOVLW  .103              ;
        MOVWF  SPBRG 
        ENDIF  
        IF    VAR==57600
        MOVLW  .34            ;
        MOVWF  SPBRG 
        ENDIF
        IF    VAR==115200
        MOVLW  .16          ;
        MOVWF  SPBRG                
    ENDIF
    IF    VAR==230400
        MOVLW  .8        ;
        MOVWF  SPBRG                
    ENDIF
    IF    VAR1==8
    BCF    RCSTA    ,RX9
    ENDIF
    IF    VAR1==9
    BSF    RCSTA    ,RX9
    ENDIF
    ENDIF
    ENDM
;//////////////////////////////PRİNTF///////////////////
;asenkron veri gönderme
PRINTF    MACRO    ?0
    MOVFF    ?0,TXREG
    BSF    STATUS    ,RP0
    BTFSS        TXSTA        ,TRMT        ; gönderimin bitmesi ile kalkan bayrak
    GOTO    $-1
    BCF    STATUS    ,RP0
    

    ENDM
uart kısmı şu an sadece 8 mhz için ayarlandı ifdef bloğu ile diğer frekanslara da uyarlanacak ayrı bir seri iletişim makro dosyasında hepsi toparlanacak şalışma mantığı açısından fikir verebilir.standart dışı olarak 230400 baud hızı eklendi hatasız çalıştı ,ayrıca alma için bir makro yapmadım o biraz daha karışık ama gelecek
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 16 Nisan 2023, 04:31:56
ADXL345 için hazırlanmış 4 kablolu SPI haberleşmesini ayarlayan ve sensörü sürekli ölçüm modunda 10bit, 2g , 100hz de işarette büyüklük ile (eksi ve artı değerleri veren)ayarlayan ve 3  eksen data çıkışını veren iki adet makro
NOT: ana programda define ile CSN bacağı tanımlanmalı.örn= #DEFINE    CSN    PORTC,6
;//////////////////////ADXL345//////// STANDART AYARLAR///////////////////////////
;////////////////////////////////////////////////////////////////////////////////////////////
;
ADXL_BEGIN    MACRO          ;    CSN PORT VE BACAK SEÇİMİ

        BANKSEL    TRISA
    ;    MOVLW    0X10
    ;    IORWF        TRISB    ,F
        BSF        TRISB    ,4
        BCF        TRISB    ,6    
        BCF        TRISC    ,7
        BCF        TRISC    ,6
        
        MOVLW    0XC0
        MOVWF    SSPSTAT
        BANKSEL    SSPCON
        MOVLW    0X30
        MOVWF    SSPCON
        
        BSF        CSN
        CALL        ADXL_PAUS1
        BCF        CSN    
        MOVLW    0XFF
        MOVWF    SSPBUF
        CALL        ADXL_SEND
        CALL        ADXL_PAUS100
        BSF        CSN
        CALL        ADXL_PAUS1
        BCF        CSN
        MOVLW    0X27
        MOVWF    SSPBUF
        CALL        ADXL_SEND
        MOVLW    0X00
        MOVWF    SSPBUF
        CALL        ADXL_SEND
        BSF        CSN            ;100 HZ DATA ÇIKIŞ HIZI
        CALL        ADXL_PAUS1        ;DOKUNMA SENSÖRÜ İPTAL
        BCF        CSN
        MOVLW    0X2D
        MOVWF    SSPBUF            ;SÜREKLİ ÖLÇÜM MODU
        CALL        ADXL_SEND
        MOVLW    0X08
        MOVWF    SSPBUF
        CALL        ADXL_SEND
        BSF        CSN
        CALL        ADXL_PAUS1
        BCF        CSN
        MOVLW    0X31                ;2G ÖLÇÜM. / SAĞA YASLI 10 BİT ÇÖZÜNÜRLÜK/4 KABLO SPİ MODU
        MOVWF    SSPBUF
        CALL        ADXL_SEND
        MOVLW    0X00
        MOVWF    SSPBUF
        CALL        ADXL_SEND
        BSF        CSN
        CALL        ADXL_PAUS100
        GOTO        ADXL_EXT    
ADXL_PAUS100:        
              movlw          .186
                movwf          R0
                movlw          .4
                movwf          R1
                movlw          .2
                movwf          R2
                decfsz          R0,F
                goto            $-1
                decfsz          R1,F
                goto            $-3
                decfsz          R2,F
                goto            $-5
        RETURN
ADXL_PAUS1:    

                movlw      .6
                movwf      R0
                decfsz      R0,F
                goto        $-1
                nop
        RETURN
ADXL_SEND:
        BTFSS      PIR1 ,SSPIF
            GOTO        $-1  
            BCF            PIR1  ,SSPIF
            RETURN
ADXL_EXT:
        ENDM    
;******************************************************************************************
;//////////////////ADXL OKUMA///////////////////////////////////////////////////////
;/////////////////ADXL_READ        X,Y,Z    
ADXL_READ MACRO    ?0,?1,?2
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        BSF        CSN
        CALL        ADXL_PAUS1
        BCF        CSN
        MOVLW    0XB2
        MOVWF    SSPBUF
        CALL        ADXL_SEND
        MOVLW    0X88
        MOVWF    SSPBUF
        CALL        ADXL_SEND
        MOVF        SSPBUF    ,W
        MOVWF    ?0                    ;X
        BSF        CSN
        CALL        ADXL_PAUS1
        BCF        CSN
        MOVLW    0XB3
        MOVWF    SSPBUF
        CALL        ADXL_SEND
        MOVLW    0X88
        MOVWF    SSPBUF
        CALL        ADXL_SEND
        MOVF        SSPBUF    ,W
        MOVWF    ?0+1                ;X+1
;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY    
        BSF        CSN
        CALL        ADXL_PAUS1
        BCF        CSN
        MOVLW    0XB4
        MOVWF    SSPBUF
        CALL        ADXL_SEND
        MOVLW    0X88                ;DUMMY        
        MOVWF    SSPBUF
        CALL        ADXL_SEND
        MOVF        SSPBUF    ,W
        MOVWF    ?1                    ;Y
        BSF        CSN
        CALL        ADXL_PAUS1
        BCF        CSN
        MOVLW    0XB5
        MOVWF    SSPBUF
        CALL        ADXL_SEND
        MOVLW    0X88
        MOVWF    SSPBUF
        CALL        ADXL_SEND
        MOVF        SSPBUF    ,W
        MOVWF    ?1+1                ;Y+1
;ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ    
        BSF        CSN
        CALL        ADXL_PAUS1
        BCF        CSN
        MOVLW    0XB6
        MOVWF    SSPBUF
        CALL        ADXL_SEND
        MOVLW    0X88
        MOVWF    SSPBUF
        CALL        ADXL_SEND
        MOVF        SSPBUF    ,W
        MOVWF    ?2                    ;Z
        BSF        CSN
        CALL        ADXL_PAUS1
        BCF        CSN
        MOVLW    0XB7
        MOVWF    SSPBUF
        CALL        ADXL_SEND
        MOVLW    0X88
        MOVWF    SSPBUF
        CALL        ADXL_SEND
        MOVF        SSPBUF    ,W
        MOVWF    ?2+1                ;Z+1
        BSF        CSN
        CALL        ADXL_PAUS100
        ENDM
kullanımı=
#include    SENSORS.INC
#DEFINE    CSN    PORTC,6
    ADXL_BEGIN
start:
   
    ADXL_READ X,Y,Z
goto start
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 19 Ekim 2023, 21:37:49
S
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 19 Ekim 2023, 21:43:42
Uart haberleşme ve ayar makrolarıdır şu an için sadece osc 8 mhz ayarları mevcut.Ascii gönderme için farklı bir makro da yazdım ascii ile standart gönderme arasındaki farkı da görebilirsiniz basitçe
;///////////////////////////////////////////////////////////////////////////////
;///////////////////////UART_SET/////////////////////////////////////////////
; UART_SET BAUD,9OR8,TERS-DÜZ
;    UART_SET 9600,8,0
UART_SET MACRO    VAR,VAR1,VAR2
        BANKSEL TXSTA  
        BCF    TRISB        ,7 ;tx
        BSF    TRISB        ,5    
        MOVLW  0X24               ; TXEN,BRGH
        MOVWF  TXSTA   
        IF    VAR2>0 
        BANKSEL    BAUDCTL
        MOVLW    0X18            ;İNVERTED
        MOVWF    BAUDCTL
        ELSE
        BANKSEL    BAUDCTL
        MOVLW    0X08
        MOVWF    BAUDCTL
      ;  CLRF    BAUDCTL            ;NONİNVERTED
        ENDIF         ;
        BANKSEL RCSTA           ;
        MOVLW 0X80            ;SPEN,CREN
        MOVWF RCSTA
        BANKSEL TRISA
        
        IFDEF    OSC_8
        IF VAR==9600
        MOVLW  .207              ;
        MOVWF  SPBRG
        BANKSEL    PORTA 
        ENDIF
        IF    VAR==10417
         MOVLW  .191           ;
        MOVWF  SPBRG
        BANKSEL    PORTA 
        ENDIF   
        IF    VAR==19200
         MOVLW  .103              ;
        MOVWF  SPBRG 
        BANKSEL    PORTA 
        ENDIF  
        IF    VAR==57600
         MOVLW  .34            ;
        MOVWF  SPBRG 
        BANKSEL    PORTA 
        ENDIF
        IF    VAR==115200
         MOVLW  .16           ;
        MOVWF  SPBRG 
        BANKSEL    PORTA                 
        ENDIF
        IF    VAR==230400
         MOVLW  .8         ;
        MOVWF  SPBRG  
        BANKSEL    PORTA               
        ENDIF
        IF    VAR1==8
        BCF    RCSTA    ,RX9
        ENDIF
        IF    VAR1==9
        BSF    RCSTA    ,RX9
        ENDIF
        ENDIF
        ENDM
;//////////////////////////////PRİNTF///////////////////UART HABERLEŞME SERİ GÖNDERME
PRINTF    MACRO    ?0
        BANKSEL    PORTA
        BTFSC    INTCON    ,GIE
        GOTO    $+2
        GOTO    $+3
        BCF        INTCON    ,7
        BSF        R9        ,0
    
        MOVF    ?0,W
        MOVWF    TXREG
        BSF        STATUS    ,RP0
        BTFSS    TXSTA    ,TRMT
        GOTO    $-1
        BCF        STATUS    ,RP0
    
        MOVF    ?0+1,W
        MOVWF    TXREG
        BSF        STATUS    ,RP0
        BTFSS    TXSTA    ,TRMT
        GOTO    $-1
        BCF        STATUS    ,RP0
        
                
        MOVLW    .13
        MOVWF    TXREG
        BSF        STATUS    ,RP0
        BTFSS    TXSTA    ,TRMT
        GOTO    $-1
        BCF        STATUS    ,RP0
        
        BTFSC    R9    ,0
        BSF        INTCON    ,7

        ENDM
;////////////////////////////ASCİİ  GÖNDERME//////////////////////////////
PRINTA    MACRO    ?0
            
        BANKSEL    PORTA
        BTFSC    INTCON    ,GIE
        GOTO    $+2
        GOTO    $+3
        BCF        INTCON    ,7
        BSF        R9        ,0
    
    
        MOVLW    ?0
        MOVWF    TXREG
        BSF        STATUS    ,RP0
        BTFSS    TXSTA    ,TRMT
        GOTO    $-1
        BCF        STATUS    ,RP0            
        BTFSC    R9    ,0
        BSF        INTCON    ,7
ENDM    


(https://i.ibb.co/31sYyF1/Ads-z.png) (https://ibb.co/31sYyF1)
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 21 Ocak 2024, 15:31:38
Alıntı yapılan: alisumer - 13 Nisan 2023, 23:07:40FOR NEXT ve TOGGLE makrosu daha işlevsel hale getirildi.makro içerisinde goto lable komutu ana programda birden fazla  çalıştırıldığında çakışmaya neden olduğundan dallanmalar PCL üzerinden tekrar düzenlendi
TOGGLE    MACRO    PORT?,?0
        MOVLW    0X01<<?0
        XORWF    PORT?    ,F
           ENDM
;////////////////////////////////FOR-NEXT DÖNGÜSÜ///////////////////////////////
;KULLANIMI    "FOR 0,255"        ; 255 TAKRAR YAPARAK FOR NEXT ARASINDAKİ KODU ÇALIŞTIRIR
;            KODLAR
;            ......
;            NEXT
;*******************************************************************************
FOR    MACRO    R0,R2
        MOVLW    R2     
        MOVWF    R4
        MOVLW    R0    
        SUBWF    R4        ,F
        MOVF        PCL    ,W
        MOVWF    R9
        ENDM        
NEXT    MACRO        
        MOVF        R9    ,W
        DECFSZ    R4    ,F
        MOVWF    PCL
        ENDM    
çalışma mantığı ile ilgili video ETE hocamın affına sığınarak
düzeltme goto lable komutu aslında olabiliyormuş yöntemi ise makro içerisinde lokal kalmasını yani genel programa etki etmesini istemediğimiz değişken veya lable leri "local lable,var..." şeklinde yazdığımızda makroda kullandığımız değişkenler ve lable adresleri ana programda değişikliğe neden olmaz makrodan çıkıldıktan sonra aynı makroyu tekrar çalıştırdığımızda farklı PC numarası alır yani çakışma olmaz biraz karışık anlattım sanırım örnek vereyim
;////////////////////////////////FOR-NEXT DÖNGÜSÜ///////////////////////////////
;KULLANIMI    "FOR 0,255"        ; 255 TAKRAR YAPARAK FOR NEXT ARASINDAKİ KODU ÇALIŞTIRIR
;            KODLAR
;            ......
;            NEXT
;*******************************************************************************
FOR    MACRO    ?0,?1  ;R10,R11
    LOCAL for1
        MOVLW    ?1 ;R11     
        MOVWF    R12
        MOVLW    ?0 ;R10    
        SUBWF    R12 ,F
        ;MOVF    PCL    ,W
        ;MOVWF    R13
for1:
        ENDM        
NEXT    MACRO          
        MOVF    R13 ,W
        DECFSZ  R12    
        goto for1;MOVWF   PCL 
 
        ENDM
makroda ilk hali ve ikinci hali aynı anda var yorum yaptım sadece kod birkaç komut kısaldı daha iyi oldu.makro içindeki değişkenleri de ? şeklinde yapıp gereksiz atama derdinden kurtulduk ordanda iki üç kazanç var
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 21 Ocak 2024, 15:50:52
şimdi ise daha önce yazdığım tüm matematik kütüphanelerini bir kenara brakıp yeni bir makro yazdım sebebi ise tüm işlemlerin farklı değişkenlerde tutulma zorunluluğuydu(beceremediğimden tabi:) ) çok yer tutuyor fakat çok hızlı işlem yapıyorlardı bunun yerine http://www.piclist.com/tecHREF/microchip/index.htm (http://www.piclist.com/tecHREF/microchip/index.htm) sitesinde yazılı hazır kütüphanelerin iş görürlerini makroma adapte ettim böylelikle tüm işlemler için farklı değişkenler tanımlamak zorunluluğum kalktı kodlar biraz yavaşladı ama sorunsuz çalıştılar ne de olsa yazanlar asm nin kralları sayılır.bu deneme programı
	__CONFIG 	0x30E4
	radix	dec
   	LIST P = PIC16f690  
   	INCLUDE "p16f690.inc"
;   	INCLUDE "EPROM.INC"	
   	INCLUDE "MATH.INC"
;    INCLUDE "fload.inc"

   	RADIX	DEC
    extern  REGA0,REGB0,REGC0,subtract,add,multiply,divide,clrba,sqrt,DCOUNT,DCOUNT
;
	;	GLOBAL	MAPS
;	EXTERN FLO1624,INT2416,FPM24,FLO2424;R0,R1,R2,R3,R4,DIZ0,DIZ1,R6,R7,R8,R9,R10,R11,R12,R13,R14,R15,R16,R17,D0,D1,D2,D3,DS,DR,M0,M1,M2,MS,IF0,IF1,F0,F1,DIV32L

;		ENDC
VAR UDATA 0X20
X   RES 4  
Y   RES 4
ZB  RES 4 
DIG RES 10
_TMP0   EQU 0X70
_TMP1   EQU 0X71
_TMP2   EQU 0X72
		ORG	0X00
		GOTO	AYAR
		ORG	0X04
AYAR:
PAKET32 301 ,X
PAKET32 302  ,Y
BASLA:
;   TOPLA32   X,Y,ZB;
;   DIV32  X,Y,ZB
;   KAREKOK X,ZB
;   MULL32 X,Y,ZB
;   BCD  X,DIG
;   DIV32 ZB,Y,ZB
EGER    X,"Z",Y
    GOTO $+2
HESAP:
		GOTO BASLA
    GOTO BASLA

        END 
        

yorum larını kaldırırsanız tek tek deneme imkanınız olur
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 21 Ocak 2024, 15:51:46
bbu makro kodları (math.inc)
;//////////////// RAM ADRESİNDEN RAM ADRESİNE VERİ TRANSFERİ TAŞIMA ////////////////
;1 BYTE KULLANIMI= MOVFF A,B 
;2 BYTE KULLANIMI= MIVFF16 A,B
;4 BYTE KULLANIMI= MIVFF32 A,B
;MOVFFL MAKROSU FARKLI BANKLARDA BULUNAN REGİSTERLER ARASINDA TAŞIMA YAPAR
MOVFF MACRO ?0,?1									 	
	MOVF	?0	,W
	MOVWF	?1
	ENDM
MOVFF16 MACRO ?0,?1
	MOVF	?0	,W
	MOVWF	?1
	MOVF	(?0+1) ,W
	MOVWF	?1+1
	ENDM
MOVFF32 MACRO ?0,?1
	MOVF	?0	,W
	MOVWF	?1
	MOVF	?0+1 ,W
	MOVWF	?1+1
	MOVF	?0+2 ,W
	MOVWF	?1+2
	MOVF	?0+3 ,W
	MOVWF	?1+3
	ENDM 
MOVFFL MACRO ?0,?1
    BANKSEL ?0
    MOVF    ?0  ,W
    BANKSEL ?1
    MOVWF   ?1
    BANKSEL ?0
    ENDM
MOVFF16L MACRO ?0,?1
    BANKSEL ?0
    MOVF    ?0  ,W
    BANKSEL ?1
    MOVWF   ?1
    BANKSEL ?0
    MOVF    ?0+1 ,W
    BANKSEL ?1
    MOVWF   ?1+1
    BANKSEL ?0
    ENDM
MOVFF32L MACRO ?0,?1
    BANKSEL ?0
    MOVF    ?0  ,W
    BANKSEL ?1
    MOVWF   ?1
    BANKSEL ?0
    MOVF    ?0+1 ,W             ;26 KOMUT
    BANKSEL ?1
    MOVWF   ?1+1
    BANKSEL ?0
    MOVF    ?0+2    ,W
    BANKSEL ?1
    MOVWF   ?1+2
    BANKSEL ?0
    MOVF    ?0+3    ,W
    BANKSEL ?1	
    MOVWF   ?1+3
    BANKSEL ?0
    ENDM

 ;///////////////////////////32 BİT İARETLİ SABİT YAZMA//////////////////
;ÖRNEK= PAKET32 12345678,Out0 ; PAKET32 -12345678,Out0 yazıldığında da negatif değeri yazabilir adreslere
;RADIX DEC YAPILMALI DESİMAL SAYILAR İÇİN
;///////////////////////////////////////////////////////////////////////////////////////////////
PAKET32 MACRO Var, Address ;Address meblab ide için Cblock yada udata kullanıldığında ram başlangıç adresidir(otm)
	BANKSEL Address 
	movlw 		Address ;
	movwf 		FSR					;fsr ye adresi yükler
	movlw 		Var & H'FF'			;;en değersiz byte filtrelenip yazılır
	movwf 		INDF				;fsr nin işaretlediği adrese değeri yazar
	movlw 		Var >>8 & H'FF'		;; Var 8 bit kaydırılır filtrelenip fsr 1 arttırılır(bir sonraki ram bölgesi yazılır)
	incf 		FSR,F
	movwf 		INDF
	movlw 		Var >>16 & H'FF'
	incf 		FSR,F
	movwf 		INDF 
	movlw 		Var >>24 & H'FF'
	incf 		FSR,F 
	movwf 		INDF 
	ENDM  
;////////////////////16 BİT PAKET DEĞİŞKENLERE YAZILMASI///////////////////////////////////////////////
PAKET16	MACRO	VAR,ADDRESS
	BANKSEL 	ADDRESS 
	movlw 		ADDRESS ;
	movwf	 	FSR					;fsr ye adresi yükler
	movlw		VAR & H'FF'			;;en değersiz byte filtrelenip yazılır
	movwf 		INDF				;fsr nin işaretlediği adrese değeri yazar
	movlw		VAR >>8 & H'FF'		;; Var 8 bit kaydırılır filtrelenip fsr 1 arttırılır(bir sonraki ram bölgesi yazılır)
	incf 		FSR,F
	movwf 		INDF
	ENDM
;/////////////////////////////////MATEMATİK İŞLEMLERİ (4 İŞLEM)///////////////////////////////////
;//////////////////////////////KULLANIMI İÇİN MATH.ASM TANITILMALI////////////////////////////////
;///////////////KULLANIMI TOPLA A,B,C ŞEKLİNDE A İLE B TOPLANIR C YE YAZILIR//////////////////////
;BÖLME İŞLEMİNDE KALAN HATILATICI OLARAK KULLANILAN REGC DE TUTULUT SONUÇ İSE GENE A/B=C ŞEKLİNDEDİR
;//////32BİT İŞARETLİ TOPLAMA////	
TOPLA32 MACRO ?0,?1,?2
MOVFF32 ?0,REGA0
MOVFF32 ?1,REGB0
CALL    add
MOVFF32 REGA0,?2
;CALL    clrba
    ENDM
;//////32BİT ÇARPMA İŞARETLİ/////
MULL32 MACRO ?0,?1,?2
MOVFF32 ?0,REGA0
MOVFF32 ?1,REGB0
CALL   multiply
MOVFF32 REGA0,?2
ENDM
;///////32BİT İŞARETLİ BÖLME////
DIV32 MACRO ?0,?1,?2
MOVFF32 ?0,REGA0
MOVFF32 ?1,REGB0
    CALL    divide
MOVFF32 REGA0,?2
    ENDM
;///////KAREKÖK alma/////////
KAREKOK MACRO ?0,?2
MOVFF32 ?0,REGA0
    CALL    sqrt
MOVFF32 REGA0,?2
ENDM	
;////////BCD ÇEVİRİCİ/////////////
BCD MACRO ?0,?1
MOVFF32 ?0,REGA0
CALL bin2dec
ENDM
;////////////////////////////////////////////////////////////////////////////
;//////////////////////////////////////////////////////////////////////////////
;///////////////////////////BİR BİTİ TERSLER/////////////////////////////
;ÖRNEK= TOGGLE	PORTA,5
;/////////////////////////////////////////////////////////////////////
TOGGLE	MACRO	PORT? ,?0
		MOVLW	0X01<<?0
		XORWF	PORT? ,F
           ENDM
;////////////////////////////////FOR-NEXT DÖNGÜSÜ///////////////////////////////
;KULLANIMI	"FOR 0,255"		; 255 TAKRAR YAPARAK FOR NEXT ARASINDAKİ KODU ÇALIŞTIRIR
;			KODLAR
;			......
;			NEXT
;*******************************************************************************
FOR	MACRO	?0,?1  ;R10,R11
    local for1
		MOVLW	?1 ;R11 	
		MOVWF	R12
		MOVLW	?0 ;R10	
		SUBWF	R12 ,F
		;MOVF	PCL	,W
		;MOVWF	R13
for1:
		ENDM		
NEXT	MACRO		  
		MOVF	R13 ,W
		DECFSZ  R12	
	    goto for1;MOVWF   PCL 
 
		ENDM
;//////////////////////////////IF-THEN KOŞULLARI////////////////////////////////////
;KULLANIMI (EGER A,"<",B) KOMUT KARŞILIĞINDA KOŞUL DOĞRU İSE İKİ ALT SATIRA YANLIŞSA BİR ALT SATIRA GİDER
;          (EGER A,"Z",B) A KÜÇÜK EŞİTSE ( Z İŞARETİ KÜÇÜK EŞİT İŞARETİNE EN ÇOK BENZEDİĞİ İÇİN SEÇİLDİ)
;          (EGER A,"=",B) A VE B EŞİTSE
;///////////////////DEĞER KIYASLAMASI//////////////////////////////////
;KULLANIMI= KARŞILAŞTIRILACAK HER BİR "WORD" DEĞERİ ARDIŞIK RAM BÖLGELERİNDE TUTULMALI 
;R15 VE R16 DEĞERLERİNİ ASCII DEĞERLER OLARAK İLGİLİ İŞARETLER OLARAK SEÇTİM 
;MAKRODA "=" SENBOLÜ KABUL EDİLMEDİĞİ İÇİN DEC KARŞILIĞI YAZILDI
;AMA ANA PROGRAMDA KULLANILABİLİR OLDU
;BOŞ BIRAKILAN SEMBOL YERİNE ASCII BOŞLUK BIRAKILMALI
;R6 ADRESİNİN İLK BİTİ TRUE/FALSE DÖNDÜRÜR 
;MAKRO ÇIKIŞI "R4" , 0 BİTİ KONTROL EDİLEREK İŞLEM YAPILIR
;" > " YADA "?" İŞARETİ İÇİN AYRI BİR İŞLEME GEREK YOK MEVCUT İŞLEMLERİN TERSİ OLDUĞUNDAN SADECE DEĞİŞKEN YERİ DEĞİŞECEK	
EGER	MACRO	?0,?2,?1;,?2
		BCF		STATUS	,C
		BCF		STATUS	,Z
;		MOVF	?0		,W
;		MOVWF	R15         ;R0
;		MOVF	?0+1	,W
;		MOVWF	R15+1       ;R0+1	
;		MOVF	?1		,W
;		MOVWF	R16         ;R3	
;		MOVF	?1+1	,W
;		MOVWF	R16+1       ;R3+1

		IF	?2=="<"							;????????
		MOVF		?0+1   ,W  ;R0+1		,W			;IF Y <= ART THEN GOTO KAPA
		SUBWF		?1+1   ,W  ;R3+1	,W			;
		BTFSS		STATUS	,C			;
		GOTO		$+6	
		BTFSS       STATUS  ,Z
		GOTO        $+5				
		MOVF		?0     ,W  ;R0			,W								
		SUBWF		?1     ,W  ;R3			,W
		BTFSS		STATUS	,C

		ELSE
;		IF   R1 == "<" && R2 == .32
		IF	?2=="Z" 
		MOVF		?0+1	,W			;IF Y < ART THEN 
		SUBWF		?1+1	,W			;
		BTFSS		STATUS	,C			;
		GOTO		$+8				
		BTFSS		STATUS	,Z
		GOTO		$+7				
		MOVF		?0		,W								
		SUBWF		?1		,W
		BTFSC		STATUS	,Z
		GOTO		$+3
		BTFSS		STATUS	,C
		ELSE

		IF	?2=="="
;		IF	R1 == .61 && R2 == .32
		MOVF		?0+1	,W
		XORWF		?1+1	,W
		BTFSS		STATUS	,Z
		GOTO		$+5
		MOVF		?0		,W
		XORWF		?1		,W
		BTFSC		STATUS	,Z
		GOTO 		$+2
		ENDIF
		ENDIF
		ENDIF
		ENDM 
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 21 Ocak 2024, 15:54:23
buda kütüphane dosyası (sub.asm) math.asm
       INCLUDE "p16f690.inc"
INCLUDE "MATH.INC"
UDATA 0X56
REGA0   RES 1                ;lsb
REGA1   RES 1 
REGA2   RES 1
REGA3    RES 1            ;msb
REGB0    RES 1            ;lsb
REGB1   RES 1
REGB2   RES 1
REGB3    RES 1                ;msb
REGC0    RES 1            ;lsb
REGC1   RES 1
REGC2   RES 1
REGC3    RES 1            ;msb
DSIGN    RES 1            ;Digit Sign. 0=positive,1=negative
;DIGIT1    RES 1            ;MSD
;DIGIT2  RES 1
;DIGIT3  RES 1
;DIGIT4  RES 1
;DIGIT5    RES 1                ;Decimal (BCD) digits
;DIGIT6  RES 1
;DIGIT7  RES 1
;DIGIT8  RES 1
;DIGIT9  RES 1
;DIGIT10    RES 1            ;LSD
MTEMP   RES 1
MCOUNT  RES 1
DCOUNT  RES 1

;*** 32 BIT SIGNED SUTRACT ***
;REGA - REGB -> REGA
;Return carry set if overflow
    GLOBAL REGA0,REGB0,REGC0,subtract,add,multiply,divide,clrba,sqrt,DCOUNT,DCOUNT 
CODE
subtract:
    call    negateb        ;Negate REGB
    skpnc
    return            ;Overflow

;*** 32 BIT SIGNED ADD ***
;REGA + REGB -> REGA
;Return carry set if overflow

add:
    movf    REGA3,w        ;Compare signs
    xorwf    REGB3,w
    movwf    MTEMP

    call    addba        ;Add REGB to REGA

    clrc            ;Check signs
    movf    REGB3,w        ;If signs are same
    xorwf    REGA3,w        ;so must result sign
    btfss    MTEMP,7        ;else overflow
    addlw    0x80
    return
;*** 32 BIT SIGNED MULTIPLY ***
;REGA * REGB -> REGA
;Return carry set if overflow
multiply:
    clrf    MTEMP        ;Reset sign flag
    call    absa        ;Make REGA positive
    skpc
    call    absb        ;Make REGB positive
    skpnc
    return                ;Overflow

    call    movac        ;Move REGA to REGC
    call    clra        ;Clear product

    movlw    D'31'        ;Loop counter
    movwf    MCOUNT

muloop:    
    call    slac        ;Shift left product and multiplicand
    
    rlf    REGC3,w            ;Test MSB of multiplicand
    skpnc                ;If multiplicand bit is a 1 then
    call    addba        ;add multiplier to product

    skpc                ;Check for overflow
    rlf    REGA3,w
    skpnc
    return

    decfsz    MCOUNT,f    ;Next
    goto    muloop

    btfsc    MTEMP,0        ;Check result sign
    call    negatea        ;Negative
    return


;*** 32 BIT SIGNED DIVIDE ***
;REGA / REGB -> REGA
;Remainder in REGC
;Return carry set if overflow or division by zero

divide:
    clrf    MTEMP        ;Reset sign flag
    movf    REGB0,w        ;Trap division by zero
    iorwf    REGB1,w
    iorwf    REGB2,w
    iorwf    REGB3,w
    sublw    0
    skpc
    call    absa        ;Make dividend (REGA) positive
    skpc
    call    absb        ;Make divisor (REGB) positive
    skpnc
    return                ;Overflow

    clrf    REGC0        ;Clear remainder
    clrf    REGC1
    clrf    REGC2
    clrf    REGC3
    call    slac        ;Purge sign bit

    movlw    D'31'        ;Loop counter
    movwf    MCOUNT

dvloop:
    call    slac        ;Shift dividend (REGA) msb into remainder (REGC)

    movf    REGB3,w        ;Test if remainder (REGC) >= divisor (REGB)
    subwf    REGC3,w
    skpz
    goto    dtstgt
    movf    REGB2,w
    subwf    REGC2,w
    skpz
    goto    dtstgt
    movf    REGB1,w
    subwf    REGC1,w
    skpz
    goto    dtstgt
    movf    REGB0,w
    subwf    REGC0,w
dtstgt:
    skpc                ;Carry set if remainder >= divisor
    goto    dremlt

    movf    REGB0,w        ;Subtract divisor (REGB) from remainder (REGC)
    subwf    REGC0,f
    movf    REGB1,w
    skpc
    incfsz    REGB1,w
    subwf    REGC1,f
    movf    REGB2,w
    skpc
    incfsz    REGB2,w
    subwf    REGC2,f
    movf    REGB3,w
    skpc
    incfsz    REGB3,w
    subwf    REGC3,f
    clrc
    bsf    REGA0,0        ;Set quotient bit

dremlt:
    decfsz    MCOUNT,f    ;Next
    goto    dvloop

    btfsc    MTEMP,0        ;Check result sign
    call    negatea        ;Negative
    return

;*** ROUND RESULT OF DIVISION TO NEAREST INTEGER ***

round:
    clrf    MTEMP        ;Reset sign flag
    call    absa        ;Make positive
    clrc
    call    slc        ;Multiply remainder by 2
    movf    REGB3,w        ;Test if remainder (REGC) >= divisor (REGB)
    subwf    REGC3,w
    skpz
    goto    rtstgt
    movf    REGB2,w
    subwf    REGC2,w
    skpz
    goto    dtstgt
    movf    REGB1,w
    subwf    REGC1,w
    skpz
    goto    rtstgt
    movf    REGB0,w
    subwf    REGC0,w
rtstgt:
    skpc            ;Carry set if remainder >= divisor
    goto    rremlt
    incfsz    REGA0,f        ;Add 1 to quotient
    goto    rremlt
    incfsz    REGA1,f
    goto    rremlt
    incfsz    REGA2,f
    goto    rremlt
    incf    REGA3,f
    skpnz
    return            ;Overflow,return carry set
rremlt:
    btfsc    MTEMP,0        ;Restore sign
    call    negatea
    return


;*** 32 BIT SQUARE ROOT ***
;sqrt(REGA) -> REGA
;Return carry set if negative

sqrt:
    rlf    REGA3,w        ;Trap negative values
    skpnc
    return

    call    movac        ;Move REGA to REGC
    call    clrba        ;Clear remainder (REGB) and root (REGA)

    movlw    D'16'        ;Loop counter
    movwf    MCOUNT

sqloop:
    rlf    REGC0,f        ;Shift two msb's
    rlf    REGC1,f        ;into remainder
    rlf    REGC2,f
    rlf    REGC3,f
    rlf    REGB0,f
    rlf    REGB1,f
    rlf    REGB2,f
    rlf    REGC0,f
    rlf    REGC1,f
    rlf    REGC2,f
    rlf    REGC3,f
    rlf    REGB0,f
    rlf    REGB1,f
    rlf    REGB2,f

    setc            ;Add 1 to root
    rlf    REGA0,f        ;Align root
    rlf    REGA1,f
    rlf    REGA2,f

    movf    REGA2,w        ;Test if remdr (REGB) >= root (REGA)
    subwf    REGB2,w
    skpz
    goto    ststgt
    movf    REGA1,w
    subwf    REGB1,w
    skpz
    goto    ststgt
    movf    REGA0,w
    subwf    REGB0,w
ststgt:
    skpc            ;Carry set if remdr >= root
    goto    sremlt

    movf    REGA0,w        ;Subtract root (REGA) from remdr (REGB)
    subwf    REGB0,f
    movf    REGA1,w
    skpc
    incfsz    REGA1,w
    subwf    REGB1,f
    movf    REGA2,w
    skpc
    incfsz    REGA2,w
    subwf    REGB2,f
    bsf    REGA0,1        ;Set current root bit

sremlt:
    bcf    REGA0,0        ;Clear test bit
    decfsz    MCOUNT,f    ;Next
    goto    sqloop

    clrc
    rrf    REGA2,f        ;Adjust root alignment
    rrf    REGA1,f
    rrf    REGA0,f
    return


;*** 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
;    return
;
;
;;*** 32 BIT SIGNED DECIMAL TO BINARY ***
;;Decimal DIGIT1 thro DIGIT(X) & DSIGN -> REGA
;;Set DSIGN = 0 for positive, DSIGN = 1 for negative values
;;Most significant digit in DIGIT1
;;Enter this routine with digit count in w register
;;Return carry set if overflow
;;Uses FSR register
;
;dec2bin:    
;    movwf    MTEMP        ;Save digit count
;    movlw    D'32'        ;Outer bit loop counter
;    movwf    MCOUNT
;
;d2blp1:    
;    movlw    DIGIT1-1    ;Set up pointer to MSD
;    movwf    FSR
;    movf    MTEMP,w        ;Inner digit loop counter
;    movwf    DCOUNT
;
;    movlw    D'10'
;    clrc            ;Bring in '0' bit into MSD
;
;d2blp2:    
;    incf    FSR,f
;    skpnc
;    addwf    INDF,f        ;Add 10 if '1' bit from prev digit
;    rrf    INDF,f        ;Shift out LSB of digit
;
;    decfsz    DCOUNT,f    ;Next L.S. Digit
;    goto    d2blp2
;
;    rrf    REGA3,f        ;Shift in carry from digits
;    rrf    REGA2,f
;    rrf    REGA1,f
;    rrf    REGA0,f
;
;    decfsz    MCOUNT,f    ;Next bit
;    goto    d2blp1
;
;    movf    INDF,w        ;Check for overflow
;    addlw    0xFF
;    skpc
;    rlf    REGA3,w
;    skpnc
;    return
;
;    btfsc    DSIGN,0        ;Check result sign
;    call    negatea        ;Negative
;    return
;
;
;UTILITY ROUTINES


;Add REGB to REGA (Unsigned)
;Used by add, multiply,

addba:    
    movf    REGB0,w        ;Add lo byte
    addwf    REGA0,f

    movf    REGB1,w        ;Add mid-lo byte
    skpnc            ;No carry_in, so just add
    incfsz    REGB1,w        ;Add carry_in to REGB
    addwf    REGA1,f        ;Add and propagate carry_out

    movf    REGB2,w        ;Add mid-hi byte
    skpnc
    incfsz    REGB2,w
    addwf    REGA2,f

    movf    REGB3,w        ;Add hi byte
    skpnc
    incfsz    REGB3,w
    addwf    REGA3,f
    return


;Move REGA to REGC
;Used by multiply, sqrt

movac:    
    movf    REGA0,w
    movwf    REGC0
    movf    REGA1,w
    movwf    REGC1
    movf    REGA2,w
    movwf    REGC2
    movf    REGA3,w
    movwf    REGC3
    return


;Clear REGB and REGA
;Used by sqrt

clrba:    
    clrf    REGB0
    clrf    REGB1
    clrf    REGB2
    clrf    REGB3

;Clear REGA
;Used by multiply, sqrt

clra:    
    clrf    REGA0
    clrf    REGA1
    clrf    REGA2
    clrf    REGA3
    return


;Check sign of REGA and convert negative to positive
;Used by multiply, divide, bin2dec, round

absa:    
    rlf    REGA3,w
    skpc
    return            ;Positive

;Negate REGA
;Used by absa, multiply, divide, bin2dec, dec2bin, round

negatea:    
    movf    REGA3,w        ;Save sign in w
    andlw    0x80

    comf    REGA0,f        ;2's complement
    comf    REGA1,f
    comf    REGA2,f
    comf    REGA3,f
    incfsz    REGA0,f
    goto    nega1
    incfsz    REGA1,f
    goto    nega1
    incfsz    REGA2,f
    goto    nega1
    incf    REGA3,f
nega1:
    incf    MTEMP,f        ;flip sign flag
    addwf    REGA3,w        ;Return carry set if -2147483648
    return


;Check sign of REGB and convert negative to positive
;Used by multiply, divide

absb:    
    rlf    REGB3,w
    skpc
    return            ;Positive

;Negate REGB
;Used by absb, subtract, multiply, divide

negateb:    
    movf    REGB3,w        ;Save sign in w
    andlw    0x80

    comf    REGB0,f        ;2's complement
    comf    REGB1,f
    comf    REGB2,f
    comf    REGB3,f
    incfsz    REGB0,f
    goto    negb1
    incfsz    REGB1,f
    goto    negb1
    incfsz    REGB2,f
    goto    negb1
    incf    REGB3,f
negb1:
    incf    MTEMP,f        ;flip sign flag
    addwf    REGB3,w        ;Return carry set if -2147483648
    return


;Shift left REGA and REGC
;Used by multiply, divide, round

slac:    
    rlf    REGA0,f
    rlf    REGA1,f
    rlf    REGA2,f
    rlf    REGA3,f
slc:        
    rlf    REGC0,f
    rlf    REGC1,f
    rlf    REGC2,f
    rlf    REGC3,f
    return


;Set all digits to 0
;Used by bin2dec
;
;clrdig:    
;    clrf    DSIGN
;    clrf    DIGIT1
;    clrf    DIGIT2
;    clrf    DIGIT3
;    clrf    DIGIT4
;    clrf    DIGIT5
;    clrf    DIGIT6
;    clrf    DIGIT7
;    clrf    DIGIT8
;    clrf    DIGIT9
;    clrf    DIGIT10
;    return
    END
kütüphanedeki BCD işlemi için girilen kodları yorum yaptım kullanmadığımdan lazım olan açıp kullanabilir 10 basamak binary decimal dönüşümünü yapıyor.bcd için kullanılan değişkenleri Global satırına eklemeniz gerekiyor ana programda da external satırına ekleyiniz
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 22 Ocak 2024, 15:51:57
bir değişkenin ard arda değerlerinin bir başka byte uzunluğunu kendimizin belirlediği bir "dizi değişkene" kaydetmeye yarayan makrodur
kullanım amacı genellikle Adxl tarzı bir sensörden okunan ard arda verilerin sıralı adreslere sırası ile kaydedilmesine yarar .ortalama almak yada data loger yapmak için kullanılabilir.kullanımına Örnek:
CBLOCK;Yada UDATA
DIZI :10 ;10 Byte uzunluğunda değişken
endc
SAYAC EQU 0X73 ;Her banktan ulaşılabilir olması için sayaç değişkenleri 0x70 üstüne yazılıyor
......
clrf SAYAC
......
ADXL_OKU:
......
movwf A
DIZ A,DIZI,10
GOTO ADXL_OKU
GOTO OKUMA_TAMAM
makro kodu ise:
DIZ MACRO  ?0,?1,?2          ;?2 = kayıt sayısı
                            ;?1 = kayıt yapılan dizi değişkeni ilk adresi yada adı
        MOVLW  ?1          ;?0 = kaydedeceğimiz değişken
        ADDWF  SAYAC ,W 
        MOVWF  FSR
        MOVFF  ?0,INDF
        INCF    SAYAC ,F
        MOVF    SAYAC ,W
        XORLW  ?2  
        BTFSS  STATUS ,Z
        GOTO    $+3
        CLRF    SAYAC
        GOTO    $+2
        
        ENDM
        
belirttiğimiz sayı adedince kayıt yapılınca verdiğimiz komutun iki altına  eğer verdiğimiz sayı kadar kayıt yapılmamışsa bir alt satıra gider Aynı BTFSS gibi
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 22 Ocak 2024, 16:27:42
Aynı makronun değişkenimizin 16 bit olması halinde çalışan iki bytelik versiyonu
DIZ16 MACRO ?0,?1,?2
        MOVLW   ?1
        ADDWF   SAYAC   ,W
        MOVWF   FSR
        MOVFF   ?0,INDF
        INCF    FSR ,F
        MOVFF   ?0+1,INDF
        INCF    SAYAC
        INCF    SAYAC
        MOVF    SAYAC   ,W
        XORLW   ?2
        BTFSS   STATUS ,Z
        GOTO    $+3
        CLRF    SAYAC
        GOTO    $+2        
        ENDM 
kaç değer kaydedeceğimizi girdiğimiz değer doğal olarak yarı boyutta kayıt yapacaktır yani 10 tane 1 Byte değer yazarken artık 5 tane 2 byte değer sığdırabiliriz aynı adreslere doğal olarak önemli olan kayıt adedi ise DIZ16 komutunda sayı değerimiz de iki kat artmalı
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 23 Ocak 2024, 15:13:31
yeni makro dizi değişkendeki belli sayıda değerin en küçüğünü dizinin en başına taşır yer değiştirir. art arda çalıştırıldığında MEDIAN filtre( bir dizi değerin orta noktasını bulma) uygulamalarında iş görür.Örnek kodu:
    __CONFIG    0x30E4
    radix    dec
      LIST P = PIC16f690  
      INCLUDE "p16f690.inc"
;      INCLUDE "EPROM.INC"    
      INCLUDE "MATH.INC"
;    INCLUDE "fload.inc"
 
      RADIX    DEC
    extern  REGA0,REGB0,REGC0,subtract,add,multiply,divide,clrba,sqrt,DCOUNT,DCOUNT,subtract
;
    ;    GLOBAL    SAYAC
;    EXTERN FLO1624,INT2416,FPM24,FLO2424;R0,R1,R2,R3,R4,DIZ0,DIZ1,R6,R7,R8,R9,R10,R11,R12,R13,R14,R15,R16,R17,D0,D1,D2,D3,DS,DR,M0,M1,M2,MS,IF0,IF1,F0,F1,DIV32L
 
;        ENDC
VAR UDATA 0X20
X  RES 4  
Y  RES 4
ZB  RES 4 
DIG RES 20
_TMP0  EQU 0X70
_TMP1  EQU 0X71
_TMP2  EQU 0X72
SAYAC  EQU 0X73
RAM0    EQU 0X74
RAM1    EQU 0X75
RAM2    EQU 0X76
RAM3    EQU 0X77
RAM4    EQU 0X78
RAM5    EQU 0X79
RAM6    EQU 0X7A
RAM7    EQU 0X7B
        ORG    0X00
        GOTO    AYAR
        ORG    0X04
AYAR:
PAKET32 200 ,X
PAKET32 302  ,Y
SELF:
DECF    X  ,F
BASLA:
;  TOPLA32  X,Y,ZB;
;  DIV32  X,Y,ZB
;  KAREKOK X,ZB
;  MULL32 X,Y,ZB
;  BCD  X,DIG
;  DIV32 ZB,Y,ZB
;  EGER    X,"Z",Y
;  CIKAR32 X,Y,X
DIZ X,DIG,5    ;x in değerini her seferinde bir azaltarak sıra ile DIG in ilk 5 adresine yazar 
 
 
    GOTO SELF
    SIRALA DIG,5        ; ilk değeri diğer tüm değerler arasından en küçüğü ile değişir
    SIRALA DIG+1,4      ; ikinci değeri kalan değerler arasından en küçüğü ile değişir
    SIRALA DIG+2,3      ; öylece devam eder
    SIRALA DIG+3,2
 
HESAP:
    
 
        GOTO $
    GOTO BASLA
 
 
 
 
        END
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 23 Ocak 2024, 15:14:29
makro kodları:
SIRALA MACRO   ?0,?1       ; ?0 DİZİ DEĞİŞKENİ BAŞLANGIÇ ADRESİ
         LOCAL KAR,TARA,AYRIL,BITIR,SONRAKI
         MOVLW  1
         MOVWF  RAM4
         MOVLW ?0                   ; SIRALANACAK BYTE SAYISI  
         MOVWF  FSR 
         MOVLW   ?1-1  
         MOVWF  RAM3   
 TARA:   
         FORR 0,RAM3
         MOVFF  INDF,RAM0
         MOVFW  RAM4
         ADDWF  FSR ,F
         MOVFF  INDF,RAM1
         EGER RAM0,"<",RAM1
         CALL   KAR
         CALL   SONRAKI      
         NEXT
         GOTO   BITIR   
 KAR:   
        MOVFF RAM0,INDF 
        MOVFW   RAM4
        SUBWF   FSR ,F  
        MOVFF RAM1,INDF 
        RETURN
 SONRAKI:
        INCF    RAM4,F
        DECFSZ  RAM3,F
        RETURN   
  BITIR:       
        ENDM   
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 23 Ocak 2024, 15:17:07
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
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 04 Mayıs 2024, 15:56:27
;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.
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 04 Mayıs 2024, 16:24:41
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
(https://i.ibb.co/RGXF4bn/Ads-z.png) (https://ibb.co/RGXF4bn)
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.
                         

(https://i.ibb.co/MPb2D2L/Ads-z.png) (https://ibb.co/MPb2D2L)
Başlık: Ynt: ASM makro kullanımı ile ilgili bilgiler
Gönderen: alisumer - 04 Mayıs 2024, 16:46:42
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