NRF24L01 Kullanımı

Başlatan erdogan2734, 26 Haziran 2016, 00:07:04

erdogan2734

#45
Alıntı yapılan: Burak GÜNAY - 02 Ağustos 2016, 18:13:56
İşlemci frekansın nedir ?

Burak

Burak Hocam Merhaba Şu anda 20 Mhz'de çalışıyorum.
Örnek video aşağıdaki gibi, konuşmalarımı iletebiliyorum (gürültü mevcut).
Yarın pll kullanarak 40Mhz de deneme yapacağım.

https://www.dropbox.com/s/fcxahmivbfa91og/WhatsApp-Video-20160802.mp4?dl=0

İyi akşamlar.
Erdoğan
İmkansızın zaman aldığı bir dünya'da bana zorluktan bahsetme!

Burak

Gurultu filte ve dac adc ile alakali.. Bu arada csn icin ben pause kullanmadigimi farkettim .. Problem yok yani

Burak
Ω Gens Una Sumus Ω

erdogan2734

Alıntı yapılan: Burak GÜNAY - 02 Ağustos 2016, 18:37:51
Gurultu filte ve dac adc ile alakali.. Bu arada csn icin ben pause kullanmadigimi farkettim .. Problem yok yani

Burak

Değerli Burak Hocam, Magic_gun ve ETE hocam.
Bugün 18f46k22 (dahili 16 Mhz-x4pll)-NRF24L01+(Antenli olan) ile 166 metre mesafeye kadar 1 Mgbtps insan sesi iletimi yaptım.
Gayet başarılı bir şekilde çalıştırabildim. Daha ileri gidecek yolum olmadığı için denemeyi bu mesafede kestim. Magic_gun hocamın 8 bit DAC kullan tavsiyesi üzerine kendim yaptığım R-2R dac ile ayrıca PWM kullanarak da başarılı bir şekilde sistemi çalıştırabildim. Ufak tefek cızırltılar falan oluyor, ancak bunların DAC yada ADC kısmında kullandığım pasif kompenentlerden kaynaklandığını düşünüyorum.

Projem ile ilgili en baştan bir bir yorulmadan her sorduğum soruya cevap verdiğiniz için size teşekkür ederim.

İligilenen arkadaşlara elimden geldiğince ve zamanım olduğunca yardımcı olacağım.

Bu arada aldığım ses CD kalitede bir ses değil, insan sesi iletimi yapacağım için 300Hz-3kHz frekansları arasına yönelip nokta hedef çalıştım. (Özellikle bu konuda yardımcı olan Magic_gun hocama bir kez daha teşekkür ederim.)Projemin devamında CD kalitede ses için çalışacağım.

İyi Günler.
Erdoğan
İmkansızın zaman aldığı bir dünya'da bana zorluktan bahsetme!

Burak

Tebrik ederim :) İyi çalışmalar ;

Burak
Ω Gens Una Sumus Ω

magic_gun

:) tebrikler ,,, balık almak degil tutmayı ogrenmek daha guzel bir duygu degilmi ? sevgi ve saygılarımla
hayal etemeden basaramazsınız
u cnt achieve w/out dreamin

erdogan2734

Alıntı yapılan: magic_gun - 13 Ağustos 2016, 20:08:40
:) tebrikler ,,, balık almak degil tutmayı ogrenmek daha guzel bir duygu degilmi ? sevgi ve saygılarımla

Kesinlikle katılıyorum. :)
Erdoğan
İmkansızın zaman aldığı bir dünya'da bana zorluktan bahsetme!

cemilsivas

Merhaba hocalarım. Ben de nrf ile çalışma yapmak ıstiyorum. Datasheeti okudum. Forumda erdogan Burak hoca ve Ete hocanin konu ile ilgili kaynaklari olduğundan bahsetmiş. Ben forumda bulamadim. Elinizde bu kaynaklar varsa gönderebilir misiniz?

ete

Aşağıdaki linkte 2. sayfada verdiğim programlara bakıver.
Ete

http://etepic.com/index.php/topic,1419.15.html

cemilsivas

Hocalarım. Biraz kodları inceledim. erdogan arkadaşımın yaptığı tx kodlarını dahasheet'e de bakarak çözdüm. Ben de rx için bir  yol haritası çizeceğim yardımcı olursanız sevinirim.

Rx için:
CE pini 0 olacak

