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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » Определение "живых" устройств на шине 1-Wire


Определение "живых" устройств на шине 1-Wire

Сообщений 1 страница 16 из 16

1

При ходе работы с проектом "умного дома" столкнулся с вопросом определения наличия и исправности устройств 1-Wire на шине.

Выяснилось, что ставший уже "обычным" способ по проверке Err = 1 не подходит.

При запуске системы МК проверяет все лучи 1-Wire, для каждого неоткликнувшегося устройства выставляет "1" в соответствующем бите флаговой переменной (далее ФП).
Получается так: на шине 4 шт. DS18B20, один расширитель DS2408 и один ключ DS2413.
В идеале ФП должна выглядеть так - 00000000 (биты слева направо соответствуют перечисленным устройствам).
В реалии:
- при отсутствии всех устройств получаем 11111100
- при наличии хотя бы одного - 00000000

Причина в том, что Err проверяет только отклик на Reset, а этот отклик будет получен в любом случае, еще до адресации конкретного устройства, т.к. при наличии хотя бы одного устройства оно и будет всегда "мигать" в ответ.

Выход нашел такой:
- обращаемся к устройству "по имени" (ROM-адрес). Независимо от наличия его на шине.
- считываем состояние регистра. Любого, который имеет "заводские" установки. Для DS18B20, например, я взял Configuration Register (byte 4). В нем "с завода" будет 127.
- проводим сравнение. Только уже не Err = 1, а сравниваем считанный байт с желаемым значением, в данном случае - 127.
- по результатам сравнения выставляем (или нет) флаг неисправности.

В результате получаем (например):
- при отсутствии двух датчиков DS18B20 - 01100000
- при отсутствии одного DS18B20 и DS2408 - 10001000

Зная, какой бит к какому устройству "привязан", топаем уже конкретно к нему, а не перещупываем всю гирлянду.

Отредактировано Nord (2018-04-21 23:30:59)

0

2

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

обращаемся к устройству "по имени" (ROM-адрес). Независимо от наличия его на шине.

Можно ведь произвести поиск устройств.

0

3

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

Можно ведь произвести поиск устройств.

Можно, но тогда теряется их "привязка" в пространстве.
Получится просто набор стоящих "где-то там" устройств и прочитанными ID.

В данном случае я знаю, в каком "углу" стоит устройство с ранее считанным ID и записанным в блок DATA.

0

4

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

Можно ведь произвести поиск устройств.

Не сразу понял идею...
Да, как вариант, можно выполнить поиск и сравнивать получаемые ID с имевшимися ранее.
Даже не обязательно все 8 байт...

0

5

Изначально фэйловый подход, надо было не жадничать и делать полноценный (хотя бы) rs485, там бы ты не только смог проверить наличие устройства, но и вообще его тип...

0

6

Доработал алгоритм поиска "живых" устройств.
Собственно, открытия никакого не сделал, но готовый "кирпичик" получился. ;)
Причина доработки - отсутствие у DS2413 регистров, которые имеют гарантированно неизменное состояние.
В данном варианте можно проконтролировать любые устройства, отвечающие протоколу 1-Wire.

За опору были взяты предложения Петра и даташит ;)

MATCH ROM (Выбор ROM) [55h]
Команда Match ROM, за которой следует 64-битная последовательность ROM, позволяет мастеру шины адресовать конкретное устройство на многоточечной шине. Только устройство, которое точно соответствует 64-битной ROM, будет отвечать на следующую команду функции управления. Все подчиненные устройства, которые не соответствуют 64-битовому ROM, ожидают импульс сброса. Эта команда может использоваться с одним или несколькими устройствами на шине.


1wreset PINB, num1w                                 ' Сброс по шине
1wwrite &H55, 1, PINB, num1w                   ' Команда Match ROM
For a = 1 To 8                                            ' Загоняем
   1wwrite id_ds24o(a), 1, PINB, num1w       ' в шину
Next a                                                       ' ID устройства
' А вот тут самый цинус...
1wreset PINB, num1w                             ' Сброс, но уже для выбранного устройства
Waitus 80                                                   ' Пауза, пока устройство выставляет в шине ответ

флаг_ошибок.31 = PINB.num1w                 ' Считываем шину

Значение "80" было выбрано практическим путем.
Гарантированно определяется физическое отсутствие устройства, отсутствие питания на нем (GND).
Проверялось с имеющейся прошивкой проекта с 12 шт. DS18B20, 6 шт. DS2408, 4 шт. DS2413 на 4-х лучевой системе 1-Wire.
Единственный казус - надо заранее знать ID всех устройств.

+1

7

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

Изначально фэйловый подход, надо было не жадничать и делать полноценный (хотя бы) rs485

Не будем вспоминать, почему мной был выбран 1-Wire... ;)

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

там бы ты не только смог проверить наличие устройства, но и вообще его тип...

В ID устройств 1-Wire есть байт Family Code, который однозначно указывает на тип устройства. ;)

+1

8

В ID устройств 1-Wire есть байт Family Code, который однозначно указывает на тип устройства.

Кстати...
Производитель сменил этот код для DS2413 - вместо 3А эти устройства имеют 85...
Считаные серийники имеющихся у меня DS2413:
856EB776C00310AA
857CB776C003109F
8591A776C0031080
8560B776C00310B9
8575B776C0031009
859FA776C0031093
85CBAB76C0031040
85A4A776C0031086
8596A776C0031005
85ADA776C0031010

Сомнений м/с не вызывают, т.к. функциональность 100%

Отредактировано Nord (2018-04-22 19:02:28)

+1

9

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

В ID устройств 1-Wire есть байт Family Code, который однозначно указывает на тип устройства

Да, но все устройства у тебя однотипные, когда я говорю про глобальную систему, а это для "умного дома" вещь одна из важных.

