ASM hazır kütüphane çalışmaları

Başlatan alikeskinkilic, 27 Ocak 2023, 00:44:06

alikeskinkilic

  ;////////////////////PAUSEUS///////////////////////////////////////////////
 ;/////////////////////////////////////////////////////////////////////////

;istenen gecikme için T1 makine adım sayısını verir formul
;örneğin OSC 8000000 için 10 us gecikme 20 makine adımı değerini verir
;bu adımları decfsz ile sayıyoruz ama her sorgulama için 1 goto komutu kullanılmalı
;oda 2 makine adımı demek yani her çevrim 3 makine adımı harcar.
;decfsz de son adımında 2 makine adımı yer
;tabi bulduğumuz değeri değişkenlere yazmak için da en az 2 adım harcarız(1 byte aşmıyorsa değer)
;bu adımları çevrim değişkenlerine yazmadan önce düşmemiz gerekir.
    
    DELAYUS MACRO US

    LOCAL T1,T2,T3,T4,FOSC
    FOSC=OSC/4000000 ;osc /4 /1000000 mikrosaniye öşçümü için 1/1000000  ms için 1/1000
    T1 = (US*FOSC)        ;girdiğimiz us değerinde kaç CYCLE SAYISI gerektiği burada çıkacak    
    T2 = T1-1        ; 
    T3 = T2/3
    T4 = T2%3        ; KALAN VARSA NOP İLE TAMAMLA
    IF T3<257 
    MOVLW T3
    MOVWF _TMP0
    DECFSZ _TMP0
    GOTO $-1
     IF T4==2
     NOP
     NOP
     ENDIF
     IF T4==1
     NOP
     ENDIF
    ELSE
    T2=T1-7
    T3=T2/3
    T4=T2%3
    T3=T3-HIGH(T3)/2
    MOVLW HIGH (T3)+1
    MOVWF    _TMP1
    MOVLW LOW (T3)
    MOVWF _TMP0
    DECFSZ _TMP0
    GOTO  $-1
    DECFSZ _TMP1
    GOTO  $-3
    IF T4==2
    NOP
    NOP
    ENDIF
    IF T4==1
    NOP
    ENDIF
    ENDIF
    ENDM
mikrosaniye bekleme için bir makro yazmaya çalışıyorum 1 byte sınırını aşmadığı sürece sorun yok fişek gibi çalışıyor sorun artık tek byte yetmediğinde (cycle-1)/3>256 olduğunda iç içe döngü algoritmasını sorunsuz gecikmede kayma olmadan yakalayamıyorum şu meşhur pic delay programında nasıl bir formül kullanmışlarsa bana ondan lazım.Sorunum şu ki adım sayısı 257 olduğunda üst byte 1 oluyor yani decfsz de geçersiz elaman gibi nop ile aynı direkt atlıyor o yüzden üst byte 1 ekliyorum ki o da sayıma dahil olsun ama alt byte her 0 olduğunda cüzi de olsa kayma yapıyor ve tam o iki aralıkta zaman sapıtıyor. dedim yapay zeka yapsın gpt ilk bi uğraştı sonra bıktı hatalardan dediki çok karışık xc.h kütüphanesi kullan beni yorma. Bende matematik 4 işlemden 3 ü yok ! 2 byte için formülü çıkarana baklava alacam  :)
Hep meraktan

Epsilon