1. 0x00 adresindeki prim_rx ve en_crc bitlerini aktif et
2. 0x01 adresindeki enaa_p0 bitini aktif et
3. 0x02 adresindeki  erx_p0 pinini aktif et
4. 0x03 adresindeki aw pinini $2(4 byte genişlik) olarak ayarladım.
5. 0x04 adresindeki rf_ch bitini $2( sanırım 2. kanal) olarak ayarladım.
6. 0x05 adresindeki rf_pwr bitini 11(0 dBm), rf_dr_low bitini 1(250 kpbs) ayarladım.
7.  0x06 adresindeki rx_p_no 1(data pipe 0), rx_dr 1 ayarladım.
8. 0x0a adresindeki rx_add_p0 bitine 11987 sayınısın lowbyte ve highbyte larını gönderdim(Buradaki sayının ne olduğunu anlamadım. erdoganın programındakinin aynısını aldım. Alıcı ve verici adreslerinin aynı olması gerektiğini biliyorum.tx_addr=rx_addr_p0)
9. 0x11 adresindeki rx_pw_p0 bitini 1 (sadece 1 sayısını alacağım. eğer verici ile 3 byte veri yollamaya kalkarsam alıcı buradaki değere göre sadece 1 byte veri mi alıyor? Burayı direk 32 yapmamın bir sakıncası var mıdır? )  yaptım.

bu adreslerdeki bitleri de değiştirirken csn bitini 0 yapıyoruz. Biti değiştirdikten sonra csn 1 yapıyoruz.

alım yaparken 0x00 adresinden pwr_up, prim_rx, en_crc ve max_rx_dr bitlerini aktif ederek rx moda geçtim
CE pinini 1 yapıp veri beklemeye başlayalım. Bu arada 0x07 adresindeki 7 pini kontrol edelim. 1 olursa data gelmiştir.
CE pinini 0 yap. Modülü standby1 moduna al.
Ardından gelen verileri al:
shiftout mosi,sck,1[$61]'   r_rx_payload komutunu gönderdim.
shiftin miso,sck,1[veriler] ' gelen veri değişkenini okudum.

Biraz uzun oldu kusura bakmayın. Yardımcı olursanız sevinirim. İyi geceler.

erdogan2734

#54
Alıntı yapılan: cemilsivas - 02 Eylül 2016, 00:11:30
Hocalarım. Biraz kodları inceledim. erdogan arkadaşımın yaptığı tx kodlarını dahasheet'e de bakarak çözdüm. Ben de rx için bir  yol haritası çizeceğim yardımcı olursanız sevinirim.

Rx için:
CE pini 0 olacak

1. 0x00 adresindeki prim_rx ve en_crc bitlerini aktif et
2. 0x01 adresindeki enaa_p0 bitini aktif et
3. 0x02 adresindeki  erx_p0 pinini aktif et
4. 0x03 adresindeki aw pinini $2(4 byte genişlik) olarak ayarladım.
5. 0x04 adresindeki rf_ch bitini $2( sanırım 2. kanal) olarak ayarladım.
6. 0x05 adresindeki rf_pwr bitini 11(0 dBm), rf_dr_low bitini 1(250 kpbs) ayarladım.
7.  0x06 adresindeki rx_p_no 1(data pipe 0), rx_dr 1 ayarladım.
8. 0x0a adresindeki rx_add_p0 bitine 11987 sayınısın lowbyte ve highbyte larını gönderdim(Buradaki sayının ne olduğunu anlamadım. erdoganın programındakinin aynısını aldım. Alıcı ve verici adreslerinin aynı olması gerektiğini biliyorum.tx_addr=rx_addr_p0)
9. 0x11 adresindeki rx_pw_p0 bitini 1 (sadece 1 sayısını alacağım. eğer verici ile 3 byte veri yollamaya kalkarsam alıcı buradaki değere göre sadece 1 byte veri mi alıyor? Burayı direk 32 yapmamın bir sakıncası var mıdır? )  yaptım.

bu adreslerdeki bitleri de değiştirirken csn bitini 0 yapıyoruz. Biti değiştirdikten sonra csn 1 yapıyoruz.

alım yaparken 0x00 adresinden pwr_up, prim_rx, en_crc ve max_rx_dr bitlerini aktif ederek rx moda geçtim
CE pinini 1 yapıp veri beklemeye başlayalım. Bu arada 0x07 adresindeki 7 pini kontrol edelim. 1 olursa data gelmiştir.
CE pinini 0 yap. Modülü standby1 moduna al.
Ardından gelen verileri al:
shiftout mosi,sck,1[$61]'   r_rx_payload komutunu gönderdim.
shiftin miso,sck,1[veriler] ' gelen veri değişkenini okudum.

