Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Кто передавал температуру 18в20 по радиоканалу?


Кто передавал температуру 18в20 по радиоканалу?

Сообщений 181 страница 185 из 185

181

Программный и аппаратный ШИМ это не одно и то же.

+1

182

Я не спорю, не одно и то-же, согласен... Но, работает же.

0

183

Код:
'***************************************************************************************************************
'*********Переменные приема по радиоканалу**********************************************************************
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)

0

184

Вот передача.

Код:
$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

0

185

По питанию уже давно использую Р-канальные половики. По этому включение 0. За месяц работы аккумы от сотика сели на 0.01В. Всем удачи.

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Кто передавал температуру 18в20 по радиоканалу?