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

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

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

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


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


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

Сообщений 61 страница 78 из 78

61

Вместо

rom-i написал(а):

If Принятый_символ <> 13 Then
     If Принятый_символ <> 10 Then Буфер_приема = Буфер_приема + Chr(принятый_символ)
   Else

Можно попроще

If Принятый_символ <> 13 And Принятый_символ <> 10 Then Буфер_приема = Буфер_приема + Chr(принятый_символ)

Хотя... Дело хозяйское... ;)

0

62

Nord
Так писать нет смысла. Если в предыдущей строке мы не взяли 10, она достанется следующей строке. Строка будет начинаться с 10. Соответственно Else пустит тебе пустышку. Но все идет к лучшему. Если хотим забрать из буфера абсолютно все, тогда нужно игнорировать 13, а заканчивть прием 10. Вот самое правильное.
If Принятый_символ <> 10 Then
     If Принятый_символ <> 13 Then Буфер_приема = Буфер_приема + Chr(принятый_символ)
   Else
Не понимаю свой браузер Макстон. Иногда нормуль, но чаще всего не перетащить из Bascom кириллицу. Вместо букв знаки вопроса. Наоборот, такая же хрень. Комменты можно затереть. Но если переменные на кириллице, кранты. Пробовал черезь блокнот, тож самое.

0

63

rom-i
Языковой значек должен быть RU и в окне Bascom и в окне браузера.

0

64

pavel1969
Спасибо. Думаю, что понял. Действительно в браузере по умолчанию EN, а в Bascom, что придется. Вот, и получается. То нормально, то восклицаловки.

0

65

Для дальности передачи пришлось перейти на кварцованные контроллеры.
Передатчик ATtiny84a, 8mHz. Скорость передачи оставил 2400 бод. Для надежности. На жрачку аккума сильно не влияет.
Состав:
Темература 18в20
Температура, влажность DHT22
Вход АЦП контроль разряда батареи
Сон черезь павердовн 9мкА. Передача, раз в 5 минут.

Код:
$regfile = "attiny84.dat"
$crystal = 8000000
$hwstack = 160
$swstack = 160
$framesize = 64
'-------------------------  Настройка Watchdog  --------------------------------
  On Wdt Обработка_прерывания_watchdog                      ' Nosave       ' Переход на подпрограмму обработки прерывания после переполнения таймера-счётчика Watchdog
  Config Watchdog = 1024                                    'время срабатывания ~1сек., при соответствии $crystal и фьюзов МК      ' 16   32   64   128   256   512   1024   2048   4096   8192

'=======Подключаем DHT22===============================================================================
Config Pina.2 = Input
Dht_get1 Alias Pina.2
'===============================================================================
Config Porta.1 = Output
Pitanie Alias Porta.1
'===============================================================================
 Dim Sch As Byte
 Dim Secunda As Word
 Dim Sinhr As Byte : Sinhr = &B10101010
 Dim Albyte As String * 18
 Dim Id As String * 4 : Id = "1550"
 Dim L As Word
 Dim L_str As String * 3
'========Переменные 1 датчика 18В20====================================================================================================
 Dim Tds1 As Integer                                        'температура получаемая с 1 датчика в 0.1градуса. 10 = 1,0 градус
 Dim Tds1_str As String * 4
 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                                        'переменная для хранения температуры С.1
Dim Hdht1 As Integer                                        'переменная для хранения влажности   С.1
Dim Tdht1_str As String * 5                                 'дисплейные
Dim Hdht1_str As String * 4

Declare Sub Dht22
Declare Sub Read_timings1
'========конфигурируем АЦП===========================================================
  Config Adc = Single , Prescaler = Auto , Reference = Internal
'===============================================================================
  Enable Wdt                                                ' Разрешаем прерывание от переполнения таймера Watchdog
  Enable Interrupts
'===============================================================================
 Главный_цикл:

  If Secunda = 300 Then
    Pitanie = 0
  Adcsra.aden = 1                                           'Включаем АЦП
  Open "coma.3:2400,8,n,1" For Output As #1
    Waitms 100
    L = Getadc(0)                                           'считываем третий канал АЦП и записываем в переменную
