0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Чтения и записи 1 wire. Примеры кодов программ

Чтения и записи 1 wire. Примеры кодов программ

В этой статье рассмотрим два важных вопроса: подключение к компьютеру устройств с интерфейсом 1-Wire, для чего соберём соответствующий переходник и случай подключения нескольких ведомых устройств к одной 1-Wire шине. Когда на одной шине имеется несколько устройств, уже не удастся отделаться простейшими командами вроде SKIP ROM или READ ROM, а потребуется полноценное исследование ROM-кодов всех устройств. Многие авторы избегают этой темы, с помощью отговорки типа «рассмотрим простейший случай случай подключения одного устройства, а вообще используйте какую-нибудь готовую библиотеку из целой кучи существующих». Конечно, это нечестно — желающим пользоваться готовыми библиотеками не особенно нужны даже простые примеры работы с 1-Wire на низком уровне, а желающим разобраться недостаточно тривиальных примеров очевидного кода.

Подключение шины 1-Wire к COM-порту компьютера

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

Преобразователь интерфейса COM — 1-Wire не просто пример применения микроконтроллеров, но и в действительности полезное устройство. С его помощью возможно подключение к компьютеру множества датчиков для контроля за объектами с целью сбора и хранения данных, управления технологическими процессами в тех случаях, когда возможностей микроконтроллера оказывается недостаточно. Например, можно разместить датчики температуры по всем комнатам квартиры, а компьютер использовать как сервер, с помощью которого через Internet можно посмотреть, тепло ли дома, или может он уже в огне? Dallas Semiconductor выпускает с интерфейсом 1-Wire не только датчики температуры, но и другие устройства, например цифровые ключи. Цифровые ключи могут использоваться как ключи для цифровых замков или для получения прав на доступ в программах на компьютере. Цифровые замки в настоящее время очень распространены, практически в каждом подъезде установлен домофон, позволяющий открывать дверь с помощью ключа-таблетки, имеющего именно интерфейс 1-Wire.

Аппаратная реализация нашего преобразователя очень простая.

Как и в предыдущих примерах, здесь используется оценочная плата STM32VLDISCOVERY с ARM Cortex-M3 микроконтроллером STM32F100RBT6B. В качестве преобразователя уровней для подключения USART микроконтроллера к COM-порту, используется схема гальванической развязки, подробно описанная в одной из предыдущих статей: «UART и USART. COM-порт. Часть 1».

Взаимодействие компьютера и шины 1-Wire здесь реализовано следующим образом. Компьютер, как ведущее устройство, подключённое к 1-Wire шине является инициатором любой активности в шине. Для генерации сигналов сброса, тайм-слотов записи и чтения, компьютер посылает преобразователю команды через COM-порт. Преобразователь интерфейса дешифрует полученную команду, выполняет необходимые действия с шиной 1-Wire и отправляет компьютеру ответ о результатах выполнения команды.

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

Пример программы

Скачать исходный код, проект для компьютера

Скачать исходный код, проект для микроконтроллера

Первый пример — программа для компьютера, демонстрирующая использование переходника. Программа определяет и выводит ROM-коды всех подключённых к 1-Wire шине устройств. Если среди устройств есть датчики температуры, то программа производит замер температуры с помощью каждого из них и выводит результаты.

Для взаимодействия компьютера с 1-Wire шиной определён класс Com_1WireBridge. Объекты класса позволяют с помощью своих методов выполнять все необходимые действия: сброс; запись битов и байтов; чтение битов и байтов. При вызове соответствующих методов, прозрачно для пользователя, происходит формирование соответствующих команд, которые передаются через COM-порт и управляют преобразователем интерфейса.

Кроме того, определён класс EnumRom для определения ROM-кодов всех подключённых к 1-Wire шине ведомых устройств.

Программа для микроконтроллера не содержит ничего нового, здесь используется код из предыдущих статей — осуществляется приём/передача данных через USART и используется программно реализованный 1-Wire интерфейс. Для взаимодействия с 1-Wire определён класс Port1Wire. В программе можно создать несколько объектов-экземпляров класса для независимой работы с несколькими 1-Wire шинами.

Байты, получаемые от COM-порта компьютера и содержащие команды для переходника, декодируются обработчиком прерывания от USART, после чего вызываются соответствующие методы объекта типа Port1Wire.

Поиск ROM-кодов подключённых к 1-Wire шине устройств

В статье «Измерение температуры. Аналоговые и цифровые датчики. Цифровой датчик DS18B20» уже рассказывалось об используемом шиной 1-Wire протоколе, наборе команд и о принципе определения ROM-кодов всех устройств, подключённых к шине с помощью ROM-команды SEARCH ROM (0xF0).

Фрагмент блок-схемы из спецификации на устройство DS18B20, приведённый ниже иллюстрирует процесс.

После сброса и получения команды SEARCH ROM, каждое ведомое устройство на шине в тайм-слотах чтения начинает передавать информацию о своём ROM-коде (начиная с младшего бита, бита с индексом 0).

Все устройства подключены к шине по схеме с открытым стоком, поэтому шина реализует так называемую схему «монтажное И». Это означает, что если хотя бы одно устройство, подключённое к шине, на своём выходе установит уровень логического 0, то уровень 0 будет установлен на всей шине. А для того чтобы на шине установился уровень логической 1 (под действием подтягивающего резистора), на выходах всех устройств должен быть установлен уровень 1, что и соответствует логике элемента И.

Далее, обнаружив начало тайм-слота, готовые к передаче бита ведомые устройства, устанавливают на своём выходе уровень логического 0 на время, не менее 15 мкс для передачи бита 0 или ничего не делают для передачи бита 1 (подробнее о временных параметрах тайм-слотов речь идёт в названной выше статье).

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

