Сбор данных с 1 wire устройств. Ведомые однопроводные компоненты

Детские товары 19.06.2020
Детские товары

Все (и в том числе я) называют DS18B20 цифровым датчиком температуры. Однако это не просто датчик, это программируемый цифровой термометр. Он измеряет температуру в диапазоне от –55 до +125 градусов Цельсия, имеет программируемое температурное разрешение от 9 до 12 бит и позволяет задавать верхний и нижний температурные пороги, в случае превышения которых, устанавливается флаг аварии.

Каждый термометр DS18B20 имеет уникальный 64 битный серийный номер, который используется для его адресации на 1-Wire шине. Это позволяет объединять на одной шине несколько независимо работающих термометров и осуществлять между ними и микроконтроллером обмен данными по 1-Wire протоколу.

Схема подключения нескольких датчиков DS18B20 с внешним питанием.

1-Wire шина должна быть обязательно подтянута к плюсу питания через резистор номиналом 4,7 Ком. Напряжение источника питания от 3 до 5 Вольт.

Вывод Vdd соединяется с GND, а 1-Wire шина дополнительно подключается к источнику питания через полевой транзистор.

Когда датчик DS18B20 выполняет преобразование температуры или копирует данные из ОЗУ в EEPROM память, он потребляет ток до 1,5 мА. Этот ток может вызывать недопустимое снижение напряжения на 1-Wire шине. Чтобы этого не происходило, 1-Wire шину на время выполнения этих операций подключают к источнику питания. Для этого и нужен полевой транзистор.

Несколько слов о 1-Wire протоколе

Для обмена данными термометр DS18B20 использует 1-Wire протокол (однопроводный протокол). Это низкоскоростной двунаправленный полудуплексный последовательный протокол обмена данными использующий всего один сигнальный провод. Естественно требуется еще и возвратный (земляной) провод, но об этом маркетологи обычно умалчивают. 1-Wire протокол был разработан фирмой Dallas Semiconductor в конце 90-х годов.

Имеется несколько типов сигналов, определенных 1-Wire протоколом - импульс сброса, импульс присутствия, запись 0, запись 1, чтение 0 и чтение 1. Все эти сигналы, за исключением импульса присутствия, формируются на шине главным устройством - MASTERом. В нашем случае это микроконтроллер AVR.

Принцип формирования сигналов во всех случаях одинаковый. В начальном состоянии 1-Wire шина с помощью резистора подтянута к плюсу питания. Главное устройство «проваливает» на определенное время 1-Wire шину в ноль, затем «отпускает» ее и, если нужно, «слушает» ответ подчиненного (SLAVE) устройства. В нашем случае подчиненное устройство - термометр DS18B20.

Физически это реализуется так.

Операция записи бита: Вывод микроконтроллера устанавливается в режим выхода и на нем устанавливается логический ноль. Выдерживается пауза, длительность которой зависит от значения передаваемого бита (0 или 1), затем вывод переводится в режим входа в состоянии Hi-z и снова выдерживается пауза.

Операция чтения бита: Вывод микроконтроллера устанавливается в режим выхода и на нем устанавливается логический ноль. Выдерживается определенная пауза, вывод переводится в режим входа в состоянии Hi-z, выдерживается пауза, а затем микроконтроллер считывает потенциал вывода.

Инициализация: сигнал сброса и присутствия

Все сеансы связи микроконтроллера с датчиком DS18B20 начинаются с сигнала сброса. Микроконтроллер на 480 мкс «проваливает» 1-Wire шину в ноль, а затем «отпускает» ее. Если к шине подключен термометр DS18B20, то он обнаруживает положительный перепад и после паузы в 15-60 мкс отвечает микроконтроллеру импульсом присутствия - «проваливает» шину в ноль на время от 60 до 240 мкс.

Запись данных на 1-Wire шине

Обмен данными по 1-Wire шине происходит последовательно, младшим битом вперед. Передача или прием одного бита данных выполняются в течении фиксированного промежутка времени, так называемого тайм слота (time slot). Различают тайм слоты записи и тайм слоты чтения. Длительность всех тайм слотов должна быть > 60 мкс, а пауза между тайм слотами > 1 мкс.

Для передачи нуля микроконтроллер «проваливает» 1-Wire шину на время от 60 до 120 мкс. Затем «отпускает» ее и перед записью следующего бита выдерживает паузу >1 мкс.

Для передачи единицы микроконтроллер «проваливает» 1-Wire шину на время от 1 до 15 мкс, «отпускает» ее и выдерживает паузу. Пауза должна быть такой, чтобы длительность тайм слота была > 60+1 мкс.

Чтение данных на 1-Wire шине

DS18B20 является подчиненным устройством и может передавать данные, только когда микроконтроллер формирует на 1-Wire шине тайм слоты чтения. Для формирования тайм слота чтения микроконтроллер «проваливает» 1-Wire шину на время от 1 до 15 мкс, а затем «отпускает» ее, передавая управление состоянием 1-Wire шины датчику DS18B20. Если DS18B20 передает ноль, он удерживает шину в «проваленном» состоянии (в состоянии логического нуля) до конца тайм слота. Если он передает 1, он оставляет шину в «подтянутом» состоянии.

Микроконтроллер может считывать данные датчика DS18B20 через 15 мкс после начала тайм слота чтения.

1-Wire — однопроводный низкоскоростной интерфейс, разработанный фирмой Dallas Semiconductor (сейчас она является подразделением фирмы MAXIM) для двунаправленного обмена данными с различными периферийными устройствами (датчики температуры, электронные ключи, аккумуляторы).

Это довольно дешёвый и надёжный интерфейс, для устройств, не требующих быстрого обмена большим количеством данных. Он позволяет обмениваться данными на скорости до 15,4 кбит/с в обычном режиме и до 125 кбит/с в режиме «overdrive» (в статье мы будем рассматривать обычный режим). При использовании специальных проводов (IEEE1394 — Firewire) расстояние передачи данных может составлять до 300 м.

Как физически устроен сам интерфейс? Да очень просто, — смотрим рисунок слева. В микрухах реализованы порты 1-wire, которые состоят из высокоомного приёмника и передатчика на полевом транзисторе с открытым стоком, подключенные к одному общему выводу (вывод порта 1-wire). Типовой ток утечки закрытого выходного полевика составляет 5 мкА. Снаружи реализована шина 1-wire. Она состоит из одного сигнального провода (поэтому интерфейс и назван однопроводным), подтянутого через резистор (типовое значение 5,1 кОм) к питанию (к плюсу) и одного провода, подключенного к общему проводу (то есть к минусу).

Обмен данными осуществляется по принципу Master-Slave (ведущий-ведомый), соответственно устройства с интерфейсом 1-wire бывают двух типов: «Master» (ведущее устройство) и «Slave» (ведомое устройство). Как правило в качестве «Мастера» выступает контроллер (или компьютер, через специальное устройство сопряжения), а в качестве «Слэйвов» — различные периферийные устройства.

На одну шину 1-wire можно подключить множество (до 2 48) slave-устройств, поскольку каждое такое устройство имеет уникальный 48-битный серийный номер, который вместе с байтом «CRC» и байтом «family code» (определяющим тип устройства) образует уникальную 64-битную метку. Ведущий на шине 1-wire должен быть один.

