ASM makro kullanımı ile ilgili bilgiler

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

alisumer

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.

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

alisumer

#1

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
Hep meraktan

Serk@n

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.
Bildiklerimize göre hareket edersek bilmediklerimizi de öğrenebiliriz.

alisumer

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 
Hep meraktan

alisumer

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

alisumer

#5
	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
Hep meraktan

alisumer

#6
;;****************************************************************
;* 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
Hep meraktan

alisumer

#7
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
Hep meraktan

alisumer

#8
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.
Hep meraktan

alisumer

#9
;/////////////////////////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
Hep meraktan

alisumer

#10
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.
Hep meraktan

alisumer

#11
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"
Hep meraktan

alisumer

#12
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
Hep meraktan

alisumer

#13
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 .
Hep meraktan

alisumer

#14
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.
Hep meraktan

Powered by EzPortal