В случае одновременного ответа нескольких ведомых устройств, когда некоторые устройства передают бит 1 и хотя бы одно — бит 0, за счёт свойств схемы «монтажное И», ведущим устройством будет считано значение 0. Такое событие называют коллизией.

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

В случае команды SEARCH ROM коллизии выявляются за счёт особого алгоритма передачи данных. Для каждого бита ROM-кода каждое активное ведомое устройство передаёт сначала значение своего бита, потом его отрицание, а потом ждёт чтобы ведущее устройство выполнило запись этого бита в шину. Если возвращённое мастером значение совпадает с битом ROM-кода ведомого устройства, ведомое устройство продолжает процесс для следующего бита своего ROM-кода. Если не совпадает — ведомое устройство переходит в ждущее состояние и больше не участвует в обмене данными по шине до следующего сброса.

Мастер для изучения очередного бита ai ROM-кода производит два считывания шины (генерирует 2 тайм-слота чтения). Он ожидает считать бит ai и его отрицание

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

Если мастер считал два единичных бита, это означает, что ни одно из устройств не ответило. Возможно, к шине не подключены ведомые устройства. В любом случае, дальнейший поиск ROM-кодов не имеет смысла и должен быть прекращён.

В случае коллизии какие-то устройства ответят сначала битом 0, затем битом 1, а другие наоборот, сначала передадут бит 1, а затем бит 0. Как сказано выше, за счёт свойств схемы с отрытым стоком, передача бита 0 «поглощает» передачу 1. В результате мастером будет считано два нулевых бита подряд. Это говорит ему о том, что произошла коллизия. Далее мастер делает выбор, какой бит передать в ответ — 0 или 1. Передав 0, мы переводим в ждущий режим ту группу устройств, которая содержит в данном бите ROM-кода значение 1 и наоборот. Каждая коллизия и каждый выбор будут сокращать количество устройств, остающихся активными, и дойдя до старшего бита, мы получим ROM-код одного из устройств.

По ходу процесса, будем добавлять в список выбранные варианты при прохождении каждой коллизии. После получения очередного ROM-кода, будем исключать из списка концевые коллизии, пройденные двумя возможными способами. Если список коллизий не пуст, снова делаем сброс устройств, даём команду SEARCH ROM, повторяем побитовый процесс исследования ROM-кода, в случае коллизий делаем выбор того же варианта, что и в прошлый раз, кроме самой последней коллизии, где выбираем ещё не испробованный вариант.

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

Проблема локализации устройств

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

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

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

Если же целесообразно использовать общую шину для устройств, потребуются дополнительные действия по конфигурированию системы. Например, в программе может быть предусмотрена процедура регистрации новых устройств — при каждом включении системы, определяются ROM-коды всех устройств на шине и если появилось устройство с ещё не известным, не зарегистрированным ROM-кодом, этому коду ставится в соответствие очередной порядковый номер. Подключая к шине в соответствующем порядке по одному датчику за один раз, мы обеспечим требуемую привязку индекс — исследуемый объект.

Также можно воспользоваться возможностью применения на усмотрение пользователя хранимых в EEPROM однобайтных ячеек датчика температуры TH и TL. С помощью отдельного программатора, например с помощью описанного здесь переходника COM — 1-Wire и простейшей программы, можно записывать в эти ячейки необходимую служебную информацию, допустим тот же самый порядковый номер, определяющий будущее расположение датчика.

Описание датчика DS18B20 для Arduino

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

Микросхема имеет три выхода, из которых для данных используется только один, два остальных – это земля и питание. Число проводов можно сократить до двух, если использовать схему с паразитным питанием и соединить Vdd с землей. К одному проводу с данными можно подключить сразу несколько датчиков DS18B20 и в плате Ардуино будет задействован всего один пин.

Виды корпусов DS18B20

Температурный датчик DS18B20 имеет разнообразные виды корпуса. Можно выбрать один из трех – 8-Pin SO (150 mils), 8-Pin µSOP, и 3-Pin TO-92. Последний является наиболее распространенным и изготавливается в специальном влагозащитном корпусе, так что его смело можно использовать под водой. У каждого датчика есть 3 контакта. Для корпуса TO-92 нужно смотреть на цвет проводов: черный – земля, красный – питание и белый/желтый/синий – сигнал. В интернет-магазинах можно купить готовый модуль DS18B20.

Читать еще:  Как искать информацию в сет? Ищем по фраз?

Где купить датчик

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

Особенности цифрового датчика DS18B20

  • Погрешность измерения не больше 0,5 С (для температур от -10С до +85С), что позволяет точно определить значение температуры. Не требуется дополнительная калибровка.
  • Температурный диапазон измерений лежит в пределах от -55 С до +125 С.
  • Датчик питается напряжением от 3,3В до 5В.
  • Можно программно задать максимальную разрешающую способность до 0,0625С, наибольшее разрешение 12 бит.
  • Присутствует функция тревожного сигнала.
  • Каждое устройство обладает своим уникальным серийным кодом.
  • Не требуются дополнительные внешние элементы.
  • Можно подключить сразу до 127 датчиков к одной линии связи.
  • Информация передается по протоколу 1-Wire.
  • Для присоединения к микроконтроллеру нужны только 3 провода.
  • Существует так называемый режим паразитного питания – в нем происходит питание напрямую от линии связи. Для подключения в этом случае нужны только 2 провода. Важно, что в этом режиме не гарантируется корректная работа при температурах выше 100С. Режим паразитного питания удобно обычно применяется для приложений с удаленным температурным датчиком.

Память датчика состоит из двух видов: оперативной и энергонезависимой – SRAM и EEPROM. В последнюю записываются регистры конфигурации и регистры TH, TL, которые могут использоваться как регистры общего назначения, если не используются для указания диапазона допустимых значений температуры.