Питаться устройства с интерфейсом 1-wire могут как от независимого источника, так и от сигнального провода. Если в устройствах используется КМОП-архитектура, то диапазон напряжений питания может быть довольно широкий, но, при подключении на одну шину, питание всех устройств должно быть примерно одинаковым (чтобы уровни напряжения правильно распознавались приёмниками). В основном используются TTL-уровни (соответственно, пятивольтовое питание). Ещё хотелось бы добавить, что выход, реализованный на полевике с низким током утечки, — это специальная заточка под питание от сигнальной линии. Если у вашего устройства будет внешнее питание — никто не мешает вам организовать порт 1-wire, например, на биполярном транзисторе с открытым коллектором. Аналогично, резистор 5,1 кОм — тоже не догма, его значение может варьироваться в зависимости, например, от ёмкости линии.

Теперь давайте подробнее расмотрим механизм передачи данных на уровне протокола.

Во первых, необходимо отметить, что всем обменом на шине управляет «Мастер». Только мастер решает — когда и с каким устройством он хочет поговорить и когда устройство должно посылать или принимать очередной бит. «Слэйвы» синхронизируются с «Мастером» по спаду на сигнальной линии и далее отсчитывают интервалы до тех или иных своих действий по внутреннему счётчику. Единственное самостоятельное действие, разрешённое «Слэйву» — это выдача сигнала «Presence» (импульс присутствия), который он выдаёт сразу после подключения на шину, чтобы обозначить своё присутствие. Кроме этого, «Мастер» может сформировать на шине сигнал «Ресет», после которого все «Слэйвы» на шине должны ресетнуться и также ответить «Мастеру» сигналом «Presence».

Диаграммы сигналов «Reset» и «Presence» приведены на рисунке слева. Синим цветом обозначено состояние активности «Мастера» (когда он притягивает уровень на шине к нулю), красным цветом обозначено состояние активности «Слэйва» (когда «Слэйв» притягивает уровень на шине к нулю), серым цветом обозначено состояние, когда «Мастер» и «Слэйв» неактивны (сигнал через резистор подтянут к питанию).

Чтобы всё было понятно — опишем то, что нарисовано на этом рисунке, словами. Итак, чтобы сформировать сигнал «Reset», — «Мастер» должен притянуть уровень на шине к нулю на время не менее 480 мкс и не более 960 мкс (480 мкс ≤ T RSTL < 960 мкс). После этого он должен отпустить шину и, не менее, чем на 480 мкс, прекратить свою активность на шине (T RSTH > 480 мкс). «Слэйвы», не ранее, чем через 15 мкс, но и не позднее, чем через 60 мкс после того, как «Мастер» отпустит шину (15 мкс < T PDH < 60 мкс), должны сформировать на шине низкий уровень (это и есть сигнал присутствия), длительностью от 60 до 240 мкс (60 мкс < T PDL < 240 мкс), после чего они также отпускают шину.

После того как «Мастер», получив сигнал «Presence», понял, что на шине есть «Слэйвы» — он может начинать с этими «Слэйвами» обмен данными. Данные по шине передаются побитово, младшим битом вперёд. 0 и 1 кодируются уровнями напряжения на сигнальном проводе (0 — низкий уровень напряжения, 1 — высокий уровень напряжения).

Каждый бит передаётся в установленном временном промежутке, называемом тайм-слотом. Начало каждого тайм-слота (как я уже говорил) определяет «Мастер», притягивая шину к низкому уровню. Время между тайм-слотами не регламентировано, то есть один бит можно передать, условно говоря, сейчас, а другой, скажем, через 5 минут, ничего страшного при этом не произойдёт и данные не потеряются.

Выборка данных «Слэйвом» и «Мастером» происходит в разные временные интервалы, относительно начала тайм-слота, поэтому мы отдельно рассмотрим варианты передачи данных в направлениях «Мастер» ⇒ «Слэйв» (тайм-слот записи) и «Слэйв» ⇒ «Мастер» (тайм-слот чтения).

Тайм-слот записи показан на рисунке слева. Как и ранее, синим цветом обозначена активность «Мастера», красным — активность «Слэйва» и серым — моменты, когда линия подтянута к питанию через резистор.

  1. 1 мкс≤T LOW1 <15 мкс — время, в течении которого шина притянута к нулю при передаче 1
  2. 60 мкс≤T LOW0
  3. 60 мкс≤T SLOT <120 мкс — длительность тайм-слота
  4. T REC >

Поясню этот рисунок несколько подробнее. Итак, для того, чтобы «Слэйв» распознал начало тайм-слота — «Мастер» должен удерживать сигнал на шине равным нулю в течении времени T LOW1 . После этого, но не позднее 15 мкс от начала тайм слота, «Мастер» должен установить на шине уровень сигнала, соответствующий передаваемому биту. То есть, если он хочет передать 1, то он должен отпустить шину через какой-то промежуток времени от начала тайм-слота, чтобы до начала «Окна выборки» сигнал успел установиться в единицу. Если же «Мастер» хочет передать ноль, то он просто должен так и оставить линию притянутой к нулю. В течении «Окна выборки» сигнал на линии не должен меняться, потому что в любой момент в течении этого времени сигнал может быть считан «Слэйвом». «Окно выборки» заканчивается через 60 мкс от начала тайм-слота. После окончания окна выборки и до окончания тайм-слота — «Мастер» должен отпустить шину, чтобы сигнал вернулся к высокому уровню. Понятно, что отпускать шину актуально только в том случае, если «Мастер» передавал 0, если же он передавал 1, то ему нужно просто дождаться окончания тайм-слота.

Тайм-слот чтения показан на рисунке справа.

  1. 1 мкс≤T LOWR <15мкс — время, в течении которого шина притянута к нулю
  2. T RDV =15 мкс — момент окончания «Окна выборки»
  3. 0 мкс≤T RELEASE <45 мкс — время, в течении которого «Слэйв» должен отпустить шину
  4. 60 мкс≤T SLOT <120 мкс — длительность тайм-слота
  5. T REC >1 мкс — интервал между тайм-слотами

Здесь всё происходит следующим образом: «Мастер» притягивает шину к нулю, чтобы обозначить начало тайм-слота. Пока линия притянута к нулю — «Слэйв» должен либо тоже притянуть линию к нулю, если хочет передать ноль, либо оставить линию свободной, если хочет передать единицу. После того, как «Мастер» отпустит шину (через время T LOWR), — начинается «Окно выборки» и «Мастер» может считывать с шины значение бита. Далее, после окончания «Окна выборки», «Слэйв» должен в течении времени T RELEASE отпустить шину.

Хотелось бы уточнить, что «Мастер» должен не сразу читать уровень на шине после того, как отпустит её, а через некоторое время, которое необходимо для того, чтобы исключить влияние ёмкости линии (если «Слэйв» передаёт 1, то, из-за наличия этой ёмкости, напряжение не может вырасти мгновенно после отпускания шины «Мастером»). С учётом этого, «Мастеру» наиболее целесообразно сделать промежуток, в течении которого он удерживает шину на низком уровне, как можно короче (чтобы увеличить себе окно выборки), а читать данные с шины как можно ближе к концу «окна выборки» (таким образом можно будет работать с линиями, имеющими бОльшую ёмкость).

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

  1. Эмуляция электронного ключа 1-wire на ATTiny2313

Система "Бенукс" позволяет собрать в один общий центр управления и мониторинга оборудование, которое казалось-бы ничего общего не имеет между собой. Благодаря тому, что все датчики и модули управления заводятся в одном общем справочнике устройств, дальнейшее их использование в программе единообразно и значительно упрощается для пользователя, не зависимо от типа оборудования и протоколов.

В настоящее время Бенукс поддерживает следующие разновидности оборудования:

Оборудование с доступом по WiFi на базе модуля ESP8266


