$regfile = "m328pdef.dat" ' used micro $crystal = 16000000 ' used xtal 'Wait 3 $hwstack = 40 $swstack = 20 $framesize = 40 $lib "lcd_pcf8574.lib" Config I2cdelay = 1 Config Scl = Portc.5 ' CONFIGURE I2c Scl Config Sda = Portc.4 ' Configure I2c Sda Config Lcd = 16 * 2 Const Pcf8574_lcd = &H4E ' Defines the address of the I/O expander for LCD Const Pcf_e2_is_output = 1 ' festlegen das E2 ein Ausgang ist Const Pcf_rw_is_output = 1 ' festlegen das RW ein Ausgang ist ' festlgen welcher Pin vom PCF8574 welchen Pin vom LCD ansteuern soll Const Pcf_rs = 0 Const Pcf_rw = 1 Const Pcf_e1 = 2 '2 Const Pcf_e2 = 3 '3 Const Pcf_d4 = 4 Const Pcf_d5 = 5 Const Pcf_d6 = 6 Const Pcf_d7 = 7 Cursor Off Cls Dim _out_rw As Byte Dim _out_e2 As Byte Dim _lcd_e As Byte _lcd_e = 192 ' 64=E2 128=E1 192=E1+E2 _out_rw = 1 ' Ausgang ein schalten _out_e2 = 1 Locate 1 , 1 Lcd "Zeile1" waitms 500 Config Portb.1 = Output : Ce Alias Portb.1 'CE pin is output Config Portb.2 = Output : Ss Alias Portb.2 'SS pin is output Config Pinb.0 = Input : Irq Alias Pinb.0 'IRQ pin is input Portb.0 = 1 Config Portd.1 = Output : U_24l01 Alias Portd.1 Config Portd.0 = Output : Led Alias Portd.0 'Заявить отдельные подпрограммы Declare Sub R_register(byval Command As Byte , Byval C_bytes As Byte) Declare Sub W_register(byval C_bytes As Byte) Declare Sub Tx(byval D1 As Byte , Byval D2 As Byte , Byval D3 As Byte , Byval D4 As Byte , Byval D5 As Byte) 'Определить nRF24L01 прерывания, флаг Const Idle_int = &H00 'Ожидания, нет прерывания Const Max_rt = &H10 'Max #Tx, выберите Прерывания Const Tx_ds = &H20 'Tx Данных, Переданных Прерывания Const Rx_dr = &H40 'Rx Данные, Полученные 'SPI (nRF24L01) команды Const Write_reg = &H20 'Определить Команду Записи В Реестр Const Rd_rx_pload = &H61 'Define Rx Полезной Нагрузки Адрес Регистра Const Wr_tx_pload = &HA0 'Определить Tx Полезной Нагрузки Адрес Регистра Const Flush_tx = &HE1 'Определить Флеш Tx Зарегистрировать Команду 'SPI (nRF24L01) регистры (адреса) Const Config_nrf = &H00 'Config адрес регистра Const En_aa = &H01 'Включить Автоматическое Подтверждение регистрации адрес Const En_rxaddr = &H02 'Включено Rx адреса " адрес регистра" Const Rf_ch = &H05 'RF channel' адрес регистра Const Rf_setup = &H06 'РФ Setup " (Настройка) адрес регистра" Const Status = &H07 'Статус " адрес регистра" Const Rx_addr_p0 = &H0A 'rx адрес Pipe0 " зарегистрировать адрес" Const Tx_addr = &H10 'TX address (адрес) Const Rx_pw_p0 = &H11 'rx полезной нагрузки ширина , Pipe0 " зарегистрировать адрес" Const Fifo_status = &H17 'fifo - Регистр Состояния " регистрация адреса" Const True = 1 Const False = 0 Dim B_bytes(5) As Byte , D_bytes(6) As Byte , Dim N_d As Byte 'Различные Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1 Spiinit Const Опрос = &HAA 'fifo - Регистр Состояния " регистрация адреса" 'Различные Dim Temp As Byte , W As Word Dim Packet_count As Byte Dim Term(10) As Word Dim Sign(10) As Byte 'Config оборудования 'Программное обеспечение SPI НЕ работает с nRF24L01, используйте оборудование SPI только, но эсэсовцы pin-код должен управляться нашей функцией 'Initlcd Cls Lcd "Welcom" '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'Настройка на передачу Do Передача: Incr N_d If N_d > 3 Then N_d = 1 Incr Packet_count Home End If If N_d = 3 Then Lowerline Lcd "T" ; N_d ; " " : If Term(n_d) = 99 Then Lcd "Err " Else Lcd Term(n_d) ; "C " Call Tx(2 , 1 , Sign(n_d) , 1 , 2) W = 0 'Счетчик для time out Do Waitms 350 If Irq = 0 Then Call R_register(status , 1) Temp = B_bytes(1) And &B01110000 'Маски IRQ бит, байт состояния Select Case Temp 'Который IRQ происходит Case Max_rt 'Нет ответа от приёмника D_bytes(1) = Flush_tx 'Флеш TX буфера Call W_register(1) D_bytes(1) = Write_reg + Status D_bytes(2) = &B00010000 'Очистить MAX_RT IRQ бит Call W_register(2) Waitms 10 Term(n_d) = 99 Goto Передача Case Tx_ds 'удачный приём Set Led D_bytes(1) = Write_reg + Status D_bytes(2) = &B00100000 'Clear the TX_DS IRQ bit Call W_register(2) Waitms 10 Goto Приём Case Else 'Другое IRQ? D_bytes(1) = Flush_tx 'Флеш TX буфера Call W_register(1) D_bytes(1) = Write_reg + Status D_bytes(2) = &B00110000 'Очистить TX_DS IRQ бит Call W_register(2) End Select End If Waitms 1 'Время ожидания для IRQ 1 мс * 100 Incr W If W > 100 Then Home Lcd "Bed 24L01 " Goto Передача End If Loop '''''''''''''''''''''''''''''''''' Приём: Gosub Setup_rx Waitms 700 Reset Ce 'Ресивер должен быть включен до чтения pload 'Do 'Цикл, пока все 3 буферы fifo пусты Call R_register(rd_rx_pload , 5) 'Читать 5 байт RX pload регистрации Term(n_d) = B_bytes(2) Term(n_d) = Term(n_d) * 10 Term(n_d) = Term(n_d) + B_bytes(3) If Term(n_d) > 250 Then Sign(n_d) = 1 Else Sign(n_d) = 2 Reset Led Wait 1 Loop $include "Setup_rx.bas" $include "setup_tx.bas" Sub W_register(byval C_bytes As Byte) 'Пишите зарегистрировать с SPI Reset Ss 'Руководство управления СС контакт, установить СС низких до смещение, байт Spiout D_bytes(1) , C_bytes 'Shiftout байты данных SPI корыта, C_bytes это количество байт, которые будут написаны Set Ss 'Set СС высокого End Sub Sub R_register(byval Command As Byte , Byval C_bytes As Byte) As Byte 'C_bytes = Count_bytes, номер off байт для чтения Reset Ss 'Ручное управление СС контакт, установить на низком уровне до переход в/из байт Spiout Command , 1 'Первый shiftout в реестр, который будет читать Spiin B_bytes(1) , C_bytes 'Прочитал назад байты из SPI направлять по nRF24L01 Set Ss 'Установить СС обратно на высоком уровне End Sub '================================================================================= '====================================================================================