Основной задачей DS18B20 является определение температуры и преобразование полученного результата в цифровой вид. Мы можем самостоятельно задать необходимое разрешение, установив количество бит точности – 9, 10, 11 и 12. В этих случаях разрешающие способности будут соответственно равны 0,5С, 0,25С, 0,125С и 0,0625С.

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

Полученные температурные измерения сохраняются в SRAM датчика. 1 и 2 байты сохраняют полученное значение температуры, 3 и 4 сохраняют пределы измерения, 5 и 6 зарезервированы, 7 и 8 используются для высокоточного определения температуры, последний 9 байт хранит устойчивый к помехам CRC код.

Основные преимущества

Датчик ds18b20 обладает массой основных функций и плюсов:

  1. Однопроводный интерфейс 1-Wire требует только один порт связи для контроллера.
  2. Уникальные коды для каждого агрегата.
  3. Одна линия может подключить сразу несколько датчиков.
  4. Не нужны никакие внешние компоненты.
  5. Питание может быть получено напрямую после подключения к линии связи.
  6. Большой диапазон температур, от -55 до +125 градусов Цельсия.
  7. Ошибки и погрешности могут составлять максимум полградуса.
  8. Можно запрограммировать тревожный сигнал.
  9. Адрес датчика будет передаваться тревожным сигналом, если температура вышла за предел допустимого.
  10. Позволяет установить программное обеспечение.
  11. Может применяться практически повсеместно.

Краткий обзор характеристик

Датчик позволяет вносить корректировки в конфигурацию, используя регистр. Можно установить параметры преобразования агрегата. Цифра варьируется от 9 до 12 бит. Вся информация будет внесена в энергонезависимую память, которую еще называют (EEPROM). Обмен данными осуществляется специальным протоколом 1-Wire. Владельцу нужен небольшой подтягивающий резистор, ведь все агрегаты подключаются к общей шине.

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

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

Также датчик может работать без источников внешнего питания. Используется специальный резистор и вывод DQ. Сигналы повышенного уровня подзаряжают внутренние конденсаторы. Данный метод называется паразитным питанием. Каким вариантом питания пользоваться решать именно владельцу.

Чтения и записи 1 wire. Примеры кодов программ

В этой статье рассмотрим два важных вопроса: подключение к компьютеру устройств с интерфейсом 1-Wire, для чего соберём соответствующий переходник и случай подключения нескольких ведомых устройств к одной 1-Wire шине. Когда на одной шине имеется несколько устройств, уже не удастся отделаться простейшими командами вроде SKIP ROM или READ ROM, а потребуется полноценное исследование ROM-кодов всех устройств. Многие авторы избегают этой темы, с помощью отговорки типа «рассмотрим простейший случай случай подключения одного устройства, а вообще используйте какую-нибудь готовую библиотеку из целой кучи существующих». Конечно, это нечестно — желающим пользоваться готовыми библиотеками не особенно нужны даже простые примеры работы с 1-Wire на низком уровне, а желающим разобраться недостаточно тривиальных примеров очевидного кода.

Подключение шины 1-Wire к COM-порту компьютера

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

Преобразователь интерфейса COM — 1-Wire не просто пример применения микроконтроллеров, но и в действительности полезное устройство. С его помощью возможно подключение к компьютеру множества датчиков для контроля за объектами с целью сбора и хранения данных, управления технологическими процессами в тех случаях, когда возможностей микроконтроллера оказывается недостаточно. Например, можно разместить датчики температуры по всем комнатам квартиры, а компьютер использовать как сервер, с помощью которого через Internet можно посмотреть, тепло ли дома, или может он уже в огне? Dallas Semiconductor выпускает с интерфейсом 1-Wire не только датчики температуры, но и другие устройства, например цифровые ключи. Цифровые ключи могут использоваться как ключи для цифровых замков или для получения прав на доступ в программах на компьютере. Цифровые замки в настоящее время очень распространены, практически в каждом подъезде установлен домофон, позволяющий открывать дверь с помощью ключа-таблетки, имеющего именно интерфейс 1-Wire.

Аппаратная реализация нашего преобразователя очень простая.

Как и в предыдущих примерах, здесь используется оценочная плата STM32VLDISCOVERY с ARM Cortex-M3 микроконтроллером STM32F100RBT6B. В качестве преобразователя уровней для подключения USART микроконтроллера к COM-порту, используется схема гальванической развязки, подробно описанная в одной из предыдущих статей: «UART и USART. COM-порт. Часть 1».

Взаимодействие компьютера и шины 1-Wire здесь реализовано следующим образом. Компьютер, как ведущее устройство, подключённое к 1-Wire шине является инициатором любой активности в шине. Для генерации сигналов сброса, тайм-слотов записи и чтения, компьютер посылает преобразователю команды через COM-порт. Преобразователь интерфейса дешифрует полученную команду, выполняет необходимые действия с шиной 1-Wire и отправляет компьютеру ответ о результатах выполнения команды.

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

Пример программы

Скачать исходный код, проект для компьютера

Скачать исходный код, проект для микроконтроллера

Первый пример — программа для компьютера, демонстрирующая использование переходника. Программа определяет и выводит ROM-коды всех подключённых к 1-Wire шине устройств. Если среди устройств есть датчики температуры, то программа производит замер температуры с помощью каждого из них и выводит результаты.

Для взаимодействия компьютера с 1-Wire шиной определён класс Com_1WireBridge. Объекты класса позволяют с помощью своих методов выполнять все необходимые действия: сброс; запись битов и байтов; чтение битов и байтов. При вызове соответствующих методов, прозрачно для пользователя, происходит формирование соответствующих команд, которые передаются через COM-порт и управляют преобразователем интерфейса.

