NRF24L01 Kullanımı

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

_tnt

#60
Programdaki register adresleri yanlışmı?
EN_AA nın =$01 olması gerekmezmi. Benim doğru gördüklerim $00,$1C ve $1D adresleri.

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



'Register      DEC  HEX
CONFIG      con 0  '00
EN_AA       con 1  '01
EN_RXADDR   con 2  '02
SETUP_AW    CON 3  '03
SETUP_RETR  CON 4  '04
RF_CH       CON 5  '05
RF_SETUP    CON 6  '06
STATUS      CON 7  '07
OBSERVE_TX  CON 8  '08
CD          CON 9  '09
RX_ADDR_P0  CON 10 '0A
RX_ADDR_P1  CON 11 '0B
RX_ADDR_P2  CON 12 '0C
RX_ADDR_P3  CON 13 '0D
RX_ADDR_P4  CON 14 '0E
RX_ADDR_P5  CON 15 '0F
TX_ADDR     CON 16 '10
RX_PW_P0    CON 17 '11
RX_PW_P1    CON 18 '12
RX_PW_P2    CON 19 '13
RX_PW_P3    CON 20 '14
RX_PW_P4    CON 21 '15
RX_PW_P5    CON 22 '16
FIFO_STATUS CON 23 '17
DYNPD       CON 28 '1C
FEATURE     CON 29 '1D




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

buradaki rfsetr=$38    arc değeri =1000 yani 8 re-transmite denk geliyor.
diğer mevzu power-up kısmında $7b gönderilmiş fakat down kısmında $48.Up kısmında yapılan ayarların bozulmaması için bununda $79 yapılması gerekirdi.


erdogan2734

Adresler yanlış değil. Registerlera yazmak için 0x20 değerini yollamanız gerekir. Adres belirlerkende bu değerle yazmak istediğin adresi toplaman gerek. En aa için 0x21 yazılması bundandır. Bu benim mantigim da yazılan bir yazılımdı.

Diğer bur konu ise, yazılım elden ele dolaştığı için benlik bir durum değil. Ben su anda 15 retransmit kullaniyorum.
Erdoğan
İmkansızın zaman aldığı bir dünya'da bana zorluktan bahsetme!

_tnt

Merhabalar.
Registerlerin default değerlerini okuyabiliyorum ama içine değer yazamıyorum,hatam nedir acaba?
okumak için kullandığım kod
LOW CS
SHIFTOUT MOSI,SCK, 1,[ADRS]
SHIFTin  MISO,SCK, 0,[VERI]
PAUSEUS 50
HIGH CS
HSEROUT [BIN8 VERI,10,13]

yazmak için;
LOW CE
LOW CS
ADRS=32
VERI=%01001010
SHIFTOUT MOSI,SCK, 1,[ADRS,VERI]
PAUSEUS 50
HIGH CS

erdogan2734

#63
İstersen adres ile yazmak istediğin veriyi ayrı ayrı yollamayı dene bende senin gibi araya gecikme koymamış hali ile okuyup yazıyorum.

Birde adres değerini binary yollarmısın, bi değişiklik olacağını sanmıyorum ama (çünkü makina direk binary e ceviriyor) denemek lazim.
Erdoğan
İmkansızın zaman aldığı bir dünya'da bana zorluktan bahsetme!

_tnt

Öyle denemiştim aslında ama iki adresin arasına gecikme koymak gerekirmi onuda deniycem. Pic 32 Mhz de belki fazla hızlıdır.

erdogan2734

#65
Ben 64 mhz de çalışıyorum, dikkatli bakmak gerek belki gözünden kaçan başka birşey vardır. İki adres arasına gecikme koyma na gerek yok.
Erdoğan
İmkansızın zaman aldığı bir dünya'da bana zorluktan bahsetme!

_tnt

