При ходе работы с проектом "умного дома" столкнулся с вопросом определения наличия и исправности устройств 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)