Кроме того, определён класс EnumRom для определения ROM-кодов всех подключённых к 1-Wire шине ведомых устройств.

Программа для микроконтроллера не содержит ничего нового, здесь используется код из предыдущих статей — осуществляется приём/передача данных через USART и используется программно реализованный 1-Wire интерфейс. Для взаимодействия с 1-Wire определён класс Port1Wire. В программе можно создать несколько объектов-экземпляров класса для независимой работы с несколькими 1-Wire шинами.

Байты, получаемые от COM-порта компьютера и содержащие команды для переходника, декодируются обработчиком прерывания от USART, после чего вызываются соответствующие методы объекта типа Port1Wire.

Поиск ROM-кодов подключённых к 1-Wire шине устройств

В статье «Измерение температуры. Аналоговые и цифровые датчики. Цифровой датчик DS18B20» уже рассказывалось об используемом шиной 1-Wire протоколе, наборе команд и о принципе определения ROM-кодов всех устройств, подключённых к шине с помощью ROM-команды SEARCH ROM (0xF0).

Фрагмент блок-схемы из спецификации на устройство DS18B20, приведённый ниже иллюстрирует процесс.

После сброса и получения команды SEARCH ROM, каждое ведомое устройство на шине в тайм-слотах чтения начинает передавать информацию о своём ROM-коде (начиная с младшего бита, бита с индексом 0).

Все устройства подключены к шине по схеме с открытым стоком, поэтому шина реализует так называемую схему «монтажное И». Это означает, что если хотя бы одно устройство, подключённое к шине, на своём выходе установит уровень логического 0, то уровень 0 будет установлен на всей шине. А для того чтобы на шине установился уровень логической 1 (под действием подтягивающего резистора), на выходах всех устройств должен быть установлен уровень 1, что и соответствует логике элемента И.

Далее, обнаружив начало тайм-слота, готовые к передаче бита ведомые устройства, устанавливают на своём выходе уровень логического 0 на время, не менее 15 мкс для передачи бита 0 или ничего не делают для передачи бита 1 (подробнее о временных параметрах тайм-слотов речь идёт в названной выше статье).

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

В случае одновременного ответа нескольких ведомых устройств, когда некоторые устройства передают бит 1 и хотя бы одно — бит 0, за счёт свойств схемы «монтажное И», ведущим устройством будет считано значение 0. Такое событие называют коллизией.

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

В случае команды SEARCH ROM коллизии выявляются за счёт особого алгоритма передачи данных. Для каждого бита ROM-кода каждое активное ведомое устройство передаёт сначала значение своего бита, потом его отрицание, а потом ждёт чтобы ведущее устройство выполнило запись этого бита в шину. Если возвращённое мастером значение совпадает с битом ROM-кода ведомого устройства, ведомое устройство продолжает процесс для следующего бита своего ROM-кода. Если не совпадает — ведомое устройство переходит в ждущее состояние и больше не участвует в обмене данными по шине до следующего сброса.

Мастер для изучения очередного бита ai ROM-кода производит два считывания шины (генерирует 2 тайм-слота чтения). Он ожидает считать бит ai и его отрицание

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

Если мастер считал два единичных бита, это означает, что ни одно из устройств не ответило. Возможно, к шине не подключены ведомые устройства. В любом случае, дальнейший поиск ROM-кодов не имеет смысла и должен быть прекращён.

В случае коллизии какие-то устройства ответят сначала битом 0, затем битом 1, а другие наоборот, сначала передадут бит 1, а затем бит 0. Как сказано выше, за счёт свойств схемы с отрытым стоком, передача бита 0 «поглощает» передачу 1. В результате мастером будет считано два нулевых бита подряд. Это говорит ему о том, что произошла коллизия. Далее мастер делает выбор, какой бит передать в ответ — 0 или 1. Передав 0, мы переводим в ждущий режим ту группу устройств, которая содержит в данном бите ROM-кода значение 1 и наоборот. Каждая коллизия и каждый выбор будут сокращать количество устройств, остающихся активными, и дойдя до старшего бита, мы получим ROM-код одного из устройств.

Читать еще:  Исчез значок lastpass в мозиле как вернуть. LastPass - бесплатный браузерный менеджер паролей. Дополнительные опции аккаунта

По ходу процесса, будем добавлять в список выбранные варианты при прохождении каждой коллизии. После получения очередного ROM-кода, будем исключать из списка концевые коллизии, пройденные двумя возможными способами. Если список коллизий не пуст, снова делаем сброс устройств, даём команду SEARCH ROM, повторяем побитовый процесс исследования ROM-кода, в случае коллизий делаем выбор того же варианта, что и в прошлый раз, кроме самой последней коллизии, где выбираем ещё не испробованный вариант.

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

Проблема локализации устройств

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

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

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

Если же целесообразно использовать общую шину для устройств, потребуются дополнительные действия по конфигурированию системы. Например, в программе может быть предусмотрена процедура регистрации новых устройств — при каждом включении системы, определяются ROM-коды всех устройств на шине и если появилось устройство с ещё не известным, не зарегистрированным ROM-кодом, этому коду ставится в соответствие очередной порядковый номер. Подключая к шине в соответствующем порядке по одному датчику за один раз, мы обеспечим требуемую привязку индекс — исследуемый объект.

Также можно воспользоваться возможностью применения на усмотрение пользователя хранимых в EEPROM однобайтных ячеек датчика температуры TH и TL. С помощью отдельного программатора, например с помощью описанного здесь переходника COM — 1-Wire и простейшей программы, можно записывать в эти ячейки необходимую служебную информацию, допустим тот же самый порядковый номер, определяющий будущее расположение датчика.

Урок 26.3 Соединяем две arduino по шине I2C