'    L = L - 1
    L_str = Str(l)
    L_str = Format(l_str , "000")
    Gosub 18b20
    Gosub Dht22
   Albyte = Id + Tds1_str + Tdht1_str + Hdht1_str + L_str

   For Sch = 0 To 3
      Waitms 50
      Printbin #1 , Sinhr
      Print #1 , Albyte
   Next Sch
     Waitms 50
   Config Porta.3 = Output : Porta.3 = 0                    'Перевод порта для понижения энергопотребления
   Adcsra.aden = 0
     Pitanie = 1
     Waitms 10
     Secunda = 0
   End If

   Powerdown
  Goto Главный_цикл
 End
'===============================================================================
  Обработка_прерывания_watchdog:
      Incr Secunda
  Return
'===============================================================================
'======Обработка датчика температуры DS18B20====================================
18b20:
   1wreset Pina , 5
   If Err = 1 Then
         Err_c1 = 1                                         'ставим флаг ошибки датчика
         Tds1 = 32767                                       'если при опросе небыло ответа ставим флаг ошибки
      Else
         Err_c1 = 0
         1wwrite &HCC , 1 , Pina , 5                        'пропуск ROM(для всех)
         1wwrite &H44 , 1 , Pina , 5                        'конвертировать температуру(для всех)
   End If

     Waitms 750
                                                            'если небыло ошибки при начале конвертирования
   If Err_c1 = 0 Then
      1wreset Pina , 5
      If Err = 1 Then
            Tds1 = 32767                                    'если при опросе небыло ответа ставим флаг ошибки
          Else                                              'иначе, если ошибки не было, продолжаем опрос датчика
            1wwrite &HCC , 1 , Pina , 5
            1wwrite &HBE , 1 , Pina , 5
            Tds1 = 1wread(2 , Pina , 5)
            Tds1 = Tds1 * 10
            Tds1 = Tds1 \ 16
      End If
       Tds1_str = Str(tds1)
       Tds1_str = Format(tds1_str , "+000")
      Else
       Tds1 = 32767
       Tds1_str = "8888"
   End If
 Return
'===============================================================================
Sub Dht22:
   Gosub Read_timings1                                      'DHT22 Порт C1
   Chs = Hb(2) + Hb(3)                                      'считаем контрольную сумму
   Chs = Chs + Hb(4)
   Chs = Chs + Hb(5)
     If Chs = Hb(1) And Chs > 0 Then                        'определяем знак температуры
'     If Chs = Hb(1) Then                                    'определяем знак температуры
      Tdht1 = Hu(1)
      Hdht1 = Hu(2)
      If Hu(1).15 = 1 Then
            Tdht1 = 32768 + Tdht1
            Tdht1 = 0 - Tdht1
      End If
      Tdht1_str = Str(tdht1)
      Tdht1_str = Format(tdht1_str , "+000")
      Hdht1_str = Str(hdht1)
      Hdht1_str = Format(hdht1_str , "000")
   Else
      Tdht1 = 32767
      Tdht1_str = "8888"
      Hdht1_str = "888"
   End If
End Sub

Sub Read_timings1:                                          'опрос DHT22 порт C1
   Local Y As Byte
   Count = 1
   Kod = 0
   Hb(1) = 0
   Config Porta.2 = Output : Porta.2 = 0                    ' request data
   Waitms 20                                                ' wait 20 ms
   Config Pina.2 = Input                                    ' wait for data, receive data
   Waitus 40
'    Waitus 30
   If Dht_get1 = 0 Then
      Bitwait Pina.2 , Reset
     While Count < 42                                       '
        Y = Count - 1                                       '
        Y = 40 - Y
         Pulsein D , Pina , 2 , 1
         If D > Min_time Then Toggle Hb(1).y
         Incr Count
      Wend
   End If
   Waitms 50
End Sub

Приемник решил сделать на ATtiny25.

Код:
$regfile = "Attiny25.dat"
$crystal = 8000000
'===============================================================================
Open "comb.0:2400,8,n,1" For Input As #1
Open "comb.1:9600,8,n,1" For Output As #2
'===============================================================================
'Config Serialin = Buffered , Size = 60
Led Alias Portb.2 : Config Led = Output
'===============================================================================
'===============================================================================
 Dim Sinhr As Byte
 Dim Dat_in As String * 18
 Dim Id As String * 4
 Dim Temper As String * 4
'===============================================================================

