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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Ds18B20. Работа с несколькими датчиками


Ds18B20. Работа с несколькими датчиками

Сообщений 31 страница 60 из 82

31

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

Да я там и смотрю...

Плохо смотрим... ;)
В той же теме - #5.
Есть все, что надо для работы с датчиками и EEPROM.

0

32

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

В приведенном тут же (#18) коде есть работа с EEPROM, уже все "скрещено"...
Что еще "скрещивать" надо ?

Может я не внимательно смотрел , покажите где именно , DS18B20 + EEPROM видел , DS18B20 + DS18S20+ EEPROM не видел .

0

33

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

Плохо смотрим...
В той же теме - #5.
Есть все, что надо для работы с датчиками и EEPROM.

Посмотрю.

0

34

Sub Select_18b20(byval Number_18b20 As Byte)                'подпрограмма выбора датчика18b20
'процедура выбора датчика
  Select Case Number_18b20
    Case 0 : 1wverify T_id_ds18b20(1)                       ' нулевой датчик определим как временный для простоты настройки id
    Case 1 : 1wverify 1_id_ds18b20(1)                       ' Обращаемся к Ds18b20 именно с этим, ранее считанным id
    Case 2 : 1wverify 2_id_ds18b20(1)                       ' Обращаемся к Ds18b20 именно с этим, ранее считанным id
    Case 3 : 1wverify 3_id_ds18b20(1)                       ' Обращаемся к Ds18b20 именно с этим, ранее считанным id
    Case 4 : 1wverify 4_id_ds18b20(1)                       ' Обращаемся к Ds18b20 именно с этим, ранее считанным id
    Case 5 : 1wverify 5_id_ds18b20(1)                       ' Обращаемся к Ds18b20 именно с этим, ранее считанным id
    Case 6 : 1wverify 6_id_ds18b20(1)                       ' Обращаемся к Ds18b20 именно с этим, ранее считанным id
    Case 7 : 1wverify 7_id_ds18b20(1)                       ' Обращаемся к Ds18b20 именно с этим, ранее считанным id
    Case 8 : 1wverify 8_id_ds18b20(1)                       ' Обращаемся к Ds18b20 именно с этим, ранее считанным id
    Case 9 : 1wverify 9_id_ds18b20(1)                       ' Обращаемся к Ds18b20 именно с этим, ранее считанным id
    Case 10 : 1wverify 10_id_ds18b20(1)                     ' Обращаемся к Ds18b20 именно с этим, ранее считанным id
  End Select
End Sub

0

35

Function Get_temperature_18b20(byval Number_18b20 As Byte) As Single       'без задержки в 750 мсек
Local Int_ds18b20 As Integer

   Call Read_ram_18b20(number_18b20)                        ' выберем нужный датчик и прочтём его RAM

If Ram_ds18b20(9) = Crc8(ram_ds18b20(1) , 8) Then          ' Проверяем контрольную сумму полученных данных
    Int_ds18b20 = Makeint(ram_ds18b20(1) , Ram_ds18b20(2) ) ' соберём в переменную
  Else
    Int_ds18b20 = &HFC90                                    ' иначе ошибка и -55 гр.С
End If

If Int_ds18b20.15 = 1 Then                                 ' вычисляем температуру
    Int_ds18b20 = Int_ds18b20 Xor 255                       ' отрицательное значение температуры
    Incr Int_ds18b20
End If
Get_temperature_18b20 = Int_ds18b20 / 16

End Function

0

36

Sub Write_ram_18b20(byval Number_18b20 As Byte)             'запись RAM датчика 18b20
   1wreset                                                  ' Сброс линии 1 датчика  (1.025 ms)
   1wwrite &H55                                             ' именно нужный Ds18b20
Call Select_18b20(number_18b20)
   1wwrite &H4E                                             'команда запись RAM
   1wwrite &H01                                             'Th
   1wwrite &H02                                             'Tl
   1wwrite &B_0110_0000                                     'максимальная точность
End Sub

0

37

Sub Read_ram_18b20(byval Number_18b20 As Byte)              'чтение RAM датчика 18b20

   1wreset                                                  ' Сброс линии 1 датчика  (1.025 ms)
   If Err = 1 Then
      Ram_ds18b20(1) = 255
      Ram_ds18b20(2) = 255
      Goto Err_1820
   End If
   1wwrite &H55                                             ' именно нужный Ds18b20
Call Select_18b20(number_18b20)
   1wwrite &HBE                                             'команда чтение RAM
   Ram_ds18b20(1) = 1wread(9)                               ' Принимаем 9 байт данных
Err_1820:
End Sub

0

38

Sub Copy_ram_to_rom_18b20(byval Number_18b20 As Byte)       'копирование конфигурации RAM датчика 18b20 в ROM
   1wreset                                                  ' Сброс линии 1 датчика  (1.025 ms)
   1wwrite &H55                                             ' именно нужный Ds18b20
Call Select_18b20(number_18b20)
   1wwrite &H48                                             'команда копирования ОЗУ в ПЗУ
End Sub

0

39

Sub Count_of_18b20()
N_id_ds18b20 = 1wirecount()                                'запрос количества датчиков на шине

  If N_id_ds18b20 > 0 Then T_id_ds18b20(1) = 1wsearchfirst()       'и запись первого ID для последующего использования

  Const Разрешение_9_бит = &H1F
  Const Разрешение_10_бит = &H3F
  Const Разрешение_11_бит = &H5F
  Const Разрешение_12_бит = &H7F

End Sub

Sub Measuring_all_ds18b20()                                 'измерение температуры для всех датчиков
1wreset                                                    ' Сброс линии 1 датчика  (1.025 ms)
1wwrite &HCC                                               ' Обращение ко всем датчикам (788 мкс)
1wwrite &H44                                               ' Запуск измерения всех датчиков   (784 мкс)
'Waitms 750
End Sub

0

40

ВОТ тебе ГОТОВЫЕ процедуры работы с датчиками. Так сказать ... разжевал до состояния "агуши" Пользуйси... "программист"  :D

0

41

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

Может я не внимательно смотрел , покажите где именно , DS18B20 + EEPROM видел , DS18B20 + DS18S20+ EEPROM не видел .

Фуууух... ;)  Видимо, придется "по второму кругу"... ;)

Какая разница, с какими датчиками работать ?
Как устройства 1-Wire - они идентичны, за исключением "кода семейства".
У них разница в первую очередь - в арифметике пересчета полученных данных  http://avr.ru/beginer/understand/ds18s20vsds18b20

Выше - несколько готовых "кирпичиков", складывайте...
Не обязательно в форме Sub ... End Sub, вполне сканает и Gosub ... Return
Поэтапно...
Не спешите и все получится ! ;)

Отредактировано Nord (2018-06-26 14:18:33)

0

42

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

Фуууух...   Видимо, придется "по второму кругу"...

Какая разница, с какими датчиками работать ?
Как устройства 1-Wire - они идентичны, за исключением "кода семейства".
У них разница в первую очередь - в арифметике пересчета полученных данных  http://avr.ru/beginer/understand/ds18s20vsds18b20

Выше - несколько готовых "кирпичиков", складывайте...
Не обязательно в форме Sub ... End Sub, вполне сканает и Gosub ... Return
Поэтапно...
Не спешите и все получится !

Отредактировано Nord (Сегодня 14:18:33)


Я понял что разница в пересчете , буду разбираться , попробую в железе материал выше изложенный   , спасибо .

0

43

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

Я понял что разница в пересчете , буду разбираться

Вот так примерно...
Можно и облагородить, но так нагляднее... ;)

Код:
Dim <готовая> As String * 6
Dim <пересчет> As String * 2
Dim <десятые> As String * 2
Dim temperature As Byte
Dim Ram_ds18s20(9) As Byte

......
convertion:
temperature = Ram_ds18s20(1)                 ' Выделяем сырое значение температуры

If temperature.0 = 0 Then                          ' Определяем значение после запятой
	<десятые> = ",0"
Else
	<десятые> = ",5"
End If

temperature = temperature / 2                   ' Формируем готовое значение температуры
<пересчет> = Str(temperature)

If Ram_ds18s20(2) > 0 Then                     ' Определяем знак
	<готовая> = "-"
Else
	<готовая> = "+"
End If

<готовая> = <готовая> + <пересчет> + <десятые>   ' Результат для вывода на дисплей
Return

Отредактировано Nord (2018-06-26 15:52:28)

0

44

В общим вот файл с протеусом и програмой , Ссылкав железе датчик который у меня был - работает , а китайский нет , а через ком порт работают оба (китайский второй) вот фото Ссылка

Отредактировано olegkaras (2018-06-27 00:11:16)

0

45

http://s7.uploads.ru/t/n4Wuf.jpg

Здесь
'--------------  Настраиваем шину 1Ware для работы с Ds18x20  ------------------
  Config 1wire = Portc.0       ' Ножка МК для подключения необходимого количества датчиков: Ds18x20

поправьте ножку МК под себя

Исходник

'===============================================================================

'===============================================================================

  $map       ' Получаем карту распределения памяти компилятором Bascom
  $regfile = "m32def.dat"       ' мега32
  $crystal = 8000000       ' 8 МГц
  $framesize = 120       'размер области используемой и необходимой для преобразований
  $hwstack = 120       ' Размер аппаратного стека
  $swstack = 120       ' Размер программного стека
  $baud = 38400
'  Ucsr0a.1 = 1      ' Baud = Baud * 2

'--------------  Настраиваем шину 1Ware для работы с Ds18x20  ------------------

  Config 1wire = Portc.0       ' Ножка МК для подключения необходимого количества датчиков: Ds18x20

'-------------  Используемые константы для работы с Ds18x20  -------------------

  Const Задержка_опроса_ds18x20 = 100
  Const Количество_ошибок_crc_ds18x20 = 1       ' Значение игнорируемого количества ошибок CRC полученных данных с Ds18x20, перед отображением информации
  Const Кол_ошибок_ds18x20_не_ответил = 2

' !!!!! ' Значение предпологаемого количества подлюченных датчиков. Используется в подпрограмме "Запрос_количества_ds18x20:"
  Const Max_количество_датчиков_ds18x20 = 8       ' Значение предпологаемого количества подлюченных датчиков. Используется в подпрограмме "Запрос_количества_ds18x20:"
' !!!!! ' Значение предпологаемого количества подлюченных датчиков. Используется в подпрограмме "Запрос_количества_ds18x20:"

'----------------------------------------------

  Const Разрешение_9_бит = &H1F
  Const Разрешение_10_бит = &H3F
  Const Разрешение_11_бит = &H5F
  Const Разрешение_12_бит = &H7F