При создании некоторых проектов, требуется разделить выполняемые задачи между несколькими arduino.

В этом уроке мы научимся соединять две arduino по аппаратной шине I2C.

Преимущества:

  • Реализуется возможность подключения до 126 устройств.
    (не рекомендуется присваивать устройствам адреса 0x00 и 0x7F)
  • Не требуются дополнительные модули.
  • Все устройства одинаково подключаются к шине.
  • Каждое ведомое устройство имеет свой уникальный адрес на шине.

Недостатки:

  • Код программы немного сложнее чем для шины UART.

Нам понадобится:

  • Arduino х 3шт.
  • LCD дисплей LCD1602 IIC/I2C(синий) или LCD1602 IIC/I2C(зелёный) х 1шт.
  • Trema Shield х 3шт.
  • Trema кнопка x 2шт.
  • Trema светодиод x 1шт.
  • Trema потенциометр x 1шт.
  • Trema I2C Hub x 1шт.
  • Шлейф «мама-мама» (4 провода) для шины I2С х 4шт.

Для реализации проекта нам необходимо установить библиотеки:

  • Библиотека LiquidCrystal_I2C_V112 (для подключения дисплеев LCD1602 по шине I2C).
  • Библиотека iarduino_I2C_connect (для удобства соединения нескольких arduino по шине I2C).

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki — Установка библиотек в Arduino IDE, а о том, как работать с LCD дисплеями, на странице Wiki — Работа с символьными ЖК дисплеями.

Видео:

Схема подключения:

На шине i2С находятся 4 устройства: 3 arduino и 1 LCD дисплей. Все устройства шины I2C соединены через Trema I2C Hub. Для подключения Arduino используются аппаратные выводы шины I2C.

  • Arduino master — к цифровому выводу D2 подключена trema кнопка.
  • Arduino slave 0x01 — к цифровому выводу D2 подключена trema кнопка.
  • Arduino slave 0x02 — к цифровому выводу D13 подключён trema светодиод, к аналоговому выводу A0 подключён Trema потенциометр.
  • LCD I2C дисплей — является устройством slave 0x27.

На шине I2C не используются дополнительные подтягивающие резисторы (для линий SDA и SCL), так как они интегрированы в LDC I2C дисплее.

Код программы:

Arduino master:
Arduino slave 0x01:
Arduino slave 0x02:

Алгоритм работы:

  • Arduino master проверяет состояние собственной кнопки.
  • Arduino master опрашивает две Arduino Slave.
    • Arduino Slave 0x01 возвращает состояние кнопки.
    • Arduino Slave 0x02 возвращает значение падения напряжения плеча потенциометра.
  • Arduino master мастер отправляет состояние своей кнопки в Arduino Slave 0x02.
    • Arduino Slave 0x02 включает или выключает светодиод, в соответствии с полученными данными.
  • Arduino master отправляет данные о состояниях кнопки Arduino Slave 0x01 и потенциометра Arduino Slave 0x02 на LCD I2C дисплей.

Настройка параметров шины I2C:

Максимальная, аппаратно реализуемая частота передачи данных, может достигать 1/16 от тактовой частоты.

Библиотека Wire позволяет устанавливать скорость передачи данных через функцию setClock(), которую требуется вызвать до функции begin().

Библиотека Wire позволяет аппаратно подключить Arduino к шине I2C с указанием роли Arduino на шине: ведущий или ведомый.

  • Wire.setClock(400000); // скорость передачи данных 400 кБит/с.
  • Wire.begin(); // подключение к шине I2C в роли ведущего.
  • Wire.begin(адрес); // подключение к шине I2C в роли ведомого, с указанием адреса.

Функции библиотеки iarduino_I2C_connect:

В библиотеке iarduino_I2C_connect реализованы 4 функции: 2 для ведущего и 2 для ведомого.

На ведомом устройстве достаточно вызвать функцию begin() с указанием массива, данные которого требуется сделать доступными для мастера. Далее можно работать с этим массивом, «забыв» про шину I2C. Мастер обращаясь к ведомому сможет получать и изменять данные элементов указанного массива (обращаясь к номеру элемента массива как к номеру регистра).

Если требуется запретить мастеру менять значения некоторых ячеек массива, то достаточно вызвать «необязательную» функцию writeMask() с указанием маскировочного массива, каждый элемент которого является флагом, разрешающим запись в соответствующий элемент массива доступного по шине I2C.

На ведущем устройстве доступны функции readByte() и writeByte(). Указывая в качестве параметров функций, адрес ведомого устройства и номер регистра, можно побайтно читать и записывать данные.

Функции для ведомого:

begin():

  • Назначение: указание массива, элементы которого будут доступны для чтения/записи по шине I2C.
  • Синтаксис: begin(массив); // тип данных массива — byte.
  • Возвращаемые значения: Нет.
  • Примечание: Вызывается 1 раз в коде функции Setup().

writeMask():

  • Назначение: указание маскировочного массива, каждый элемент которого является флагом разрешения записи по шине I2C.
  • Синтаксис: writeMask(маскировочный_массив); // тип данных массива — bool.
  • Возвращаемые значения: Нет.
  • Примечание: Вызывается 1 раз в коде функции Setup().
  • Пример:
    #include
    #include
    iarduino_I2C_connect ccc;
    byte aaa[5]; // объявляем 5 элементов массива, к которому разрешим доступ.
    bool bbb[5] = <0,1,1,1,0>; // объявляем 5 элементов маскировочного массива.
    Wire.begin(0x33); // подключаемся к шине I2C в роли ведомого с адресом 0x33.
    ccc.begin(aaa); // разрешаем доступ к массиву aaa по шине I2C.
    ccc.wtiteMask(bbb); // маскируем разрешение на запись в массив aaa.
    • В соответствии со значениями массива bbb, мастер сможет записывать данные в ячейки 1,2,3 массива aaa, а попытка записи в 0 и 4 элементы будет проигнорирована.
    • Если массив aaa имеет больше элементов чем массив bbb, то попытка мастера записать данные в «лишние» элементы будет проигнорирована.
    • Если не объявлять маскировочный массив (не вызывать функцию writeMask() вообще), то все элементы массива aaa будут доступны для записи мастером.