Biraz sakin kafayla çalışmak lazımmış. Okuma ve yazma için örnek program en azından modülü test etmek için kullanılabilir.
0-9 arası tuşlar 0-9 arasındaki registerleri okumak için.asdfzxcv harfleri de 0 adresindeki registere yazmak için.
'PIC18F25K22   XTAL=8Mhz
@ __CONFIG _CONFIG1H, _FOSC_HSMP_1H & _PLLCFG_ON_1H
@ __CONFIG _CONFIG2L, _PWRTEN_ON_2L & _BOREN_OFF_2L
@ __CONFIG _CONFIG2H, _WDTEN_OFF_2H
@ __CONFIG _CONFIG3H, _MCLRE_EXTMCLR_3H
@ __CONFIG _CONFIG5L, _CP0_ON_5L & _CP1_ON_5L & _CP2_ON_5L & _CP3_ON_5L
@ __CONFIG _CONFIG5H, _CPB_ON_5H & _CPD_ON_5H
define OSC 32
INCLUDE "modedefs.bas"
'USART1
RCSTA1 = $90 ' Enable serial port & continuous receive
TXSTA1 = $20 ' Enable transmit, BRGH = 0
SPBRG1 = 51 ' 9600 Baud @ 32MHz, 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
INTCON=%11000000
ON INTERRUPT GOTO INT
SYMBOL GIE  =INTCON.7   
SYMBOL PEIE =INTCON.6 
SYMBOL RCIE =PIE1.5     'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5     'USART Receive interrupt flag bit
RCIE=1
PEIE=1
GIE=1

ANSELA   = %00000011
ANSELB   = 0
ANSELC   = 0

TRISA=%00000011
TRISB=%00010011
TRISC=%10000000

PORTA=0
PORTB=0
PORTC=0

IRQ         VAR PORTB.0
SCK         VAR PORTB.1
MISO        VAR PORTB.2
MOSI        VAR PORTB.6
CE          VAR PORTB.3
CS          VAR PORTB.7
BT          VAR PORTB.4'Buton1

RX_DATA     VAR BYTE
X           VAR BYTE
ADRS        VAR BYTE
VERI        VAR BYTE
PAUSE 500
CLEAR
HSEROUT ["TERMINAL-1",10,13]
pause 100
ce=0

MAIN:
'Okuma----------------
IF X=1 THEN
CS=0
veri=0
SHIFTOUT MOSI,SCK, 1,[ADRS]
SHIFTin  MISO,SCK, 0,[VERI]
CS=1
HSEROUT [BIN8 VERI,10,13]
X=0
ENDIF
'Yazma----------------
IF X=2 THEN
CS=0
ADRS=32
SHIFTOUT MOSI,SCK, 1,[ADRS,veri]
CS=1
X=0
ENDIF
GOTO MAIN   

DISABLE
INT:
GIE=0
hserin [RX_DATA]

    SELECT CASE RX_DATA
    'Okuma
    CASE 48 '0
    ADRS=0:x=1
    CASE 49 '1
    ADRS=1:x=1
    CASE 50 '2
    ADRS=2:x=1
    CASE 51 '3
    ADRS=3:x=1
    CASE 52 '4
    ADRS=4:x=1
    CASE 53 '5
    ADRS=5:x=1
    CASE 54 '6
    ADRS=6:x=1
    CASE 55 '7
    ADRS=7:x=1
    CASE 56 '8
    ADRS=8:x=1
    CASE 57 '9
    ADRS=9:x=1
    'Yazma
    case 97  'a
    veri=%00000000 :x=2
    case 115 's
    veri=%00000001 :x=2
    case 100 'd
    veri=%00000011 :x=2
    case 102 'f
    veri=%00000100 :x=2
    case 122 'z
    veri=%00000101 :x=2
    case 120 'x
    veri=%00000111 :x=2
    case 99  'c
    veri=%00001000 :x=2
    case 118 'v
    veri=%01001010 :x=2
    END SELECT 

RCIF=0
GIE=1
Resume
enable

end

cemilsivas

Alıntı yapılan: _tnt - 18 Eylül 2016, 12:33:27
buradaki rfsetr=$38    arc değeri =1000 yani 8 re-transmite denk geliyor.
diğer mevzu power-up kısmında $7b gönderilmiş fakat down kısmında $48.Up kısmında yapılan ayarların bozulmaması için bununda $79 yapılması gerekirdi.
Teşekkür ediyorum hocam.

cemilsivas

Hocalarım kolay gelsin. Bu saate kadar nrf nin default değerlerini okumak için program yazdım. Ancak sadece adres değerlerini %11111111 olarak okuyabildim. Programda mı yoksa modülde mi sorun olabilir?

cemilsivas

#69

'-----------------------------------------------------------------
@ 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_ON            'MCLR pini kullanılıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
'-----------------------------------------------------------------
DEFINE LCD_DREG PORTB 'LCD data bacakları PortB de bağlı
DEFINE LCD_DBIT 0 'LCD data bacakları 4. bitten başlıyor
DEFINE LCD_EREG PORTA 'LCD Enable Bacağı PortB de bağlı
DEFINE LCD_EBIT 6 'LCD Enable Bacağı 3. bite bağlı
DEFINE LCD_RSREG PORTA 'LCD RS Bacağı PortB de bağlı
DEFINE LCD_RSBIT 7 '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.
PAUSE 200
'************************NRF24 KOMUTLARI**********************************
READ_REG     var byte    '// 0x00  '//Define read command to register
WRITE_REG    var byte    '// 0x20  '// Define write command to register