'----------------------------------------------

  Const Поиск_тревоги_ds18x20 = &HEC       ' Команда используется для поиска датчиков с сработавшим состоянием тревоги
  Const Запуск_измерения_ds18x20 = &H44       ' Команда используется для запуска измерения датчиком Ds18x20
  Const Чтение_температуры_ds18x20 = &HBE       ' Команда используется для чтения ОЗУ датчиков Ds18x20
  Const Запись_из_озу_в_пзу_датчика = &H48       ' Команда используется для записи данных из ОЗУ в ПЗУ датчика, для последующего использования
  Const Запись_данных_в_озу_датчика = &H4E       ' Команда используется для записи данных в ОЗУ датчика
  Const Подготовка_к_чтению_ds18x20 = &HCC       ' Команда используется, чтобы обратиться ко всем подключенным устройствам на шине одновременно
  Const Адресное_обращение_к_ds18x20 = &H55       ' Команда используется для поиска датчиков с конкретным, ранее считанным номером (id)

'-----------------------  Используемые переменные  -----------------------------

  Dim 1_id_ds18x20(9) As Byte       ' Постоянная переменная для хранения считанного id Ds18x20
  Dim Not_used_1 As Byte       ' Неиспользуемый буфер, иначе в переменную может попадать мусор (проверено в Bascom 2.0.7.1, актуально для переменных типа: Single; String; Double и массивов)
  Dim 2_id_ds18x20(9) As Byte       ' Постоянная переменная для хранения считанного id Ds18x20
  Dim Not_used_2 As Byte       ' Неиспользуемый буфер, иначе в переменную может попадать мусор (проверено в Bascom 2.0.7.1, актуально для переменных типа: Single; String; Double и массивов)
  Dim 3_id_ds18x20(9) As Byte       ' Постоянная переменная для хранения считанного id Ds18x20
  Dim Not_used_3 As Byte       ' Неиспользуемый буфер, иначе в переменную может попадать мусор (проверено в Bascom 2.0.7.1, актуально для переменных типа: Single; String; Double и массивов)
  Dim 4_id_ds18x20(9) As Byte       ' Постоянная переменная для хранения считанного id Ds18x20
  Dim Not_used_4 As Byte       ' Неиспользуемый буфер, иначе в переменную может попадать мусор (проверено в Bascom 2.0.7.1, актуально для переменных типа: Single; String; Double и массивов)
  Dim 5_id_ds18x20(9) As Byte       ' Постоянная переменная для хранения считанного id Ds18x20
  Dim Not_used_5 As Byte       ' Неиспользуемый буфер, иначе в переменную может попадать мусор (проверено в Bascom 2.0.7.1, актуально для переменных типа: Single; String; Double и массивов)
  Dim 6_id_ds18x20(9) As Byte       ' Постоянная переменная для хранения считанного id Ds18x20
  Dim Not_used_6 As Byte       ' Неиспользуемый буфер, иначе в переменную может попадать мусор (проверено в Bascom 2.0.7.1, актуально для переменных типа: Single; String; Double и массивов)
  Dim 7_id_ds18x20(9) As Byte       ' Постоянная переменная для хранения считанного id Ds18x20
  Dim Not_used_7 As Byte       ' Неиспользуемый буфер, иначе в переменную может попадать мусор (проверено в Bascom 2.0.7.1, актуально для переменных типа: Single; String; Double и массивов)
  Dim 8_id_ds18x20(9) As Byte       ' Постоянная переменная для хранения считанного id Ds18x20
  Dim Not_used_8 As Byte       ' Неиспользуемый буфер, иначе в переменную может попадать мусор (проверено в Bascom 2.0.7.1, актуально для переменных типа: Single; String; Double и массивов)

  Dim Id_ds18x20(9) As Byte       ' Временная переменная для хранения считанного id Ds18x20
  Dim Not_used_9 As Byte       ' Неиспользуемый буфер, иначе в переменную может попадать мусор (проверено в Bascom 2.0.7.1, актуально для переменных типа: Single; String; Double и массивов)

  Dim Цикл As Byte       ' Используется по мере необходимости в циклах "For-Next"

  Dim Флаг_опросить_ds18x20 As Byte
  Dim Флаг_идет_опрос_ds18x20 As Byte

  Dim Семейство_датчиков As Byte       ' Временная переменная для хранения семейства датчиков Ds18x20
  Dim Количество_найденных_ds18x20 As Word       ' Временная переменная для хранения количества найденных датчиков Ds18x20
  Dim Количество_датчиков_ds18x20 As Byte       ' Переменная для хранения количества найденных датчиков Ds18x20

  Dim Количество_измерений As Word       ' Счётчик измерений, для удобства
  Dim Порядковый_номер_датчика As Byte       ' Временная переменная для перебора датчиков

'-----------------  Счётчики ошибок датчиков Ds18x20  --------------------------
  Dim Флаг_ошибка_ds18x20(max_количество_датчиков_ds18x20) As Byte
  Dim Not_used_10 As Byte       ' Неиспользуемый буфер, иначе в переменную может попадать мусор (проверено в Bascom 2.0.7.1, актуально для переменных типа: Single; String; Double и массивов)

  Dim Общий_счетчик_ошибок As Word
  Dim Ошибка_запроса_id(max_количество_датчиков_ds18x20) As Word
  Dim Not_used_11 As Byte       ' Неиспользуемый буфер, иначе в переменную может попадать мусор (проверено в Bascom 2.0.7.1, актуально для переменных типа: Single; String; Double и массивов)