Функции для ведущего:

readByte():

  • Назначение: Чтение одного байта данных из устройства на шине I2C.
  • Синтаксис: readByte(адрес_устройства, адрес_регистра);
  • Возвращаемые значения: uint8_t байт — данные считанные из указанного адреса, указанного устройства.
  • Примечание: Если производится чтение по шине I2C из массива объявленного функцией begin(), то адрес регистра соответствует номеру элемента массива.

Выводы

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

За дополнительные возможности приходится платить относительной сложностью работы с датчиком. Для подключения DS18B20 нам обязательно понадобится резистор с номиналом около 5К. Для работы с датчиком в скетчах ардуино нужно установить дополнительную библиотеку и получить определенные навыки для работы с ней – там все не совсем тривиально. Впрочем, можно купить уже готовый модуль, а для скетча в большинстве случаев хватит простых примеров, приведенных в этой статье.

Урок 26.3 Соединяем две arduino по шине I2C

При создании некоторых проектов, требуется разделить выполняемые задачи между несколькими arduino.

В этом уроке мы научимся соединять две arduino по аппаратной шине I2C.

Преимущества:

  • Реализуется возможность подключения до 126 устройств.
    (не рекомендуется присваивать устройствам адреса 0x00 и 0x7F)
  • Не требуются дополнительные модули.
  • Все устройства одинаково подключаются к шине.
  • Каждое ведомое устройство имеет свой уникальный адрес на шине.

Недостатки:

  • Код программы немного сложнее чем для шины UART.

Нам понадобится:

  • Arduino х 3шт.
  • LCD дисплей LCD1602 IIC/I2C(синий) или LCD1602 IIC/I2C(зелёный) х 1шт.
  • Trema Shield х 3шт.
  • Trema кнопка x 2шт.
  • Trema светодиод x 1шт.
  • Trema потенциометр x 1шт.
  • Trema I2C Hub x 1шт.
  • Шлейф «мама-мама» (4 провода) для шины I2С х 4шт.

Для реализации проекта нам необходимо установить библиотеки:

  • Библиотека LiquidCrystal_I2C_V112 (для подключения дисплеев LCD1602 по шине I2C).
  • Библиотека iarduino_I2C_connect (для удобства соединения нескольких arduino по шине I2C).

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki — Установка библиотек в Arduino IDE, а о том, как работать с LCD дисплеями, на странице Wiki — Работа с символьными ЖК дисплеями.

Видео:

Схема подключения:

На шине i2С находятся 4 устройства: 3 arduino и 1 LCD дисплей. Все устройства шины I2C соединены через Trema I2C Hub. Для подключения Arduino используются аппаратные выводы шины I2C.

  • Arduino master — к цифровому выводу D2 подключена trema кнопка.
  • Arduino slave 0x01 — к цифровому выводу D2 подключена trema кнопка.
  • Arduino slave 0x02 — к цифровому выводу D13 подключён trema светодиод, к аналоговому выводу A0 подключён Trema потенциометр.
  • LCD I2C дисплей — является устройством slave 0x27.

На шине I2C не используются дополнительные подтягивающие резисторы (для линий SDA и SCL), так как они интегрированы в LDC I2C дисплее.

Код программы:

Arduino master:
Arduino slave 0x01:
Arduino slave 0x02:

Алгоритм работы:

  • Arduino master проверяет состояние собственной кнопки.
  • Arduino master опрашивает две Arduino Slave.
    • Arduino Slave 0x01 возвращает состояние кнопки.
    • Arduino Slave 0x02 возвращает значение падения напряжения плеча потенциометра.
  • Arduino master мастер отправляет состояние своей кнопки в Arduino Slave 0x02.
    • Arduino Slave 0x02 включает или выключает светодиод, в соответствии с полученными данными.
  • Arduino master отправляет данные о состояниях кнопки Arduino Slave 0x01 и потенциометра Arduino Slave 0x02 на LCD I2C дисплей.

Настройка параметров шины I2C:

Максимальная, аппаратно реализуемая частота передачи данных, может достигать 1/16 от тактовой частоты.

Библиотека Wire позволяет устанавливать скорость передачи данных через функцию setClock(), которую требуется вызвать до функции begin().

Библиотека Wire позволяет аппаратно подключить Arduino к шине I2C с указанием роли Arduino на шине: ведущий или ведомый.

  • Wire.setClock(400000); // скорость передачи данных 400 кБит/с.
  • Wire.begin(); // подключение к шине I2C в роли ведущего.
  • Wire.begin(адрес); // подключение к шине I2C в роли ведомого, с указанием адреса.

Функции библиотеки iarduino_I2C_connect:

В библиотеке iarduino_I2C_connect реализованы 4 функции: 2 для ведущего и 2 для ведомого.

На ведомом устройстве достаточно вызвать функцию begin() с указанием массива, данные которого требуется сделать доступными для мастера. Далее можно работать с этим массивом, «забыв» про шину I2C. Мастер обращаясь к ведомому сможет получать и изменять данные элементов указанного массива (обращаясь к номеру элемента массива как к номеру регистра).

Если требуется запретить мастеру менять значения некоторых ячеек массива, то достаточно вызвать «необязательную» функцию writeMask() с указанием маскировочного массива, каждый элемент которого является флагом, разрешающим запись в соответствующий элемент массива доступного по шине I2C.