Biraz uzun oldu kusura bakmayın. Yardımcı olursanız sevinirim. İyi geceler.


cemilsivas merhaba;

Öncelikle projenizde başarılar dilerim.
Yazdıklarınızı dikkatle okudum, bir kaç şeyi daha zihninizde oturtmanız gerektiğini düşünüyorum.
Öncelikle shifin-shiftout komutlarının içerisinde bulunan mode parametresini iyi incelemeniz gerekir zira aldığı değer veri alırken yada yollarken farklılık oluşturmakta.
Benim mantığımda daha doğrusu benim projem için yaptığım yazılımda AutoACK'yı kullanmadım, çünkü tektaraflı iletişim kullanıyorum.
Ayrıca 0x00 registerinda bulunan değerlerden sadece mask_rx_dr register bitini aktif ettim, çünkü IRQ pinini veri aldığımda kontrol için kullanıyorum. (Sizin projenizde bu değişiklik gösterebilir.)
Genel olarak gidiş yolun doğru ancak 0x06 adresi ile 0x07 adresini karıştırmışsınız oraya dikkat etmeniz gerek.

''8. 0x0a adresindeki rx_add_p0 bitine 11987 sayınısın lowbyte ve highbyte larını gönderdim(Buradaki sayının ne olduğunu anlamadım. erdoganın programındakinin aynısını aldım. Alıcı ve verici adreslerinin aynı olması gerektiğini biliyorum.tx_addr=rx_addr_p0)''
0x0a adresinde bir adres belirliyorsunuz, ben mesela ismimin başharflerini ERD olarak adres belirleyip yolladım, karşı taraf bu adresden gelen bilgiyi okuyacak, başka adreslere tepki vermeyecektir.
0x11 adreside yine sizin dediğiniz gibi yolladığınız verinin değerini belirtir, 2 byte olduğunda 65536 değerinde word tipini yollayabilirsiniz mesela. (Bu konuda hatalı olabilirim emin olamadım.)

Umarım bilgiler işinize yarar.

İyi çalışmalar.





Erdoğan
İmkansızın zaman aldığı bir dünya'da bana zorluktan bahsetme!

cemilsivas

#55
Cevap için teşekkür ederim. Setup_retr registerini atladığımdan kayıtçıların sırası karışmış.
shiftout-in deki mode parametresini incelediğimde farkı da gördüm.
Basit bir işlem yaptığım için ben de ack aktif etmedim.(Yanlış okumadıysam ack aktif etmek için modüle w_ack_payload komutunu pipe no yazarak göndermem gerekiyor.)
Yine Burak hocamın söylediklerini yanlış anlamadıysam mrf modülünün buffer'ları yüksek olduğundan bu bitleri kullanmak şimdilik ihtiyaç değil. Sanırım orada da hata yaptım. O bitleri kullanmak istemiyorsam onları da 1 yapmam gerekti.
Adreste de sanırım siz serbest bir adres belirlediniz. Merak ettiğimden soruyorum. Adreste baş harflerinizi kullandım dediniz. Baş harflerinizin ascii kodlarını mı birleştirdiniz?
Bir de adresi gönderirken neden lowbyte ve highbyte olarak gönderdiniz?

erdogan2734

#56
Alıntı yapılan: cemilsivas - 03 Eylül 2016, 12:27:24
Cevap için teşekkür ederim. Setup_retr registerini atladığımdan kayıtçıların sırası karışmış.
shiftout-in deki mode parametresini incelediğimde farkı da gördüm.
Basit bir işlem yaptığım için ben de ack aktif etmedim.(Yanlış okumadıysam ack aktif etmek için modüle w_ack_payload komutunu pipe no yazarak göndermem gerekiyor.)
Yine Burak hocamın söylediklerini yanlış anlamadıysam mrf modülünün buffer'ları yüksek olduğundan bu bitleri kullanmak şimdilik ihtiyaç değil. Sanırım orada da hata yaptım. O bitleri kullanmak istemiyorsam onları da 1 yapmam gerekti.
Adreste de sanırım siz serbest bir adres belirlediniz. Merak ettiğimden soruyorum. Adreste baş harflerinizi kullandım dediniz. Baş harflerinizin ascii kodlarını mı birleştirdiniz?
Bir de adresi gönderirken neden lowbyte ve highbyte olarak gönderdiniz?

Cemilsivas bey

Lowbyte, hightbyte gönderme sebebim, orada bulunan 11987 degeri  byte degerini aşıyor olması, bu sebeple lowbyte ve highbyte olmak üzere ikiye bölünerek yollanıyor.