'--  Временные переменные для обработки данных полученных с датчиков Ds18x20  --
  Dim Temp As Integer       ' Температура в HEX формате с сигнатурой (знак температуры (+ или -))
  Dim Ответ_датчика_ds18x20(9) As Byte At Temp Overlay       ' Временный массив данных ответа датчика DS18x20
  Dim Not_used_12 As Byte       ' Неиспользуемый буфер, иначе в переменную может попадать мусор (проверено в Bascom 2.0.7.1, актуально для переменных типа: Single; String; Double и массивов)

  Dim Температура As Single       ' Временная переменная для хранения считанной неформатированной температуры
  Dim Not_used_13 As Byte       ' Неиспользуемый буфер, иначе в переменную может попадать мусор (проверено в Bascom 2.0.7.1, актуально для переменных типа: Single; String; Double и массивов)

  Dim Готовая_температура_temp_str As String * 8       ' Временная переменная для хранения считанной форматированной температуры
  Dim Not_used_14 As Byte       ' Неиспользуемый буфер, иначе в переменную может попадать мусор (проверено в Bascom 2.0.7.1, актуально для переменных типа: Single; String; Double и массивов)

'Постоянные переменные для хранения полученных температур с  датчиков Ds18x20
  Dim Готовая_температура_str_1 As String * 8       ' Постоянная переменная для хранения считанной форматированной температуры 1 датчика
  Dim Not_used_15 As Byte       ' Неиспользуемый буфер, иначе в переменную может попадать мусор (проверено в Bascom 2.0.7.1, актуально для переменных типа: Single; String; Double и массивов)
  Dim Готовая_температура_str_2 As String * 8       ' Постоянная переменная для хранения считанной форматированной температуры 2 датчика
  Dim Not_used_16 As Byte       ' Неиспользуемый буфер, иначе в переменную может попадать мусор (проверено в Bascom 2.0.7.1, актуально для переменных типа: Single; String; Double и массивов)
  Dim Готовая_температура_str_3 As String * 8       ' Постоянная переменная для хранения считанной форматированной температуры 3 датчика
  Dim Not_used_17 As Byte       ' Неиспользуемый буфер, иначе в переменную может попадать мусор (проверено в Bascom 2.0.7.1, актуально для переменных типа: Single; String; Double и массивов)
  Dim Готовая_температура_str_4 As String * 8       ' Постоянная переменная для хранения считанной форматированной температуры 4 датчика
  Dim Not_used_18 As Byte       ' Неиспользуемый буфер, иначе в переменную может попадать мусор (проверено в Bascom 2.0.7.1, актуально для переменных типа: Single; String; Double и массивов)
  Dim Готовая_температура_str_5 As String * 8       ' Постоянная переменная для хранения считанной форматированной температуры 5 датчика
  Dim Not_used_19 As Byte       ' Неиспользуемый буфер, иначе в переменную может попадать мусор (проверено в Bascom 2.0.7.1, актуально для переменных типа: Single; String; Double и массивов)
  Dim Готовая_температура_str_6 As String * 8       ' Постоянная переменная для хранения считанной форматированной температуры 6 датчика
  Dim Not_used_20 As Byte       ' Неиспользуемый буфер, иначе в переменную может попадать мусор (проверено в Bascom 2.0.7.1, актуально для переменных типа: Single; String; Double и массивов)
  Dim Готовая_температура_str_7 As String * 8       ' Постоянная переменная для хранения считанной форматированной температуры 7 датчика
  Dim Not_used_21 As Byte       ' Неиспользуемый буфер, иначе в переменную может попадать мусор (проверено в Bascom 2.0.7.1, актуально для переменных типа: Single; String; Double и массивов)
  Dim Готовая_температура_str_8 As String * 8       ' Постоянная переменная для хранения считанной форматированной температуры 8 датчика
  Dim Not_used_22 As Byte       ' Неиспользуемый буфер, иначе в переменную может попадать мусор (проверено в Bascom 2.0.7.1, актуально для переменных типа: Single; String; Double и массивов)

  Dim I1 As Integer , T_xk As Integer , I1_sum As Integer , Готовая_температура As Integer
Dim I2 As Integer , T_k_xk As Integer
Dim I3 As Integer , T_mk As Integer
Dim I4 As Integer , T_mk_verx As Integer
Dim I5 As Integer , T_k_mk As Integer
Dim I6 As Integer , T_ten As Integer
Dim T_kom_xk As Byte , T_kom_mk As Byte , Bk_kom_xk As Integer , Bk_kom_mk As Integer , T_kom_xk_nov As Byte , T_kom_mk_nov As Byte , Bk_kom_xk_nov As Integer , Bk_kom_mk_nov As Integer

Dim T_kom_xk_eram As Byte , T_kom_mk_eram As Byte , Bk_kom_xk_eram As Integer , Bk_kom_mk_eram As Integer

'Dim T_kom_xk_eram As Eram Byte , T_kom_mk_eram As Eram Byte , Bk_kom_xk_eram As Eram Integer , Bk_kom_mk_eram As Eram Integer

'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
'    З А П У С К    И    П Р Е Д В А Р И Т Е Л Ь Н Ы Е    Н А С Т Р О Й К И
'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

  Print
  Print
  Gosub Запрос_количества_ds18x20 : Print "Обнаружено " ; Количество_датчиков_ds18x20 ; " датчиков"
  Print
  Print

  If Количество_датчиков_ds18x20 > 0 Then
      Gosub Считывание_id_ds18x20
      Gosub Start_измерения_ds18x20
      Waitms 800
      Gosub Опросить_все_датчики_ds18x20
  End If       ' If Количество_датчиков_ds18b20 > 0 Then