ayar var byte

'************************NRF24 KOMUTLARI**********************************
READ_REG            = $00
WRITE_REG           = $20 'REG00 KON.

'**********************NRF24 KOMUTLARI**********************************
symbol CE    =PORTA.2
SYMBOL CSN   =PORTA.3
SYMBOL SCK   =PORTA.0
SYMBOL MOSI  =PORTA.1
SYMBOL MISO  =PORTB.6
SYMBOL TUS   =PORTB.7
TRISA   = %00000000
TRISB   = %11000000 'miso pinini giriş yaptım.
porta=0
portb=0

ayar=0
ADRS  VAR BYTE :ADRS=0
VERI  VAR BYTE :VERI=0
ilk:
lcdout $fe,1,"Devam etmek icin"
lcdout $fe,$c0,"Bir tusa basın"
dongu:
if tus=1 then
while tus=1:wend
goto devam
endif
goto dongu

devam:
lcdout $fe,1,"Su an devamdayz"
lcdout $fe,$c0,"Tusa bas"
while tus=1 then:wend

ce=0

BASLA:
if tus=1 then
while tus=1:wend
gosub nrfuyan
gosub oku
gosub nrfkapat
ayar=ayar+1
endif
goto basla

nrfuyan:
CSN=0
adrs=write_reg
veri=$7B
shiftout mosi,sck,1,[adrs,veri]
CSN=1

csn=0
adrs=write_reg+1
veri=%11100111  ' Bu ayarı sadece denemek için verdim.
shiftout mosi,sck,1,[adrs,veri]
csn=1


return

oku:

CSN=0
adrs=read_reg+ayar
shiftout mosi,sck,1,[adrs]
shiftin miso,sck,0,[veri]
CSN=1
lcdout $fe,1,"Adres :",bin8 adrs
lcdout $fe,$c0,"Veri :",bin8 veri
  return

nrfkapat:
adrs=write_reg
veri=79
CSN=0
shiftout mosi,sck,1,[adrs,veri]
CSN=1
return

_tnt

Yukarıda verdiğim kodları bi deneyin isterseniz.Terminal programıyla (ben Termite kullanıyorum) test edebilirsiniz.Bende yarın fırsat bulduğum kadarıyla veri gönderip almaya çalışıcam.

cemilsivas

#71
Alıntı yapılan: _tnt - 20 Eylül 2016, 22:33:45
Yukarıda verdiğim kodları bi deneyin isterseniz.Terminal programıyla (ben Termite kullanıyorum) test edebilirsiniz.Bende yarın fırsat bulduğum kadarıyla veri gönderip almaya çalışıcam.
Hocam sizin verdiğiniz kodda okuma bölümünü de denedim. Baktığım adreslerden veriler geliyor. Ama veriler default değeri olarak gelmiyor. Neden olabilir?
Adresi döngü ile gördüğümden olabilir mi?

_tnt

#72
Aşağıdaki kodu bi denermisin. 2sn yede bir adres ve içeriğini görmen gerekecek.

for adrs=0 to 23
CS=0
veri=0
SHIFTOUT MOSI,SCK, 1,[adrs]
SHIFTin MISO,SCK, 0,[veri]
CS=1
pause 2000
lcdout $fe,$80,"Adres :",bin8 adrs
lcdout $fe,$c0,"Veri :",bin8 veri
next

cemilsivas

Alıntı yapılan: _tnt - 21 Eylül 2016, 08:36:08
Aşağıdaki kodu bi denermisin. 2sn yede bir adres ve içeriğini görmen gerekecek.

for adrs=0 to 23
CS=0
veri=0
SHIFTOUT MOSI,SCK, 1,[adrs]
SHIFTin MISO,SCK, 0,[veri]
CS=1
pause 2000
lcdout $fe,$80,"Adres :",bin8 adrs
lcdout $fe,$c0,"Veri :",bin8 veri
next

hocam akşam deneyip bilgivereceğim. Cevaplarınız için çok teşekkür ederim.

cemilsivas

Hatamı buldum hocam. Pull-up dirençlerini kapatmamışım. Pull-up dirençlerini iptal ettiğimde default değerlerini okudum.

Powered by EzPortal