В последнее время широкую популярность получили недорогие малогабаритные модули с доступом по Wi-Fi на базе чипа ESP8266, который представляет собой 32-битный контроллер со схемой обвязки. Помимо большого разнообразия аппаратных модификаций этого модуля, существует и много вариантов прошивок для контроллера. Система Бенукс поддерживает прошивку от "homes-smart", в которой обмен происходит по Http-протоколу. Есть модули со встроенной внутренней антенной, есть модули с подключением внешней антенны. Небольшие габариты модулей позволяют их легко встраивать в другие блоки или аппаратуру, а так-же в интерьер жилища или офиса. В системе Бенукс используются модули с прошивкой от homes-smart.ru

Одним из удачных законченных решений является оборудование интернет-магазина radioseti.ru в котором датчики и модули управления размещены в корпусах и готовы к использованию. В номенклатуре датчики температуры, влажности, протечки воды. Для управления оборудованием существуют модули в корпусах для монтажа на DIN-рейку. Начальная настройка модулей производится через ВЭБ-интерфейс, а затем в программе Бенукс это оборудование заводится в справочник устройств и используется в программе наравне с оборудованием других протоколов и технологий.

Основой сети 1-Wire является так называемый "мастер линии" - адаптер



Что значит "облегчённый"? - При малом количестве датчиков и небольшой длине микросети в качестве адаптера можно использовать очень простенькие схемы из нескольких деталей. В интернете можно найти несколько вариантов таких схем. Схема одного из них приведена: Этот адаптер используется для подключения около 3 устройств при длине линии не более 5 метров.

Если же организация 1-Wire-системы на базе персонального компьютера связана с особыми трудностями (большая длина линии, большое количество ведомых устройств, плохое качество кабеля или сложная топология, много помех и т.п.), то наиболее оптимально использование интеллектуального адаптера для COM-порта типа LINK. Он реализован на базе микропроцессора. При этом устройство полностью эмулирует со стороны последовательного порта работу популярного адаптера DS9097U производства Dallas Semiconductor и, таким образом, поддерживает все разработанное ранее для персональных компьютеров программное обеспечение. Но главное, что благодаря собственным интеллектуальным ресурсам этот адаптер реализует льготный режим работы однопроводных устройств на проблемных 1-Wire-линиях, в условиях сложной помеховой обстановки. LINK многократно улучшает механизм активной подтяжки на линии, что позволяет действительно получать идеальные сигналы обмена при длинах кабеля до 300 метров и числе сопровождаемых однопроводных компонентов до 250 шт, а использование процессором такого адаптера специальных алгоритмов цифровой фильтрации многократно улучшает устойчивость обслуживаемой 1-Wire-линии к электромагнитным помехам, шумам и отражениям сигналов.

Примечание: если USB-адаптер подключается к компьютеру через USB-расширитель, то обычно количество ошибок 1-Wire увеличивается, поэтому такое подключение нежелательно.


Конструктивно микросхема может устанавливаться в стандартную телефонную розетку со схемой стабилизатора внешнего питания. Приводим внешний вид модуля в сборе.

Конструктивно микросхема может устанавливаться в стандартную телефонную розетку со схемой стабилизатора внешнего питания. Приводим внешний вид модуля в сборе.



схема подключения к цифровому модулю внешних герконовых датчиков или датчиков типа "сухой контакт" показана
схема подключения к цифровому модулю цепи для управления оборудованием показана

В системе Бенукс может применяться восьмиканальная микросхема DS2408 в качестве как цифрового ввода, так и управления оборудованием. Причём часть каналов может использоваться для ввода, а часть для вывода.

Датчик питания 220V.

Один из вариантов применения цифрового универсального модуля - контроль наличия напряжения. Для этого стандартный модуль дополняется оптроном типа АОТ166А и двумя резисторами на 110 Ком. Благодаря тому, что используемый оптрон имеет широкий диапазон входного тока, на вход полученного модуля допускается подавать напряжение от 12 до 380 Вольт. А наличие двух встречно включенных светодиодов внутри оптрона позволяет подавать напряжение любой полярности, а значит как переменного тока, так и постоянного. На фото показан модуль, используемый в качестве датчика наличия 220В. Кроме примера, показанного на фото, описываемый модуль можно использовать и в других применениях, например как датчик наличия питания на электромагнитном клапане или задвижке и т.д.

Схема подключения внешнего сигнала к модулю показана
Стоит отметить, что если в описанном модуле использовать двухканальную микросхему DS2406P и два оптрона, то такой модуль можно использовать для контроля двух различных напряжений. Видеокоммутаторы с интерфейсом 1-Wire изготавливается на основе микросхем DS2406, DS2406P, DS2408 и DS2413. В настоящее время система "Бенукс" обслуживает следующие типы видеокоммутаторов:


Двухканальный на основе DS2406. В таком коммутаторе микросхема управляет одним реле с переключающимися контактами. Таким образом, на выход коммутатора подаётся видеосигнал либо с одного видеовхода, либо с другого.


Четырёхканальный на основе DS2406P или DS2413. В таком коммутаторе сигналы с двухканальной микросхемы поступают на двоичный дешифратор, который управляет четырьмя электромеханическими реле. В зависимости от двоичного кода на выходе микросхемы DS2406P, включается один из четырёх видеоканалов.

Розетка с интерфейсом 1-Wire

Для управления всевозможными бытовыми электроприборами имеется типовая розетка 220 вольт в пластиковом корпусе. Внутри корпуса размещается плата с микросхемой DS2413P и интегральный стабилизатор для её питания. Микросхема управляет силовым симистором со схемой опторазвязки. Симистор крепится на радиаторе, что позволяет управлять нагрузками до 1000 ватт. Кроме силовой розетки, наружу корпуса выведены два гнезда RJ для подключения микросети 1-Wire. Светодиодный индикатор сигнализирует о включенной розетке. Вместо микросхемы DS2413P можно использовать DS2406(DS2406P), которая так-же позволяет управлять внешними устройствами, но имеет иное расположение выводов на корпусе.
Ниже по тексту имеется ссылка на схему этого устройства.

Безкорпусные сборки управления нагрузкой 220В с 1-Wire
Для промышленного использования в системах управления рекомендуем использовать безкорпусные модули, коммутирующие нагрузки 220в. Для примера приводим модуль с электромагнитным реле.

Датчик движения с интерфейсом 1-Wire

Это устройство представляет собой типовой датчик движения SRP100 с дополнительной встроенной платой. На плате расположена микросхема DS2406P и интегральный стабилизатор для её питания. На один канал микросхемы заведён сигнал от датчика движения, а на второй канал - концевик, срабатывающий при открывании корпуса датчика движения. Питание датчика движения выполняется от микросети 1-Wire.
Для того, чтобы не ограничивать пользователя использованием только датчика SRP100 и чтобы пользователь мог по своему усмотрению выбрать датчик движения из множества вариантов исходя из своих требований, используется специальный модуль для подключения любых датчиков движения с подобным интерфейсом. То есть, пользователь отдельно приобретает понравившийся ему датчик движения и подключает его к этому модулю. Единственное ограничение: чтобы датчик позволял запитывать его от напряжения +12В и тип выходного сигнала этого датчика должен быть типа "сухой контакт" или подобный. Модуль изготовлен на основе универсального двухканального цифрового ввода-вывода с дополнительным встроенным стабилизатором питания +12В. На выходную колодку этого модуля выводятся два цифровых канала и питание +12В.

Пример подключения двухканального цифрового модуля к датчику движения SRP-100
Датчик протечки воды с интерфейсом 1-Wire

Это устройство представляет собой транзисторный ключ, срабатывающий от малых токов, возникающих при попадании воды на контакты сенсорной платы. Сигнал от транзисторного ключа поступает на микросхему DS2406, а затем обрабатывается системой "Бенукс".