'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
'--------------  Разрешаем работу необходимых прерываний  ----------------------
'  Enable Timer0
'  Start Timer0
'------------  Разрешаем работу всех включенных прерываний  --------------------
'  Enable Interrupts
'===============================================================================
'                   Г Л А В Н Ы Й         Ц И К Л
'===============================================================================
  Главный_цикл:

'===============================================================================





    If Количество_датчиков_ds18x20 > 0 Then
        Gosub Опросить_все_датчики_ds18x20
        Incr Количество_измерений
    End If       ' If Количество_датчиков_ds18x20 > 0 Then

    Print "1 датчик - " ; Готовая_температура_str_1 ; "°C"
    Print "2 датчик - " ; Готовая_температура_str_2 ; "°C"
    Print "3 датчик - " ; Готовая_температура_str_3 ; "°C"
    Print "4 датчик - " ; Готовая_температура_str_4 ; "°C"
    Print "5 датчик - " ; Готовая_температура_str_5 ; "°C"
    Print "6 датчик - " ; Готовая_температура_str_6 ; "°C"
    Print "7 датчик - " ; Готовая_температура_str_7 ; "°C"
    Print "8 датчик - " ; Готовая_температура_str_8 ; "°C"
    Print

    Wait 1

  Goto Главный_цикл
End
'===============================================================================
'             И С П О Л Ь З У Е М Ы Е    П О Д П Р О Г Р А М М Ы
'===============================================================================






'===============================================================================
'---  Подпрограмма для опроса всех найденных датчиков Ds18x20
'===============================================================================
  Опросить_все_датчики_ds18x20:
'-------------------------------------------------------------------------------
    Do
      Gosub Опрос_ds18x20

      Select Case Порядковый_номер_датчика
           Case 1 :
                    T_xk = Готовая_температура
                    Готовая_температура_str_1 = Готовая_температура_temp_str

          Case 2 :
                   T_k_xk = Готовая_температура
                   Готовая_температура_str_2 = Готовая_температура_temp_str

          Case 3 :
                   T_mk = Готовая_температура
                   Готовая_температура_str_3 = Готовая_температура_temp_str

          Case 4 :
                   T_mk_verx = Готовая_температура
                   Готовая_температура_str_4 = Готовая_температура_temp_str

          Case 5 :
                   T_k_mk = Готовая_температура
                   Готовая_температура_str_5 = Готовая_температура_temp_str

          Case 6 :
                   T_ten = Готовая_температура
                   Готовая_температура_str_6 = Готовая_температура_temp_str

          Case 7 :
                   Готовая_температура_str_7 = Готовая_температура_temp_str

          Case 8 :
                   Готовая_температура_str_8 = Готовая_температура_temp_str

      End Select       ' Select Case Порядковый_номер_датчика

      Incr Порядковый_номер_датчика

      If Порядковый_номер_датчика > Количество_найденных_ds18x20 Then
          Gosub Start_измерения_ds18x20
          Порядковый_номер_датчика = 1
          Флаг_опросить_ds18x20 = 0
      End If       ' If Порядковый_номер_датчика > Количество_найденных_ds18x20 Then

    Loop Until Порядковый_номер_датчика = 1
'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
'  Подпрограмма расчета и вывода температур
'===============================================================================
  Опрос_ds18x20:
'-------------------------------------------------------------------------------
    1wreset       ' Занимаем шину 1Ware
    1wwrite Адресное_обращение_к_ds18x20       ' Адресное обращение к Ds18b20
    Gosub Выбор_датчика       ' Выбираем заводской номер (id) датчика с которым будем работать

    If Err = 0 Then
        Goto Читаем_ds18x20       ' Если датчик с запрашеваемым id ответил, переходим к чтению
      Else
        Goto Error_id_ds18x20       ' Если датчик с запрашеваемым id не ответил, переходим к индикации отсутствия датчика
    End If

'=================
  Читаем_ds18x20:
'=================
    1wwrite Чтение_температуры_ds18x20       ' Команда чтения ОЗУ датчика
    Ответ_датчика_ds18x20(1) = 1wread(9)       ' Принимаем 8 байт данных

    If Err = 0 Then
        If Ответ_датчика_ds18x20(9) = Crc8(ответ_датчика_ds18x20(1) , 8) Then       ' Проверяем контрольную сумму полученных данных

            Gosub Расчет_температуры       ' Приводим полученные с Ds18x20 данные к удобоваримому формату

           If Семейство_датчиков = &H10 Then       ' Если xxxxS20 тогда форматируем так

                Готовая_температура = Температура * 10       'Получаем температуру с десятыми

                Готовая_температура_temp_str = Str(готовая_температура)
                Готовая_температура_temp_str = Format(готовая_температура_temp_str , "    0")       ' Форматируем данные
                Insertchar Готовая_температура_temp_str , 5 , "."

            Elseif Семейство_датчиков = &H28 Then       ' Если xxxxB20 тогда форматируем так
                Готовая_температура = Температура * 10

                Готовая_температура_temp_str = Str(готовая_температура)
                Готовая_температура_temp_str = Format(готовая_температура_temp_str , "    0")       ' Форматируем данные
                Insertchar Готовая_температура_temp_str , 5 , "."

            End If
          Else
            Готовая_температура_temp_str = "Err"       ' Печатаем ошибку контрольной суммы ответа датчика
        End If       ' If Ответ_датчика_ds18x20(9) = Crc8(ответ_датчика_ds18x20(1) , 8) Then       ' Проверяем контрольную сумму полученных данных
      Else
        Готовая_температура_temp_str = "Err"       ' Печатаем сообщение, что датчик не ответил
    End If       ' If Err = 0 Then ' Если получили ответ датчика

'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
  Расчет_температуры:
'-------------------------------------------------------------------------------

    Температура = Temp       ' Получаем дробное значение температуры (±xxx.xxxx)

    If Семейство_датчиков = &H10 Then       ' Если xxxxS20 тогда считаем так
        Shift Температура , Right , 1
        If Температура < 0 Then
            Температура = Температура + 0.5
        End If       ' If Температура < 0 Then

    Elseif Семейство_датчиков = &H28 Then       ' Если xxxxB20 тогда считаем так
        Shift Температура , Right , 4
    End If       ' If Семейство_датчиков = &H10 Then

'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
'  Подпрограмма выбора датчика для текущенго считывания температуры
'===============================================================================
  Выбор_датчика:
'-------------------------------------------------------------------------------
    Select Case Порядковый_номер_датчика
      Case 1 :
               1wverify 1_id_ds18x20(1)       ' Обращаемся к Ds18x20 именно с этим, ранее считанным id
               Семейство_датчиков = 1_id_ds18x20(1)       ' Узнаём с каким датчиком будем работать
      Case 2 :
               1wverify 2_id_ds18x20(1)       ' Обращаемся к Ds18x20 именно с этим, ранее считанным id
               Семейство_датчиков = 2_id_ds18x20(1)       ' Узнаём с каким датчиком будем работать
      Case 3 :
               1wverify 3_id_ds18x20(1)       ' Обращаемся к Ds18x20 именно с этим, ранее считанным id
               Семейство_датчиков = 3_id_ds18x20(1)       ' Узнаём с каким датчиком будем работать
      Case 4 :
               1wverify 4_id_ds18x20(1)       ' Обращаемся к Ds18x20 именно с этим, ранее считанным id
               Семейство_датчиков = 4_id_ds18x20(1)       ' Узнаём с каким датчиком будем работать
      Case 5 :
               1wverify 5_id_ds18x20(1)       ' Обращаемся к Ds18x20 именно с этим, ранее считанным id
               Семейство_датчиков = 5_id_ds18x20(1)       ' Узнаём с каким датчиком будем работать
      Case 6 :
               1wverify 6_id_ds18x20(1)       ' Обращаемся к Ds18x20 именно с этим, ранее считанным id
               Семейство_датчиков = 6_id_ds18x20(1)       ' Узнаём с каким датчиком будем работать
      Case 7 :
               1wverify 7_id_ds18x20(1)       ' Обращаемся к Ds18x20 именно с этим, ранее считанным id
               Семейство_датчиков = 7_id_ds18x20(1)       ' Узнаём с каким датчиком будем работать
      Case 8 :
               1wverify 8_id_ds18x20(1)       ' Обращаемся к Ds18x20 именно с этим, ранее считанным id
               Семейство_датчиков = 8_id_ds18x20(1)       ' Узнаём с каким датчиком будем работать
    End Select
'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
'  Запуск измерения температур датчиками Ds18x20
'===============================================================================
  Start_измерения_ds18x20:
'-------------------------------------------------------------------------------
    1wreset       ' Сброс линии 1Ware
    1wwrite Подготовка_к_чтению_ds18x20       ' Команда используется, чтобы обратиться ко всем подключенным устройствам на шине одновременно
    1wwrite Запуск_измерения_ds18x20       ' Команда используется для запуска измерения датчиками Ds18x20
'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
'  Подпрограмма для обработки ошибки поиска датчика по номеру
'===============================================================================
  Error_id_ds18x20:
'-------------------------------------------------------------------------------
    Incr Общий_счетчик_ошибок

    Флаг_ошибка_ds18x20(порядковый_номер_датчика) = 1

    Incr Ошибка_запроса_id(порядковый_номер_датчика)

    Print Порядковый_номер_датчика ; "Error id"

    Готовая_температура_temp_str = "----"
'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
'  Подпрограмма для считывания id датчиков Ds18x20
'===============================================================================
  Считывание_id_ds18x20:
'-------------------------------------------------------------------------------

  Id_ds18x20(1) = 1wsearchfirst()       ' Спрашиваем id первого датчика, отвечает датчик с наименьшим id

  If Id_ds18x20(8) = Crc8(id_ds18x20(1) , 7) Then       ' Если контрольная сумма соответствует, идём дальше

      Print "id: ";

      For Цикл = 1 To 8
          1_id_ds18x20(цикл) = Id_ds18x20(цикл)

          If 1_id_ds18x20(1) = &H10 Then
              1_id_ds18x20(9) = 1
            Else
              1_id_ds18x20(9) = 0
          End If       ' If 1_id_ds18x20(1) = &H10 Then

          Print Hex(1_id_ds18x20(цикл));
      Next Цикл       ' For Цикл = 1 To 8

      If 1_id_ds18x20(1) = &H10 Then
          Print " - 1 sensor Ds18s20"
      Elseif 1_id_ds18x20(1) = &H28 Then
          Print " - 1 sensor Ds18b20"
      End If       ' If 1_id_ds18x20(9) = 1 Then

    Else

          Print "Error CRC id 1 датчика Ds18x20"

  End If       ' If Id_ds18x20(8) = Crc8(id_ds18x20(1) , 7) Then

  If Количество_найденных_ds18x20 > 1 Then

      Порядковый_номер_датчика = 2

      Do

        Id_ds18x20(1) = 1wsearchnext()       ' Спрашиваем id следующих датчиков, отвечают в порядке возрастания id

        If Id_ds18x20(8) = Crc8(id_ds18x20(1) , 7) Then       ' Если контрольная сумма соответствует, идём дальше
            Print "id: ";

            For Цикл = 1 To 8
                Select Case Порядковый_номер_датчика
                  Case 2 :
                           2_id_ds18x20(цикл) = Id_ds18x20(цикл)       ' Забираем считанный id из временной переменной в постоянную переменную, которую будем использовать по мере необходимости
                           Print Hex(2_id_ds18x20(цикл));
                  Case 3 :
                           3_id_ds18x20(цикл) = Id_ds18x20(цикл)       ' Забираем считанный id из временной переменной в постоянную переменную, которую будем использовать по мере необходимости
                           Print Hex(3_id_ds18x20(цикл));
                  Case 4 :
                           4_id_ds18x20(цикл) = Id_ds18x20(цикл)       ' Забираем считанный id из временной переменной в постоянную переменную, которую будем использовать по мере необходимости
                           Print Hex(4_id_ds18x20(цикл));
                  Case 5 :
                           5_id_ds18x20(цикл) = Id_ds18x20(цикл)       ' Забираем считанный id из временной переменной в постоянную переменную, которую будем использовать по мере необходимости
                           Print Hex(5_id_ds18x20(цикл));
                  Case 6 :
                           6_id_ds18x20(цикл) = Id_ds18x20(цикл)       ' Забираем считанный id из временной переменной в постоянную переменную, которую будем использовать по мере необходимости
                           Print Hex(6_id_ds18x20(цикл));
                  Case 7 :
                           7_id_ds18x20(цикл) = Id_ds18x20(цикл)       ' Забираем считанный id из временной переменной в постоянную переменную, которую будем использовать по мере необходимости
                           Print Hex(7_id_ds18x20(цикл));
                  Case 8 :
                           8_id_ds18x20(цикл) = Id_ds18x20(цикл)       ' Забираем считанный id из временной переменной в постоянную переменную, которую будем использовать по мере необходимости
                           Print Hex(8_id_ds18x20(цикл));
                End Select
            Next Цикл       ' For Цикл = 1 To 8

            If Id_ds18x20(1) = &H10 Then
                Print " - " ; Порядковый_номер_датчика ; " sensor Ds18s20"
            Elseif Id_ds18x20(1) = &H28 Then
                Print " - " ; Порядковый_номер_датчика ; " sensor Ds18b20"
            End If       ' If Id_ds18x20(1) = &H10 Then

            Incr Порядковый_номер_датчика
          Else
            Print "Error CRC id " ; Порядковый_номер_датчика ; " sensor"
        End If       ' If Id_ds18x20(8) = Crc8(id_ds18x20(1) , 7) Then

      Loop Until Порядковый_номер_датчика > Количество_датчиков_ds18x20       ' Считали id всех найденных датчиков и идём дальше

      Print ""

  End If       ' If Количество_найденных_ds18x20 > 1 Then

  Порядковый_номер_датчика = 1       ' Начинаем работу с первого датчика

'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
'  Подпрограмма определения количества датчиков на линии 1Ware
'===============================================================================
  Запрос_количества_ds18x20:
'-------------------------------------------------------------------------------
    Количество_найденных_ds18x20 = 1wirecount()

    If Количество_найденных_ds18x20 > Max_количество_датчиков_ds18x20 Then
        Количество_найденных_ds18x20 = Max_количество_датчиков_ds18x20
    End If       ' If Количество_найденных_ds18b20 > Max_количество_датчиков_ds18x20 Then

    Количество_датчиков_ds18x20 = Количество_найденных_ds18x20
'-------------------------------------------------------------------------------
  Return
'===============================================================================

0

46

Саш, это на каком компе ты столько датчиков одновременно "крутишь" ???
У меня если взять LCD + пару датчиков и ещё Шим какойнить - на четырехядерном интеле возникает желтое предупреждение о черезмерной загрузке процессора. Посему 18В20 иногда не определяются в протеусе, либо "пропускают" команду сброса, короче глючат. В железе все проходит 100-часовой и более тест без единой ошибки.
ЧТО я делаю не так???

0

47

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

Здесь
'--------------  Настраиваем шину 1Ware для работы с Ds18x20  ------------------
  Config 1wire = Portc.0       ' Ножка МК для подключения необходимого количества датчиков: Ds18x20

поправьте ножку МК под себя

Проверил в железе , тоже самое китайский датчик не работает.

0

48

Через COM порт компа работает? Если да, возможно дело в ошибке в схеме или еще в чем-то связанном не только с программной, но и с железом. Закажите на алиэкспресс (или в другом магазине где обычно покупаете) логический анализатор, который позволит увидеть обмен между датчиком и МК.

0

49

Пётр написал(а):

Через COM порт компа работает? Если да, возможно дело в ошибке в схеме или еще в чем-то связанном не только с программной, но и с железом. Закажите на алиэкспресс (или в другом магазине где обычно покупаете) логический анализатор, который позволит увидеть обмен между датчиком и МК.

Разве можео быть ошибка если датчик с одной партии работает а с другой нет , а через компорт работают с обеих партий ? Может подтягивающего резистора поменять номинал.

Отредактировано olegkaras (2018-06-27 18:37:05)

0

50