'*******************************************************************************
Do
  Waitms 75

   Strt:
    Gosub Kodin
     Id = Left(dat_in , 4)
  If Id = "1550" Then
     Temper = Mid(dat_in , 5 , 14)
     Print #2 , Temper
   Led = 1
     Waitms 10
   Else
     Waitms 10
     Dat_in = ""
    Goto Strt
  End If
  Led = 0
  Loop
End
'===============================================================================
Kodin:
   Inputbin #1 , Sinhr
   Input #1 , Dat_in Noecho
Return
'=============================================================================

Дальше мона мулить к чему хочешь.
Для питания периферии использую р-канал половик. По этому "0" управление.

Отредактировано rom-i (2018-10-26 21:08:29)

0

66

rom-i
Сталкивался с тем,что иногда не вся посылка доходит  в первозданном виде.Например,ID принимает нормально,температура нормально,а время 55 часов 88 минут,или другие варианты с поломкой данных.Чем длиннее строка,тем больше  вероятность порчи.Пришлось добавлять контрольную сумму в передачу и при приёме сравнивать с вычисленной.Только после этого всё чётко.Если ещё не столкнулись с подобным,возможно всё ещё впереди)

0

67

Sergik07
Тоже столкнулся с этим когда длинную строку начал передавать. В конце такой фарш, что переменные переполнятся начали. Основной МК просто вешался. С кварцами нормально стало. Но думаю все равно не надежно. Реальных условий конструкция еще не видела.
Вот, и начал эту тему. Думал кто подскажет как ШИМ на Баском принимать. У Бороды все работает. Дальность приличная.

0

68

Добрый день! Не стал открывать новую тему. Решил задать вопрос тут. Экспериментирую с 433Мгц модулями. Вроде передача и прием есть.Только ума ни приложу как  строковую переменную , которая получается на выходе,  перевести в десятичную(например:у меня получается Bin_kod="00000110"(String*8) , а как получить из нее 6?) 

Прием 6-ки на осциллографе:
http://s5.uploads.ru/t/JSmhc.jpg
передача:

Код:
$regfile = "m8adef.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 32
$framesize = 64
Dim Raz As Byte , Timer0pre As Byte , I As Byte , Z As Byte
Dim Razrad As String * 2
Dim Stroka_binkod As String * 8
Config Timer0 = Timer , Prescale = 8
Enable Timer0
Stop Timer0
Timer0 = Timer0pre
Start Timer0
On Timer0 Pulse
Enable Interrupts
Config Portb.2 = Output
'*******************Тело программы**********************************************                                                \
Do
   Incr I                                                   'отправляем от 1 до 8 (для проверки)
   Stroka_binkod = Bin(i)                                   'перводим в бинарный
   Timer0pre = 220 : Waitms 3                               'отправим пакет , чтобы  приемник был готов к приему
   Timer0pre = 100 : Waitms 3                               'берем по очереди каждый бит в байте
   For Z = 1 To 8
      Razrad = Mid(stroka_binkod , Z , 1)
      Raz = Val(razrad)
      If Raz = 1 Then Timer0pre = 200 : Waitms 3
      If Raz = 0 Then Timer0pre = 180 : Waitms 3
      If Z < 8 Then
         Timer0pre = 100 : Waitms 3
      End If
   Next Z
   Stop Timer0 : Portb.2 = 0
   Waitms 100
   Timer0 = 0 : Start Timer0
   If I = 9 Then I = 0
Loop
End
'*******************************************************************************

Pulse:
   Stop Timer0
   Timer0 = Timer0pre
   Toggle Portb.2
   Start Timer0
Return


прием:

Код:
$regfile = "m328pdef.dat"
$crystal = 8000000
$hwstack = 100
$swstack = 100
$framesize = 200
'----------------------------------------------------------------
Dim Flag_dalshe As Boolean
Dim Bid_paketa As Byte , Razdelitel As Byte
Dim Imp As Word , Count As Word
Dim Bit_vbaite As String * 1
Dim Bin_kod As String * 8
Config Timer1 = Timer , Prescale = 1
Config Portb.0 = Input
Enable Interrupts
Enable Capture1
Enable Timer1
Start Timer1
On Capture1 Pulsе
'-------------------------------------------------------------------------------
Do
  If Imp > 714 And Imp < 735 Then Flag_dalshe = 1
   If Flag_dalshe = 1 Then
      If Imp > 2664 And Imp < 2687 Then Incr Razdelitel
      If Imp > 1030 And Imp < 1050 Then Bit_vbaite = "1"
      If Imp > 1350 And Imp < 1375 Then Bit_vbaite = "0"
      If Razdelitel = 8 Then Razdelitel = 0 : Flag_dalshe = 0
      Bin_kod = Bin_kod + Bit_vbaite                                            
   End If
