'/http://avrproject.ru '/2012 $regfile = "M8def.dat" $crystal = 16000000 $baud = 19200 $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 Pind.5 = Output 'CE pin is output Config Pinb.2 = Output 'SS pin is output Config Pind.7 = Input 'IRQ pin is input Ce Alias Portd.5 Ss Alias Portb.2 Irq Alias Pind.7 'подключение светодиодов индикации Config Portd.3 = Output Config Portd.4 = Output Red_led Alias Portd.3 Green_led Alias Portd.4 'подключение датчика '==================================================================================== Config 1wire = Portc.0 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) Print "TX_device" 'Send to terminal who i'm 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 Do '============================================================================== 'подготовка данных 'опрос датчика Gosub 18b20 '============================================================================== '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 'опрос датчика '===================================================================== 18b20: 1wreset If Err = 1 Then 'если при опросе небыло ответа ставим флаг ошибки Red_led = 1 Wait 5 Else ' иначе, если ошибки не было, продолжаем опрос датчика 1wwrite &HCC ' Выдаем команду чтения ПЗУ 1wwrite &H44 ' Запуск измерения Waitms 750 ' Ждем окончания преобразования 1wreset 1wwrite &HCC 1wwrite &HBE ' Команда чтения ОЗУ датчика Byte0 = 1wread() ' Читаем нулевой байт Byte1 = 1wread() ' Читаем первый байт If Byte1 > 248 Then ' Проверка на отрицательность температуры Byte0 = &HFF - Byte0 Byte1 = &HFF - Byte1 Sign = "-" Else Sign = "+" End If T1 = Byte0 / 16 ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16) T2 = Byte1 * 16 ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16) T1 = T1 + T2 ' Формируем результат для вывода на дисплей ' *** Коррекция полученных значений If Sign = "-" Then ' для корректного вывода отрицательных температур T1 = T1 + 1 End If If Sign = "+" And T1 = 0 Then ' убираем знак "+" с нулевой температуры Sign = " " End If End If Return