Датчик освещённости и влажности

Этот модуль собран на основе микросхемы DS2438. В качестве датчика освещённости используется фотодиод ФД256, а измерителем влажности является дактчик HIH-4000-004 фирмы Honeywell Inc.

Модуль аналоговых сигналов на основе DS2438

Основное назначение этого модуля - завести типовой аналоговый сигнал (0-10В) в персональный компьютер для цифровой обработки. Источником такого сигнала может быть датчик влажности, датчик давления (водяного, атмосферного и т.д.), датчик усилия, потребляемого тока и т.д., т.е. любой датчик, у которого выходной сигнал имеет диаппозон от 0 до 10 вольт.
Этот модуль собран на основе микросхемы DS2438. Особенность этой микросхемы в том, что в ней имеется два входа для аналоговых сигналов. На первый вход подаётся сигнал от 0 до +10 вольт. На второй вход может подаваться двуполярный сигнал от -250 милливольт до +250 милливольт.

Для увеличения надо кликнуть на картинке.

Модуль-приёмник ИК-команд с передачей сигнала в 1-Wire

Это устройство даёт возможность управлять восемью устройствами на расстоянии, с помощью ИК пульта. Сигналами с ИК пульта одна из восьми DS2401 подключается непосредственно к сети 1-WIRE. ПК с системой БЕНУКС обнаруживает активность на шине DS2401 и подает команды на включение или выключение устройств, а так же выполнение команд по заданному сценарию.
Система Бенукс определяет микросхему DS2401 как тип iButton, поэтому допускается использование микросхем DS* с такими "групповыми" номерами: 01,04,06,08,09,11,12,20,35,45,55.
Тем кто любит попаять. Девайс так же можно модернизировать и сделать автономное устройство, которое управляет всевозможными бытовыми электроприборами. Для этого вместо микросхем DS2401 нужно установить, согласно схеме, силовой каскад из симистров или реле. Тогда у Вас получится устройство, которое управляет восемью устройствами с ИК пульта.

Примечание:
Этот модуль является отдельной разработкой одного из пользователей системы "Бенукс",
по всем вопросам обращайтесь на E-mail [email protected]

Примечания.
Во всех представленных выше устройствах микросхемы DS2406, DS2406P и DS2408 могут могут работать либо как цифровой датчик, либо как устройство управления, в зависимости от электрической схемы подключения. Микросхема DS2413 в системе Бенукс не используется как цифровой датчик, потому что не поддерживает команду 1-Wire "поиск активных". Эта микросхема используется только для устройства управления.
Схемотехника большинства устройств заимствована с сайта Московской фирмы ЭлИн.
Производители оборудования с протоколом 1-Wire

Большой выбор датчиков и устройств с 1-Wire в Интернет-магазине www.radioseti.ru
Кроме того, в этом же магазине можно приобрести модули ESP8266 с доступом по Wi-Fi. Более подробно о таких модулях ethernet usb (может быть использован для адаптера 1-Wire)
Миникомпьютеры серии eBox

Технология достаточно старая и широко употребляемая

Изначально, выведена на рынок компанией Dallas - Все помнят таблетки для домофонов iButton- это оно

Устройство соединяется с контроллером по одному проводу (кроме общего) - отсюда название. Большое преимущество в том, что каждый чип имеет свой адрес, что позволяет термометры соединять просто параллельно

Я провел массу экспериментов с данным стандартом. Изначально, предполагая очень широко использовать его для управления Умным Домом

Хуже всего, если для управления 1-wire шиной не использовать никаких специализированных контроллеров (подключение напрямую к PIN у Arduino устройств) - в этом случае, проблемы возникают уже при длине кабеля более 3-х метров

Для моих целей такое расстояние не подходило, поэтому я использовал I2C to 1-wire мост DS2482-100

Стоимость чипа на Aliexpress менее 100 руб, чип имеет аппаратный драйвер шины с режимом strong-pullup, что в разы увеличивает надежность работы системы.

Альтернативные решения, как правило, используют USB контроллеры шины 1-Wire на основе DS2490 но это подразумевает использование компьютера в составе контура управления. По опыту, надежность комплексного решения, включающего в себя PC, операционную систему, ПО, сетевую инфраструктуру, в любом случае ниже решения, локализованного в пределах одного контроллера. Поэтому ответственные задачи регулирования я реализовывал таким образом, что это регулирование происходит автономно, контроллером.

У себя я использую шлейф длиной около 150 м.

Термометры опрашиваются, относительно, устойчиво, что позволило предельно дешево и управляемо реализовать систему управления теплыми полами. Но сбои в считывании значений датчиков присутствуют. (В особенности, когда задействовано диммирование освещения или работает приточная вентиляция с фазовой регулировкой мощности нагревательного элемента)

Контроллер опрашивает датчики циклично, поэтому, единичные сбои не влияют на функционирование.

Кроме термометров, я пробовал использовать самую разнообразную перефирию, вооружившись Datasheet - ами написав множество процедур для управления следующими чипами и устройствами на их базе:

Если коротко - себя это не оправдало

Основная проблема - все же не очень хорошая помехозащищенность

Борьба с помехами в сети 1-Wire

Это, пожалуй, самое непростое в данной технологии. Описываю свой опыт:

  • Шину 1-Wire прокладывайте на расстоянии от высоковольтных проводов, трансформаторов LED освещения и проводов LED освешения (провода дают сильную помеху за счет того, что сила тока велика и используется ШИМ модулирование)
  • Не надо использовать экранированную витую пару. Я проложил STP 5-й категории, но при попытке заземлить экран - связь полностью теряется. Предполагаю, что это связано с увеличением емкости проводника.
  • По отзывам, невитая пара (самый дешевый двужильный провод) дает лучший результат.
  • Хороший опыт - подтягивать дальний конец провода через резистор 3-4 КОм к стабилизированному фильтрованному источнику питания 5Вольт.
  • Отводы от шины в 2-3 метра, в целом, не ухудшают качества работы системы, но прилично упрощают монтаж.

Отличительные особенности:

  • Поддержка стандартной скорости протокола Dallas 1-Wire.
  • Совместимость со всеми микроконтроллерами AVR.
  • Реализация с управлением по прерываниям или по опросу.
  • Реализация на основе опроса не требует внешней схемы.

Введение

Уникальность микросхем Dallas с интерфейсом 1-Wire заключается в необходимости использования для связи с ними только одной сигнальной линии и общего проводника. Питание и связь осуществляются через одно соединение. Для связи с такой микросхемой требуется задействовать только одну линию ввода-вывода. В данных «Рекомендациях» показывается, как с помощью AVR-микроконтроллера реализовать ведущий интерфейс 1-Wire программным способом или с задействованием модуля У(С)АПП.

Принцип действия протокола Dallas 1-Wire

Шина 1-Wire использует только один проводник для связи и питания. Режим связи – асинхронный и полудуплексный, который строго следует схеме ведущий-подчиненный. К одной и той же шине могут быть одновременно подключено одно или несколько подчиненных устройств. К одной шине может быть подключено только одно ведущее устройство.

Незанятому состоянию шины соответствует высокий уровень, который формируется подтягивающим резистором. Номинал подтягивающего резистора приводится в документации на подчиненную ИМС. Все микросхемы, подключенные к шине, должны быть способны создавать низкий уровень. Если выход микроконтроллера не поддерживает тристабильность, то необходимо предусмотреть драйвер, у которого выход с открытым коллектором или открытым стоком