Kendi kullandığım adres için ise direk E harfini, VERI="E" şeklinde yolluyorum. Ben bu değeri okuduğum da byte  karşılığını görüyorum.
Yani ASCII karşılığı da olsa, derleyici kendisi çeviriyor ve byte degeri olarak yolluyor. Zaten paylaştığım fotolarda görebilirsiniz.

İyi çalışmalar.


Adres yolladığım program parçacığı şu şekilde;

CSN=0
ADRS = $30' TX ADR REG.  TX ADRESININ YAZILDIGI REGISTER

VER3 = "E"
VER2 = "R"
VER1 = "D"

SHIFTOUT mosi, sck, 1,[ADRS]
SHIFTOUT mosi, sck, 1,[VER1,ver2,ver3]
PAUSEUS 50
CSN=1
Erdoğan
İmkansızın zaman aldığı bir dünya'da bana zorluktan bahsetme!

cemilsivas

Şimdi anladım hocam. Siz sanırım 2 prog. yazdınız. Sitedeki prog. da adres olarak 11987 göndermişsiniz. Elinizdeki prog da adres ERD olarak yazmışsınız.

Rx için de kodları yazıp kontrol amaçlı paylaşacağım.

Tekrar yardımlarınız için teşekkür ederim.
İyi geceler.

cemilsivas

#58
Merhaba hocalarım. Datasheeti defalarda okuyarak ve  Erdogan hocamın da yönlendirmesiyle rx için şu şekilde kod bloğu oluşturdum. Kod aralarındaki soruları cevaplandırabilirseniz sevinirim.
Yanlış anlaşılmak istemiyorum. Kodları tekrar yazın ya da kodları düzeltin demiyorum. En azından yaptığım mantık hatalarını söylerseniz sevinirim. Herkese teşekkür ederim.

'****************************************************************
'*  Name    : NRF24+RX.BAS                                      *
'*  Author  :                                       *
'*  Notice  : Copyright (c) 2016 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 28.06.2016                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
'-----------------------------------------------------------------
@ DEVICE pic16F628a                      'işlemci 16F628                               
@ DEVICE pic16F628a, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628a, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628a, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628a, MCLR_off            'MCLR pini kullanılıyor.
@ DEVICE pic16F628a, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
'-----------------------------------------------------------------
DEFINE LCD_DREG PORTA 'LCD data bacakları PortA de bağlı
DEFINE LCD_DBIT 0 'LCD data bacakları 0. bitten başlıyor
DEFINE LCD_EREG PORTA 'LCD Enable Bacağı PortB de bağlı
DEFINE LCD_EBIT 5 'LCD Enable Bacağı 3. bite bağlı
'DEFINE LCD_RWREG    PORTB 'LCD RW Bacağı PortB de bağlı'   RW BACAĞI
'DEFINE LCD_RWBIT      2 'LCD RW Bacağı  2. bite bağlı'   GND YE BAĞLANACAK
DEFINE LCD_RSREG PORTA 'LCD RS Bacağı PortB de bağlı
DEFINE LCD_RSBIT 6 'LCD RS bacağı 1. Bite bağlı
DEFINE LCD_BITS 4 'LCD 4 bit  olarak bağlı
DEFINE LCD_LINES 2 'LCD 2 sıra olarak çalışıyor.

cmcon=7 
OPTION_REG.7 = 0

'************************NRF24 KOMUTLARI**********************************
READ_REG     var byte    '// 0x00  '//Define read command to register
WRITE_REG    var byte    '// 0x20  '// Define write command to register
WRITE_REG1   VAR BYTE 'REG01 EN_AA
WRITE_REG2   VAR BYTE 'REG03 AW
WRITE_REG3   VAR BYTE 'REG04 RETR
WRITE_REG4   VAR BYTE 'REG05 RF_CH
WRITE_REG5   VAR BYTE 'REG06 RF_SETUP
WRITE_REG6   VAR BYTE 'REG07 STATUS
WRITE_REG7   VAR BYTE 'REG10 TX_ADDR
WRITE_REG8   VAR BYTE 'REG0A RX_ADDR
WRITE_REGA   VAR BYTE 'REG1C DYNPD
WRITE_REGB   VAR BYTE 'REG1D FEATURE
WRITE_REGc var byte 'rx için en_rxaddr registeri.