0

10

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

Да, но все устройства у тебя однотипные, когда я говорю про глобальную систему, а это для "умного дома" вещь одна из важных.

Они "однотипные" в первую очередь потому, что они - 1-Wire устройства...
Из набора устройств 1-Wire для данного проекта что еще можно припупырить, кроме как уже использованые ? ;)
Был бы в "одноварном" наборе датчик, аналогичный ВМЕ280, я бы не стал использовать ВМЕ280...
А больше как-то подходящих не нашел...
И м/с памяти "одноварные" мне ни к чему тут... ;)

Сама идеология "географической привязки" устройства подразумевает, что человек должен заранее знать и указать, в данном случае МК, где установлено какое устройство.
Сам МК НИКОГДА не определит, что один датчик установлен на кухне, а другой на улице.
Именно поэтому определение ID датчика при старте такой системы просто бестолково, т.к. устройства откликаются не по мере их установки на шине, а повинуясь другим законам.

Допустим, на шине 5 устройств...
Первым может откликнуться третий (по удалению от МК), а последним - самый ближний.
И какой смысл от считывания их ID при таком раскладе ?
Устройство не расскажет о себе, где оно установлено, протокол 1-Wire этого не предполагает.

Поэтому я заранее прочитываю ID каждого устройства и в программе достаточно вписать его в нужный блок DATA, чтоб программа работала с ним правильно.
При таком раскладе я буду однозначно знать, что "это" - температура на кухне, а "это" - на улице.

Или я в чем-то неправ ? ;)

Отредактировано Nord (2018-04-23 16:33:29)

0

11

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

Или я в чем-то неправ

У тебя просто применение для конкретной задачи и по этому нечему удивляться:

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

А больше как-то подходящих не нашел

Ладно, каждому нужно по мере восприятия.

0

12

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

У тебя просто применение для конкретной задачи и по этому нечему удивляться

Однозначно.
Вопрос работы с 1-Wire устройствами у каждого свой.
Надеюсь, поднятый в этой теме вопрос будет кому-то полезен. ;)

0

13

Вот читаю, и не врублюсь, о чём спор?
Всё это фигня, о чём вы говорите. Объясню на простом примере - BM8036. У меня он стоит уже ...... дцать лет. Во первых, ни когда не возникало проблемы, где какой датчик стоит. Сразу их присваиваешь куда надо.
Во вторых - одна шина хренова тем, что если один датчик крякнет, то хрен поймёшь какой, потому, что все датчики начинают прыгать.

0

14

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

Вот читаю, и не врублюсь, о чём спор? Всё это фигня, о чём вы говорите. Объясню на простом примере - BM8036. У меня он стоит уже ...... дцать лет. Во первых, ни когда не возникало проблемы, где какой датчик стоит. Сразу их присваиваешь куда надо. Во вторых - одна шина хренова тем, что если один датчик крякнет, то хрен поймёшь какой, потому, что все датчики начинают прыгать.

Первое... Никаких споров нет. ;)
Второе... Выделенное - как раз то, про что я и говорю.
Третье... Именно по этой причине я и разнес устройства на несколько лучей, а "крякнутое" устройство отслеживается прекрасно. Результат проверки описан в #6 в конце поста.

ЗЫ. Если "по душам", то для домашнего применения эта шина (1-Wire) - лучше не придумать... ;)
Программно реализуется на "раз-два".
Дальнобойность вполне себе даже без дополнительных прибамбасов (резистор не в счет).
Помехозащищенность - "на-ура". Проверялась на линии 20м телефонной "лапши", проложенной параллельно питающего кабеля э/д вентилятора 7,5кВт 380в.
Быстродействие достаточное для бытовых нужд.

Отредактировано Nord (2018-04-23 21:43:14)

0

15

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

Помехозащищенность - "на-ура". Проверялась на линии 20м телефонной "лапши", проложенной параллельно питающего кабеля э/д вентилятора 7,5кВт 380в.

У меня лапша в кабель-канале 5 метров, 18в20 и rs232 который управлял ВМ8036 не давал работать всему устройству. Как только вытащил разъём из компа, всё заработало.

0

16

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

Поэтому (чисто для DS2413) был выработан следующий алгоритм.

Изначально, как и ранее:

1wreset PINB, num1w                                 ' Сброс по шине
1wwrite &H55, 1, PINB, num1w                   ' Команда Match ROM
For a = 1 To 8                                            ' Загоняем
   1wwrite id_ds24o(a), 1, PINB, num1w       ' в шину
Next a                                                       ' ID устройства'

А вот дальше нововведения...

1wwrite &HF5, 1, PINB, num1w                   ' Считывание состояния выходов
                                                                           ' устройства
sostrd = 1wread(1, PINB, num1w)

sostwr = sostrd                                          ' Записываем считанное состояние обратно
sostinv = Not sostwr
1wwrite &H5A, 1, PINB, num1w
1wwrite sostwr, 1, PINB, num1w
1wwrite sostinv, 1, PINB, num1w
sostrd = 1wread(1, PINB, num1w)               ' Считываем ответ от чипа
a = sostrd                                              ' Нас интересует сейчас только
                                                                 ' первый байт

sostrd = 1wread(1, PINB, num1w)

If a <> &HAA Then флаг_ошибок.объект = 1  ' Теперь во флаге - истинное значение о наличии чипа на шине

Другие устройства 1-Wire по этому алгоритму не испытывал, в этих случаях однозначнее чтения заводских значений регистров не придумать.
В DS2413 же - куда не сунься после включения, везде "255"... ;)

Вот как-то так...

Отредактировано Nord (2018-04-26 23:02:12)

0


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » Определение "живых" устройств на шине 1-Wire