Я не спорю, не одно и то-же, согласен... Но, работает же.
Кто передавал температуру 18в20 по радиоканалу?
Сообщений 181 страница 184 из 184
Поделиться1822019-04-21 17:03:50
Код:
'*************************************************************************************************************** '*********Переменные приема по радиоканалу********************************************************************** Dim Accept_data(4) As Integer 'весь блок подлежащий приему Dim Scan As Word : Scan = 0 Dim Scan_str As String * 5 Dim Moi_signal As Bit : Moi_signal = 0 Dim Bi As Bit '-------------------------------------------------------------------------------------------------- Dim Count As Byte : Count = 0 Dim Count_str As String * 2 Dim Nomer As Integer At Accept_data(4) Overlay '1 байт Dim Nomer_str As String * 4 Dim Tdsrx As Integer At Accept_data(3) Overlay '2 байт Dim B As Integer At Accept_data(2) Overlay '3 байт Dim Crc As Word Dim Crc_str As String * 4 Dim Crc_rx As Integer At Accept_data(1) Overlay '4 байт Dim Crc_rxstr As String * 4 Dim X As Byte Dim C As Bit : C = 0 '-------------------------------------------------------------------------------------------------- Dim Tdsrx1 As Integer Dim Tdsrx2 As Integer Dim Tdsrx3 As Integer Dim Tdsrx1_str As String * 5 Dim Tdsrx2_str As String * 5 Dim Tdsrx3_str As String * 5 Dim B1 As Integer Dim B2 As Integer Dim B3 As Integer Dim B1str As String * 4 Dim B2str As String * 4 Dim B3str As String * 4 Dim Prd1str As String * 8 Dim Prd2str As String * 8 Dim Prd3str As String * 8 '****************************************************************************************************************
Полный ответ по теме.
Код:
'=========настраиваем таймер в режим захвата по восходящему фронту========================================
Config Timer1 = Timer , Prescale = 256 , Capture Edge = Rising
On Capture1 Zaxvat
'**************************************************************************************************
Zaxvat:
Scan = Timer1 ' копируем значение таймера в переменную
Timer1 = 0 ' обнуляем таймер
Gosub Posilka
Return
'-------------------------------------------------------------------------------------------------
Posilka:
If Scan < 30 Then
Moi_signal = 0
Scan = 0
Count = 0
Return
End If 'Сильно короткий, значит помеха выходим
If Scan > 400 Then 'Слижком длинный, значит пауза между посылками
Moi_signal = 0
Scan = 0
Count = 0
Return
End If
Select Case Scan
Case 40 To 70 '62.5МС (1000мкС) значит 0
Incr Count
Bi = 0
Goto Zapis
Case 100 To 150 '125МС (2000мкС) значит 1
Incr Count
Bi = 1
Goto Zapis
Case 250 To 350 '312.5МС (5000мкС) значит сигнал опознования
Count = 0
Moi_signal = 1
End Select
Return
'-----------------------------------------------------------------------------------------------------------
Zapis:
If Moi_signal = 1 Then
X = 64 - Count
Accept_data(1).x = Bi
If Count = 64 Then
Count = 0
Moi_signal = 0
End If
End If
Crc = Nomer + Tdsrx
Crc = Crc + B
If Crc = Crc_rx And Nomer = 15 Then Gosub Датчик1
If Crc = Crc_rx And Nomer = 21 Then Gosub Датчик2
If Crc = Crc_rx And Nomer = 33 Then Gosub Датчик3
Return
End
'-----------------------------------------------------------------------------------------------------------
Датчик1:
Tdsrx1 = Tdsrx
B1 = B
Prd1str = Minestr ' + ":" + Secostr Hourstr + ":" +
Crc = 0
Nomer = 0
Return
'-----------------------------------------------------------------------------------------------------------
Датчик2:
Tdsrx2 = Tdsrx
B2 = B
Prd2str = Minestr ' + ":" + Secostr Hourstr + ":" +
Crc = 0
Nomer = 0
Return
'-----------------------------------------------------------------------------------------------------------
Датчик3:
Tdsrx3 = Tdsrx
B3 = B
Prd3str = Minestr ' + ":" + Secostr Hourstr + ":" +
Crc = 0
Nomer = 0
ReturnОтредактировано rom-i (2019-04-21 17:14:16)
Поделиться1832019-04-21 17:06:47
Вот передача.
Код:
$regfile = "attiny84.dat"
$crystal = 8000000
'------------------------- Настройка Watchdog --------------------------------
On Wdt Обработка_прерывания_watchdog 'Nosave ' Переход на подпрограмму обработки прерывания после переполнения таймера-счётчика Watchdog
Config Watchdog = 1024 'время срабатывания ~1сек., при соответствии $crystal и фьюзов МК ' 16 32 64 128 256 512 1024 2048 4096 8192
'===============================================================================
Config Porta.1 = Output
Pitanie Alias Porta.1
Pitanie = 1
'===============================================================================
Config Porta.2 = Output
Data_ Alias Porta.2
Data_ = 0
'===============================================================================
Dim Sendata(4) As Word 'весь блок подлежащий передаче
Dim Sch As Byte
Dim Secunda As Word
Dim L As Word At Sendata(3) Overlay '4 байт
'=========Переменные передачи======================================================================
Dim N As Byte : N = 16
Dim Байты As Byte
Dim Номер As Word At Sendata(1) Overlay : Номер = 15 '0 байт
Dim Crc As Word At Sendata(4) Overlay '5 байт
Dim Preambula As Byte
Dim Nomer_bita As Byte
Dim Odin As Word : Odin = 1500
Dim Nol As Word : Nol = 500
Dim Pausa As Word : Pausa = 500
'========Переменные 1 датчика 18В20====================================================================================================
Dim Tds1 As Integer At Sendata(2) Overlay '1 байт температура получаемая с 1 датчика в 0.1градуса. 10 = 1,0 градус
Dim Err_c1 As Bit
'======переменные для работы датчиков DHT22=========================================================================
Const Min_time = 3
Dim Count As Byte
Dim D As Byte
Dim Hb(5) As Byte '$337 Overlay '$11d Overlay
Dim Kod As Dword At Hb + 1 Overlay '$338 '$11e
Dim Hu(2) As Word At Kod Overlay
Dim Chs As Byte
Dim Tdht1 As Integer At Sendata(3) Overlay '2 байт переменная для хранения температуры С.1
Dim Hdht1 As Integer At Sendata(4) Overlay '3 байт переменная для хранения влажности С.1
Declare Sub Dht22
Declare Sub Read_timings1
'========конфигурируем АЦП===========================================================
Config Adc = Single , Prescaler = Auto , Reference = Internal
Adcsra.aden = 0
'===============================================================================
Enable Wdt ' Разрешаем прерывание от переполнения таймера Watchdog
Enable Interrupts
'===============================================================================
Главный_цикл:
If Secunda = 300 Then
Pitanie = 0
Adcsra.aden = 1 'Включаем АЦП
Waitms 100
L = Getadc(0) 'считываем канал АЦП и записываем в переменную
L = L / 2
L = L - 14
Gosub 18b20
Crc = Tds1 + Номер
Crc = Crc + L
For Sch = 0 To 2
Waitms 100
For Preambula = 1 To N
Data_ = 1
Waitus Odin
Data_ = 0
Waitus Odin
Next Preambula
Data_ = 1
Waitms 4
Data_ = 0
Gosub Peredacha_bytov
N = 8
Next Sch
N = 16
Waitms 50
Adcsra.aden = 0
Pitanie = 1
Waitms 10
Secunda = 0
End If
Powerdown
Goto Главный_цикл
End
'===============================================================================
Обработка_прерывания_watchdog:
Incr Secunda
Return
'===============================================================================
'======Обработка датчика температуры DS18B20====================================
18b20:
1wreset Pina , 3
If Err = 1 Then
Err_c1 = 1 'ставим флаг ошибки датчика
Tds1 = 32767 'если при опросе небыло ответа ставим флаг ошибки
Else
Err_c1 = 0
1wwrite &HCC , 1 , Pina , 3 'пропуск ROM(для всех)
1wwrite &H44 , 1 , Pina , 3 'конвертировать температуру(для всех)
End If
Waitms 750
'если небыло ошибки при начале конвертирования
If Err_c1 = 0 Then
1wreset Pina , 3
If Err = 1 Then
Tds1 = 32767 'если при опросе небыло ответа ставим флаг ошибки
Else 'иначе, если ошибки не было, продолжаем опрос датчика
1wwrite &HCC , 1 , Pina , 3
1wwrite &HBE , 1 , Pina , 3
Tds1 = 1wread(2 , Pina , 3)
Tds1 = Tds1 * 10
Tds1 = Tds1 \ 16
End If
End If
Return
'------------------------------------------------------------------------------------------
Peredacha_bytov:
Waitus Pausa
Waitus Pausa
For Байты = 1 To 4
For Nomer_bita = 15 To 0 Step - 1 'Старшим битом вперед
If Sendata(байты).nomer_bita = 1 Then
Data_ = 1 'Передний фронт импульса передачи
Waitus Odin 'Длительность 1 1500мкС
Data_ = 0 'Задний фронт импульса передачи
Waitus Pausa 'Пауза 500мкС. Общая длительность передачи 1 (1500+500=2000мкС)
Else
Data_ = 1
Waitus Nol 'Длительность 0 500мкС
Data_ = 0
Waitus Pausa 'Общая длительность передачи 0 (500+500=1000мкС)
End If
Next Nomer_bita
Next Байты
Data_ = 1 'Передний фронт для измерения последнего бита
Waitus Nol '------
Data_ = 0 '------
ReturnПоделиться1842019-04-21 17:10:54
По питанию уже давно использую Р-канальные половики. По этому включение 0. За месяц работы аккумы от сотика сели на 0.01В. Всем удачи.
Похожие темы
| Датчики температуры | Путеводитель по Форуму | 2022-02-18 |