Haberler:

Forum Yeni Kuruldu

Ana Menü

PIC asm kütüphanesi oluşturma

Başlatan alisummer, 19 12 2022, 16:08

« önceki - sonraki »

alisummer

Selamlar herkese ASM ile ilgili bir ders programı ve kütüphane geliştirme ile ilgili bir çalışma yapıyorum amaç ise;
1 = asm dilini ve mplab ide yi beraberce öğrenmek
2 = ASM dilinde de üst seviye diller gibi kolayca karmaşık fonksiyon çalıştırabilmek.
3 = asm kodlama esnasında oluşan kod kalabalığını üst seviye diller gibi kısaltmak ve daha anlaşılır olmasını sağlamak .
olarak sıralayabiliriz .bilindiği gibi aslında ASM kullanılan komut sayısı bakımından çok kolay (35-50 komut) fakat az sayıda komut ile çok sayıda işlem yaparken zorlayan bir dil.buna en basit Örnek çip içerisinde dahili olarak bölme yada çarpma komutunun işlenemiyor olması gösterilebilir . doğal olarak çarpma yapmak istediğimizde çarpan kadar çarpılanı sürekli toplamamız ve kaydırmamız gerekiyor bu da kafa karıştırıcı olabiliyor ve kod satırı olarak kalabalık bir görüntü ,anlaşılması güç döngüler anlamına geliyor.Üst seviye dillerde de durum aslında aynı  onlar sadece fonksiyonların hazır yazılı olduğu makrolar ve kütüphaneler oluşturmuşlar ve onları kullanıyorlar bizde aynı yöntemle ASM için makrolar ve kütüphaneler oluşturacağız.Böylelikle üst seviye dillerin kolaylığını yakalayıp hantallığından etkilenmeyeceğiz.derslerimiz videolar halinde olacak ayrıca yazılan makro ve kütüphaneleri dosya olarak paylaşacağım katkılarınız olursa birlikte geliştireceğiz. 
hep meraktan

alisummer

#1
MOVFF MACRO R3,R1
;R3 =BANK0--------R1 = BANK0
IF (R3) < 0X80 && (R1) < 0X80
BCF STATUS  ,RP0
BCF STATUS ,RP1
MOVF R3 ,W
MOVWF R1
ENDIF
;R3 =BANK0--------R1 = BANK1
IF    (R3) < 0x80 && (R1) > 0x7F && (R1) < 0X100
BCF STATUS ,RP0
BCF STATUS ,RP1
MOVF R3 ,W
BSF STATUS ,RP0
BCF STATUS ,RP1
MOVWF R1
BCF STATUS ,RP0
ENDIF
;R3 =BANK0--------R1 = BANK2
IF    (R3) < 0x80 && (R1) > 0XFF && (R1) < 0X180
BCF STATUS ,RP0
BCF STATUS ,RP1
MOVF R3 ,W
BSF STATUS ,RP1
MOVWF R1
BCF STATUS ,RP1
ENDIF
;R3 =BANK0--------R1 = BANK3
IF    (R3) < 0x80 && (R1) > 0X17F && (R1) <  0X1FF
BCF STATUS ,RP0
BCF STATUS ,RP1
MOVF R3 ,W
BSF STATUS ,RP0
BSF STATUS ,RP1
MOVWF R1
BCF STATUS ,RP0
BCF STATUS ,RP1
ENDIF
;///////////////////////////// r3= bank1/////////////
;R3 =BANK1--------R1 = BANK0
IF    (R3) > 0x7F && (R3)< 0x100 && (R1) < 0X80
BSF STATUS  ,RP0
BCF STATUS ,RP1
MOVF R3 ,W
BCF STATUS  ,RP0
MOVWF R1
ENDIF
;R3 =BANK1  -------R1 = BANK1
IF    (R3) > 0x7F && (R3)< 0x100 && (R1) > 0X80 && (R1) < 0X100
BSF STATUS  ,RP0
BCF STATUS ,RP1
MOVF R3 ,W
MOVWF R1
BCF STATUS  ,RP0
ENDIF
;R3 =BANK1--------R1 = BANK2
IF    (R3) >0x80 && (R3)<0X100 && (R1)> 0xFF && (R1) < 0X180
BSF STATUS ,RP0
BCF STATUS ,RP1
MOVF R3 ,W
BCF STATUS ,RP0
BSF STATUS ,RP1
MOVWF R1
BCF STATUS ,RP1

ENDIF

;R3 =BANK1--------R1 = BANK3
IF    (R3) >0x80 && (R3)<0X100 && (R1)> 0x17F && (R1) < 0X1FF
BSF STATUS ,RP0
BCF STATUS ,RP1
MOVF R3 ,W
BSF STATUS ,RP1
MOVWF R1
BCF STATUS ,RP1
BCF STATUS ,RP0
ENDIF

;///////////////////////////// r3= bank2/////////////
;R3=BANK2--------R1=BANK0
IF    (R3) >0xFF && (R3)<0X180 && (R1)<0X80
BCF STATUS ,RP0
BSF STATUS ,RP1
MOVF R3 ,W
BCF STATUS ,RP1
MOVWF R1

ENDIF

;R3=BANK2--------R1=BANK1
IF    (R3) >0xFF && (R3)<0X180 && (R1)>0X80 && (R1)<0X100
BCF STATUS ,RP0
BSF STATUS ,RP1
MOVF R3 ,W
BCF STATUS ,RP1
BSF STATUS ,RP0
MOVWF R1
BCF STATUS ,RP0

ENDIF

;R3=BANK2--------R1=BANK2
IF    (R3) >0xFF && (R3)<0X180 && (R1)>0XFF && (R1)<0X180
BCF STATUS ,RP0
BSF STATUS ,RP1
MOVF R3 ,W
MOVWF R1
BCF STATUS ,RP1

ENDIF
;R3=BANK2--------R1=BANK3
IF    (R3) >0xFF && (R3)<0X180 && (R1)>0X17F && (R1)<0X1FF
BCF STATUS ,RP0
BSF STATUS ,RP1
MOVF R3 ,W
BSF STATUS ,RP1
BSF STATUS ,RP0
MOVWF R1
BCF STATUS ,RP0
BCF STATUS ,RP1
;///////////////////////////// r3= bank3/////////////
;R3=BANK3--------R1=BANK3
IF    (R3) >0x17F && (R3)<0X1FF && (R1)>0X17F && (R1)<0X1FF
BSF STATUS ,RP0
BSF STATUS ,RP1
MOVF R3 ,W
MOVWF R1
BCF STATUS ,RP0
BCF STATUS ,RP1
ENDIF

;R3=BANK3--------R1=BANK2
IF    (R3) >0x17F && (R3)<0X1FF && (R1)>0XFF && (R1)<0X180
BSF STATUS ,RP0
BSF STATUS ,RP1
MOVF R3 ,W
BCF STATUS ,RP0
MOVWF R1
BCF STATUS ,RP1
ENDIF
;R3=BANK3--------R1=BANK1
IF    (R3) >0x17F && (R3)<0X1FF && (R1)>0X80 && (R1)<0X100
BSF STATUS ,RP0
BSF STATUS ,RP1
MOVF R3 ,W
BCF STATUS ,RP1
MOVWF R1
BCF STATUS ,RP0

ENDIF
;R3=BANK3--------R1=BANK0
IF    (R3) >0x17F && (R3)<0X1FF && (R1)<0X80
BSF STATUS ,RP0
BSF STATUS ,RP1
MOVF R3 ,W
BCF STATUS ,RP1
BCF STATUS ,RP0
MOVWF R1


ENDIF
ENDM
Bu ilk kütüphanemiz olsun  program içerisinde " MOVFF reg0,reg1 " komutunu kullanabiliriz bu makrolar ile
örneğin:     MOVFF    ADRESH , ADO+1
                   MOVFF  ADRESL , ADO
hep meraktan

alisummer

#2
mevcut kod geliştirilecek
hep meraktan

alisummer

#3
Bu geliştirmeyi aslında if koşuluna status rp0 -r1  in o anki durumunu da sorgulayarak yapmaya çalıştım daha az kod üretmesi için fakat derleme esnasında status registerinin çalışma esnasında ne olacağı dallanmalar vs den dolayı tam kestirelemeyeceğinden hataya açık işlem yapması olasılığına karşı kaldırdım.fakat bu kütüphane içerisinde daha az kod üretilmesi genede mümkün örneğin MOVFF F1 ,F2 komutunun F1 olanının adresi hangi bankta ise komut öncesi o banka geçilerek işlem yapılabilir böylece makroda eklenecek kod uzunluğu opsiyonel olmaktan çıkarak göreceli olarak kısalır
o hali ile de paylaşacağım. tabi burada görsel kazanımlarımız birazcık hız artışı karşılığında ödünleşmek zorunda olacak yani yükarıdaki kodda ana koda yazmamız gereken kod MOVFF F1,F2 iken hız artışı için bunu gerekmesi halinde
BANKSEL F1
MOVFF  F1,F2 şeklinde yazmamız gerekecek tabi bu F1 in o an işlem yaptığımız bankın haricinde bir bankta olması halinde yapacağımız için kodda kısalmaya neden olacak dolayısı ile hızda da artışa  ;     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
hep meraktan

alisummer

#4
ikinci kütüphanemiz pic basic prodan araklama  tabi modifiyeli çarpma kütüphanesi kendisi 16x16 bit işaretsiz çarpma yapar sonucu 32 bit olarak değişkenlere atar (Not modifiye kısmı pic basic te 32 bit veriye ulaşılamıyordu bunda ise R0-R2+1 adreslerine sırası ile düşük byteden yükseğe yazar ulaşılabiliriz);****************************************************************
;* 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
program içerisinde yazılacak kod ise "CARP  sayıA,sayıA1,sayıB,sayıB1" şeklindedir
hep meraktan

alisummer

;///////////////8X8 = 16 BİT////////////////////
 MUL MACRO R3,R1
 
mult:
            CLRF    R2               ;Sonucu temizle
                CLRF  R2+1
                MOVLW    0x08                 ;Bit
counter:
                MOVWF    R4
                MOVF    R3 ,W             ;çarpılanı w ye yaz
loop:
    RRF      R1 ,F             ;çarpanı sağa kaydır
                SKPNC                                     ;taşmayı kontrol et
                ADDWF    R2+1 ,F              ;sonuc ile topla
                RRF      R2+1 ,F              ;sağa kaydır
                RRF      R2,F
                DECFSZ  R4,F              ;8 kere tekrar
                GOTO    loop
                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,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///////
;///////////////// R2-R2+1 MANCHESTER KODU//////////////////
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///////////
; R3 = BINARY
;
;
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
;//////////////////////PAUSE ///////////////////
;///////////////////////MS/////////////////////
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
       
        IF R0==3
        movlw       .201
            movwf       _TMP0
            movlw       .8
            movwf       _TMP1
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            nop
            nop
            ENDIF
           
            IF R0==4
            movlw       .98
            movwf       _TMP0
            movlw       .11
            movwf       _TMP1
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            nop
ENDIF

IF R0==5
movlw       .251
            movwf       _TMP0
            movlw       .13
            movwf       _TMP1
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            nop
            nop
            ENDIF
           
            IF R0==10
            movlw       .248
            movwf       _TMP0
            movlw       .26
            movwf       _TMP1
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            nop
            ENDIF

IF R0==50
movlw       .220
            movwf       _TMP0
            movlw       .130
            movwf       _TMP1
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            ENDIF
           
            IF R0==100
            movlw       .186
            movwf       _TMP0
            movlw       .4
            movwf       _TMP1
            movlw       .2
            movwf       _TMP2
            decfsz      _TMP0,F
            goto        $-1
            decfsz      _TMP1,F
            goto        $-3
            decfsz      _TMP2,F
            goto        $-5
            ENDIF
           
            IF R0==150
            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         
ENDIF
ENDIF
ENDM
             
şimdiye kadar yaptığım makroların tamamı .
Not: bazı algoritmalar sağdan soldan toplanıp makro formatına göre düzenlendi sadece. bunun içinde pic basic pro lib dosyasından ve internette paylaşılan bazı hazır kodlardan yararlandım bazılarını tamamen kendim yazdım.pause makrosu bir örnek olsun diye ekledim çalışıyor ama görüldüğü gibi tüm bekleme sürelerini eklemek (her farklı osc seçeneği için )büyük bir beyin ve algoritma yada bol bol yazma istiyor bol bol yazmaya gözüm yemedi büyük bir beyin de sayılmam.örneğin birbirinin katı olan osc seçeneklerinde aynı kodların gene birbirinin katı şeklinde orantılı beklemeye neden olacağını ve bir algoritma kurularak bunun yazabieceğimi biliyorum.böylelikle yazılması gereken kod çok kısalabilir aksi halde sonsuz olasılık var neredeyse.algoritma konusunda destek atabiilirsiniz tabi.
hep meraktan