Если они работают, значит исправные и дело не в датчиках, а в чем-то другом.

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

Может подтягивающего резистора поменять номинал.

Какой он сейчас? Поставьте на 2 килоома.

0

51

Пётр написал(а):

Если они работают, значит исправные и дело не в датчиках, а в чем-то другом.

Какой он сейчас? Поставьте на 2 килоома.

Сейчас 4.7 кОм , попробую уменьшить.

0

52

-NMi- написал(а):

Саш, это на каком компе ты столько датчиков одновременно "крутишь" ???

Обычный ноут на Core i5, довольно старенький.

-NMi- написал(а):

У меня если взять LCD + пару датчиков и ещё Шим какойнить - на четырехядерном интеле возникает желтое предупреждение о черезмерной загрузке процессора.

LCD + 40 датчиков + 6 шимов + ds1307, загрузка процессора < 100%

http://sd.uploads.ru/t/dBrFM.jpg

На горчишник можно не обращать внимание или понизить частоту МК.

-NMi- написал(а):

Посему 18В20 иногда не определяются в протеусе, либо "пропускают" команду сброса, короче глючат.

Значит что-то собрано не правильно, такого быть не должно ни при каких условиях.

40 датчиков, всё работает

http://s7.uploads.ru/t/4Cli9.jpg http://s3.uploads.ru/t/BKhj0.jpg

-NMi- написал(а):

ЧТО я делаю не так???

Надо искать причину в конкретном случае.

0

53

Спасибо. Буду делать работу над ошибками  :flag:

0

54

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

Сейчас 4.7 кОм , попробую уменьшить.

Из спецификации на шину 1-Wire:

Сопротивление резистора надо выбирать из компромисса между сопротивлением используемого кабеля и внешними помехами. Сопротивление резистора может быть от 5,1 до 1 кОм. Для кабелей с высоким сопротивлением жил надо использовать более высокое сопротивление. А там где присутствуют промышленные помехи – выбирать более низкое сопротивление и использовать кабель с более большим сечением провода. Для телефонной лапши (4 жилы) для 100 метров необходимо резистор 3,3 кОм.

Если все устройства на шине питаются от ИП, то практически всегда можно не заморачиваться и ставить 4,3...4,7кОм.
При наличии на одной линии устройств с "внешним" и с паразитным питанием вперемешку или только с паразитным уже придется подбирать...

В моем случае при наличии на линии "витая пара" L = 18м устройств 3 x DS18B20, 1 x DS2408 и 2 x DS2413 опытным путем поставил 2,7кОм.
Иначе DS2413 (стоят в самом конце линии) спотыкались из-за нехватки питания (у них только паразитное)... ;)

0

55

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

Иначе DS2413 (стоят в самом конце линии) спотыкались из-за нехватки питания (у них только паразитное)...

Значит "недокурил" ДШ  :D
Паразитное питание ПОДРАЗУМЕВАЕТ!!! питание датчика(ов) во время преобразования не через резистор, а через отдельный MOSFET, который ЗАКОРАЧИВАЕТ шину данных на ПЛЮС питания на ВРЕМЯ преобразования!!!
Так-что ОПЯТЬ, не вводи в заблуждение "недопрограммистов" , иначе он(и) так и останется(утся) на "пальме"  :rofl:

0

56

-NMi- написал(а):

Значит "недокурил" ДШ

Практику никто не отменял, даже ДШ.

-NMi- написал(а):

Так-что ОПЯТЬ, не вводи в заблуждение "недопрограммистов" , иначе он(и) так и останется(утся) на "пальме"

Рано или поздно все слезают. ;)

Отредактировано Nord (2018-06-28 10:29:39)

0

57

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

Практику никто не отменял, даже ДШ.

Вот лично я дико сомневаюсь, что софт написан правильно и по всем канонам ДШ при питании датчика от линии данных. Приведи кусок кода, чде контролируется конец преобразования или подтверждения выполнения команды.Вот тогда я возьму свои "буквы" обратно!

0

58

-NMi- написал(а):

Вот лично я дико сомневаюсь, что софт написан правильно и по всем канонам ДШ

Использованы операторы Bascom'а. ;)
Куда уж неправильнее... ;)
Все претензии - к его создателю. ;)

0

59

Дык а баском то тут причём? В нём реализован всего-лишь стандарт протокола 1wire.
Вот смотри, как написано в даташите. Как раз вот на время ИЗМЕРЕНИЯ, допустим, возьмём 18В20 в 12-ти битном разрешении, с ОТДЕЛЬНОГО пина и ОТДЕЛЬНЫМ транзистором ПОДАЁМ питание по шине ДАННЫХ, т.е. DQ на эти пресловутые 750 мс. Далее снимаем с дополнительного пина питание и работаем обычным способом. Питать напрямую от пина нельзя т.к. в атмелах выходные каскады собраны по двухкаскадной схеме (хотя... если переводить порт в состояние ВХОДА - может и прокатит) и в ДШ об этом то-же намекнули.

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

Иначе DS2413 (стоят в самом конце линии) спотыкались из-за нехватки питания

Вот поэтому и "спотыкаются"
Добавь в процедуру опроса пару строк и спотыкашки пройдут  :D

0

60

-NMi- написал(а):

Далее снимаем с дополнительного пина питание и работаем обычным способом. Питать напрямую от пина нельзя

Вывод к которому подключены датчики настраиваем на выход, устанавливаем 1 и получаем нужный результат.

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Ds18B20. Работа с несколькими датчиками