$regfile = "m32def.dat" $crystal = 8000000 Config Watchdog = 1024 Start Watchdog 'конфигурирование приемника Declare Sub R_register(byval Command As Byte , Byval C_bytes As Byte) Declare Sub W_register(byval C_bytes As Byte) 'SPI (nRF24L01) команды Const Write_reg = &H20 'Определить Команду Записи В Реестр Const Rd_rx_pload = &H61 'Define Rx Полезной Нагрузки Адрес Регистра '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 Rx_pw_p0 = &H11 'rx полезной нагрузки ширина , Pipe0 " зарегистрировать адрес" Const Fifo_status = &H17 'fifo - Регистр Состояния " регистрация адреса" Dim D_bytes(6) As Byte , B_bytes(5) As Byte Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1 'Программное обеспечение SPI НЕ работает с nRF24L01, используйте оборудование SPI только, но эсэсовцы pin-код должен управляться нашей функцией Config Portb.2 = Output : Ce Alias Portb.2 'CE pin is output portb.2 Config Portb.4 = Output : Ss Alias Portb.4 'SS pin is output portb.1 Config Pinb.3 = Input : Irq Alias Pinb.3 'IRQ pin is input Spiinit Set Ce Waitms 10 Reset Ce Reset Ss Call R_register(status , 1) 'Читать Регистр СОСТОЯНИЯ Reset Ce 'Set CE низко, чтобы получить доступ к регистрам Gosub Setup_rx 'Настройка nRF24L01 для RX Waitms 2 Set Ce 'Set nRF20L01 в режим приема Led7 Alias Portc.0 : Config Portc.0 = Output : Led7 = 0 Led6 Alias Portc.1 : Config Portc.1 = Output : Led6 = 0 ' подключаем светодиод №7 к 23 ножке Led5 Alias Portc.2 : Config Portc.2 = Output : Led5 = 0 ' подключаем светодиод №6 к 24 ножке Led4 Alias Portc.3 : Config Portc.3 = Output : Led4 = 0 ' подключаем светодиод №5 к 25 ножке Led3 Alias Portc.4 : Config Portc.4 = Output : Led3 = 0 ' подключаем светодиод №4 к 26 ножке Led2 Alias Portc.5 : Config Portc.5 = Output : Led2 = 0 ' подключаем светодиод №3 к 27 ножке Led1 Alias Portc.6 : Config Portc.6 = Output : Led1 = 0 ' подключаем светодиод №2 к 28 ножке Led0 Alias Portc.7 : Config Portc.7 = Output : Led0 = 0 ' подключаем светодиод №1 к 30 ножке Led8 Alias Porta.7 : Config Porta.7 = Output : Led8 = 0 ' подключаем светодиод №0 к 31 ножке Green_led Alias Porta.1 : Config Porta.1 = Output : Green_led = 0 'красный светодиод \ Red_led Alias Porta.2 : Config Porta.2 = Output : Red_led = 0 'зеленый светодиод - включены с общим анодом (1-включен)!!! Blue_led Alias Porta.3 : Config Porta.3 = Output : Blue_led = 0 'синий светодиод / Dim Sc(2) As Byte 'массив данных от DS18B20 Dim Temperature As Word 'температура Dim Temp_sign As Byte 'знак температуры (0-минус, 8-плюс) 'старшая цифра температуры Dim X1_digit As Word 'младшая цифра температуры Dim X01_digit As Byte 'дробная цифра температуры Dim First_round As Byte : First_round = 1 'первый замер температуры Dim Transfer As Byte 'переменная времени между замером и считыванием температуры Dim T0_slave As Word : T0_slave = 0 'время оборота (/32ms) Dim Sector As Byte : Sector = 0 'номер текущего сектора Dim Scroll As Byte 'положение скроллинга Dim Letter As Word 'номер байта в символе Dim Sector_data As Byte : Sector_data = 0 'данные текущего сектора Dim N_char As Word 'текущий символ текста Dim Eram_char As Eram Word At &H10 'номер текущего символа, хранимый в EERAM Dim Saved_position As Byte : Saved_position = 0 'флаг сохранения позиции текста Dim Pos As Byte 'вспомогательные переменные Dim Pos1 As Byte Dim Pos2 As Byte Dim N_temp As Word Dim X10_digit As Word Dim X11_digit As Word Dim X12_digit As Word Dim X13_digit As Word Dim X14_digit As Word Dim X15_digit As Word Dim S1 As Word Config Timer0 = Timer , Prescale = 256 'Таймер0, частота 31250 Гц (8МГц/256)- замеряет время оборота Config Timer1 = Timer , Prescale = 1 , Compare A = Disconnect , Clear Timer = 1 'Таймер1, частота 8 МГц - выдает частоту секторов Enable Compare1a On Compare1a Timer_1_int Enable Timer0 Enable Timer1 On Timer0 Timer_0_int On Int0 Hall_sensor Nosave 'Датчик Холла подключен к INT0 Config Int0 = Rising 'прерывание INT0 по фронту импульса Enable Int0 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Start Timer0 Enable Interrupts 'X10_digit = 0 'X11_digit = 7 'X12_digit = 5 'X13_digit = 6 Spiinit Gosub Setup_rx 'Настройка Rx 'начало основного цикла Do Reset Watchdog If Irq = 0 Then 'флаг приема поднят, в буфер чтото привалило Reset Ce 'Ресивер должен быть включен до чтения pload Do 'Цикл, пока все 3 буферы fifo пусты Call R_register(rd_rx_pload , 5) 'Читать 5 байт RX pload регистрации 'Print "Pload:" ; Hex(b_bytes(1)) ; Hex(b_bytes(2)) ; Hex(b_bytes(3)) ; Hex(b_bytes(4)) ; Hex(b_bytes(5)) X10_digit = B_bytes(1) X11_digit = B_bytes(2) X12_digit = B_bytes(3) X13_digit = B_bytes(4) Call R_register(fifo_status , 1) 'Читать FIFO_STATUS Loop Until B_bytes(1).0 = 1 'Test или RX_EMPTY бит равен true, RX FIFO пустой D_bytes(1) = Write_reg + Status 'Сброс RX_DR бит состояния D_bytes(2) = &B01000000 'Напиши 1 до RX_DR бит для сброса IRQ Call W_register(2) Set Ce 'Включить приемник снова Waitms 2 End If Loop 'подпрограммы 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 направлять по nRF20L01 Set Ss 'Установить СС обратно на высоком уровне End Sub Setup_rx: 'Подготовка к RX D_bytes(1) = Write_reg + Rx_addr_p0 'RX адрес для 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) '6 байт для SPI D_bytes(1) = Write_reg + En_aa 'Enable auto ACK на pipe0 D_bytes(2) = &H01 Call W_register(2) D_bytes(1) = Write_reg + En_rxaddr 'Включить RX адрес для pipe0 D_bytes(2) = &H01 Call W_register(2) D_bytes(1) = Write_reg + Rf_ch 'Настройка каналов D_bytes(2) = 40 'Частота 2440 MГц Call W_register(2) D_bytes(1) = Write_reg + Rx_pw_p0 'Set RX pload ширина для pipe0 D_bytes(2) = 5 Call W_register(2) D_bytes(1) = Write_reg + Rf_setup 'Настройка РФ -> Выходной мощности 0 дБм, datarate 2 Мбит / с и МШУ прибыль по D_bytes(2) = &H0F Call W_register(2) D_bytes(1) = Write_reg + Config_nrf 'Настройка CONFIG -> I=1 (RX_device), PWR_UP=1, CRC 2bytes, Включить CRC D_bytes(2) = &H0F Call W_register(2) Return '-----------------------Переполнение Таймера T0--------------------------------- Timer_0_int: T0_slave = T0_slave + 256 'переполнение счетчика времени оборота Return '--------------------------Срабатывание Датчика Холла--------------------------- Hall_sensor: Compare1a = T0_slave + Timer0 'вычисляем время оборота (/32mkc) Timer0 = 0 Timer1 = 0 Start Timer1 T0_slave = 0 Transfer = Transfer + 1 Sector = 0 Return '-----------------------Компаратор Таймера T1----------------------------------- Timer_1_int: If Sector < 244 Then Incr Sector 'номер сектора Else Stop Timer1 'останавливаем индикацию, ждем Датчик Холла Goto Stop_ind 'выходим End If If Sector => 3 And Sector =< 67 Then 'наверху показываем ВРЕМЯ Gosub Temp_indication End If If Sector => 0 And Sector =< 244 Then Gosub Min_str End If 'If Sector > 197 Then 'от 198 до конца оборота выключаем текст и подсветку ' Sector_data = 0 ' Red_led = 1 'Green_led = 1 'End If 'If Sector = 224 And Transfer = 67 Then 'Gosub Temp_request 'запрос на новую температуру 'Goto Stop_ind 'End If 'If Sector = 224 And Transfer = 78 Then 'можно запросить данные 'Gosub Temp_measure 'получаем данные и вычисляем температуру 'Transfer = 0 'цикл закончен, можно начинать сначала 'First_round = 0 'первый цикл закончен 'Goto Stop_ind 'End If Led7 = Sector_data.7 ' высвечиваем текущий сектор Led6 = Sector_data.6 Led5 = Sector_data.5 Led4 = Sector_data.4 Led3 = Sector_data.3 Led2 = Sector_data.2 Led1 = Sector_data.1 Led0 = Sector_data.0 Stop_ind: Return '--------------------------Замер температуры------------------------------------ Temp_measure: Return '------------------------Запрос измерения температуры--------------------------- Temp_request: Return '------------------------Индикация ВРЕМЕНИ---------------------------------- Temp_indication: 'Disable Interrupts If Sector => 57 And Sector < 66 Then 'ДЕСЯТКИ ЧАСЫ Green_led = 1 Red_led = 0 Blue_led = 0 N_temp = X10_digit * 9 N_temp = N_temp + Sector Letter = N_temp - 57 Sector_data = Lookup(letter , Digits) Goto Noind End If If Sector => 43 And Sector < 52 Then 'ЕДИНИЦЫ ЧАСЫ Green_led = 1 Red_led = 0 Blue_led = 0 N_temp = X11_digit * 9 N_temp = N_temp + Sector Letter = N_temp - 43 Sector_data = Lookup(letter , Digits) Goto Noind End If If Sector => 31 And Sector < 38 Then 'ДВОЕТОЧИЕ Green_led = 0 Red_led = 0 Blue_led = 1 N_temp = X14_digit * 7 N_temp = N_temp + Sector Letter = N_temp - 31 Sector_data = Lookup(letter , Symbols) Goto Noind End If If Sector => 17 And Sector < 26 Then 'ДЕСЯТКИ МИНУТ Green_led = 1 Red_led = 0 Blue_led = 0 N_temp = X12_digit * 9 N_temp = N_temp + Sector Letter = N_temp - 17 Sector_data = Lookup(letter , Digits) Goto Noind End If If Sector => 3 And Sector < 12 Then 'ЕДИНИЦЫ МИНУТ Green_led = 1 Red_led = 0 Blue_led = 0 N_temp = X13_digit * 9 N_temp = N_temp + Sector Letter = N_temp - 3 Sector_data = Lookup(letter , Digits) Goto Noind End If '------------------------СТРЕЛКИ---------------------------------- Min_str: 'X15_digit = 0 'If Sector => 17 And Sector < 20 Then ' Green_led = 0 ' Red_led = 0 ' Blue_led = 1 ' N_temp = X15_digit * 3 ' N_temp = N_temp + Sector 'Letter = N_temp - 17 ' Sector_data = Lookup(letter , Signs) ' Goto Noind 'End If Return Noind: Return '=========================== Символы температуры =============================== Signs: Data &H00 , &HFF , &H00 'МИНУТНАЯ СТРЕЛКА Data &H10 , &H10 , &H10 , &H10 , &H10 , &H00 'минусик Data &H10 , &H10 , &H7C , &H10 , &H10 , &H00 'плюсик Data &H00 , &H00 , &H03 , &H00 'запятая Data &H00 , &H00 , &H60 , &H90 , &H90 , &H60 , &H00 'цельсий Digits: Data &H38 , &H7C , &H44 , &H44 , &H44 , &H44 , &H7C , &H38 , &H00 '0 Data &H4 , &H7C , &H7C , &H24 , &H4 , &H00 , &H00 , &H00 , &H00 '1 Data &H4 , &H24 , &H54 , &H54 , &H54 , &H54 , &H54 , &HC , &H00 ''2 Data &H28 , &H7C , &H54 , &H54 , &H54 , &H54 , &H14 , &H4 , &H00 '3 Data &H4 , &H7C , &H7C , &H54 , &H54 , &H70 , &H30 , &H10 , &H00 '4 Data &H8 , &H5C , &H54 , &H54 , &H54 , &H54 , &H24 , &H4 , &H00 '5 Data &H8 , &H5C , &H54 , &H54 , &H54 , &H74 , &H3C , &H18 , &H00 '6 Data &H40 , &H60 , &H70 , &H78 , &H5C , &H4C , &H44 , &H00 , &H00 '7 Data &H8 , &H74 , &H54 , &H54 , &H54 , &H54 , &H34 , &H8 , &H00 '8 Data &H38 , &H54 , &H54 , &H54 , &H54 , &H54 , &H24 , &H4 , &H00 '9 '============================== Таблица символов =============================== Symbols: Data &H00 , &H00 , &H28 , &H28 , &H00 , &H00 , &H00 '0/ -->: