$regfile = "m32def.dat" $crystal = 8000000 Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1 Dim Rd_rx_pload As Byte : Rd_rx_pload = &H61 'Define Rx Полезной Нагрузки Адрес Регистра 'Программное обеспечение 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 : Pinb.3 = 1 'IRQ pin is input Dim D_bytes(16) As Byte , Dan(15) As Byte , I As Byte 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 If Irq = 0 Then Gosub Rx End If If Dan(1) = 2 Then Green_led = 1 Led8 = 1 End If Dan(2) = X11_digit Dan(3) = X12_digit Dan(4) = X13_digit Waitms 50 Loop Led: Return Setup_rx: 'Настройка Rx 'Сброс буфера Set Ce Waitms 1 'Нельзя убирать задержку Reset Ce D_bytes(1) = &HA0 'Положи байты в RX pload буфера D_bytes(2) = &HFF 'Байт 1 D_bytes(3) = &HFF 'Байт 2 D_bytes(4) = &HFF 'Байт 3 D_bytes(5) = &HFF 'Байт 4 D_bytes(6) = &HFF 'Байт 5 D_bytes(7) = &HFF 'Байт 6 D_bytes(8) = &HFF 'Байт 7 D_bytes(9) = &HFF 'Байт 8 D_bytes(10) = &HFF 'Байт 9 D_bytes(11) = &HFF 'Байт 10 D_bytes(12) = &HFF 'Байт 11 D_bytes(13) = &HFF 'Байт 12 D_bytes(14) = &HFF 'Байт 13 D_bytes(15) = &HFF 'Байт 14 D_bytes(16) = &HFF 'Байт 15 Reset Ss Spiout D_bytes(1) , 16 'Shiftout байты данных SPI корыта, C_bytes это количество байт, которые будут написаны Set Ss Set Ce Waitms 1 'Нельзя убирать задержку Reset Ce D_bytes(1) = &H2A 'RX адрес для pipe0 D_bytes(2) = &H34 D_bytes(3) = &H43 D_bytes(4) = &H10 D_bytes(5) = &H10 D_bytes(6) = &H01 Reset Ss Spiout D_bytes(1) , 6 'Shiftout байты данных SPI корыта, C_bytes это количество байт, которые будут написаны Set Ss D_bytes(1) = &H21 'Enable auto ACK на pipe0 D_bytes(2) = &H01 Reset Ss Spiout D_bytes(1) , 2 'Shiftout байты данных SPI корыта, C_bytes это количество байт, которые будут написаны Set Ss D_bytes(1) = &H22 'Включить RX адрес для pipe0 D_bytes(2) = &H01 Reset Ss Spiout D_bytes(1) , 2 'Shiftout байты данных SPI корыта, C_bytes это количество байт, которые будут написаны Set Ss D_bytes(1) = &H25 'Настройка каналов D_bytes(2) = &H28 'Канал 2400МГц+40МГц=2440 МГц (&H28 = 40) Reset Ss Spiout D_bytes(1) , 2 'Shiftout байты данных SPI корыта, C_bytes это количество байт, которые будут написаны Set Ss D_bytes(1) = &H31 'Set RX pload ширина для pipe0 D_bytes(2) = &H0F 'Сколько будет байт на приём (&H0F=15) на приём 15 штук Reset Ss Spiout D_bytes(1) , 2 'Shiftout байты данных SPI корыта, C_bytes это количество байт, которые будут написаны Set Ss D_bytes(1) = &H26 'Настройка РФ -> Выходной мощности 0 дБм, datarate 2 Мбит / с и МШУ прибыль по D_bytes(2) = &H0F Reset Ss Spiout D_bytes(1) , 2 'Shiftout байты данных SPI корыта, C_bytes это количество байт, которые будут написаны Set Ss D_bytes(1) = &H20 'Настройка CONFIG -> I=1 (RX_device), PWR_UP=1, CRC 2bytes, Включить CRC D_bytes(2) = &H0F Reset Ss Spiout D_bytes(1) , 2 'Shiftout байты данных SPI корыта, C_bytes это количество байт, которые будут написаны Set Ss Set Ce 'Set nRF20L01 в режиме приема Waitms 1 'Нельзя убирать задержку Return '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Rx: 'Приём данных Dan(15) Reset Ce 'Ресивер должен быть включен до чтения pload 'Читать 15 байт RX pload регистрации Reset Ss Spiout Rd_rx_pload , 1 'Первый shiftout в реестр, который будет читать Spiin Dan(1) , 15 'Прочитал назад байты из SPI направлять по nRF20L01 Set Ss Set Ce 'Set nRF20L01 в режиме приема Waitms 1 'Нельзя убирать задержку 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: X14_digit = 0 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/ -->: