avatar_alisumer

ASM makro kullanımı ile ilgili bilgiler

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

alisumer

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

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

alisumer

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

    ENDM    

;NEXTION_READ MACRO ?0,?1

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

alisumer

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

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


Hep meraktan

alisumer

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

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

alisumer



Herkese selamlar Nextion ekranla bir uygulama yapıyorum PWM frekansını 50khz ile 100khz arasında ayarlayıp duty değerini %50 de sabit tutmam gerekiyor ekranın pic e gönderdiği veri doğal olarak 50 ile 100 arasında bir değer  grafikte ve tabloda bir kısmının  görüldüğü gibi tam orantılı değer almıyor ki  basit matematik bir işlemi ile çözeyim.ilk başta gelen değeri 149 dan çıkardım pr2 attım sonra aynı değeri 150 den çıkarıp ikiye bölüp CCPR1L ye atınca duty değeri en fazla %3 sapmayla yerinde sayılır iş görür ama pr2 değeri olması gerektiği gibi yay çizmeyip orantılı değiştiğinden skalanın başında ve sonunda birkaç adım iyi gittikten sonra ortalarında tat vermedi .Her frekans için tablo da yapmak istemiyorum bunun basit bir formulü varmıdır öneriniz nedir.
Hep meraktan

ete

100 Khz den başlayıp 50 Khz doğru gittiğin zaman PR2 değerinin ard arda gelen bazı frekanslarda aynı kaldığını göreceksin. Eğrilik ordan geliyor olsa gerek.

Mesajında tam olarak neyi amaçladığın pek anlaşılmıyor. Frekansımı yoksa frekansa göre PR2 değeri ve buna karşılık gelen Duty değerinimi hesaplamak istiyorsun pek anlaşılmamış.

Bu konuda elbette senin değinmediğin OSC frekansı etkin rol oynuyor. 50Khz ile 100Khz aralığındaki frekansları uygun çözünürlükte elde etmek için işlemci frekansının en azından 32Mhz dolayında olması gerekir. Şart değil ama yüksek çözünürlük için gerekli. Hatta 48 Mhz olsa hiç fena olmaz.

Örnek vereyim,
4Mhz OSC frekansında 50Khz PWM sinyali için %50 Duty değeri 40 olabiliyor. (6bit)
Aynı frekansı 32Mhz de yaratırsak Duty değeri 320 oluyor. Aradaki fark epeyce büyük bana kalırsa.

Kullanılan genel formüller şöyle ;

Period = (((PR2+1)* 4) /OSC) * (TMR2 Bölme Oranı) 
Olası T2CON registeri için bölme oranları  %00=1/1  %01=1/4  %10=1/16   %11=1/64
Unutmayalım en büyük çözünürlükler 1/1 bölme oranı ile elde ediliyor.

Örnek hesap yapalım ve bu formülde 50Khz ve 16Mhz için 1/1 bölme oranı ile PR2 değeri hesaplayalım.
50Khz=50.000 Hz.  Period=1.000.000/50.000=20us
20us=(((PR2+1)*4)/16)*1 ,   20us=(PR2 +1)/4  ,  4*20 =(PR2+1) ,  80=PR2+1  PR2=79

Direk Frekans hesaplamak için ise ;
Frekans=1000/[(PR2+1)*4*(1/OSC Frekansı_MHz)*PR2_Bölücüdeğeri]   formülünü kullanıyoruz.

Direk Duty Değeri hesaplamak için ise;
Duty=(PR2+1)*%DUTY/25  formülünü kullanıyoruz. 
Örnek vereyim. yukarıda hesapladığımız PR2=79 değeri ile %50 duty değerini hesaplayalım.
Duty=(79+1)*50/25  , Duty=(80) * 2 = 160 olarak bulunacaktır.

Umarım formüller işine yarar.

Ete

alisumer

#51
hocam pr2 ve duty değeri 20 mhz ye göre ayarlandı.duty değerinde sorun yok +-5 oynuyor zaten çok ta önemli değil zaten alt iki biti okumuyorum bile çözünürlük yeterli benim için önemli olan ekranda gösterdiğim 60khz bilgisi ile pr2 nin değerini map yapamıyorum liner artmadığından sonuçta frekans sınırlarına yaklaştıkça rakamlar tutuyor ama orta frekanslarda kayma çok oluyor .Sanırım ekranda frekans bilgisi göstermek yerine yüzde bilgisi göstersem daha kolay olacak
Hep meraktan

alisumer

;ana programda #DEFINE OSC 8000000 gibi frekansınızı belirtmeniz gerekiyor bu haliyle 4mhz alt sınır üst sınır yok
DELAYUS MACRO US
;
	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
 
mikrosaniye bekleme makrosu en fazla 2 iç içe çevrim için ayarlandı yani üst gecikme limiti frekansa göre  değişir (4 mhz için en çok 197126 us )
Hep meraktan

alisumer

#53
nrf 24l01+ makroları ayar gönderme ve alma için 3 ayrı makro
;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  NRF_RETR                        ; 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;R8                          
        ;CALL    GONDER  
        ENDIF
        IF NRF_SPEED == 1000000
        CLRF ASD;R8                            
       ; CALL    GONDER  
        ENDIF
        IF NRF_SPEED == 2000000  
        MOVLW   0X08
        MOVWF   ASD;R8
        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;R8
        ENDIF   
        IF NRF_POWER == 2
        MOVLW   0X02
        ADDWF   ASD;R8
        ENDIF
        IF NRF_POWER == 3
        MOVLW   0X04
        ADDWF   ASD;R8
        ENDIF
        IF NRF_POWER == 4
        MOVLW   0X06
        ADDWF   ASD;R8
        ENDIF
        IF (NRF_POWER<1)||(NRF_POWER>4)
        ERROR "NRF GÜCÜ (NRF_POWER XX) 1-4 ARASI AYARLANMALI
        ENDIF
        MOVF  ASD  ,W;R8
        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,SIZE
;KULLANIMI:NRF_SEND değişken adı, değişken boyutu(BYTE)
;NRF_SEND veri,5   (5 byte veriyi LSBYTE şeklinde nrf ile gönderir)
;            
NRF_SEND MACRO DAT
        LOCAL VERI; DAT, SIZE , RPT
        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 , beklenen data boyutu
;NRF_RECEIVE alınan,5  (5 byte değeri en düşük byteden başlayarak sırayla değişkene yazar)
        
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 

                    
bu hali ile bir çok ayar yapılıyor tabi ufak tefek kusurlar var hala gelişiyor ama çalışıyor da veri alma kısmı biraz o makroya biraz çalışmak lazım şu an için manuel yapıyorum.
Hep meraktan

alisumer

#54
;///////////////////////////////////////////////////////////////////////////////
;///////////////////////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          
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
uart ayar makrosu
Hep meraktan

alisumer

;**************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 kapatma,ayar ve okuma makroları
Hep meraktan

Powered by EzPortal
▲