DELAYUS MACRO US
    LOCAL T1, T2, T3, T4, FOSC, LOOP_1, LOOP_2
 
    FOSC = OSC / 4000000        ; 1 MHz internal cycle için çarpan (Örn: 8MHz için 2)
    T1 = (US * FOSC)            ; Toplam gereken makine adımı (Cycle)

    ; --- TEK BYTE DÖNGÜSÜ (Gereken cycle 768'den küçükse) ---
    IF T1 < 769
        ; Formül: T1 = 2 (Yükleme) + (T3 * 3) + 1 (Son adım bonusu) + T4 (Kalan)
        ; Buradan: T3 = (T1 - 3) / 3
        T2 = T1 - 3
        T3 = T2 / 3
        T4 = T2 % 3

        IF T3 > 0
            MOVLW   T3
            MOVWF   _TMP0
LOOP_1:     DECFSZ  _TMP0, F
            GOTO    LOOP_1
        ENDIF
        
        ; Kalan adımları NOP ile tamamlama
        IF T4 == 2
            NOP
            NOP
        ENDIF
        IF T4 == 1
            NOP
        ENDIF

    ; --- ÇİFT BYTE DÖNGÜSÜ (Gereken cycle 768 ve daha büyükse) ---
    ELSE
        ; İç içe döngüde dış döngü her döndüğünde iç döngü 256 kere döner.
        ; Sabit harcanan süreler düşüldükten sonra toplam cycle formülüze edilir.
        T2 = T1 - 5             ; Kurulum ve çıkış adımları düşülür
        T3 = T2 / 768           ; Yüksek bayt (Dış döngü sayaç değeri)
        T4 = T2 % 768           ; Kalan adımlar

        ; İç döngünün tam turları için dış döngü ayarı
        MOVLW   T3
        MOVWF   _TMP1
        MOVLW   0               ; İç döngü 256 tur atsın diye 0 yüklüyoruz
        MOVWF   _TMP0
LOOP_2:     DECFSZ  _TMP0, F
            GOTO    LOOP_2
            DECFSZ  _TMP1, F
            GOTO    LOOP_2 + 2  ; İç döngüyü tekrar 256 yapmadan direkt azaltmaya gider

        ; Çift bayttan kalan ekstra adımları temizleme döngüsü (Kalan T4 adımı için)
        T3 = T4 / 3
        T4 = T4 % 3
        IF T3 > 0
            MOVLW   T3
            MOVWF   _TMP0
_DELAY_REM: DECFSZ  _TMP0, F
            GOTO    _DELAY_REM
        ENDIF
        
        ; Son kalan 1 veya 2 adımı NOP ile besleme
        IF T4 == 2
            NOP
            NOP
        ENDIF
        IF T4 == 1
            NOP
        ENDIF
    ENDIF
    ENDM
Bunu denermisin

alikeskinkilic

#47
hocam yok 1 byte de de kayma yaptı 2 byte kaymadan ziyade tamamen farklı gecikme süreleri verdi.3. döngünün amacını anlamadım normalde cycle= (3*(r1+1))+(r2+256) .... gibi bişey olmalı 8mhz frekans ile 500us beklemeye registerlere r1=75 r2=2 veriyor pic delay programı sonuç net tutuyor 500us 1000 cycle  her geri sayım 3 makine adımı atıyor son adımda 1 fazla adımlıyor bu yuzden registere 1 eksik veriyoruz ki eksik olanı nop ile tamamlarız ama fazlaya çözüm yok yani 75 =0 olunca ikinci çevrimden dolayı artık 256 adım atacaktır. yani ((75*3)+1)+ ((3*256)+1)+(register yükleme ıvır zıvır sayısı) 995 + ıvır zıvır işte ben o ıvır zıvırın her durumda aynı olmasını sağlayamadım tum 255-0 geçişleri sorun yaratıyor yoksa 50000us de 1-2 us kayna hepi topu da kafa durunca inat da ettim. adam bunu 8 byte için yazmış hata yapmıyor programı

Hep meraktan

slimandheavy

bu paylaşımı Github'ta yapsanız günümüz itibari ile daha modern şekilde ilerleyebilir konu.

alikeskinkilic

Alıntı yapılan: slimandheavy - 01 Haziran 2026, 10:48:28bu paylaşımı Github'ta yapsanız günümüz itibari ile daha modern şekilde ilerleyebilir konu.
:D " ASM " Dilin kendisinden anlaşılmıyormu modern biri olmadığım. forumda aksakallılara haber saldım ihtiyar heyeti toplanıp bakar bi ara
Hep meraktan

power20


mehmet

Onlar, atlarına binip yavaşça uzaklaştılar.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

alikeskinkilic

#52
; ;////////////////////PAUSEUS///////////////////////////////////////////////
; ;/////////////////////////////////////////////////////////////////////////
;

DELAYUS MACRO US
;kullanımı= DELAYUS 1-197124 arası 4mhz -20mhz denendi üst limiti düşük frekans alt limiti yüksek frekans kısıtlıyor ona göre kullanılmalı
    LOCAL T1,T2,T3,T4,T5,T6,T7,FOSC
    FOSC=OSC/4000000 ;osc /4 /1000000 mikrosaniye öşçümü için 1/1000000  ms için 1/1000
    T1 = (US*FOSC)        ;girdiğimiz us değerinde kaç CYCLE SAYISI gerektiği burada çıkacak    
    IF T1<771
    T2 = T1-1        ; 
    T3 = T2/3        ;
    T4 = T2%3        ; KALAN VARSA NOP İLE TAMAMLA

    MOVLW T3
    MOVWF _TMP0
    DECFSZ _TMP0
    GOTO $-1
    IF T4==2
    NOP
    NOP
    ENDIF
    IF T4==1
    NOP
    ENDIF
    ELSE    
    T2=((T1-4)/770)
    T3=(T1-4)%770
    T4=(T3-1)/3            

    T6=(T3-1)%3
    MOVLW T4
    MOVWF _TMP0
    IF (T3)>= 4
    MOVLW (T2)+1
    MOVWF    _TMP1
    ELSE
    MOVLW    T2
    MOVWF    _TMP1
    ENDIF
    DECFSZ _TMP0
    GOTO  $-1
    DECFSZ _TMP1
    GOTO  $-3
    IF (T3) == 1
    NOP
    NOP
    NOP
    ENDIF
    IF T3==2
    NOP
    NOP
    ENDIF
    IF T3==0
    NOP
    ENDIF
    IF T6==2
    NOP
    NOP
    ENDIF
    IF T6==1
    NOP
    ENDIF

    ENDIF
    ENDM
 
Ne uğraştırdı be kafa çalışmayınca gramla erik satan dayılar gibi 1 ekle 2 çıkar olmadı 2 ekle 1 çıkar.baktım tutmuyor komple değiştim açıyı şimdi denediğim kadarıyla 0 geçişleri dahil çözüldü. osc en düşük  4 mhz de çalışıyor 770 ikinci çevrime her girdiğinde döndürdüğü adım yani toplam adım sayısından register yüklemelerini çıktıktan sonra 770 e bölünce üst byte çıkıyor kalanı alt byte de kullanıyoruz.Makroları diğer dillerde de çağırabilirsiniz include ile çalışmaya ekleyip deneyebilirsiniz
Hep meraktan

kimlenbu

Pic ile en son assembly kullandığımda sene 2003'tü.

Günümüzde elbellte hala hakim olan birilerinin olduğunu görmek güzel ama modern kontrolcülerde artık oturup kodu üst düzey programlama dilleriyle bile satır satır yazmak sizi geride bırakır, karışık registry yapısı, işe göre seçilen mcu'nun görece farklı donanıma sahip olması yüzünden elzem zamanlar dışında (atomik zamanlama, giriş/çıkışlara çok hassas zamanlama ile erişim) tekerleği yeniden icat etmek gibi.

Yapay zeka desteğiyle 2 saatte yazacağım kodu mevcut düzenle 2 haftada yazmak bile mucize olur. Saygılar

alikeskinkilic

hak vermekle birlikte benimkisi eğlence birazda . tabi yıllar içinde işlerde kullandığım sensör ve modüllere özel bir çok makro yazdım bu yüzden çoğu durumda kendi adıma C den daha hızlı oluyorum yazarken adxl set ,nrf begin,serial begin gibi kısa ve anlaşılır satırlar işimin çoğunu hallediyor boş zamanlarda da eksik kalan makro ve kütüphaneleri kurcalıyorum işte.tabi işi sadece asm olarak görmeyin bence bu makrolar C ve basic de de çağrılabiliyor. bu yüzden paylaşıyorum örneğin önceki paylaşımlarımdan birinde 32 bit matematik kütüphanesi vardı standartta kullanılmayan hızlandırma yöntemleri kullanmıştım C de bulamaz kimse mesela onlar 0 ları kaydır topla yaparken ben 0 sa toplamayla uğraşmayıp 1 bulana kadar sadece kaydırma yapabiliyorum kısıtlı hızlarda işlemciyi şenlendriyor bunlar. birde pic den vazgeçmeme gerek duyacak kadar ağır bir yük olmadı şimdiye kadar bir kaç kere esp ve arduino kullandım ama çoğunluğu pic 8 bit 16 bit ve dsPic çözdü işimi hep.
Hep meraktan

alikeskinkilic

NRF24L01+ için ayar gönderme ve alma makrosu çoğu açıklama kod içinde var.
;2MAY2026
;NRF.inc
;AliSümer
;nrf24L01 library
;NRF 24L01  MAKRO
;NRF_BEGIN                                         
;SPEED= 1Mbps  = 1000000               
;       2Mbps  = 2000000                 
;       256Mbps= 250000                                        
;NRF_POWER  4=  0dBm                                        
;           3= -6dBm                                        
;           2= -12dBm
;           1= -18dBm  
;NRF_PAYLEN (veri Uzunluğu) 0-32  BYTE

;****************************************************************************************************         
;***********************************ANA PROGRAM TANIMLAMALARI****************************************
;****************************************************************************************************
;#DEFINE NRF_AA  0X00-0X3F                     Enhanced ShockBurst AKTİF(OTOMATİK GERİ YANIT VE KONTROL)
;#DEFINE NRF_AA_DISABLE                     Enhanced ShockBurst PASİF (KONTROL KAPALI SADECE GÖNDER GİTSİN :)
;#DEFINE NRF_SPEED 2000000                  2Mbps  = 2000000  
;#DEFINE NRF_SPEED 1000000                  1Mbps  = 1000000
;#DEFINE NRF_SPEED 250000                   250Kbps= 250000 
;#DEFINE NRF_POWER 1                        1= -18dBm            
;#DEFINE NRF_POWER 2                        2= -12dBm
;#DEFINE NRF_POWER 3                        3= -6dBm
;#DEFINE NRF_POWER 4                        4=  0dBm
;#DEFINE NRF_TX                             VERICI MODU
;#DEFINE NRF_RX                             ALICI MODU
;#DEFINE NRF_PAYLEN 2                    ALICI VERI BOYU 0-32 BYTE   
;#DEFINE NRF_ADRLEN 5                   ;5,4,3 BYTE ADRES rf yoluyla iletilir/alınır 
;#DEFINE NRF_ADDRES 0X5353535353         ;tx/rx adresi aynı olmalı.gönderilen uzunluk ise NRF_ADRLEN ile ayarlanır    
;#DEFINE NRF_RETR 0X00- 0XFF             ;İLK 4 BİT 0-15 arası tekrar sayısı  ikinci 4 bit 250us aralıklarala tekrarlar arası bekleme çarpanı 16*250us 4000us max bekleme
;#DEFINE NRF_RF_CHNL 2453                iletişim frekansı 2400+53 mhz
;#DEFINE CSN PORTC,6                    ;SPI İÇİN GEREKLİ BACAK TANIMLAMALARI YAPILMALI
;#DEFINE CE  PORTB,7
;#DEFINE IRQ PORTB,5
;****************************************************************************************************
;****************************************GEREKLİ DEĞİŞKENLER*****************************************
;CBLOCK 0XXX
;R1
;ENDC
;****************************************************************************************************
;;*********************************************Command name******************************************
;*********************************************NRF KOMUTLARI******************************************
#DEFINE   R_REGISTER          0X00
#DEFINE   W_REGISTER          0X20 
#DEFINE   R_RX_PAYLOAD        0X61 
#DEFINE   W_TX_PAYLOAD        0XA0  
#DEFINE   FLUSH_TX            0XE1
#DEFINE   FLUSH_RX            0XE2
#DEFINE   REUSE_TX_PL         0XE3
#DEFINE   R_RX_PL_WID         0X60
#DEFINE   W_ACK_PAYLOAD       0XA8  ;Bu komut FEATURE registeri lsb 2 yapılarak KULLANILIR
#DEFINE   W_TX_PAYLOAD_NOACK  0XB0  ;Bu komut FEATURE registeri lsb 1 yapılarak KULLANILIR
;****************************************************************************************************
;******************************************** NRF REGISTERLER ***************************************    
;registers Yazma adresleri okuma moduna adresteki .6 bit 0 olacak yani NRF_CONFIG 0x20 yazma NRF_CONFIG = 0x00 okuma
;Adreslerin yazma modunda kullanılmasının sebebi daha çok yazma yapıldığından her yazmada
; bit açma ile uğraşmamak için.okumak istediğimizde bit kapama daha hızlı olacaktır  
 #DEFINE NRF_CONFIG 0X20                                                                           
 #DEFINE EN_AA      0X21
 #DEFINE EN_RXADDR  0X22
 #DEFINE SETUP_AW   0X23
 #DEFINE SETUP_RETR 0X24
 #DEFINE RF_CH      0X25
 #DEFINE RF_SETUP   0X26
 #DEFINE NRF_STATUS 0X27
 #DEFINE OBSERVE_TX 0X28
 #DEFINE RPD        0X29
 #DEFINE RX_ADDR_P0 0X2A    ;5 BYTE     RX DATA KAYIT ADRESLERİ 6 NRF CİHAZI VE KANALI DİNLEYİP AYRI AYRI KAYDEDER
 #DEFINE RX_ADDR_P1 0X2B    ;5 BYTE
 #DEFINE RX_ADDR_P2 0X2C    ;1 BYTE  
 #DEFINE RX_ADDR_P3 0X2D    ;1 BYTE 
 #DEFINE RX_ADDR_P4 0X2E    ;1 BYTE 
 #DEFINE RX_ADDR_P5 0X2F    ;1 BYTE 
 #DEFINE TX_ADDR    0X30    ;5 BYTE
 #DEFINE RX_PW_P0   0X31    ;Veri Byte uzunluğu 0-32 byte PIPE 0 ADRESİ
 #DEFINE RX_PW_P1   0X32    ;PIPE 2      toplam 6 bağlantı noktası  var her biri için ayrı 
 #DEFINE RX_PW_P2   0X33    ;PIPE 3      alıcının kaç byte veri bekleyeceğini belirler 
 #DEFINE RX_PW_P3   0X34    ;PIPE 4      gönderilen veri burada ayarlananla aynı uzunlukta olmalı
 #DEFINE RX_PW_P4   0X35    ;PIPE 5
 #DEFINE RX_PW_P5   0X36    ;PIPE 6
 #DEFINE FIFO_STATUS 0X37
 #DEFINE DYNPD      0X3C    ;Dinamik payload(veri) uzunluğu
 #DEFINE FEATURE    0X3D    ;En/dsb DPL,ACK,  
 
 ;****************************************************************************************************
 ;************************************* NRF BAŞLATMA MAKROSU ***************************************** 
 ;****************************************************************************************************                              
NRF_BEGIN MACRO 
        LOCAL GONDER ,CIK,ASD 
        BCF   CE                          
        BCF   CSN           
        MOVLW 0XFF                        
        CALL    GONDER 
        BSF   CSN                         
        BCF   CSN                         
        MOVLW NRF_CONFIG                ;0X00 CONFIG_REG 
        CALL    GONDER                  ;
        IFDEF   NRF_RX          
        MOVLW 0X3B 
        ENDIF                           ;0011 1011 RX_DS - RXIRQ - POWER UP - 1 BYTE CRC
        IFDEF  NRF_TX;    ELSE 
        MOVLW 0X5A                      ;0101 1010 TX_DS - TXIRQ - POWER UP - 1 BYTE CRC
        ENDIF                              
        CALL    GONDER  
    
        BSF   CSN                        
        BCF   CSN
                               
        MOVLW EN_AA                     ;0X01 EN_AA REG  
        CALL  GONDER                    ; AUTO ACKNOW DISABLE  
        MOVLW NRF_AA                     
        CALL  GONDER
                   
        BSF   CSN                                         
        BCF   CSN                         
                         
        MOVLW  EN_RXADDR                ;0X02 EN_RXADDR( Enable RX adress)toplam 6 bağımsız adres
        CALL   GONDER                   ;PIPE0  KULLANILACAK
        MOVLW  0X01                       
        CALL   GONDER       
        
        BSF   CSN
        BCF   CSN
        
        MOVLW SETUP_AW                  ;0X03 SETUP_AW(Setup adress uzunluğu )
        CALL    GONDER
        IF NRF_ADRLEN == 5              ;5 byte uzunluğunda adres
        MOVLW 0X03                       
        CALL    GONDER  
        ENDIF   
        IF NRF_ADRLEN == 4
        MOVLW 0X02                       
        CALL    GONDER
        ENDIF
        IF NRF_ADRLEN == 3
        MOVLW 0X01                       
        CALL    GONDER 
        ENDIF
        BSF   CSN
        BCF   CSN
        
        MOVLW  SETUP_RETR               ;0X04 SETUP_RETR (Automatic Retransmission)
        CALL    GONDER
        MOVLW 0X00                        ; KAPALI
        CALL    GONDER 
        
        BSF   CSN
        BCF   CSN
        IF (NRF_RF_CHNL<2400)||(NRF_RF_CHNL>2527)
        ERROR   "RF frekansı 2.4ghz ile 2.527ghz arasında 128 kanal olabilir"
        ENDIF
        MOVLW  RF_CH                    ;0X05 RF_CH (rf KANAL frekansı 2400+FREK  MHZ)
        CALL    GONDER
        MOVLW   NRF_RF_CHNL - 2400 & 0XFF                       
        CALL    GONDER 
        
        BSF   CSN
        BCF   CSN
        
        MOVLW  RF_SETUP                 ;0X06 RF_SETUP ()
        CALL    GONDER
        IF NRF_SPEED  == 250000
        MOVLW 0X20
        MOVWF   ASD                         
        ;CALL    GONDER  
        ENDIF
        IF NRF_SPEED == 1000000
        CLRF ASD                          
   
        ENDIF
        IF NRF_SPEED == 2000000  
        MOVLW   0X08
        MOVWF   ASD
        ENDIF
        IF (NRF_SPEED!=.2000000)&&(NRF_SPEED!=.1000000)&&(NRF_SPEED!=.250000)
        ERROR " RF hızı sadece NRF_SPEED 100000-2000000 veya 250000 sayıları yazılacak"
        ENDIF   
        IF NRF_POWER == 1   
        MOVF   ASD ,W
        ENDIF   
        IF NRF_POWER == 2
        MOVLW   0X02
        ADDWF   ASD
        ENDIF
        IF NRF_POWER == 3
        MOVLW   0X04
        ADDWF   ASD
        ENDIF
        IF NRF_POWER == 4
        MOVLW   0X06
        ADDWF   ASD
        ENDIF
        IF (NRF_POWER<1)||(NRF_POWER>4)
        ERROR "NRF GÜCÜ (NRF_POWER XX) 1-4 ARASI AYARLANMALI
        ENDIF
        MOVF  ASD  ,W
        CALL GONDER
        BSF   CSN
        BCF   CSN
        
        MOVLW   0X27                    ;STATUS()
        CALL    GONDER
        MOVLW   0X70
        CALL    GONDER
        
        BSF CSN
        BCF CSN
        
        MOVLW   RX_ADDR_P0              ; 0X2A ;RX KANAL PIPE0

        CALL    GONDER
        MOVLW   RX_ADDRES & H'FF'       ; 0X11 12 13 14 15
        CALL    GONDER
        MOVLW   RX_ADDRES >> .8 & H'FF'
        CALL    GONDER
        MOVLW   RX_ADDRES >> .16 & H'FF'
        CALL    GONDER
        MOVLW   RX_ADDRES >> .24 & H'FF' 
        CALL    GONDER
        MOVLW   RX_ADDRES >> .32 & H'FF'
        CALL    GONDER
        BSF CSN
        BCF CSN
        
        MOVLW   TX_ADDR                 ; 0X30  ;TX KANAL PIPE0
        CALL    GONDER
        MOVLW   RX_ADDRES & H'FF' 
        CALL    GONDER
        MOVLW   RX_ADDRES >> .8 & H'FF'
        CALL    GONDER
        MOVLW   RX_ADDRES >> .16 & H'FF'
        CALL    GONDER
        MOVLW   RX_ADDRES >> .24 & H'FF'
        CALL    GONDER
        MOVLW   RX_ADDRES >> .32 & H'FF'
        CALL    GONDER 
        BSF CSN
        
        BCF CSN
        MOVLW RX_PW_P0                ;0X31 RX_PW_P0 
        CALL GONDER
        MOVLW NRF_PAYLEN                ; VERİ BOYU
        CALL GONDER
        BSF CSN
        GOTO CIK
GONDER:
        MOVWF   SSPBUF                                                                                                                           
        BTFSS    PIR1 ,SSPIF
        GOTO    $-1
        BCF     PIR1 ,SSPIF 
        RETURN
CIK:
         ENDM
;*****************************************************************
;NRF_SEND MACRO DAT
;KULLANIMI:NRF_SEND değişken adı
;NRF_SEND veri
;            
NRF_SEND MACRO DAT
        LOCAL VERI;
        BCF INTCON,7
        MOVLW   NRF_PAYLEN
        MOVWF   R1
        MOVLW   DAT
        MOVWF   FSR
                              
        BCF     CSN 
        MOVlW   W_TX_PAYLOAD
        MOVWF   SSPBUF                                                                                                                           
        BTFSS    PIR1 ,SSPIF
        GOTO    $-1
        BCF     PIR1 ,SSPIF 
VERI:
        MOVF    INDF,W
        MOVWF   SSPBUF
        BTFSS    PIR1 ,SSPIF
        GOTO    $-1
        BCF     PIR1 ,SSPIF 
        INCF    FSR,F
        DECFSZ R1,F
        GOTO VERI
        BSF CSN
        BSF INTCON,7
        NOP
        NOP
        BSF CE        
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        BCF CE
        ENDM
;********************************************************************************
;NRF DATA ALMA MAKROSU
;KULLANIMI:
;NRF_RECEIVE verinin yazılacağı değişken 
;NRF_RECEIVE alınan
        
NRF_RECEIVE MACRO DAT;,SIZE
    LOCAL GON,CCC,DUMMY
        MOVLW   NRF_PAYLEN
        MOVWF   R1
        MOVLW   DAT
        MOVWF   FSR
 ;       BSF     CE
        BCF     CSN
        ;BTFSS   IRQ        
        MOVLW   R_RX_PAYLOAD
        CALL    GON
DUMMY:                                  ;okunacak byte karşılığı boş byte ( değeri önemsiz tektarlamayan düşük yüksek değerler iyidir )spi ile nrf fifoları ile yer değiştirir
        MOVLW   0X55
        CALL    GON
        MOVFW   SSPBUF
        MOVWF   INDF
        INCF    FSR,F
        DECFSZ  R1
        GOTO DUMMY
        GOTO CCC
GON:
        MOVWF   SSPBUF                                                                                                                           
        BTFSS    PIR1 ,SSPIF
        GOTO    $-1
        BCF     PIR1 ,SSPIF 
        RETURN
CCC:
        BSF CSN
        ENDM
        
        ;BCF     PIR1 ,SSPIF 

                   
Hep meraktan

alikeskinkilic

MOVLW  SETUP_RETR               ;0X04 SETUP_RETR (Automatic Retransmission)
        CALL    GONDER
        MOVLW NRF_RETR                       ; KAPALI
        CALL    GONDER
düzeltme
Hep meraktan

alikeskinkilic

;///////////////////////////////////////////////////////////////////////////////
;///////////////////////UART_SET/////////////////////////////////////////////
; UART_SET BAUD,9OR8,TERS-DÜZ
;    UART_SET 9600,8,0
;Aana program tanımlamaları
;#DEFINE TX_INVERTED
;#DEFINE LONGBRG
;#DEFINE HIGHBRG
;#DEFINE BIT9  
;#DEFINE BAUDRATE 300-115200 br          
UART_SET MACRO    
        BANKSEL TXSTA  
        BCF    TRISB        ,7 ;tx
        BSF    TRISB        ,5    
        MOVLW  0X24               ; TXEN,BRGH
        MOVWF  TXSTA   
        IFDEF   TX_INVERTED; ;İNVERTED
        BANKSEL    BAUDCTL        
        BSF    BAUDCTL,SCKP
        ELSE
        BANKSEL    BAUDCTL
        BCF    BAUDCTL,SCKP
        ENDIF   
        IF   LONGBRG == 1 
       ; BANKSEL BAUDCTL
        BSF BAUDCTL,3;BRG16
        ELSE
        BCF BAUDCTL,3;BRG16     ;
        ENDIF
        BANKSEL RCSTA           ;
        MOVLW 0X80            ;SPEN,CREN
        MOVWF RCSTA
        
        
        BANKSEL TRISA
        IF (LONGBRG!=HIGHBRG);(LONGBRG==1)||(HIGHBRG==1)
        MOVLW ((OSC/BAUDRATE)/.16)-1 & 0XFF
        MOVWF   SPBRG
        MOVLW ((OSC/BAUDRATE)/.16)>> 8 & 0XFF
        MOVWF   SPBRGH
        ENDIF
        IF (LONGBRG==1)&&(HIGHBRG==1)
        MOVLW ((OSC/BAUDRATE)/4)-1 & 0XFF
        MOVWF   SPBRG
        MOVLW ((OSC/BAUDRATE)/4)>> 8 & 0XFF
        MOVWF   SPBRGH
        ENDIF
        
        IF (LONGBRG==0)&&(HIGHBRG==0)
        MOVLW ((OSC/BAUDRATE)/.64)-1 & 0XFF
        MOVWF   SPBRG
        MOVLW ((OSC/BAUDRATE)/.64)>> 8 & 0XFF
        MOVWF   SPBRGH
        ENDIF

        BANKSEL    PORTA               

        IFDEF BIT9;     VAR1==8
        BANKSEL RCSTA
        BSF    RCSTA    ,6;RX9
        ELSE;
        BCF    RCSTA    ,6;RX9
        BANKSEL PORTA
        ENDIF
        ENDM
donanım seri haberleşme ayar makrosu
Hep meraktan

alikeskinkilic

;**************ADC OKUMA**************************************************
; ANA PROGRAM TANIMLAMALAR
;#DEFINE ADC_SIZE 10                    ;ADC 8 veya 10 bit okuma 
;#DEFINE ADC_CHNL 0X00-0XFF
;#DEFINE ADC_CHNH 0X00-0X0F
;#DEFINE OSC 8000000

ADC_DISABLE MACRO 
    BANKSEL ANSEL
    CLRF    ANSEL
    CLRF    ANSELH
    BANKSEL PORTA
    ENDM
    
ADC_ENABLE MACRO ;CHNL;,CHNH

    IF OSC == 8000000
    BANKSEL ADCON1 ;
    MOVLW B'01010000' ;FOSC/16 2 us TAD
    MOVWF ADCON1 ;
    ENDIF
    IF  OSC > 8000000
    BANKSEL ADCON1 ;
    MOVLW B'00100000' ;FOSC/32 1.6us TAD
    MOVWF ADCON1 ;
    ENDIF    
    IF OSC < 8000000
    BANKSEL ADCON1 ;
    MOVLW B'00010000' ;FOSC/32 2 us TAD
    MOVWF ADCON1 ;
    ENDIF 
        
    MOVLW   ADC_CHNL
    BANKSEL ANSEL
    MOVWF   ANSEL
    MOVLW   ADC_CHNL>>8 & 0XFF
    MOVWF   ANSELH
    BANKSEL PORTA

    
    ENDM
;///////////////////////////////////

ADC_READ MACRO CHNL,VAR
    LOCAL   SampleTime, ADC_CIK,K
    
    BANKSEL ADCON0 ;
    MOVLW CHNL << 2
    ADDWF   ADCON0,F
    IF ADC_SIZE == 10
    BSF ADCON0,7
    ENDIF
    IF ADC_SIZE == 8
    BCF ADCON0,7  
    ENDIF
    IF (ADC_SIZE!=.8)&&(ADC_SIZE!=.10) 
    ERROR "ADC çözünürlülüğü geçersiz ADC_SIZE 8 - VEYA 10 YAZIN"
    ENDIF
    BSF ADCON0,ADON

; Delay 50 machine cycles
; Gecikme süresi 25 mikrosaniye
; osilatörün frekansı 8 MHZ
      SampleTime   set (((25 * (OSC / 4)) / 1000000)-2)/3
      K = (((25*(OSC/4))/1000000)-2) %3
      IF K >=1
      NOP
      ENDIF
      IF K>=2
      NOP

      ENDIF 


            movlw     SampleTime
            movwf       _TMP0
            decfsz      _TMP0,F
            goto        $-1
           ; nop
         ;   RETURN
 ;   ENDIF
    BSF ADCON0,GO ;Start conversion
    BTFSC ADCON0,GO ;Is conversion done?
    GOTO $-1 ;No, test again
    IF ADC_SIZE == 10
    BANKSEL ADRESH ;
    MOVF ADRESH,W ;Read upper 2 bits
    MOVWF VAR+1 ;store in GPR space
    BANKSEL ADRESL ;
    MOVF ADRESL,W ;Read lower 8 bits
    BANKSEL VAR
    MOVWF VAR ;Store in GPR space
    ENDIF
    IF ADC_SIZE == 8
    BANKSEL ADRESH
    MOVF    ADRESH,W
    MOVWF   VAR

    ENDIF
    MOVLW 0XC3
    ANDWF   ADCON0,F


ADC_CIK:
    ENDM 
adc ile ilgili okuma ve ayar makroları
Hep meraktan

Benzer Konular (2)