Loop
End
'--------------------Подпрограмма захвата -------------------------
Pulsе:
   Imp = Timer1                                             'При прерывании Timer1 берем значение  Timer1
   Timer1 = 0
Return

Отредактировано Niya (2018-11-11 22:16:34)

0

69

Niya написал(а):

Добрый день!

У кого как... ;)

Niya написал(а):

Только ума ни приложу как  строковую переменную , которая получается на выходе,  перевести в десятичную

Оператор ASC покопайте... ;)
Правда, работает только с одним байтом.

С каким р/м работа ?

Отредактировано Nord (2018-11-11 22:30:07)

0

70

Nord написал(а):

С каким р/м работа ?

Вот эти:
http://sd.uploads.ru/t/zLWm6.jpg

0

71

Niya написал(а):

например:у меня получается Bin_kod="00000110"(String*8) , а как получить из нее 6?

Для данного варианта - банальный перевод позиции в строке в бит.

For a = 1 To 8
b = a - 1
If Mid(Bin_kod, a, 1) = "0" Then nomer.b = 0
If Mid(Bin_kod, a, 1) = "1" Then nomer.b = 1
Next a

UPD
Исправлены очепятки в коде... ;)

Отредактировано Nord (2018-11-11 23:01:20)

0

72

Niya написал(а):

Вот эти

Ой, какашка, намучался с ними (без обид)... ;)
Перешёл на HC-12 - в порядок удобнее.

0

73

Nord написал(а):

Для данного варианта - банальный перевод позиции в строке в бит.

Получается, что на выходе у меня будет число в десятичной в форме с 8 разрядами ?

0

74

Niya написал(а):

Nord написал(а):
Для данного варианта - банальный перевод позиции в строке в бит.

Получается, что на выходе у меня будет число в десятичной в форме с 8 разрядами ?

Что-то я туплю :) ..Взять и просто перевести двоичное число в десятичное ,по определению

0

75

Niya написал(а):

Что-то я туплю  ..Взять и просто перевести двоичное число в десятичное ,по определению

Только бяка в том, что изначально полученное значение - далеко не в BIN, а в STRING... ;)
Посему - не "двоичное - в десятичное", а "двоичное значение, представленное в строковом формате - в десятичное"

0

76

Nord написал(а):

Только бяка в том, что изначально полученное значение - далеко не в BIN, а в STRING...
Посему - не "двоичное - в десятичное", а "двоичное значение, представленное в строковом формате - в десятичное"

Это понятно. Реализовал в таком виде,  справляется

Код:
Perevesti_binkod:
   For Z = 8 To 1 Step - 1
      B = 8 - Z
      If Mid(bin_kod , Z , 1) = "0" Then Raz = 0
      If Mid(bin_kod , Z , 1) = "1" Then Raz = 1
      Chislo_temp = 2 ^ B
      Chislo_temp = Raz * Chislo_temp
      Chislo = Chislo + Chislo_temp
   Next Z

0

77

Niya написал(а):

Реализовал в таком виде,  справляется
Perevesti_binkod:
   For Z = 8 To 1 Step - 1
      B = 8 - Z
      If Mid(bin_kod , Z , 1) = "0" Then Raz = 0
      If Mid(bin_kod , Z , 1) = "1" Then Raz = 1
      Chislo_temp = 2 ^ B
      Chislo_temp = Raz * Chislo_temp
      Chislo = Chislo + Chislo_temp
   Next Z

Не совсем понятна арифметика (выделено)...
Все решаемо Raz.B...

Но, если вам так удобнее, не настаиваю.

0

78

rom-i написал(а):

Обработка_прерывания_watchdog:
      Incr Secunda
  Return

Интересно..после того, как  watchdog сделает аппаратный сброс МК переменная Secunda где сохранится, чтобы при следуещем срабатвании  увеличить на единицу? Получается, что после каждого сброса Secunda станет =0, а при срабатывании  Watchdog  станет =1.. и так без конца .  Разве не так?

0


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