RD_RX_PLOAD         var byte    ' RX payload register address
WR_TX_PLOAD         var byte    ' TX payload register address
FLUSH_TX            var byte    ' flush TX register command
FLUSH_RX            var byte    ' flush RX register command

RFKANAL VAR BYTE
RFADRES VAR WORD
RFSET   VAR BYTE
RFSETR  VAR BYTE

'************************NRF24 KOMUTLARI**********************************
READ_REG            = $00
WRITE_REG           = $20 'REG00 KON.
WRITE_REG1          = $21 'REG01 EN_AA
write_regc          = $22
WRITE_REG2          = $23 'REG03 AW
WRITE_REG3          = $24 'REG04 RETR
WRITE_REG4          = $25 'REG05 RF_CH
WRITE_REG5          = $26 'REG06 RF_SETUP
WRITE_REG6          = $27 'REG07 STATUS
WRITE_REG7          = $30 'REG10 TX_ADDR
WRITE_REG8          = $2A 'REG0A RX_ADDR
WRITE_REGA          = $1C 'REG1C DYNPD
WRITE_REGB          = $1D 'REG1D FEATURE



RD_RX_PLOAD         = $61
WR_TX_PLOAD         = $A0
FLUSH_TX            = $E1
FLUSH_RX            = $E2


'**********************NRF24 KOMUTLARI**********************************
INCLUDE "modedefs.bas"

symbol CE    =PORTB.0
SYMBOL CSN   =PORTB.1
SYMBOL SCK   =PORTB.2
SYMBOL MOSI  =PORTB.3
SYMBOL MISO  =PORTB.4
SYMBOL TUS   =PORTB.5
SYMBOL LED   =PORTB.6

TRISA   = %00000000
TRISB   = %00010000 'miso pinini giriş yaptım.


ADRS  VAR BYTE :ADRS=0
VERI  VAR BYTE :VERI=0

BASLA:
CSN=0
CE=1
PAUSE 250
GOSUB KANALSEC
GOSUB NRFAYAR
GOSUB FLUSHRX

   
   
    TEST:
    GOSUB NRFPOWERUP
    GOSUB verial
    gosub NRFPOWERDOWN
   
    CE=0' standby I modu
    ADRS = RD_RX_PLOAD
     CSN=0
    SHIFTOUT mosi, sck, 1,[ADRS]
    shiftin miso, sck,0,[veri]
    CSN=1
    lcdout $FE,1,bin8 ADRS
    lcdout $FE,$C0,[veri]
pause 500
   
   
    GOTO TEST

'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
'KANAL SEC>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
KANALSEC:
RFKANAL= $02
RFADRES= 11987
RFSET  = $26
RFSETR = $38

RETURN 
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
'NRF AYAR>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
NRFAYAR:

CE=0
CSN=0
ADRS = WRITE_REG
VERI = $79'prim_rx=1 en_crc=1 kesmeler kapalı
GOSUB NRFGONDER
CSN=1

CSN=0
ADRS = WRITE_REG1
VERI = $01' datapipe0 için auto ack açık
GOSUB NRFGONDER
CSN=1

CSN=0
ADRS = WRITE_REGc ' Burada rx için datapipe0 açıyoruz.
VERI = $01
GOSUB NRFGONDER
CSN=1

CSN=0
ADRS = WRITE_REG2
VERI = $02 '4 byte adres genişliği
GOSUB NRFGONDER
CSN=1

CSN=0
ADRS = WRITE_REG3
VERI = RFSETR' 4 retramsmission 1 ms tekrar gönderim aralığı
GOSUB NRFGONDER
CSN=1

CSN=0
ADRS = WRITE_REG4
VERI = RFKANAL ' 2. kanal seçildi
GOSUB NRFGONDER
CSN=1

CSN=0
ADRS = WRITE_REG5
VERI = RFSET ' odBm çıkış gücü, 250 kbps data hızı
GOSUB NRFGONDER
CSN=1

CSN=0
ADRS = WRITE_REG6
VERI = $40'rx_dr=1 hocam bu pini 1 yapıp intterupt barağını mı sıfırlıyoruz?
GOSUB NRFGONDER
CSN=1

CSN=0
ADRS = WRITE_REG7
VERI = RFADRES.LOWBYTE
GOSUB NRFGONDER  'burada adres gönderiyoruz. tx adresi.Benim belirlemem gerekiyor mu?
VERI = RFADRES.HIGHBYTE
GOSUB NRFGONDER
CSN=1