На ведущем устройстве доступны функции readByte() и writeByte(). Указывая в качестве параметров функций, адрес ведомого устройства и номер регистра, можно побайтно читать и записывать данные.

Функции для ведомого:

begin():

  • Назначение: указание массива, элементы которого будут доступны для чтения/записи по шине I2C.
  • Синтаксис: begin(массив); // тип данных массива — byte.
  • Возвращаемые значения: Нет.
  • Примечание: Вызывается 1 раз в коде функции Setup().

writeMask():

  • Назначение: указание маскировочного массива, каждый элемент которого является флагом разрешения записи по шине I2C.
  • Синтаксис: writeMask(маскировочный_массив); // тип данных массива — bool.
  • Возвращаемые значения: Нет.
  • Примечание: Вызывается 1 раз в коде функции Setup().
  • Пример:
    #include
    #include
    iarduino_I2C_connect ccc;
    byte aaa[5]; // объявляем 5 элементов массива, к которому разрешим доступ.
    bool bbb[5] = <0,1,1,1,0>; // объявляем 5 элементов маскировочного массива.
    Wire.begin(0x33); // подключаемся к шине I2C в роли ведомого с адресом 0x33.
    ccc.begin(aaa); // разрешаем доступ к массиву aaa по шине I2C.
    ccc.wtiteMask(bbb); // маскируем разрешение на запись в массив aaa.
    • В соответствии со значениями массива bbb, мастер сможет записывать данные в ячейки 1,2,3 массива aaa, а попытка записи в 0 и 4 элементы будет проигнорирована.
    • Если массив aaa имеет больше элементов чем массив bbb, то попытка мастера записать данные в «лишние» элементы будет проигнорирована.
    • Если не объявлять маскировочный массив (не вызывать функцию writeMask() вообще), то все элементы массива aaa будут доступны для записи мастером.
Функции для ведущего:

readByte():

  • Назначение: Чтение одного байта данных из устройства на шине I2C.
  • Синтаксис: readByte(адрес_устройства, адрес_регистра);
  • Возвращаемые значения: uint8_t байт — данные считанные из указанного адреса, указанного устройства.
  • Примечание: Если производится чтение по шине I2C из массива объявленного функцией begin(), то адрес регистра соответствует номеру элемента массива.

Чтения и записи 1 wire. Примеры кодов программ

В этой статье рассмотрим два важных вопроса: подключение к компьютеру устройств с интерфейсом 1-Wire, для чего соберём соответствующий переходник и случай подключения нескольких ведомых устройств к одной 1-Wire шине. Когда на одной шине имеется несколько устройств, уже не удастся отделаться простейшими командами вроде SKIP ROM или READ ROM, а потребуется полноценное исследование ROM-кодов всех устройств. Многие авторы избегают этой темы, с помощью отговорки типа «рассмотрим простейший случай случай подключения одного устройства, а вообще используйте какую-нибудь готовую библиотеку из целой кучи существующих». Конечно, это нечестно — желающим пользоваться готовыми библиотеками не особенно нужны даже простые примеры работы с 1-Wire на низком уровне, а желающим разобраться недостаточно тривиальных примеров очевидного кода.

Подключение шины 1-Wire к COM-порту компьютера

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

Преобразователь интерфейса COM — 1-Wire не просто пример применения микроконтроллеров, но и в действительности полезное устройство. С его помощью возможно подключение к компьютеру множества датчиков для контроля за объектами с целью сбора и хранения данных, управления технологическими процессами в тех случаях, когда возможностей микроконтроллера оказывается недостаточно. Например, можно разместить датчики температуры по всем комнатам квартиры, а компьютер использовать как сервер, с помощью которого через Internet можно посмотреть, тепло ли дома, или может он уже в огне? Dallas Semiconductor выпускает с интерфейсом 1-Wire не только датчики температуры, но и другие устройства, например цифровые ключи. Цифровые ключи могут использоваться как ключи для цифровых замков или для получения прав на доступ в программах на компьютере. Цифровые замки в настоящее время очень распространены, практически в каждом подъезде установлен домофон, позволяющий открывать дверь с помощью ключа-таблетки, имеющего именно интерфейс 1-Wire.

Аппаратная реализация нашего преобразователя очень простая.

Как и в предыдущих примерах, здесь используется оценочная плата STM32VLDISCOVERY с ARM Cortex-M3 микроконтроллером STM32F100RBT6B. В качестве преобразователя уровней для подключения USART микроконтроллера к COM-порту, используется схема гальванической развязки, подробно описанная в одной из предыдущих статей: «UART и USART. COM-порт. Часть 1».

Взаимодействие компьютера и шины 1-Wire здесь реализовано следующим образом. Компьютер, как ведущее устройство, подключённое к 1-Wire шине является инициатором любой активности в шине. Для генерации сигналов сброса, тайм-слотов записи и чтения, компьютер посылает преобразователю команды через COM-порт. Преобразователь интерфейса дешифрует полученную команду, выполняет необходимые действия с шиной 1-Wire и отправляет компьютеру ответ о результатах выполнения команды.

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

Пример программы

Скачать исходный код, проект для компьютера

Скачать исходный код, проект для микроконтроллера

Первый пример — программа для компьютера, демонстрирующая использование переходника. Программа определяет и выводит ROM-коды всех подключённых к 1-Wire шине устройств. Если среди устройств есть датчики температуры, то программа производит замер температуры с помощью каждого из них и выводит результаты.

Для взаимодействия компьютера с 1-Wire шиной определён класс Com_1WireBridge. Объекты класса позволяют с помощью своих методов выполнять все необходимые действия: сброс; запись битов и байтов; чтение битов и байтов. При вызове соответствующих методов, прозрачно для пользователя, происходит формирование соответствующих команд, которые передаются через COM-порт и управляют преобразователем интерфейса.