Передача сигналов по шине 1-Wire разделена на временные слоты длительностью 60 мкс. Одним временным слотом передается только один бит данных. Подчиненным устройствам допускается иметь существенные отличия от номинальных выдержек времени. Однако это требует более точного отсчета времени ведущим, чтобы гарантировать корректность связи с подчиненными, у которых различаются временные базисы. Таким образом, следует в точности выдерживать временные границы, рассматриваемые в следующих разделах.

Основные сигналы шины

Ведущий инициирует каждую связь на битном уровне. Это означает, что передача каждого бита, независимо от направления, должна быть инициирована ведущим. Это достигается установкой низкого уровня на шине, который синхронизирует логику всех остальных устройств. Существует 5 основных команд для связи по шине 1-Wire: “Запись лог. 1”, “Запись лог. 0”, “Чтение”, “Сброс” и “Присутствие”.

Сигнал “Запись лог. 1”

Сигнал “Запись лог. 1” показан на рисунке 1. Ведущий устанавливает низкий уровень в течение 1…15 мкс. После этого, в течение оставшейся части временного слота он освобождает шину.

Рисунок 1 – Сигнал «Запись лог. 1»

Сигнал “Запись лог. 0”

Сигнал “Запись лог. 0” показан на рисунке 2. Ведущий формирует низкий уровень в течение не менее 60 мкс, но не дольше 120 мкс.

Рисунок 2 – Сигнал «Запись лог. 0»

Сигнал “Чтение”

Сигнал “Чтение” показан на рисунке 3. Ведущий устанавливает низкий уровень в течение 1…15 мкс. После этого подчиненный удерживает шину в низком состоянии, если желает передать лог. 0. Если необходимо передать лог. 1, то он просто освобождает линию. Сканирование шины необходимо выполнять по истечении 15 мкс после установки низкого уровня на шине. Если смотреть со стороны ведущего, сигнал “Чтение” является в сущности сигналом «Запись лог. 1». Собственно внутреннее состояние подчиненного будет определять это сигнал «Запись лог. 1» или «Чтение».

Рисунок 3 – Сигнал «Чтение»

Сигнал “Сброс/присутствие”

Сигналы “Сброс” и “Присутствие” показаны на рисунке 4. Обратите внимание, что временные интервалы импульсов отличаются. Ведущий устанавливает низкий уровень в течение 8 временных слотов (480 мкс), а затем освобождает шину. Данный длительный период низкого состояния называется сигнал «Сброс».

Если на шине присутствует подчиненный, то он должен в течение 60 мкс после освобождения ведущим шины установить низкий уровень длительностью не менее 60 мкс. Данный отклик носит название «Присутствие». Если такой сигнал не обнаруживается, то ведущий должен полагать, что нет подключенных устройств к шине и дальнейшая связь невозможна.


Рисунок 4 – Сигналы «Сброс» и «Присутствие»

Программная генерация сигналов

Программная генерация сигналов 1-Wire является наиболее очевидным решением. При этом необходимо манипулировать над изменением направления и состояния линии ввода-вывода, а также генерировать требуемые временные задержки. Подробное описание данного метода приведено в разделе реализации.

Генерация сигналов с помощью УАПП

Основные сигналы 1-Wire также можно генерировать с помощью УАПП. Для этого необходимо связать с шиной выводы TXD и RXD с помощью несложной схемы представленной на рисунке 5. Приведенные номиналы резисторов носят рекомендательный характер. Более подробные рекомендации по выбору подтягивающего резистора следует искать в документации на подчиненную ИМС.


Рисунок 5 – Схемотехника драйвера шины с открытым коллектором

Формат данных УАПП, который используется для генерации сигналов 1-Wire, - 8 бит данных без бита паритета и 1 стоп-бит. Одна посылка данных УАПП используется для генерации нужной формы прямоугольного импульса или последовательности СБРОС/ПРИСУТСТВИЕ. В таблице 1 показано, как настроить УАПП для генерации прямоугольного импульса и как интерпретировать принятые данные. Соответствующие структуры посылок УАПП показаны на рисунках 6…10.

Таблица 1 – Передача сигналов с помощью УАПП


Рисунок 6-Сигнал «Запись лог. 1» и структура посылки УАПП.


Рисунок 7- Сигнал «Запись лог. 0» и структура посылки УАПП.


Рисунок 8 – Сигнал «Чтение лог. 0» и структура посылки УАПП.


Рисунок 9 – Сигнал «Чтение лог. 1» и структура посылки УАПП.


Рисунок 10 – Сигнал «Сброс/Присутствие» и структура посылки УАПП.

Команды функций ПЗУ

Каждая ИС из семейства 1-Wire содержит ПЗУ, в котором хранится уникальный 64-разрядный идентификационный код (ИК). Данный код может использоваться для адресации или идентификации конкретной ИС на шине. Идентификатор состоит из трех частей: 8 бит кода семейства, 48 бит серийного номера и 8 бит CRC-кода, вычисленного от первых 56 бит. Имеется небольшой набор команд, который работает совместно с 64-разр. ИК. Эти команды называются команды функций ПЗУ. В таблице 2 приведен перечень шести команду ПЗУ.

Таблица 2 – Команды ПЗУ

Описание команд

Команда «Чтение ПЗУ»

Команда “Чтение ПЗУ” может использоваться на шине с одним подчиненным для чтения 64-разр. индивидуального ИК. Если имеется несколько подчиненных устройств, подключенных к шине, то результатом выполнения этой команды будет прием значения, эквивалентного логическому И между всеми ИК. При этом полагается, что связь безупречная, а наличие нескольких подчиненных индицируется ошибочным CRC.

Команда «Пропуск ПЗУ»

Команда «Пропуск ПЗУ» может использоваться, если нет необходимости адресоваться к конкретному подчиненному устройству по его специфическому адресу. На шине с одним подчиненным команда “Пропуск ПЗУ” прекрасно подходит для его адресации. На шине с несколькими подчиненными команда “Пропуск ПЗУ” может использоваться для адресации всех устройств одновременно.

Это удобно, если требуется отправить общую команду нескольким подчиненным устройствам, например, одновременный запуск преобразования температуры в нескольких датчиках температуры. Команду “Пропуск ПЗУ” бессмысленно использовать при чтении шины с несколькими подчиненными устройствами.

Команда «Совпадение ПЗУ»

Команда “Совпадение ПЗУ” используется для адресации конкретного подчиненного устройства на шине.

После выполнения команды “Совпадение ПЗУ” передается 64-разрядный ИК. По завершении, только тому подчиненному устройству, который принял свой ИК, разрешается отвечать после приема следующего импульса сброса.

Команда «Поиск ПЗУ»

Команда “Поиск ПЗУ” может использоваться, если идентификаторы подчиненных устройств неизвестны заранее. Это делает возможным обнаружить идентификаторы всех подчиненных устройств, подключенных к шине. Для этого, вначале передается команда “Пропуск ПЗУ”. Каждый подчиненный размещает первый бит своего идентификатора на шине. Ведущий считывает результат, как логическое И над всеми первыми битами идентификаторов всех подчиненных устройств. Затем подчиненные размещают на шине двоичное дополнение к первому биту своего идентификатора. Ведущий считывает состояние шины, которое есть результат логического «И» над всеми дополнениями к первому биту идентификатора всех подчиненных устройств. Если все устройства в первом разряде ИК содержат 1, то ведущий считает 10b. Аналогично, если значения 1 разряда всех устройств равно 0, то ведущий примет 01b. В этих случаях, бит может быть сохранен как значение первого бита всех адресов. После этого ведущий снова выполняет размещение этого бита на шине, чем сигнализирует подчиненным о необходимости дальнейшего продолжения передачи разрядов ИК. Если на шине будут присутствовать устройства, как с лог. 0, так и с лог. 1 в первом бите идентификатора, то ведущий примет 00. В этом случае, ведущий должен выбрать с какими адресами продолжать работу, с лог. 0 или 1 в первом разряде. Выбор передается по шине, указывая выбранным подчиненным о необходимости дальнейшей передачи ИК, а остальные подчиненные переходят в режим ожидания.