CSN=0
ADRS = WRITE_REG8
VERI = RFADRES.LOWBYTE
GOSUB NRFGONDER ' ERdogan hocamın forumdaki kodunda rx addr belirlenmiş.Tx modunda rx adresini neden belirliyoruz?
VERI = RFADRES.HIGHBYTE
GOSUB NRFGONDER
CSN=1

CSN=0
ADRS = WRITE_REGA
VERI = $0 'dpl şimdilik olmayacağı için burayı 0 yapıyorum.
GOSUB NRFGONDER
CSN=1


CSN=0
ADRS = WRITE_REGB
VERI = $00'buradaki özellikleri kullanmadığım için burayı da 0 yapıyorum.
GOSUB NRFGONDER
CSN=1

RETURN
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
'NRF AYAR>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
FLUSHTX:
VERI=FLUSH_TX
CSN=0
SHIFTOUT mosi, sck, 1,[VERI]
CSN=1
RETURN
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
'FLUSH TX>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
FLUSHRX:
VERI=FLUSH_RX
CSN=0
SHIFTOUT mosi, sck, 1,[VERI]
CSN=1
RETURN
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
'FLUSH RX>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
NRFPOWERUP:
CSN=0
ADRS = WRITE_REG
VERI = $7B 'prx=1, pw_up=1, en_crc=1, tüm kesmeler kapalı.
GOSUB NRFGONDER
CSN=1
PAUSEUS 3000
GOSUB FLUSHTX
RETURN
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
'NRFPOWERUP>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
NRFPOWERDOWN:
CSN=0
ADRS= WRITE_REG
VERI= $48
GOSUB NRFGONDER
CSN=1
RETURN
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
'NRFPOWERDOWN>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
verial:
CE=1
ADRS=WRITE_REG6
SHIFTOUT mosi,sck,1,[ADRS]
shiftin miso,sck,0,[VERI]
if veri=$40 then  'status registerinde rx_dr biti 1 olduğunda yani veri geldiğinde
RETURN
else
goto verial:


'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
NRFGONDER:
SHIFTOUT mosi, sck, 1,[ADRS]
SHIFTOUT mosi, sck, 1,[VERI]
pause 50
return

END


erdogan2734

Alıntı yapılan: cemilsivas - 06 Eylül 2016, 18:15:34
Merhaba hocalarım. Datasheeti defalarda okuyarak ve  Erdogan hocamın da yönlendirmesiyle rx için şu şekilde kod bloğu oluşturdum. Kod aralarındaki soruları cevaplandırabilirseniz sevinirim.
Yanlış anlaşılmak istemiyorum. Kodları tekrar yazın ya da kodları düzeltin demiyorum. En azından yaptığım mantık hatalarını söylerseniz sevinirim. Herkese teşekkür ederim.

'****************************************************************
'*  Name    : NRF24+RX.BAS                                      *
'*  Author  :                                       *
'*  Notice  : Copyright (c) 2016 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 28.06.2016                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
'-----------------------------------------------------------------
@ DEVICE pic16F628a                      'işlemci 16F628                               
@ DEVICE pic16F628a, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628a, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628a, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628a, MCLR_off            'MCLR pini kullanılıyor.
@ DEVICE pic16F628a, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
'-----------------------------------------------------------------
DEFINE LCD_DREG PORTA 'LCD data bacakları PortA de bağlı
DEFINE LCD_DBIT 0 'LCD data bacakları 0. bitten başlıyor
DEFINE LCD_EREG PORTA 'LCD Enable Bacağı PortB de bağlı
DEFINE LCD_EBIT 5 'LCD Enable Bacağı 3. bite bağlı
'DEFINE LCD_RWREG    PORTB 'LCD RW Bacağı PortB de bağlı'   RW BACAĞI
'DEFINE LCD_RWBIT      2 'LCD RW Bacağı  2. bite bağlı'   GND YE BAĞLANACAK
DEFINE LCD_RSREG PORTA 'LCD RS Bacağı PortB de bağlı
DEFINE LCD_RSBIT 6 'LCD RS bacağı 1. Bite bağlı
DEFINE LCD_BITS 4 'LCD 4 bit  olarak bağlı
DEFINE LCD_LINES 2 'LCD 2 sıra olarak çalışıyor.

cmcon=7 
OPTION_REG.7 = 0