Кроме того, определён класс EnumRom для определения ROM-кодов всех подключённых к 1-Wire шине ведомых устройств.

Программа для микроконтроллера не содержит ничего нового, здесь используется код из предыдущих статей — осуществляется приём/передача данных через USART и используется программно реализованный 1-Wire интерфейс. Для взаимодействия с 1-Wire определён класс Port1Wire. В программе можно создать несколько объектов-экземпляров класса для независимой работы с несколькими 1-Wire шинами.

Байты, получаемые от COM-порта компьютера и содержащие команды для переходника, декодируются обработчиком прерывания от USART, после чего вызываются соответствующие методы объекта типа Port1Wire.

Поиск ROM-кодов подключённых к 1-Wire шине устройств

В статье «Измерение температуры. Аналоговые и цифровые датчики. Цифровой датчик DS18B20» уже рассказывалось об используемом шиной 1-Wire протоколе, наборе команд и о принципе определения ROM-кодов всех устройств, подключённых к шине с помощью ROM-команды SEARCH ROM (0xF0).

Фрагмент блок-схемы из спецификации на устройство DS18B20, приведённый ниже иллюстрирует процесс.

После сброса и получения команды SEARCH ROM, каждое ведомое устройство на шине в тайм-слотах чтения начинает передавать информацию о своём ROM-коде (начиная с младшего бита, бита с индексом 0).

Все устройства подключены к шине по схеме с открытым стоком, поэтому шина реализует так называемую схему «монтажное И». Это означает, что если хотя бы одно устройство, подключённое к шине, на своём выходе установит уровень логического 0, то уровень 0 будет установлен на всей шине. А для того чтобы на шине установился уровень логической 1 (под действием подтягивающего резистора), на выходах всех устройств должен быть установлен уровень 1, что и соответствует логике элемента И.

Далее, обнаружив начало тайм-слота, готовые к передаче бита ведомые устройства, устанавливают на своём выходе уровень логического 0 на время, не менее 15 мкс для передачи бита 0 или ничего не делают для передачи бита 1 (подробнее о временных параметрах тайм-слотов речь идёт в названной выше статье).

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

В случае одновременного ответа нескольких ведомых устройств, когда некоторые устройства передают бит 1 и хотя бы одно — бит 0, за счёт свойств схемы «монтажное И», ведущим устройством будет считано значение 0. Такое событие называют коллизией.

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

В случае команды SEARCH ROM коллизии выявляются за счёт особого алгоритма передачи данных. Для каждого бита ROM-кода каждое активное ведомое устройство передаёт сначала значение своего бита, потом его отрицание, а потом ждёт чтобы ведущее устройство выполнило запись этого бита в шину. Если возвращённое мастером значение совпадает с битом ROM-кода ведомого устройства, ведомое устройство продолжает процесс для следующего бита своего ROM-кода. Если не совпадает — ведомое устройство переходит в ждущее состояние и больше не участвует в обмене данными по шине до следующего сброса.

Мастер для изучения очередного бита ai ROM-кода производит два считывания шины (генерирует 2 тайм-слота чтения). Он ожидает считать бит ai и его отрицание

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

Если мастер считал два единичных бита, это означает, что ни одно из устройств не ответило. Возможно, к шине не подключены ведомые устройства. В любом случае, дальнейший поиск ROM-кодов не имеет смысла и должен быть прекращён.

В случае коллизии какие-то устройства ответят сначала битом 0, затем битом 1, а другие наоборот, сначала передадут бит 1, а затем бит 0. Как сказано выше, за счёт свойств схемы с отрытым стоком, передача бита 0 «поглощает» передачу 1. В результате мастером будет считано два нулевых бита подряд. Это говорит ему о том, что произошла коллизия. Далее мастер делает выбор, какой бит передать в ответ — 0 или 1. Передав 0, мы переводим в ждущий режим ту группу устройств, которая содержит в данном бите ROM-кода значение 1 и наоборот. Каждая коллизия и каждый выбор будут сокращать количество устройств, остающихся активными, и дойдя до старшего бита, мы получим ROM-код одного из устройств.

По ходу процесса, будем добавлять в список выбранные варианты при прохождении каждой коллизии. После получения очередного ROM-кода, будем исключать из списка концевые коллизии, пройденные двумя возможными способами. Если список коллизий не пуст, снова делаем сброс устройств, даём команду SEARCH ROM, повторяем побитовый процесс исследования ROM-кода, в случае коллизий делаем выбор того же варианта, что и в прошлый раз, кроме самой последней коллизии, где выбираем ещё не испробованный вариант.

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

Проблема локализации устройств

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

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

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

Если же целесообразно использовать общую шину для устройств, потребуются дополнительные действия по конфигурированию системы. Например, в программе может быть предусмотрена процедура регистрации новых устройств — при каждом включении системы, определяются ROM-коды всех устройств на шине и если появилось устройство с ещё не известным, не зарегистрированным ROM-кодом, этому коду ставится в соответствие очередной порядковый номер. Подключая к шине в соответствующем порядке по одному датчику за один раз, мы обеспечим требуемую привязку индекс — исследуемый объект.

Также можно воспользоваться возможностью применения на усмотрение пользователя хранимых в EEPROM однобайтных ячеек датчика температуры TH и TL. С помощью отдельного программатора, например с помощью описанного здесь переходника COM — 1-Wire и простейшей программы, можно записывать в эти ячейки необходимую служебную информацию, допустим тот же самый порядковый номер, определяющий будущее расположение датчика.

Ссылка на основную публикацию
Статьи c упоминанием слов:

Adblock
detector