Затем ведущий переходит к считыванию следующих бит и этот процесс повторяется до считывания всех 64 бит. В результате ведущий обнаруживает полный 64-разрядный идентификатор. Для поиска других идентификаторов необходимо снова инициировать команду «Поиск ПЗУ», но в этом случае при возникновении несоответствий сделать другой выбор. Если придерживаться данной последовательности, то в конечном счете можно обнаружить все подчиненные устройства. Обратите внимание, что после выполнения первого поиска все подчиненные, кроме одного, переходят в режим ожидания. Таким образом, в этом состоянии связаться с активным подчиненным можно с помощью команды «Совпадение ПЗУ».

Ускоренные команды ПЗУ

Ускоренные команды ПЗУ не рассматриваются здесь, т.к. в данном документе рассматривается только режим стандартной скорости.

Команды памяти/функций

Команды памяти/функций – команды, которые специфичны для конкретного типа ИС или их класса. Обычно эти команды относятся к чтению или записи внутренней памяти и регистров подчиненных ИС. Количество таких команд фиксировано, но все они поддерживаются конкретным видом подчиненного устройства. Последовательность чтения и записи определена для каждой ИС. В связи с этим команды памяти здесь в подробностях не рассматриваются.

Типичная последовательность сеанса связи

Все однопроводные устройства придерживаются основной последовательности связи:

  1. Ведущий отправляет импульс “Сброс”.
  2. Подчиненный (ые) отвечает (ют) импульсом «Присутствие».
  3. Ведущий отправляет команду ПЗУ, адресуя одно или несколько подчиненных устройств.
  4. Ведущий отправляет команду памяти.

Обратите внимание, что для перехода к новому шагу, последний шаг должен быть завершен. Однако, не всегда необходимо завершать всю последовательность. Например, после завершения команды ПЗУ можно отправить новую команду «Сброс» и тем самым инициировать новый сеанс связи.

Проверка циклическим избыточным кодом

Кодирование циклическим избыточным кодом (CRC) используется для гарантирования целостности принятых данных через 1-Wire.

Подробности по теории CRC в этом документе не приводятся и в дальнейшем не обсуждаются. Если необходима информация по CRC, то рекомендуется использовать .

Среди семейства 1-Wire обычно используются две различные схемы CRC. Одна из них – 8-разрядная CRC (CRC8), другая – 16-разрядная CRC (CRC16). CRC8 используется в секторе ПЗУ всех микросхем. CRC8 также используется в некоторых ИС для проверки других данных, например, вводимых через шину команд. CRC16 используется некоторыми ИС для проверки на наличие ошибок в больших наборах данных.

Аппаратный эквивалент 8-разрядного CRC используется 64-разрядным идентификатором и показан на рисунке 11. Блоки представляют индивидуальные биты в 8-разрядном сдвиговом регистре. Эквивалентное полиноминальное выражение для CRC: X8 + X5 + X4 + 1.


Рисунок 11 – Аппаратный эквивалент 8-разр. CRC, используемого в микросхемах 1-Wire

Аппаратный эквивалент 16-разрядного CRC используется некоторыми ИС и показан на рисунке 12. Блоки представляют индивидуальные биты в 16-разрядном сдвиговом регистре. Эквивалентное полиноминальное выражение для CRC: X16 + X15 + X2 + 1.


Рисунок 12 - Аппаратный эквивалент 16-разр. CRC, используемого в микросхемах 1-Wire

Реализация

Далее рассматриваются три различных способа реализации протокола 1-Wire: полностью программная (по опросу), на основе УАПП с опросом флагов состояния и на основе УАПП с управлением по прерываниям. Короткое описание каждого дается ниже. Подробное описание по использованию каждого драйвера не входит в данный документ. Если необходимо более подробная информация по работе каждого драйвера, то необходимо ознакомится с исходным кодом интересующего драйвера, который входит в состав данных «Рекомендаций»

Рассмотрим программный подход к реализации протокола 1-Wire без задействования специальных аппаратных блоков микроконтроллера. Преимуществом данного подхода является то, что из аппаратных затрат потребуется только одна линия ввода-вывода общего назначения (GPIO). Поскольку все линии ввода-вывода у AVR-микроконтроллеров двунаправленные и содержат опциональные подтягивающие резисторы, то AVR-микроконтроллер может управлять шиной 1-Wire без какой-либо внешней схемы. В случае, если номинал внутреннего подтягивающего резистора не соответствует текущей конфигурации подчиненных устройств, то понадобиться только один внешний резистор. Недостатком данного подхода является возникновение задержек в процессе генерации “Сброс/Присутствие” и передачи бит. Чтобы гарантировать корректность временных интервалов на шине 1-Wire, прерывания должны быть отключены на время передачи бит. Длительность интервала между передачами двух бит никак не ограничивается. Таким образом, после передачи каждого бита можно смело активизировать прерывания. В этом случае генерация прерывания может возникать с задержкой, но ее наихудшее значение не превысит длительности генерации сигнала “Сброс/Присутствие” (менее 1 мс).

Драйвер УАПП с управлением по опросу использует модуль УАПП, который входит в состав многих микроконтроллеров AVR. Он используется для генерации сигнала необходимой формы на битном уровне. Остальная часть драйвера эквивалентна программному. Основными преимуществами данного драйвера по сравнению с программным – компактность программного кода и отсутствие необходимости манипулировать прерываниями во время передачи сигналов, т.к. УАПП выполняет это автономно. Недостатки: требует двух линий ввода-вывода и несложную внешнюю схему.

Драйвер УАПП с управлением по прерываниям использует УАПП для генерации сигналов необходимой формы тем же способом, что и драйвер УАПП с управлением по опросу. Дополнительным преимуществом данного подхода является возможность автоматического приема-передачи до 255 бит данных.

Драйверы с опросом состояния

Драйверы с опросом состояния разделены на две части: генерация сигналов битового уровня и команды высокого уровня для передачи байт и реализации команд ПЗУ. Отличие между двумя версиями состоит только в процедурах битного уровня, но они реализованы с общим интерфейсом, что позволяет использовать команды высокого уровня с любым драйвером.

Программная реализация

С помощью рассматриваемой программной реализации имеется возможность манипулировать с несколькими шинами 1-Wire, подключенных к одному микроконтроллеру AVR. Однако все шины должны быть подключены к одному и тому же порту ввода-вывода, а на какой именно порт необходимо определится во время проектирования.

Количество подключаемых шин ограничивается восемью, а перенос шины в пределах порта может конфигурироваться. Выводы, которые не задействованы шинами 1-Wire, остаются незатронутыми. Поскольку все шины 1-Wire подключены к одному и тому же порту, то несколько операций может быть выполнено на одной или более шинах одновременно. Это стало возможным благодаря аргументу pin или pins, которые входит в интерфейс каждой функции. Данный аргумент должен содержать маску для выводов, которые задействованы для работы. Например, имеется возможность отправить сигнал СБРОС восьми шинам одновременно, указав в качестве аргумента 0xff. Значение, возвращаемое этой функцией будет битовой маской всех шин, где один или более подчиненных устройств сгенерировали сигнал «присутствие». Данная битовая маска может подставляться в качестве аргумента pins в функцию, которая вводит команду «Пропуск ПЗУ». Все функции в этой реализации поддерживают возможность выбора вывода (pin). Следует руководствоваться общим правилом: все команды записи могут адресовать несколько шин одновременно. Команды чтения могут адресоваться только к одной шине.