'************************NRF24 KOMUTLARI**********************************
READ_REG     var byte    '// 0x00  '//Define read command to register
WRITE_REG    var byte    '// 0x20  '// Define write command to register
WRITE_REG1   VAR BYTE 'REG01 EN_AA
WRITE_REG2   VAR BYTE 'REG03 AW
WRITE_REG3   VAR BYTE 'REG04 RETR
WRITE_REG4   VAR BYTE 'REG05 RF_CH
WRITE_REG5   VAR BYTE 'REG06 RF_SETUP
WRITE_REG6   VAR BYTE 'REG07 STATUS
WRITE_REG7   VAR BYTE 'REG10 TX_ADDR
WRITE_REG8   VAR BYTE 'REG0A RX_ADDR
WRITE_REGA   VAR BYTE 'REG1C DYNPD
WRITE_REGB   VAR BYTE 'REG1D FEATURE
WRITE_REGc var byte 'rx için en_rxaddr registeri.

RD_RX_PLOAD         var byte    ' RX payload register address
WR_TX_PLOAD         var byte    ' TX payload register address
FLUSH_TX            var byte    ' flush TX register command
FLUSH_RX            var byte    ' flush RX register command

RFKANAL VAR BYTE
RFADRES VAR WORD
RFSET   VAR BYTE
RFSETR  VAR BYTE

'************************NRF24 KOMUTLARI**********************************
READ_REG            = $00
WRITE_REG           = $20 'REG00 KON.
WRITE_REG1          = $21 'REG01 EN_AA
write_regc          = $22
WRITE_REG2          = $23 'REG03 AW
WRITE_REG3          = $24 'REG04 RETR
WRITE_REG4          = $25 'REG05 RF_CH
WRITE_REG5          = $26 'REG06 RF_SETUP
WRITE_REG6          = $27 'REG07 STATUS
WRITE_REG7          = $30 'REG10 TX_ADDR
WRITE_REG8          = $2A 'REG0A RX_ADDR
WRITE_REGA          = $1C 'REG1C DYNPD
WRITE_REGB          = $1D 'REG1D FEATURE



RD_RX_PLOAD         = $61
WR_TX_PLOAD         = $A0
FLUSH_TX            = $E1
FLUSH_RX            = $E2


'**********************NRF24 KOMUTLARI**********************************
INCLUDE "modedefs.bas"

symbol CE    =PORTB.0
SYMBOL CSN   =PORTB.1
SYMBOL SCK   =PORTB.2
SYMBOL MOSI  =PORTB.3
SYMBOL MISO  =PORTB.4
SYMBOL TUS   =PORTB.5
SYMBOL LED   =PORTB.6

TRISA   = %00000000
TRISB   = %00010000 'miso pinini giriş yaptım.


ADRS  VAR BYTE :ADRS=0
VERI  VAR BYTE :VERI=0

BASLA:
CSN=0
CE=1
PAUSE 250
GOSUB KANALSEC
GOSUB NRFAYAR
GOSUB FLUSHRX

   
   
    TEST:
    GOSUB NRFPOWERUP
    GOSUB verial
    gosub NRFPOWERDOWN
   
    CE=0' standby I modu
    ADRS = RD_RX_PLOAD
     CSN=0
    SHIFTOUT mosi, sck, 1,[ADRS]
    shiftin miso, sck,0,[veri]
    CSN=1
    lcdout $FE,1,bin8 ADRS
    lcdout $FE,$C0,[veri]
pause 500
   
   
    GOTO TEST

'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
'KANAL SEC>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
KANALSEC:
RFKANAL= $02
RFADRES= 11987
RFSET  = $26
RFSETR = $38

RETURN 
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
'NRF AYAR>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
NRFAYAR:

CE=0
CSN=0
ADRS = WRITE_REG
VERI = $79'prim_rx=1 en_crc=1 kesmeler kapalı
GOSUB NRFGONDER
CSN=1

CSN=0
ADRS = WRITE_REG1
VERI = $01' datapipe0 için auto ack açık
GOSUB NRFGONDER
CSN=1

CSN=0
ADRS = WRITE_REGc ' Burada rx için datapipe0 açıyoruz.
VERI = $01
GOSUB NRFGONDER
CSN=1

CSN=0
ADRS = WRITE_REG2
VERI = $02 '4 byte adres genişliği
GOSUB NRFGONDER
CSN=1

CSN=0
ADRS = WRITE_REG3
VERI = RFSETR' 4 retramsmission 1 ms tekrar gönderim aralığı
GOSUB NRFGONDER
CSN=1

CSN=0
ADRS = WRITE_REG4
VERI = RFKANAL ' 2. kanal seçildi
GOSUB NRFGONDER
CSN=1

CSN=0
ADRS = WRITE_REG5
VERI = RFSET ' odBm çıkış gücü, 250 kbps data hızı
GOSUB NRFGONDER
CSN=1

