اطلاعیه

Collapse
No announcement yet.

مشکل با ماژول nRF24L01+

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل با ماژول nRF24L01+

    سلام دوستام خسته نباشید!
    من دو تا ماژول nrf24l01 خریدم ولی هنوز نتونستم راشون بندازم!
    ابن برنامه که من نوشتم البته بعضی جاهاش از جای دیگه برداشتم!میشه اشکالاتشو بهم بگید!
    الان هر چقدر امتحان میگنم اطلاعات ارسال نمیشه!!!
    قسمت فرستنده:
    کد:
    '/http://avrproject.ru
    '/2012
    $regfile = "M16def.dat"
    $crystal = 16000000
    $hwstack = 40
    $swstack = 20
    $framesize = 40
    
    '=== Declare sub routines
    Declare Sub R_register(byval Command As Byte , Byval C_bytes As Byte)
    Declare Sub W_register(byval C_bytes As Byte)
    
    '=== Constante ===
    'Define nRF24L01 interrupt flag's
    Const Idle_int = &H00                    'Idle, no interrupt pending
    Const Max_rt = &H10                     'Max #of Tx Retrans Interrupt
    Const Tx_ds = &H20                     'Tx Data Sent Interrupt
    Const Rx_dr = &H40                     'Rx Data Received
    
    'SPI(nRF24L01) commands
    
    Const Read_reg = &H00                    'Define Read Command To Register
    Const Write_reg = &H20                   'Define Write Command To Register
    Const Rd_rx_pload = &H61                  'Define Rx Payload Register Address
    Const Wr_tx_pload = &HA0                  'Define Tx Payload Register Address
    Const Flush_tx = &HE1                    'Define Flush Tx Register Command
    Const Flush_rx = &HE2                    'Define Flush Rx Register Command
    Const Reuse_tx_pl = &HE3                  'Define Reuse Tx Payload Register Command
    Const Nop_comm = &HFF                    'Define No Operation , Might Be Used To Read Status Register
    'SPI(nRF24L01) registers(addresses)
    Const Config_nrf = &H00                   'Config' register address
    Const En_aa = &H01                     'Enable Auto Acknowledgment' register address
    Const En_rxaddr = &H02                   'Enabled RX addresses' register address
    Const Setup_aw = &H03                    'Setup address width' register address
    Const Setup_retr = &H04                   'Setup Auto. Retrans' register address
    Const Rf_ch = &H05                     'RF channel' register address
    Const Rf_setup = &H06                    'RF setup' register address
    Const Status = &H07                     'Status' register address
    Const Observe_tx = &H08                   'Observe TX' register address
    Const Cd = &H09                       'Carrier Detect' register address
    Const Rx_addr_p0 = &H0A                   'RX address pipe0' register address
    Const Rx_addr_p1 = &H0B                   'RX address pipe1' register address
    Const Rx_addr_p2 = &H0C                   'RX address pipe2' register address
    Const Rx_addr_p3 = &H0D                   'RX address pipe3' register address
    Const Rx_addr_p4 = &H0E                   'RX address pipe4' register address
    Const Rx_addr_p5 = &H0F                   'RX address pipe5' register address
    Const Tx_addr = &H10                    'TX address' register address
    Const Rx_pw_p0 = &H11                    'RX payload width, pipe0' register address
    Const Rx_pw_p1 = &H12                    'RX payload width, pipe1' register address
    Const Rx_pw_p2 = &H13                    'RX payload width, pipe2' register address
    Const Rx_pw_p3 = &H14                    'RX payload width, pipe3' register address
    Const Rx_pw_p4 = &H15                    'RX payload width, pipe4' register address
    Const Rx_pw_p5 = &H16                    'RX payload width, pipe5' register address
    Const Fifo_status = &H17                  'FIFO Status Register' register address
    
    
    Dim D_bytes(33) As Byte , B_bytes(33) As Byte        'Dim the bytes use for SPI, D_bytes = outgoing B_bytes = Incoming
    Dim Temp As Byte , W As Word
    Dim Packet_count As Byte
    
    
    
    '=== Config hardware ===
    Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 16 , Noss = 1
    
    'Software SPI is NOT working with the nRF24L01, use hardware SPI only, but the SS pin must be controlled by our self
    
    Config Pinb.0 = Output                   'CE pin is output
    Config Pinb.4 = Output                   'SS pin is output
    Config Pinc.5 = Input                    'IRQ pin is input
    
     Ce Alias Portb.0
     Ss Alias Portb.4
     Irq Alias Pinc.5
    
    'ïîäêëþ÷åíèå ñâåòîäèîäîâ èíäèêàöèè
    Config Portd.1 = Output
    Config Portd.2 = Output
    Red_led Alias Portd.3
    Green_led Alias Portd.4
    
    
    
    'ïîäêëþ÷åíèå äàò÷èêà
    '====================================================================================
    
    
    Dim Byte0 As Byte
    Dim Byte1 As Byte
    Dim Sign As String * 1
    Dim T As Byte
    Dim T1 As Byte
    Dim T2 As Byte
    
    '==================================================================================
    
    
    
    Red_led = 1
    Green_led = 1
    Waitms 20
    Red_led = 0
    Green_led = 0
    Waitms 60
    Red_led = 1
    Green_led = 1
    Waitms 20
    Red_led = 0
    Green_led = 0
    
    
    Spiinit                           'init the spi pins
    
    Set Ce
    Waitms 10                          'Wait a moment until all hardware is stable
    Reset Ce                          'Set CE pin low
    Reset Ss                          'Set SS pin low (CSN pin)
    
    
    
    Red_led = 1
    
     D_bytes(1) = Flush_tx                   'Flush the TX_fifo buffer
    Call W_register(1)
     D_bytes(1) = Write_reg + Status              'Reset the IRQ bits
     D_bytes(2) = &B00110000
    Call W_register(2)
    Red_led = 0
    
    
    T1 = 10
    Do
    
    
    '==============================================================================
    'ïîäãîòîâêà äàííûõ
    'îïðîñ äàò÷èêà
    
    
    
    
    '==============================================================================
    
    
    
    
                                'Main loop for TX
    
    Green_led = 1
    
    Incr Packet_count                      'Increase the send packet counter, for test only
    
    If Packet_count > 254 Then Packet_count = 0
    
    Gosub Setup_tx                       'Setup the nrf24l01 for TX
     D_bytes(1) = Wr_tx_pload                  'Put 5 bytes in the TX pload buffer
     D_bytes(2) = T1                      'Byte 1  - îòïðàâëÿåìàÿ òåìïåðàòóðà
     D_bytes(3) = &HBB                     'Byte 2 - îñòàëüíûå 4 áàéòà ìîæíî òàêæå èñïîëüçîâàòü â ñâîèõ öåëÿõ
     D_bytes(4) = &HCC                     'Byte 3
     D_bytes(5) = &H11                     'Byte 4
     D_bytes(6) = Packet_count                 'Byte 5
    Call W_register(6)                     'Write 6 bytes to register
    
    Waitms 2
    
    Set Ce                           'Set CE for a short moment to transmit the fifo buffer
    Waitms 1                          '
    Reset Ce                          '
    Waitms 100                         'Some delay to read the output on the terminal, line can be removed for max. speed
    
     W = 0                           'Counter for time out
    
    
    
     Do
    
     Red_led = 1
    
     If Irq = 0 Then
      Call R_register(status , 1)
      Temp = B_bytes(1) And &B01110000             'Mask the IRQ bits out the status byte
    
      Select Case Temp                     'Which IRQ occurs
      Case Max_rt                       'MAX_RT
       Print "Maximum number of TX retries, Flushing the TX buffer now !"
       D_bytes(1) = Flush_tx                 'Flush the TX buffer
       Call W_register(1)
       D_bytes(1) = Write_reg + Status
       D_bytes(2) = &B00010000                'Clear the MAX_RT IRQ bit
       Call W_register(2)
       Waitms 10
       Red_led = 0
       Exit Do
      Case Tx_ds                       'TX_DS
       Print "Packet " ; Packet_count ; " send and ACK received."
       D_bytes(1) = Write_reg + Status
       D_bytes(2) = &B00100000                'Clear the TX_DS IRQ bit
       Call W_register(2)
       Waitms 10
       Red_led = 0
       Exit Do
      Case Else                        'Other IRQ ??
       Print "Other irq " ; Bin(temp)
       D_bytes(1) = Flush_tx                 'Flush the TX buffer
       Call W_register(1)
       D_bytes(1) = Write_reg + Status
       D_bytes(2) = &B00110000                'Clear both MAX_RT, TX_DS bits
       Call W_register(2)
      End Select
     End If
    
     Waitms 1                         'Time out waiting for IRQ 1ms * 100
     Incr W                          'Increment W
      If W > 200 Then                     'Waited for 200ms
      Print "No irq response from RF24L01 within 100ms"
      Exit Do                         'Exit the wait loop
      End If
    
    
    
    
     Loop
    
    Red_led = 0
    Wait 1
    
    Loop
    
    
    
    '=== Sub routines ===
    Sub W_register(byval C_bytes As Byte)            'Write register with SPI
    Reset Ss                          'Manual control SS pin, set SS low before shifting out the bytes
     Spiout D_bytes(1) , C_bytes                'Shiftout the data bytes trough SPI , C_bytes is the amount bytes to be written
    Set Ss                           'Set SS high
    End Sub
    
    Sub R_register(byval Command As Byte , Byval C_bytes As Byte) As Byte    'C_bytes = Count_bytes, number off bytes to be read
    Reset Ss                          'Manual controle SS pin, set low before shifting in/out the bytes
     Spiout Command , 1                     'First shiftout the register to be read
     Spiin B_bytes(1) , C_bytes                 'Read back the bytes from SPI sended by nRF20L01
    Set Ss                           'Set SS back to high level
    End Sub
    
    
    Setup_tx:                          'Setup for TX
    
     D_bytes(1) = Write_reg + Tx_addr              'TX adress
     D_bytes(2) = &H34
     D_bytes(3) = &H43
     D_bytes(4) = &H10
     D_bytes(5) = &H10
     D_bytes(6) = &H01
    Call W_register(6)
     D_bytes(1) = Write_reg + Rx_addr_p0            'RX adress for pipe0
     D_bytes(2) = &H34
     D_bytes(3) = &H43
     D_bytes(4) = &H10
     D_bytes(5) = &H10
     D_bytes(6) = &H01
    Call W_register(6)
     D_bytes(1) = Write_reg + En_aa               'Enable auto ACK for pipe0
     D_bytes(2) = &H01
    Call W_register(2)
     D_bytes(1) = Write_reg + En_rxaddr             'Enable RX adress for pipe0
     D_bytes(2) = &H01
    Call W_register(2)
     D_bytes(1) = Write_reg + Rf_ch               'Set RF channel
     D_bytes(2) = 40
    Call W_register(2)
     D_bytes(1) = Write_reg + Rf_setup             'Setup RF-> Output power 0dbm, datarate 2Mbps and LNA gain on
     D_bytes(2) = &H0F
    Call W_register(2)
     D_bytes(1) = Write_reg + Config_nrf            'Setup CONFIG-> PRX=0(TX_device), PWR_UP=1, CRC 2bytes, Enable CRC
     D_bytes(2) = &H0E
    Call W_register(2)
    
    Return
    اميدوارم خدا پنجره باز اتاقتون باشه!

    #2
    پاسخ : مشکل با ماژول nRF24L01+



    قسمت گیرنده:
    کد:
    '/http://avrproject.ru
    '/2012
    $regfile = "M16def.dat"
    $crystal = 16000000
    $hwstack = 40
    $swstack = 20
    $framesize = 40
    
    
    
    
    'êîíôèãóðàöèÿ äèñïëåÿ
    '===============================================================================================================
    Config Lcdpin = Pin , Rs = Porta.2 , E = Porta.1 , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7
    Config Lcd = 16 * 2
    Cursor Off
    Cls
    
    '===============================================================================================================
    
    
    '=== Declare sub routines
    Declare Sub R_register(byval Command As Byte , Byval C_bytes As Byte)
    Declare Sub W_register(byval C_bytes As Byte)
    
    '=== Constante ===
    'Define nRF24L01 interrupt flag's
    Const Idle_int = &H00                    'Idle, no interrupt pending
    Const Max_rt = &H10                     'Max #of Tx Retrans Interrupt
    Const Tx_ds = &H20                     'Tx Data Sent Interrupt
    Const Rx_dr = &H40                     'Rx Data Received
    'SPI(nRF24L01) commands
    
    Const Read_reg = &H00                    'Define Read Command To Register
    Const Write_reg = &H20                   'Define Write Command To Register
    Const Rd_rx_pload = &H61                  'Define Rx Payload Register Address
    Const Wr_tx_pload = &HA0                  'Define Tx Payload Register Address
    Const Flush_tx = &HE1                    'Define Flush Tx Register Command
    Const Flush_rx = &HE2                    'Define Flush Rx Register Command
    Const Reuse_tx_pl = &HE3                  'Define Reuse Tx Payload Register Command
    Const Nop_comm = &HFF                    'Define No Operation , Might Be Used To Read Status Register
    'SPI(nRF24L01) registers(addresses)
    Const Config_nrf = &H00                   'Config' register address
    Const En_aa = &H01                     'Enable Auto Acknowledgment' register address
    Const En_rxaddr = &H02                   'Enabled RX addresses' register address
    Const Setup_aw = &H03                    'Setup address width' register address
    Const Setup_retr = &H04                   'Setup Auto. Retrans' register address
    Const Rf_ch = &H05                     'RF channel' register address
    Const Rf_setup = &H06                    'RF setup' register address
    Const Status = &H07                     'Status' register address
    Const Observe_tx = &H08                   'Observe TX' register address
    Const Cd = &H09                       'Carrier Detect' register address
    Const Rx_addr_p0 = &H0A                   'RX address pipe0' register address
    Const Rx_addr_p1 = &H0B                   'RX address pipe1' register address
    Const Rx_addr_p2 = &H0C                   'RX address pipe2' register address
    Const Rx_addr_p3 = &H0D                   'RX address pipe3' register address
    Const Rx_addr_p4 = &H0E                   'RX address pipe4' register address
    Const Rx_addr_p5 = &H0F                   'RX address pipe5' register address
    Const Tx_addr = &H10                    'TX address' register address
    Const Rx_pw_p0 = &H11                    'RX payload width, pipe0' register address
    Const Rx_pw_p1 = &H12                    'RX payload width, pipe1' register address
    Const Rx_pw_p2 = &H13                    'RX payload width, pipe2' register address
    Const Rx_pw_p3 = &H14                    'RX payload width, pipe3' register address
    Const Rx_pw_p4 = &H15                    'RX payload width, pipe4' register address
    Const Rx_pw_p5 = &H16                    'RX payload width, pipe5' register address
    Const Fifo_status = &H17                  'FIFO Status Register' register address
    'Various
    Const True = 1
    Const False = 0
    
    
    '=== Config hardware ===
    Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1
    
    'Software SPI is NOT working with the nRF24L01, use hardware SPI only, but the SS pin must be controlled by our self
    
    
    
    Config Pinb.0 = Output                   'CE pin is output
    Config Pinb.4 = Output                   'SS pin is output
    Config Pinc.5 = Input                    'IRQ pin is input
    
     Ce Alias Portb.0
     Ss Alias Portb.4
     Irq Alias Pinc.5
    
    'ïîäêëþ÷åíèå ñâåòîäèîäîâ èíäèêàöèè
    Config Portd.1 = Output
    
    Red_led Alias Portd.1
    
    
    
    
    
    Red_led = 1
    
    Waitms 20
    Red_led = 0
    
    Waitms 60
    Red_led = 1
    
    Waitms 20
    Red_led = 0
    
    
    
    
    Spiinit                           'init the spi pins
    
    Set Ce
    Waitms 10                          'Wait a moment until all hardware is stable
    Reset Ce                          'Set CE pin low
    Reset Ss                          'Set SS pin low (CSN pin)
    Dim D_bytes(33) As Byte , B_bytes(33) As Byte        'Dim the bytes use for SPI, D_bytes = outgoing B_bytes = Incoming
    Dim Temp As Byte , W As Word
    Dim Packet_count As Byte
    
    
    
    
    
    Goto Main_rx
    
    Main_rx:
    
    
    Lcd "NRF24L01+DS18B20"
    Lowerline
    Lcd "AVRproject.ru"
    
    Wait 2
    
    
    
    Call R_register(status , 1)                 'Read STATUS register
    Reset Ce                          'Set CE low to access the registers
    Gosub Setup_rx                       'Setup the nRF24L01 for RX
    Waitms 2                          'Add a delay before going in RX
    Set Ce                           'Set nRF20L01 in RX mode
    
    Do                             'Main loop for RX
    
    If Irq = 0 Then                       'Åñëè íà âûâîäå IRQ íèçêèé óðîâåíü â áóôåð ïðèåìíèêà ÷òî-òî ïîïàëî
    
     Red_led = 1
    
     Reset Ce                          'Receiver must be disabled before reading pload
    
     Do                             'Loop until all 3 fifo buffers are empty
     Call R_register(rd_rx_pload , 5)              'Read 5 bytes RX pload register
    
     'âûâîä ðåçóëüòàòîâ
     '===============================================================================================================
     Home
     Lcd "Temperature: " ; Hex(b_bytes(1)) ; Hex(b_bytes(2)) ; Hex(b_bytes(3)) ; Hex(b_bytes(4)) ; Hex(b_bytes(5))    'Print the pload
    
     Cls
     Lcd "NRF24L01+DS18B20"
     Lowerline
     Lcd "T: " ; B_bytes(1) ; "C"                'òåìïåðàòóðà
    
    
    
    
     Call R_register(fifo_status , 1)              'Read FIFO_STATUS
     Loop Until B_bytes(1).0 = True               'Test or RX_EMPTY bit is true, RX FIFO empty
    
     D_bytes(1) = Write_reg + Status              'Reset the RX_DR status bit
     D_bytes(2) = &B01000000                  'Write 1 to RX_DR bit to reset IRQ
     Call W_register(2)
     Set Ce                           'Enable receiver again
     Waitms 2
    
    End If
    
    
    Red_led = 0
    
    Loop
    Return
    
    
    
    '=== Sub routines ===
    Sub W_register(byval C_bytes As Byte)            'Write register with SPI
    Reset Ss                          'Manual control SS pin, set SS low before shifting out the bytes
     Spiout D_bytes(1) , C_bytes                'Shiftout the data bytes trough SPI , C_bytes is the amount bytes to be written
    Set Ss                           'Set SS high
    End Sub
    
    Sub R_register(byval Command As Byte , Byval C_bytes As Byte) As Byte    'C_bytes = Count_bytes, number off bytes to be read
    Reset Ss                          'Manual controle SS pin, set low before shifting in/out the bytes
     Spiout Command , 1                     'First shiftout the register to be read
     Spiin B_bytes(1) , C_bytes                 'Read back the bytes from SPI sended by nRF20L01
    Set Ss                           'Set SS back to high level
    End Sub
    
    
     Setup_rx:                         'Setup for RX
     D_bytes(1) = Write_reg + Rx_addr_p0            'RX adress for pipe0
     D_bytes(2) = &H34
     D_bytes(3) = &H43
     D_bytes(4) = &H10
     D_bytes(5) = &H10
     D_bytes(6) = &H01
    Call W_register(6)                     'Send 6 bytes to SPI
     D_bytes(1) = Write_reg + En_aa               'Enable auto ACK for pipe0
     D_bytes(2) = &H01
    Call W_register(2)
     D_bytes(1) = Write_reg + En_rxaddr             'Enable RX adress for pipe0
     D_bytes(2) = &H01
    Call W_register(2)
     D_bytes(1) = Write_reg + Rf_ch               'Set RF channel
     D_bytes(2) = 40
    Call W_register(2)
     D_bytes(1) = Write_reg + Rx_pw_p0             'Set RX pload width for pipe0
     D_bytes(2) = 5
    Call W_register(2)
     D_bytes(1) = Write_reg + Rf_setup             'Setup RF-> Output power 0dbm, datarate 2Mbps and LNA gain on
     D_bytes(2) = &H0F
    Call W_register(2)
     D_bytes(1) = Write_reg + Config_nrf            'Setup CONFIG-> PRX=1(RX_device), PWR_UP=1, CRC 2bytes, Enable CRC
     D_bytes(2) = &H0F
    Call W_register(2)
    Return
    Return
    ممنون میشم کمکم کنید
    اميدوارم خدا پنجره باز اتاقتون باشه!

    دیدگاه


      #3
      پاسخ : مشکل با ماژول nRF24L01+

      سلام فکر کنم شما اگه سوییچ کنی رو زبان c بیشتر نتیجه بگیری چون اکثر منابع با این زبانه
      البته این فقط یه نظر شخصیه تصمیم با خودتونه

      دیدگاه


        #4
        پاسخ : مشکل با ماژول nRF24L01+

        ممنون ولی خدمت مقدس سربازی نمیزاره برم با c کار کنم! کلا من 1-2 روز تو 2 هفته وقت ازاد دارم بخاطر همین باید با همین بسکام راش بندازم!
        الان من نمیدونم مشکل از ماژولاست یا برنامه!
        راهی است بتونم ماژولارو امتحان کنم؟
        اميدوارم خدا پنجره باز اتاقتون باشه!

        دیدگاه


          #5
          پاسخ : مشکل با ماژول nRF24L01+

          سلام
          دوست من راهی برای این قضیه وجود نداره. برای راحتی میتونی از پورت سریال کمک بگیری اما در کل باید همزمان هر دو کار کنند که بتونی بفهمی کار میکنه یا نه. واقعا همین قضیه خیلی مارو اذیت کرد. در ضمن دوستمون درست گفتند حتی المقدور به سی برید وگرنه کارتون سخت تر هم میشه.
          با احترام.

          دیدگاه


            #6
            پاسخ : مشکل با ماژول nRF24L01+

            سلام
            من با بسکام کا نکردم اما چون خودم دنبال راه اندازی ماژول nrf هستم اومدم اینجا یه فضولی بکنم:
            من از بسکام چیزی یادم نیست اما یه نکته توی کدهاتون دیدم گفتم یاد آوری کنم شاید مشکلتون حل بشه:
            کد:
            $regfile = "M16def.dat"
            $crystal =[color=red] 16000000[/color]
            
            '=== Config hardware ===
            Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 ,[color=red] Clockrate = 4 [/color], Noss = 1
            شما فرکانس کاریتون ۱۶ هست که تقسیم بر کلاک واحد اس پی آی میشه 4 مگ!
            هنوز ماژول نتونسته به این سرعت برسه
            فرکانس رو کم کنید ببینید نتیجه میده یانه!

            دیدگاه


              #7
              پاسخ : مشکل با ماژول nRF24L01+

              اینا سر زدی؟
              http://www.eca.ir/forum2/index.php?topic=78587.0
              زکات علم نشر آن است

              دیدگاه


                #8
                پاسخ : مشکل با ماژول nRF24L01+

                نوشته اصلی توسط amin_a_y
                سلام دوستام خسته نباشید!
                من دو تا ماژول nrf24l01 خریدم ولی هنوز نتونستم راشون بندازم!
                ابن برنامه که من نوشتم البته بعضی جاهاش از جای دیگه برداشتم!میشه اشکالاتشو بهم بگید!
                الان هر چقدر امتحان میگنم اطلاعات ارسال نمیشه!!!
                سلام
                دوست عزیز این برنامه ای که شما از اینترنت گرفتی مشکل نداره .بلکه این برنامه برای انتقال دما توسط سنسور ds18b20 هست .اگر سنسور ذکر شده رو دارید با اون تست کنید و یا اگر lm35 دارید برنامه مذکور رو تغیر بدید و تست کنید و قطعا جواب خواهید گرفت .
                یا به اندازه آرزوهایت تلاش میکنی یا به اندازه تلاشت ارزو میکنی

                دیدگاه

                لطفا صبر کنید...
                X