Инициализация

Процедура инициализации интерфейса 1-Wire предельно проста. Она заключается в установке выводов 1-Wire на ввод и, при необходимости, активизации встроенного подтягивающего резистора для перевода шины в неактивное состояние. Некоторые микросхемы отреагируют на этот нарастающий фронт на шине, как на окончание сигнала «Сброс» и ответят сигналом «Присутствие». Для гарантирования, что этот сигнал не вызовет какого-либо сеанса связи, предусмотрена длительная выдержка времени.

Функции битового уровня

Функции битового уровня реализованы в соответствии с рекомендациями по применению AN126 компании Dallas Semiconductors. Все параметры временной диаграммы выдержаны в соответствии с рекомендованными значениями в этом документе. Значения приведены в таблице 3.

Таблица 3 – Значения используемых задержек времени

Параметр Рекомендованная задержка, мс
A 6
B 64
C 60
D 10
E 9
F 55
G 0
H 480
I 70
J 410

Обратите внимание, что в стандартном режиме задержка G равна 0.

Поскольку все операции ввода-вывода реализованы на Си без использования Ассемблера, то оптимизации компилятора и другие факторы могут нарушить временные характеристики. В связи с этим, рекомендуется следить за фактическими параметрами генерируемых импульсов каждой функцией битового уровня с помощью осциллографа и при необходимости отрегулировать задержки.

Функции уровня передачи бит реализованы так, как показано на рисунке 13. Обратите внимание, что функция “Определение присутствия” отправляет сигнал «Сброс» и считывает “Сигнал присутствие”. Также следует учесть, что все функции уровня передачи бит могут адресоваться к нескольким шинам одновременно.


Рисунок 13 – Функции слоя передачи бит

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

Реализация на УАПП с опросом

При использовании данного подхода за параметры всех временных диаграмм отвечает модуль УАПП. Для отправки бита устанавливается соответствующая скорость связи УАПП, а затем в регистр данных записывается значение, которое вызовет генерацию сигнала желаемой формы (см. «Генерация сигналов с помощью УАПП”).

Инициализация

Для инициализации интерфейса 1-Wire при использовании рассматриваемого драйвера, первоначально необходимо инициализировать модуль УАПП с корректными параметрами: разрешить передачу и прием, установить формат данных 8 бит, отключить паритет, установить генерацию одного стоп-бита и задать скорость связи до 115,2 кбод.

Установка данных параметров приведет к переходу вывода TXD в неактивное состояние УАПП, которое равно лог. 1. Подчиненные устройства воспримут, возникающий при этом, нарастающий фронт, как сигнал «Сброс» и ответят на него сигналом «Присутствие».

Функции битового уровня

Все функции битового уровня рассматриваемого драйвера реализованы с помощью одной общей функции, именуемой OWI_TouchBit. Данная функция загружает данные в модуль УАПП для передачи, ожидает завершения приема УАПП, а затем возвращает принятое значение. Каждая из функций битового уровня вызывается с помощью OWI_TouchBit с указанием соответствующего значения, которое приводит к генерации желаемого сигнала на шине.

Интерфейс с данными функциями такой же, как и у драйвера с программной реализацией. Однако, аргумент ‘pins’ в данном случае опускается. Набор макросов делает возможным вызвать данные функции с или без аргумента pins. Если же аргумент pins будет указан, то макрос его исключит.

Функции высокого уровня

Обратите внимание, что многие функции в этом слое получают аргумент с типом «unsigned char pointer» (символьный указатель без знака). Данный указатель адресует массив из 8 байт памяти, который может использоваться функцией. Расположение, а также редкая инициализация, этих массивов должна выполняться пользователем. В данном документе полагается, что перед вызовом функции была выполнена инициализация памяти каким-либо методом.

Функции передачи байта


Рисунок 14 – Функции передачи байта

Команды ПЗУ

Реализованы все команды ПЗУ для стандартной скорости связи.

Самой простой командой ПЗУ является команда «Пропуск ПЗУ». Ее инициирует функция SendByte с указанием в качестве аргумента командного байта SKIP ROM.

Блок-схемы команд Чтение ПЗУ (READ ROM) и Совпадение ПЗУ (MATCH ROM) показаны на рисунке 15.


Рисунок 15 – Блок-схема команды Чтение ПЗУ

Блок-схема команды Поиск ПЗУ (SEARCH ROM) показана на рисунке 16. При каждом вызове данная функция ищет одно подчиненное устройство и так до тех пор, пока не будут найдены все устройства на шине. Подтверждением последнего запуска этой функции служит возвращаемое значение OWI_ROM_SEARCH_FINISHED. Кроме этого, параметр ‘pin’ указывает на какой шине необходимо вести поиск и еще два параметра должны быть указаны в интерфейсе функции: ‘lastDeviation’ и ‘bitPattern’. Эти параметры управляют поиском подчиненного устройства. В таблице 4 приведена информация по тому, как использовать данные параметры для завершения полного поиска всех подчиненных устройств.

Таблица 4 – Использование аргументов bitPattern и lastDeviation

Функция реализована с учетом предоставления пользователю максимальной гибкости. Пример программы с использованием данного драйвера показывает, как выполнить полный поиск.


Рисунок 16 – Команда поиск ПЗУ

Замечания относительно параметров временной диаграммы

Важно, чтобы временные характеристики генерируемых сигналов соблюдались как можно более точно. Для этого необходима точная генерация временных задержек. Количество тактовых импульсов, необходимое для задержки в некоторое количество микросекунд вычисляется во время компиляции. Во время генерации импульсов некоторые такты теряются, когда происходит установка низкого уровня или освобождение шины. Данные такты вычитаются из общего количества тактов, необходимых для генерации задержки. При чрезмерно низкой тактовой частоте может генерироваться некорректная задержка. Для генерации коротких задержек тактовая частота должна быть не менее 2,17 МГц.

Реализация на УАПП с управлением по прерываниям

При использовании данного драйвера внешняя схемотехника должна быть такой же, как и при использовании драйвера УАПП с опросом флагов состояния.

Дополнительной функцией данного подхода является автоматическая передача и прием больших пакетов данных по шине, что выполняется с помощью двух процедур обслуживания прерываний (ISR). Набор вспомогательных функций может вызываться для установки всех необходимых параметров, а вызов ISR завершит трансакцию автоматически. С помощью данных функций имеется возможность без всякого вмешательства отработать последовательность «Сброс/присутствие» или передать от 1 до 255 бит данных в одном направлении.

Для максимального упрощения ISR они не должны различаться для приема и передачи. При каждом запуске функции UDRE ISR отправляется один бит из буфера данных. RXC ISR принимает тот же бит и помещает его назад в буфер данных независимо от того, в каком направлении данные были отправлены. В процессе передачи отправленные данные будут идентичны принятым данным и буфер данных остается неизменным. В процессе приема передаваться должны только ‘1’, т.к. сигнал ‘Запись лог.1’ эквивалентен сигналу чтение. Для нахождения значения, записанного подчиненным, осуществляется выборка сигнала. После этого, значение размещается в буфере данных.

Три глобальных флага индицируют состояние драйвера 1-Wire: занят, присутствие и ошибка. Флаг «занят» устанавливается, если имеются данные для передачи. Флаг «присутствие» устанавливается, если во время отправки сигнала «Сброс» обнаруживается сигнал «Присутствие». Данный флаг остается установленным до следующего сигнала «Сброс», на который не будет отклика сигналом «Подтверждение». Флаг «Ошибка» устанавливается, когда приемник УАПП определяет ошибку кадра. В этой ситуации необходимо передать новый сигнал «Сброс». Этим осуществляется сброс всех подчиненных устройств на шине, а также внутреннего состояния процедур UDRE и RXC ISR.