CSN=0
ADRS = WRITE_REG6
VERI = $40'rx_dr=1 hocam bu pini 1 yapıp intterupt barağını mı sıfırlıyoruz?
GOSUB NRFGONDER
CSN=1

CSN=0
ADRS = WRITE_REG7
VERI = RFADRES.LOWBYTE
GOSUB NRFGONDER  'burada adres gönderiyoruz. tx adresi.Benim belirlemem gerekiyor mu?
VERI = RFADRES.HIGHBYTE
GOSUB NRFGONDER
CSN=1

CSN=0
ADRS = WRITE_REG8
VERI = RFADRES.LOWBYTE
GOSUB NRFGONDER ' ERdogan hocamın forumdaki kodunda rx addr belirlenmiş.Tx modunda rx adresini neden belirliyoruz?
VERI = RFADRES.HIGHBYTE
GOSUB NRFGONDER
CSN=1

CSN=0
ADRS = WRITE_REGA
VERI = $0 'dpl şimdilik olmayacağı için burayı 0 yapıyorum.
GOSUB NRFGONDER
CSN=1


CSN=0
ADRS = WRITE_REGB
VERI = $00'buradaki özellikleri kullanmadığım için burayı da 0 yapıyorum.
GOSUB NRFGONDER
CSN=1

RETURN
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
'NRF AYAR>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
FLUSHTX:
VERI=FLUSH_TX
CSN=0
SHIFTOUT mosi, sck, 1,[VERI]
CSN=1
RETURN
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
'FLUSH TX>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
FLUSHRX:
VERI=FLUSH_RX
CSN=0
SHIFTOUT mosi, sck, 1,[VERI]
CSN=1
RETURN
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
'FLUSH RX>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
NRFPOWERUP:
CSN=0
ADRS = WRITE_REG
VERI = $7B 'prx=1, pw_up=1, en_crc=1, tüm kesmeler kapalı.
GOSUB NRFGONDER
CSN=1
PAUSEUS 3000
GOSUB FLUSHTX
RETURN
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
'NRFPOWERUP>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
NRFPOWERDOWN:
CSN=0
ADRS= WRITE_REG
VERI= $48
GOSUB NRFGONDER
CSN=1
RETURN
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
'NRFPOWERDOWN>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
verial:
CE=1
ADRS=WRITE_REG6
SHIFTOUT mosi,sck,1,[ADRS]
shiftin miso,sck,0,[VERI]
if veri=$40 then  'status registerinde rx_dr biti 1 olduğunda yani veri geldiğinde
RETURN
else
goto verial:


'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
NRFGONDER:
SHIFTOUT mosi, sck, 1,[ADRS]
SHIFTOUT mosi, sck, 1,[VERI]
pause 50
return

END



Kullanmadığınız registerlar da değişiklik yapmanıza gerek yok default halde çalışır sizi yormaz diye düşünüyorum.

CSN=0
ADRS = WRITE_REG8
VERI = RFADRES.LOWBYTE
GOSUB NRFGONDER ' ERdogan hocamın forumdaki kodunda rx addr belirlenmiş.Tx modunda rx adresini neden belirliyoruz?
VERI = RFADRES.HIGHBYTE
GOSUB NRFGONDER
CSN=1


Burada adres belirleme sebebi çift yönlü iletişim olduğunda rf'in rx adresini bilmesi gerekir. Çift yönlü iletişim için.


CSN=0
ADRS = WRITE_REG6
VERI = $40'rx_dr=1 hocam bu pini 1 yapıp intterupt barağını mı sıfırlıyoruz?
GOSUB NRFGONDER
CSN=1


Burada dediğniz gibi veri geldiğinde değişen değeri, yeni değer geldiğinde bilgi vermesi için sıfırlıyoruz.

CSN=0
ADRS = WRITE_REG7
VERI = RFADRES.LOWBYTE
GOSUB NRFGONDER  'burada adres gönderiyoruz. tx adresi.Benim belirlemem gerekiyor mu?
VERI = RFADRES.HIGHBYTE
GOSUB NRFGONDER
CSN=1


Tx adresini senin belirlemen gerekiyor. Sadece gönderim yapmak istersen sadece tx adresini belirtseniz yeterli olur.
Ancak karşılıklı veri alışverşi yapmak için rx adresini de belirtmeniz gerekir.

Umarım cevaplarım işinizi görür.


Erdoğan
İmkansızın zaman aldığı bir dünya'da bana zorluktan bahsetme!

Powered by EzPortal