Все процедуры ISR должны выполняться как можно более быстро. Более сложные функции, например, команды ПЗУ, не реализуются данными ISR. Вложенные примеры кодов программы показывают, как данное поведение реализуется в виде цифрового автомата.

Процедуры обработки прерываний

Блок-схемы процедур ISR показаны на рисунках 17 и 18. Процедура UDRE ISR обрабатывает прерывание по освобождению регистра данных УАПП и выполняется всякий раз, когда освобождается место для данных в передающем буфере УАПП. Процедура RXC ISR отвечает за обработку прерывания по завершению приема УАПП и выполняется всякий раз, когда завершен прием и данные размешаются в приемном буфере УАПП.


Рисунок 17 – Процедура обслуживания прерывания UDRE


Рисунок 18 – Процедура обслуживания прерывания RXC

Вспомогательные функции

Вспомогательные функции устанавливают некоторые параметры, которые необходимы для выполнения автоматической управляемой прерываниями передачи. После отправки всех необходимых параметров инициируется передача путем разрешения прерывания UDRE.

Блок-схемы вспомогательных функций приведены на рисунке 19.

Обратите внимание, что функция ReceiveData (прием данных) заполняет буфер данных логическими 1 и вызывает функцию TransmitData (передача данных). Функция RXC ISR осуществляет выборку сигнала и размещает считанное значение из подчиненного устройства в буфере данных.


Рисунок 19 – Вспомогательные функции

Вычисление CRC-кода

Описанный ниже алгоритм используется для вычисления двух разных CRC-кодов.

Результатом вычисления CRC может быть значение 0 или “seed”. Последовательность вычислений следующая:

  1. Нахождение логического исключающего ИЛИ между младшим битом CRC и младшим битом данных.
  2. Если результат равен 0, то:
    a. Сдвиг вправо CRC.
  3. Если результат равен 1:
    a. Поиск нового значения CRC путем вычисления логического исключающего ИЛИ между CRC и полиномом CRC.
    b. Сдвиг вправо CRC.
    c. Установка старшего бита CRC к 1.
  4. Сдвиг вправо данных.
  5. Повтор данной последовательности 8 раз.

Данный алгоритм может использоваться для вычисления, как CRC8, так и CRC16. Отличие состоит только в разрядности сдвигового регистра (8 разрядов для CRC8, 16 разрядов для CRC16) и значении полинома. Данное значение моделируется схемой из логических элементов исключающее ИЛИ. Значение полинома равно 18h для CRC8 и 4002h для CRC16.

Алгоритмы реализованы для поиска значения CRC для одного байта при однократном выполнении, но CRC “seed” размещается в качестве аргумента в процедуры CRC. Таким образом, результат одной операции CRC может быть указан в следующий раз вместе со следующим байтом и в результате вычисляется CRC от произвольного количества байт.

Проверка CRC для 64-разрядного идентификатора реализуется OWI_CheckRomCRC. Она вычисляет значение CRC8 первых 56 бит, а затем сравнивает его с последними 8 битами идентификатора.

Примеры кодов программ

Пример с опросом

Пример кода с опросом выполняет поиск шин, определенных значением “BUSES” для устройств. Устройства запоминаются в массиве с типом OWI_device. OWI_device – структура, содержащая информацию о том, какая шина устройства подключена и какой у него 64-разрядный идентификатор. Затем драйвер выполняет поиск доступных подчиненных устройств, а именно датчика температуры DS1820 и цифрового потенциометра DS2890. Если один или более этих устройств обнаружены на шине, то с ними будет установлена постоянная связь по замкнутому циклу. При каждой итерации считывается значение температуры и увеличивается положение «движка» потенциометра DS2890. Температура выводится на порт В (PORTB), что можно наблюдать с помощью светодиодов, если использовать плату STK500.

Данный пример реализован для демонстрации, как использовать различные части драйвера. Код носит достаточно общий характер и не оптимизирован под конечное использование. С учетом этого, обратите внимание, что данный пример не подходит для микроконтроллеров с размером памяти программ менее 4 кбайт. Однако сам драйвер подходит для всех микроконтроллеров AVR, в т.ч. с памятью программ 1 кбайт.

Пример с управлением по прерываниям

Данный пример реализован как цифровой автомат. Если драйвер не занят, то данные передаются по шине. Если драйвер занят, цифровой автомат обходится для выполнения других задач. При составлении программы, полагалось, что к шине подключен один единственный датчик температуры DS1820. Программа выполняет считывание текущей температуры и вычисляет CRC, чтобы гарантировать корректность считывания. После этого значение температуры помещается в глобальную переменную. Всякий раз, когда драйвер занят, во внутреннем цикле температура выводится на порт PORTB. При использовании платы STK500 состояние данного порта можно наблюдать по свечению светодиодов.

Исходный код

Исходный код может быть загружен в zip-архиве с сайта www.atmel.com. Распакуйте исходный код в директорию по собственному усмотрению. При этом необходимо сохранить структуру директорий внутри архива. Внутри архива имеется три поддиректории: “polled”, “interrupt_driven” и “common_files”. “common_files” содержит CRC-функции, общие определения и определения для специфических устройств, используемые в драйверах УАПП. “polled” и “interrupt_driven” содержат драйверы и примеры кодов.

В каждой директории имеется файл “source.doc”. В данных файлах содержится документация на исходный код. Если необходимо изучить подробности по использованию различных драйверов, то необходимо ознакомиться с данной документацией.

Драйвер с опросом

Короткое описание каждого файла данного драйвера представлено в таблице 5.

Таблица 5 – Файлы драйвера с опросом

  • Создайте новый проект в .
  • Выполните команду меню project ->
  • Откройте файл "OWIPolled.h" для редактирования и найдите раздел "User defines".
  • Выберите какой тип драйвера Вас интересует, программный или УАПП, путем удалении символов комментария (//) перед нужной строкой и, наоборот, добавления символов комментария в начало ненужной строки.
  • Перемещайтесь вниз к разделу с выбранным драйвером.
  • Настройте определения в этом разделе в соответствии с аппаратными настройками, как описано в файле.
  • Проект готов для компиляции.

Драйвер с управлением по прерываниям

В таблице 6 представлено короткое описание каждого файла данного драйвера.

аблица 6 - Файлы драйверов с управлением по прерываниям

  • Создайте новый проект в .
  • Добавить все файлы *.c из директорий "polled" и "common_files".
  • Выполните команду меню project -> options: При этом появляется диалоговое окно.
  • В категории "General/Target" убедитесь, что выбрано корректное устройство и модель памяти.
  • В категории "General/Library configuration" выберите опцию "Enable bit definitions in I/O include files".
  • В категории "General/System" установите значение Data stack (CSTACK) равным 0x40, а Return stack (RSTACK) - 0x10. Это необходимо для работы примера программы с интенсивным использованием памяти. Меньшие значения стека могут быть приемлемы для других приложений, использующих этот драйвер.
  • Если для отладки используется AVRStudio, то необходимо изменить формат выходных данных. В категории XLINK/Output выберите Format/Other, а затем установите "ubrof 8 (forced)" из ниспадающего списка "Output format".
  • Откройте файл "OWIInterruptDriven.h" для редактирования и найдите раздел "User defines".
  • Измените определения в разделе "User defines" в соответствии с аппаратными установками.
  • Проект готов для компиляции.


Рекомендуем почитать

Наверх