Шины 1 wire. Программная генерация сигналов

Моргания лампочки и замыкание контактов - дело интересное и полезное для первых шагов. Но, как все мы помним со школы, чем нагляднее эксперимент, тем он интереснее. Я продолжу развивать проект из предыдущих серий, и сегодня мы прикрутим термодатчик 1-Wire для того, чтобы контролировать температуру в твоем многострадальном холодильнике. Того и гляди, скоро у тебя появится «умный» холодильник:).

В предыдущих сериях

Так как я продолжаю повествование с некоей точки, а не с самого начала, то пройдусь по тому, что уже имеется. В нашем арсенале Arduino mega2560 с поднятой ОСРВ scmRTOS . Прошивка позволяет моргать светодиодом L на плате в разных последовательностях в зависимости от «аварийного» или «нормального» состояния, а также «плеваться» в консоль грязными ругательствами (ведь ты именно такие выбрал?) в качестве уведомления об изменении состояния. «Нормальность» состояния определяется замкнутостью контактного датчика. Последовательность можно менять из консоли. Исходники проекта выложены на GitHub .

Вдохнем новизны

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

Так в чем проблема? А вот в чем: можно было взять обычный резистивный термодатчик и использовать встроенный АЦП микропроцессора. Но! Я взялся за этот проект с правилом: минимум паяльника и дополнительного нестандартного оборудования, все из коробки. При использовании же резистивного термодатчика необходимо городить делитель напряжения, а значит, требуется минимальное, но погружение в схемотехнику. Так что этот вариант отпал.

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

Для того чтобы начать сессию обмена данными, необходимо сформировать сигнал «сброс». Для этого мастер передает в линию данных 0 на время не менее 480 мкс. После чего мастер отпускает линию данных и начинает слушать линию. За счет резистора подтяжки линия данных установится в 1. Если на линии присутствует устройство (датчик), то он передаст мастеру подтверждение сброса, для этого он удерживает линию данных в 0 на время 60–240 мкс. Считав состояние линии, мастер узнает о присутствии на шине устройств, готовых к обмену.

1-Wire обладает еще одной особенностью: передача битов осуществляется не уровнями сигнала, а временными задержками. Таким образом, чтобы передать 1, необходимо установить в линии 0 и держать его 15 мкс, после чего отпустить линию, которая за счет подтягивающего резистора перейдет в уровень 1. Чтобы передать 0, необходимо установить в линии 0 на 15 мкс, а затем держать 0 на линии еще 60–120 мкс.

Честный 1-Wire

Предложенный вариант реализации интерфейса 1-Wire обладает одним недостатком. Точнее, двумя.

  1. Он жрет ресурсы (как любая программная эмуляция).
  2. Он неустойчив к помехам.

С первым недостатком можно еще как-то мириться, хотя по мере роста проекта ресурсов остается все меньше. Со вторым недостатком в боевом софте надо бороться семплированием сигнала. Что такое семплирование? Допустим, бит 1 передается 6 мкс. Для того чтобы точно быть уверенным, что это 1, а не какая-то наводка, необходимо несколько раз в течение этих 6 мкс измерить состояние входного сигнала. Чем больше измерений ты проведешь, тем точнее будет твой результат и уверенность в правильности принятия данных. Однако 6 мкс - это ооочень мало, тут возникает вопрос разумности и аппаратных возможностей. С разумностью, хочется верить, у тебя все в порядке, а вот с возможностями в нашем микропроцессоре неважненько. Первое, что приходит в голову, - натравить таймер с частотой 1 мкс и получить хотя бы пять семплов. Проблема только в том, что в данном железе на такую частоту настроить таймер не представляется возможным. Настроить-то можно, но толку от этого не будет, так как надо учитывать накладные расходы на «проваливание» в прерывание, сохранение регистров, выход из прерывания. Другой вариант - мотание в цикле, но опять вопрос во времени. Такт процессора на частоте 16 МГц длится 1/16 мкс, то есть у тебя есть всего 16 тактов. За это ничтожное время тебе надо прокрутить счетчик (цикл же), снять состояние сигнала, перейти к следующей итерации. С учетом оптимизации и прочих накладных расходов на СИ сделать это практически нереально. Выход один - использовать аппаратную микросхему интерфейса 1-Wire, подключаемую, например, по SPI-интерфейсу.

Железо

Итак, выбор пал на термодатчик компании Maxim , модель DS18S20 (что под рукой оказалось). Если ты полез гуглить, сразу предупреждаю: подавляющее количество примеров применения термодатчиков с Arduino построено на базе DS18B20 . Он немного отличается, но в рамках нашего проекта разницы никакой.

Работа термометра

Для работы с термометром по 1-Wire необходимо выполнить (по крайней мере для знакомства с ним) всего три действия:

  • запустить измерение;
  • подождать время, необходимое АЦП термометра, чтобы зафиксировать показание;
  • считать показание из памяти термометра.

Как и с обычными АЦП, чем выше точность, тем больше времени требуется для проведения измерения, тем дольше нужна задержка перед попыткой чтения показаний.

WARNING

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



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

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

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

Ось зла

Предварительные причесывания

Начал я с простого - заставил хотя бы собираться библиотеки. Обе библиотеки используют ардуиновские функции, поэтому пришлось внести некоторые изменения. Для начала добавим файл OneWire_Port.h в проект (он будет портом библиотеки OneWire для проекта) и приинклюдим его в файл OneWire.h , а затем начнем причесывание. А именно:

  • OneWire построена таким образом, что ей при создании экземпляра объекта скармливается номер ноги, на которой у тебя будет линия 1-Wire. Это тащит за собой кусочек мрака из недр библиотек Ардуино, поэтому я пошел простым путем и зашил хардкодом в конструктор класса OneWire нужные мне ноги. Да, теряем универсальность, но я пока не вижу применения с двумя шинами 1-Wire (хотя... ну да не сейчас). Исходя из схемы платы, я выбрал ногу PA6, которая выходит на колодку DIGITAL пин 28. PORTA &= ~_BV(PA6); DDRA &= ~_BV(PA6); bitmask = _BV(PA6); baseReg = &PINA;
  • OneWire использует задержки в микросекундах для реализации протокола 1-Wire, подсунем библиотечную функцию _delay_us() в файл OneWire_Port.h #define delayMicroseconds(usec) _delay_us(usec)
  • OneWire любит отключать прерывания во время выполнения очень маленьких задержек (несколько микросекунд), и я ее понимаю. Но сразу же оглянемся и подумаем о том, что у нас все-таки будет ось. А значит, включение прерываний разумнее проредить немного, чтобы случайно не потерять контекст выполнения на неопределенное время. Библиотека использует ардуиновские функции работы с прерываниями, подсунем ей стандартные через файл OneWire_Port.h: #define noInterrupts() __builtin_avr_cli() #define interrupts() __builtin_avr_sei()
  • В драйвере термодатчика используется задержка, измеряемая в миллисекундах. Тут разумнее использовать вызов функции ОС, особенно учитывая размер этих задержек. Для замены sleep на вызов функции ОС пришлось немного погородить макросов в OneWire_Port.h , комментарии в коде. // Количество «тиков» операционной системы (переключений контекстов) в секунду #define __CLOCKS_PER_SEC 1000 //Период системного таймера операционной системы #define PERIOD_TIMER_MS (1000UL / __CLOCKS_PER_SEC) // Макрос перевода миллисекунд в количество тиков операционной системы #define MSEC_TO_TICK(X) (X / PERIOD_TIMER_MS) #define delay(msec) OS::sleep(MSEC_TO_TICK(msec))

Внедрение агента в банду

Теперь либы собираются, настал черед вкрутить их в код проекта. Как удостовериться, что оно заработало? Элементарно: создаем экземпляр класса OneWire, затем DallasTemperature с параметром шины, на которую подключены термодатчики, и начинаем все это активно использовать.

В проекте уже есть простенький терминал, добавляй туда команду, по которой будет производиться опрос термодатчика и вывод значения в терминал. Для удобства я добавил еще одну команду - поиск термодатчиков, по этой команде опрашивается линия, ответившие термодатчики заносятся в «кеш» библиотеки, после чего для найденных термодатчиков можно получить адреса и вывести их в терминал. Отмечу отдельно алгоритм поиска устройств на линии, очень увлекательный процесс, описан подробно в документации к iButton в разделе Network Capabilities.

Выносим в отдельный поток

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

Немного подумав, я решил, что лучше сделать целый класс - движок работы с термодатчиками, унаследовав его от класса process<>, чтобы все собрать в одну кучку: сделать имплементацию функции-потока, дать этой функции доступ к членам класса, выставить наружу основные функции работы с термодатчиками.

Однако тут я уткнулся в жадность. Мне хотелось оставить возможность опроса термодатчиков из консоли и иметь сигнализацию. Сразу же возникает необходимость разделять общие ресурсы, так как теперь два потока будут дергать один термодатчик (а точнее, шину 1-Wire). Лезь в класс OneWire и добавляй ему приватного мембера OS::TMutex _mutex; .

Здесь начинается интересное. Мьютекс мы завели, но пользоваться им внутри класса неразумно, так как библиотека работы с термодатчиком написана очень сильно интегрировано и на лету дергает функции байтовой, а не пакетной приема-передачи по 1-Wire. Для локализации массовых вызовов я создал два метода: open и close для шины 1-Wire.

Void OneWire::open() { _mutex.lock(); } void OneWire::close() { _mutex.unlock(); }

Затем пришлось прошерстить всю библиотеку DallasTemperature и обернуть вызовы функций работы с шиной 1-Wire в оболочку _wire->open() -> _wire->close() .

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

Float val; AnalogState new_state; if (!TemperatureEngine::temperature_get(0, &val)) { if (state != lost && ++ lost_cntr > 10) { state = lost; TAlarmMessage msg; msg.state = state; msg.src = TAlarmMessage::AI_ALARM; AlarmMessageBox.push(msg); } continue; } lost_cntr = 0; if (val < low_value) new_state = low; else if (val > high_value) new_state = high; else new_state = normal; if (new_state != state) { TAlarmMessage msg; msg.state = new_state; msg.src = TAlarmMessage::AI_ALARM; AlarmMessageBox.push(msg); } state = new_state;

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

Тут-то я и наступил на грабли. Я забыл про функцию инициации процесса измерения DallasTemperature::requestTemperatures . В ней стоят задержки для того, чтобы подождать, пока термодатчик производит измерение. Но я поставил _wire->close() перед этими задержками. В итоге я получил странную картину: при запросе из терминала начинали скакать показания термодатчика. А случалось вот что: поток движка термодатчиков запускал измерение, одновременно приходил я со своим запросом по терминалу, и в итоге мы оба читали какие-то неинициализированные значения.

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

Остается лишь добавить в поток обработки аварийных сообщений кейсы нового источника аварий.

Template<> OS_PROCESS void TAlarmTask::exec() { for(;;) { TAlarmMessage msg; // Тут мы уснем до получения аварийного сообщения AlarmMessageBox.pop(msg); // Получили сообщение, теперь обработаем его if (TAlarmMessage::DI_ALARM == msg.src) { // Обработка аварий цифрового датчика }else if(TAlarmMessage::AI_ALARM == msg.src) { // Здесь вставляем код обработки аварий аналогового (термо)датчика } } }

Испытания огнем

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

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

Заключение

Вот мы и сделали еще один сложный шаг к защите содержимого твоего холодильника не только от врагов, но и от разморозки. Теперь в твоем арсенале есть термодатчик, а так как используется линия 1-Wire, то ты уже самостоятельно можешь навесить и два, и три, и более термодатчиков. Надеюсь, что материал этой статьи раскрыл для тебя новые и интересные возможности, казалось бы, игрушечного Arduino и подогрел интерес к программированию встраиваемых систем. Помни, что только написание кода даст тебе знание и умение. Тренируйся, больше практики, старайся воплощать самые свои сумасшедшие идеи, и знание придет. Пиши, пиши, пиши! Железный привет, RESET:).

DANGER

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

WARNING

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

WARNING

1-Wire – протокол передачи данных в обе стороны по одному проводу.

Данный протокол разработан корпорацией Dallas Semiconductor (сейчас Maxim Integrated) в далёких 90-х, но активно используется и сейчас: именно на 1-Wire работает большинство "таблеток" - домофонных чипов (DS1990A), карточек доступа, а также через 1-Wire общаются популярные датчики температуры (DS18S20 и DS18B20), транзисторные ключи (DS2405 , DS2406), программируемые порты ввода-вывода (DS2408), АЦП и ЦАП, часы реального времени (DS2417) и многое другое.

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

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

Ещё раз подчеркнём – на шине может быть только ОДИН ведущий – иначе возникнут конфликты, когда оба ведущих будут тянуть одеяло на себя (на самом деле, есть некоторые приёмы организации сетей 1-Wire в режиме мультимастера – например, с помощью ветвителя сети DS2409 – но в "обычной" жизни все-таки предпочтительней иметь только одного ведущего на шине).

Протокол 1-Wire хорош тем, что не сложен в реализации и требует для связи всего два-три провода (шина данных, земля и при необходимости питание); однако при этом он не лишён и недостатков – этот протокол весьма чувствителен ко времени и к помехам. Также 1-Wire не предназначена для передачи больших объёмов информации и для скоростного обмена данными – максимальная скорость 9600 Бод/с.

Протокол 1-Wire описывает физический, канальный, сетевой и транспортный уровни взаимодействия (см. модель OSI).
На физическом уровне даются описания способов подключения, требования к шине данных и питанию и т.д.
Канальный уровень описывает способы чтения и передачи битов по протоколу.
Сетевой уровень описывает способы адресации к различным устройствам на линии.
Наконец, транспортный уровень описывает функциональные команды, используемые устройствами 1-Wire.

Физический уровень протокола

Рисунок 1. Пример подключения ведущего и ведомых устройств по протоколу 1-Wire.

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

Канальный уровень протокола

Обмен информацией ведётся так называемыми временными, или тайм-слотами (60 мкс): один тайм-слот служит для обмена одним битом информации. Данные передаются бит за битом, начиная с младшего бита младшего байта – это, кстати, достаточно часто приводит к ошибкам у новичков – кажется, что нужно передавать данные слева направо, так, как они хранятся в памяти (то есть, следите за словами: кажется, что нужно начинать со старшего бита младшего байта (вы уже запутались, да?) – но нет! При передаче по 1-Wire, например, двухбайтового числа порядок передачи будет таким:
Имеем число 1023410 – в двоичном виде выглядит так: 00100111 11111010 2
В памяти (так как у нас "остроконечный" порядок хранения данных) выглядит так: 11111010 00100111.
А передача по 1-Wire будет выглядеть так:
0→1→0→1→1→1→1→1→1→1→1→0→0→1→0→0
Если вы запутались так же, как и я – самое время выпить чая с шоколадкой и немного утрясти все в голове.

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

Внимание : ни ведущий, ни ведомые не выставляют на шине "единицу" - это черевато коротким замыканием: если одно устройство выставит на шине "1", а другое – "0"; поэтому как ведущий, так и ведомый могут использовать только два состояния: "на выход в ноль" и "z-состояние" (на вход без подтяжки). Подтяжка к питанию осуществляется резистором (!).

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

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

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

Сигнал "Чтение" . Ведущий устанавливает низкий уровень в течение 1…15 мкс. После этого подчинённый, если хочет передать 0, удерживает шину в низком состоянии до 60 мкс; если же подчинённых хочет передать 1, то он просто освобождает линию. Ведущий обычно сканирует состояние шины по истечении 15 мкс после установки низкого уровня на шине.

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

Сигнал "Чтение при получении 1" :

Сигнал "Чтение при получении 0" :

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

Сигнал "Сброс/присутствие" . Здесь временные интервалы импульсов отличаются. Ведущий устанавливает низкий уровень в течение 8 временных слотов (480 мкс), а затем освобождает шину. Данный длительный период низкого состояния называется сигнал "Сброс".
Если на шине присутствует подчинённый, то он должен в течение 60 мкс после освобождения ведущим шины установить низкий уровень длительностью не менее 60 мкс. Данный отклик носит название "Присутствие". Если такой сигнал не обнаруживается, то ведущий должен полагать, что нет подключённых устройств к шине и дальнейшая связь невозможна.
Данная связка сигналов всегда начинает любой обмен информацией между устройствами.
Помимо этого, нужно учитывать, что любое ведомое устройство после получения питания сразу же выдаёт сигнал присутствия.
Сигнал же "Сброс" позволяет ведущему досрочно завершить обмен информацией – например, если датчик температуры передаёт нам всю свою память, а нам нужны только первые два байта, которые содержат значение температуры, то после получения этих двух байт микросхема просто может опустить линию в ноль на нужное количество времени – датчик поймет, что больше ничего пересылать не нужно.

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

Сетевой и транспортный уровни протокола

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

Алгоритм взаимодействия:

  1. Ведущий посылает на линию сигнал reset ("Сброс"). После линия освобождается для "ответных действий". Если на шине присутствует ведомый, то в течение 60 мкс он сообщает о "присутствии".
    Если же ведущий не получает отклика-"присутствия", то он считает, что подключённых к шине устройств нет.
  2. Далее следует сетевой уровень протокола: ведущий должен определить, к какому из устройств на шине данных он будет дальше обращаться. Данный выбор обеспечивается отсылкой одной из ROM-команд (длиной в 1 байт), которые работают с уникальными кодами устройств:
    • Search ROM ($F0) – "поиск ROM". Если коды подключённых устройств не известны, то эта команда позволяет ведущему определить их. Подробное описание данной команды представлено ниже.
    • Read ROM ($33) – "чтение ROM" – команда используется, если мы точно знаем, что у нас только одно подчинённое устройство (например, только один датчик температуры или один домофонный ключ), тогда для считки его кода можно не париться с поиском ROM. При получении данной команды все ведомые устройства на шине отсылают свой уникальный код.
    • Skip ROM ($CC) – "пропуск ROM". Это команда используется, когда необходимо дать команду всем устройствам на шине – например, нужно, чтобы все подключённые датчики одновременно считали температуру.
    • Match ROM ($55) – "совпадение ROM". Используется для выбора конкретного подчинённого устройства на шине. После отсылки команды ведущий передаёт 64-разрядный код. По завершении только тому подчинённому устройству, которое приняло свой идентификатор, разрешается отвечать после приёма следующего импульса сброса – остальные же молча ждут импульса сброса.
    Естественно, для отдельных устройств какие-то ROM-команды могут добавляться.
  3. Если были отправлены команды "Match ROM" или "Skip ROM", то далее ведущий отправляет какую-либо функциональную команду – это уже транспортный уровень протокола; при этом набор функциональных команд и дальнейшее поведение (должен ли ведущий быть готов принимать данные от выбранного ведомого устройства, например) зависит от конкретного устройства 1-Wire.

Так, например, если у нас есть микроконтроллер и DS18S20 – датчик температуры, и мы хотим получить от этого датчика значение температуры, то алгоритм работы будет следующим:

  1. МК отсылает импульс сброса
  2. - так как датчик у нас на линии один, то нам нет необходимости работать с "адресами"
  3. МК отсылает функциональную команду "Convert T" - по этой команде датчик температуры начнёт однократное температурное преобразование; результат же этого преобразования будет записан в память датчика
  4. МК ждёт, пока датчик закончит преобразование (ведомое устройство никоим образом не может само сообщить, что оно "освободилось", поэтому микроконтроллер просто ждёт время, указанное в даташите)
  5. МК отсылает импульс сброса
  6. Датчик отвечает импульсом приветствия
  7. МК отсылает адресную команду "Skip ROM"
  8. МК отсылает функциональную команду "Read Scratchpad" - по этой команде датчик отсылает 9 байт своей памяти
  9. МК считывает нужное количество байт (значение температуры содержится в первых двух)
  10. При необходимости МК завершает сеанс связи, отсылая импульс сброса

При этом нужно помнить, что ведомые устройства могут поломаться и, например, опускать линию всегда на 0. Допустим, у нас так закоротило датчик температуры в термостате печки. Тогда, если ведущий не проверит, что линия возвращается в единицу, то вероятна следующая ситуация:

  1. МК отсылает импульс сброса
  2. Датчик коротит линию на ноль – МК обнаруживает, что есть импульс приветствия
  3. МК отсылает адресную команду "Skip ROM" - не проверяя при этом линию, конечно
  4. МК отсылает функциональную команду "Convert T" - датчик всё ещё в коме
  5. МК ждёт
  6. МК отсылает импульс сброса
  7. история повторяется, датчик отсылает ноль
  8. МК отсылает адресную команду "Skip ROM"
  9. МК отсылает функциональную команду "Read Scratchpad"
  10. МК считывает нужное количество байт - и получает, естественно, все нули. Даже если мы считываем всю память вместе с CRC, CRC от нуля будет равно нулю – то есть ошибки не произойдет МК конвертирует температуру, получает ноль, отправляет команду нагревать печь. И так до бесконечности!

Выглядит все это довольно печально – и черевато большими проблемами! Так что на протокол полагайся, но сам не плошай.

Вернёмся к алгоритму взаимодействия ведущего и ведомого по протоколу. Как видно, реализовать работу ведущего устройства не так уж сложно – при этом есть как уже готовые библиотеки с кодом, так и аппаратные реализации – например, от той же фирмы Maxim Integrated. Так, например, для AVR-ок написан целый даташит для реализации 1-Wire .

А вот реализовать ведомое устройство не так уж просто – и если библиотеки существуют (например, ), то аппаратных реализаций именно протокола 1-Wire мне не встречалось. Принцип же работы ведомых устройств подробно описан в их документации, обычно в виде блок-схемы.

Существует целый ряд устройств, использующих интерфейс 1-Wire, - так, например, всем известная "таблетка" - домофонный ключ – работает в большинстве случаев именно через данный протокол: микроконтроллер в замке просто спрашивает уникальный код "таблетки", и если этот код содержится в списке разрешённых устройств, микроконтроллер открывает замок.

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

Уникальные коды устройств 1-Wire

Пару слов об уникальных кодах устройств, с которыми и работают ROM-команды. Каждое "одноварное" устройство имеет свой 64-хбитный код, состоящий из трёх частей:

Младший байт – это код семейства, к которому относится устройство, 6 следующих байт – уникальный в семействе серийный номер, ну и наконец, старший байт – это CRC, который служит для проверки правильности приёма всего кода. Так, например, на родных даллосовских (сейчас максимовских) "таблетках" часть уникального кода – а именно, 48-битный серийный номер – пишется на металле в шестнадцатиричном виде (все дружно посмотрели на свои домофонные ключи).

Рассмотрим подробнее, какие коды семейств устройств 1-Wire бывают:

Код семейства (HEX) Устройство iButton Описание
01 DS1990A, DS1990R, DS2401, DS2411 Уникальный серийный номер-ключ
02 DS1991 Мультиключ, 1152-битная защищённая EEPROM
04 DS1994, DS2404 4 КБ NV RAM + часы, таймер и будильник
05 DS2405 Одиночный адресуемый ключ
06 DS1993 4 КБ NV RAM
08 DS1992 1 КБ NV RAM
09 DS1982, DS2502 1 КБ PROM
0A DS1995 16 КБ NV RAM
0B DS1985, DS2505 16 КБ EEPROM
0C DS1996 64 КБ NV RAM
0F DS1986, DS2506 64 КБ EEPROM
10 DS1920, DS1820, DS18S20, DS18B20 Датчик температуры
12 DS2406, DS2407 1 КБ EEPROM + двухканальный адресуемый ключ
14 DS1971, DS2430A 256 бит EEPROM и 64 бита PROM
1A DS1963L 4 КБ NV RAM + счётчик циклов записи
1C DS28E04-100 4 КБ EEPROM + двухканальный адресуемый ключ
1D DS2423 4 КБ NV RAM + внешний счётчик
1F DS2409 Двухканальный адресуемый ключ с возможностью коммутации на возвратную шину
20 DS2450 Четырёхканальный АЦП
21 DS1921G, DS1921H, DS1921Z Термохронный датчик с функцией сбора данных
23 DS1973, DS2433 4 КБ EEPROM
24 DS1904, DS2415 Часы реального времени
26 DS2438 Датчик температуры, АЦП
27 DS2417 Часы реального времени с прерыванием
29 DS2408 Двунаправленный 8-разрядный порт ввода/вывода
2C DS2890 Одноканальный цифровой потенциометр
2D DS1972, DS2431 1 КБ EEPROM
30 DS2760 Датчик температуры, датчик тока, АЦП
37 DS1977 32 КБ защищённой паролем EEPROM
3A DS2413 Двухканальный адресуемый коммутатор
41 DS1922L, DS1922T, DS1923, DS2422 Термохронные и гигрохронные датчики высокого разрешения с функцией сбора данных
42 DS28EA00 Цифровой термометр с программируемым разрешением, возможностью работать в режиме подключения к последовательному каналу и программируемыми портами ввода/вывода
43 DS28EC20 20 КБ EEPROM

NV RAM – Non-Volatile Random-Access Memory (энергонезависимое ОЗУ)
PROM – Programmable Read-Only Memory (однократно программируемое ПЗУ)
EEPROM – Electrically Erasable Programmable Random-Access Memory (электрически стираемое перепрограммируемое ПЗУ)

Все (и в том числе я) называют 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 мкс после начала тайм слота чтения.

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

  • Поддержка стандартной скорости протокола 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" в соответствии с аппаратными установками.
  • Проект готов для компиляции.

Однопроводной интерфейс 1-Wire, разработанный в конце 90-х годов фирмой Dallas Semiconductor Corp., регламентирован разработчиками для применения в трех основных сферах-приложениях:

  • приборы в специальных корпусах MicroCAN для решения проблем идентификации, переноса или преобразования информации (технология iButton),
  • программирование встроенной памяти интегральных компонентов,
  • системы автоматизации (технология сетей
  • 1-Wire-сетей).

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

Так в чем же особенность этого сетевого стандарта? Ведь в качестве среды для передачи информации по однопроводной линии чаще всего возможно использование обычного телефонного кабеля и, следовательно, скорость обмена в этом случае не велика. Однако, если внимательно проанализировать большинство объектов требующих автоматизации, то более чем для 60% из них предельная скорость обслуживания в 15,4 кБит/сек будет более чем удовлетворительной. А другие преимущества 1-Wire, такие как:

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

Говорят о необходимости обратить самое пристальное внимание на этот эффективный инструмент для решения задач комплексной автоматизации в самых различных областях деятельности.

Основные принципы

1-Wire-net представляет собой информационную сеть, использующую для осуществления цифровой связи одну линию данных и один возвратный (или земляной ) провод. Таким образом, для реализации среды обмена этой сети могут быть применены доступные кабели, содержащие неэкранированную витую пару той или иной категории, и даже обычный телефонный провод. Такие кабели при их прокладке не требуют наличия какого-либо специального оборудования, а ограничение максимальной длины однопроводной линии регламентировано разработчиками на уровне 300м.

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

Конфигурация любой 1-Wire-сети может произвольно меняться в процессе ее работы, не создавая помех дальнейшей эксплуатации и работоспособности всей системы в целом, если при этих изменениях соблюдаются основные принципы организации однопроводной шины. Эта возможность достигается благодаря присутствию в протоколе 1-Wire-интерфейса специальной команды поиска ведомых устройств (Поиск ПЗУ ), которая позволяет быстро определить новых участников информационного обмена. Стандартная скорость отработки такой команды составляет ~75 узлов сети в секунду.

Благодаря наличию в составе любого устройства, снабженного сетевой версией 1-Wire-интерфейса, уникального индивидуального адреса (отсутствие совпадения адресов для приборов, когда-либо выпускаемых Dallas Semiconductor Corp., гарантируется самой фирмой-производителем), такая сеть имеет практически неограниченное адресное пространство. При этом, каждый из однопроводных приборов сразу готов к использованию в составе 1-Wire-сети, без каких-либо дополнительных аппаратно-программных модификаций. Однопроводные компоненты являются самотактируемыми полупроводниковыми устройствами, в основе обмена информацией между которыми, лежит управление изменением длительности временных интервалов импульсных сигналов в однопроводной среде и их измерение. Передача сигналов, для 1-Wire-интерфейса, асинхронная и полудуплексная, а вся информация, циркулирующая в сети, воспринимается абонентами либо как команды, либо как данные. Команды сети генерируются мастером и обеспечивают различные варианты поиска и адресации ведомых устройств, определяют активность на линии даже без непосредственной адресации отдельных компонентов, управляют обменом данными в сети и т.д.

Стандартная скорость работы 1-Wire-сети, которая составляет 15,4Кбит/сек, была выбрана, во-первых, с учетом обеспечения максимальной надежности передачи данных на большие расстояния, и, во-вторых, с учетом быстродействия наиболее широко распространенных типов микроконтроллеров, которые в основном должны использоваться при реализации ведущих устройств однопроводной шины. Это значение скорости обмена может быть уменьшено до любого возможного значения благодаря введению принудительной задержки между передачей в линию отдельных битов данных (растягиванию временных слотов протокола). Или увеличено за счет перехода на специальный ускоренный режим обмена (скорость Overdrive - до 125Кбит/сек), который допускается для отдельных типов однопроводных компонентов на небольшой по расстоянию, качественной, не перегруженной другими приборами линии связи.

Пожалуй, особенно привлекательным качеством технологии 1-Wire является исключительная простота настройки, отладки и обслуживания сети практически любой конфигурации, построенной по этому стандарту. Действительно, для начала работы достаточно любого персонального компьютера, недорогого адаптера 1-Wire-линии, а также свободно распространяемой фирмой Dallas Semiconductor Corp. программы iButton Viewer. При наличии этого небольшого числа составляющих контроль и управление сетью практически любой сложности, построенной на базе стандартных однопроводных компонентов, организуется буквально в течение нескольких минут. Программа iButton Viewer, в этом случае, позволяет с максимальным комфортом для разработчика идентифицировать любое из ведомых однопроводных устройств на линии и проверить в полном объеме правильность его функционирования в составе конфигурируемой сети.

Организация ведущих

Отдельные виды адаптеров, которые позволяют наделить любой персональный компьютер возможностью обслуживать в качестве мастера 1-Wire-сеть, выпускаются самой фирмой Dallas Semiconductor Corp. К ним относятся адаптеры для параллельного порта типа DS1410E, для COM-порта типа DS9097E и DS9097U, для USB-порта типа DS9490R. Эти приборы имеют различные функциональные возможности и конструктивные особенности, что обеспечивает разработчику максимальную свободу выбора при конструировании. А наличие у пользователя небольших навыков в создании электронной аппаратуры, позволяет легко произвести самостоятельную сборку схемы простейшего адаптера 1-Wire-сети для компьютера из небольшого числа доступных электронных компонентов.

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

А для организации мастера однопроводной системы на базе микроконтроллеров с 3хвольтовым питанием поставляются пассивные микросхемы DS1482, выполняющие согласование с уровнями сигналов стандартной 1-Wire-магистрали. Если же мастер однопроводной линии должен быть организован на базе стандартного узла последовательного интерфейса UART микроконтроллера, используется микросхема DS2480В, а микросхема DS2490 адаптирует однопроводную линию для работы от встроенного узла UBS-интерфейса. Обе микросхемы реализуют так называемый программируемый механизм активной подтяжки шины данных 1-Wire-магистрали, обеспечивающий качественную передачу сигналов в длинных проблемных линиях и увеличение нагрузочной способности ведущего по количеству обслуживаемых им ведомых устройств. Кстати большинство выше упомянутых адаптеров для персональных компьютеров, также построены на базе подобных микросхем. Более того, учитывая особенности работы современных операционных сред Windows, использование именно этих компонентов, которые по своей сути являются управляемыми по последовательному интерфейсу цифровыми автоматами, обеспечивает полномасштабное обслуживание однопроводных линий в реальном масштабе времени.

При построении сложных законченных микропроцессорных систем, имеющих дефицит машинного времени для реализации 1-Wire-протокола, наиболее рациональной является идея о возложении отдельной задачи по обслуживанию однопроводной линии на специальный узел заказной или полузаказной СБИС, для последующего сопряжения такого цифрового автомата, через системную магистраль, непосредственно с основным процессорным узлом. Фирма Dallas Semiconductor Corp. даже разработала набор рекомендаций по организации подобного узла под названием DS1WM, который был реализован, в том числе, специалистами Xilinx Inc. в виде законченного практического примера для программируемых перестраиваемых матриц семейств Virtex и Spartan. Более того, и Dallas Semiconductor Corp., которая в том числе известна как поставщик высокоскоростных контроллеров клона MCS51, выпускает специализированный связной микроконтроллер DS80C400, который содержит встроенный в кристалл автомат поддержки 1-Wire-протокола с возможностью реализации механизма активной подтяжки.

Достаточно перспективным представляется также направление, связанное с применением карманных компьютеров (или PDA (Personal Digital Assistant)) популярных платформ PalmOS, Handspring и WinCE/PocketPC для обслуживания однопроводных компонентов, в том числе работающих в составе 1-Wire-сетей. При этом, для подключения PDA к однопроводной шине применяют специализированные адаптеры последовательного порта, которые отличаются малым потреблением и построены на базе схемных решений, использующих выше перечисленные микросхемы сопряжения с 1-Wire-линией. Именно такой подход в настоящее время является наиболее рациональным при организации автономных и мобильных 1-Wire-систем.

Проблема подготовки программного обеспечения для управления мастером линии при обслуживании 1-Wire-сетей, также не представляется неразрешимой. Фирмой Dallas Semiconductor Corp. свободно распространяется профессиональный программный пакет разработчика iButton TMEX SDK, являющийся универсальным средством для профессиональных программистов, который значительно упрощает процесс создания программ для обслуживания однопроводных устройств, подключенных через стандартные типы адаптеров к персональным компьютерам, которые оснащены операционной системой Windows. Он содержит комплект отлаженных драйверов и утилит для реализации полномасштабного 1-Wire-протокола. В качестве среды взаимодействия с разработчиком пакет iButton TMEX SDK использует специальный стандартизованный программный API-интерфейс. Кроме того, с fttp-сервера кампании Dallas Semiconductor Corp. свободно доступен ряд примеров реализации 1-Wire-протокола для некоторых, наиболее популярных видов микропроцессоров, а также готовые библиотеки функциональных программных модулей однопроводного интерфейса для различных программных платформ.

Ведомые однопроводные компоненты

Ведомые однопроводные компоненты, содержащие 1-Wire-интерфейс, выпускаются в двух различных видах. Либо в корпусах MicroCAN, похожих внешне на дисковый металлический аккумулятор, либо в обычных корпусах для монтажа на печатную плату. Футляр MicroCAN полый внутри. Он выполняет функцию защиты содержащегося в нем полупроводникового кристалла однопроводной микросхемы, который соединен с внешним миром лишь через две, изолированные друг от друга, половинки корпуса, являющиеся по существу контактными площадками для подключения однопроводной линии. В подобных "таблеточных" корпусах поставляются, как правило, приборы iButton. Компоненты, которые предназначены для использования в составе 1-Wire-сетей, упаковываются в пластиковые корпуса, используемые для изготовления транзисторов и интегральных схем. Такой подход объясняется тем, что в отличие от устройств iButton однопроводные приборы для 1-Wire-сетей часто имеют более двух выводов. Помимо выводов, которые требуются для обмена данными по однопроводной магистрали, они располагают дополнительными выводами необходимыми, для обеспечения их питания и организации внешних цепей, связывающих такие приборы с объектами автоматизации, например, датчиками или исполнительными устройствами.

К наиболее простым ведомым однопроводным компонентам относятся кремневый серийный номер DS2401 (или модифицированный вариант этого прибора с внешним питанием DS2411) и электронный ключ DS2405, управляемый по 1-Wire-интерфейсу. Первое из этих устройств часто используется в качестве электронной метки, которая позволяет идентифицировать состояние, например, механического переключателя, коммутирующего линию данных однопроводного интерфейса. С помощью DS2405 можно дистанционно осуществить простейшие функции переключения внешнего оборудования, изменяя состояние управляемого ключа относительно возвратного проводника 1-Wire-магистрали.

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

Но все-таки наиболее незаменимыми "кирпичиками", лежащими в основе фундамента однопроводных сетей автоматизации, являются универсальные сдвоенные адресуемые транзисторные ключи типа DS2406P (современная версия широко известных приборов DS2407P).

На базе этих устройств может быть реализована масса применений, и, прежде всего, узлы контроля логических состояний (уровней) и схемы обслуживания датчиков "сухого контакта", а также разнообразные ключевые схемы. Таким образом, именно благодаря использованию этих компонентов осуществляется сбор дискретной информации с территориально рассредоточенных датчиков (мониторов дверей, контакторов положения арматуры, любых датчиков имеющих выход ДА/НЕТ, как-то датчики положения, прохода, присутствия, пожарной и охранной сигнализации и т.д.). Подобные же приборы обеспечивают управление переключением любых видов силового оборудования, которые имеют два рабочих состояния: включено/выключено (нагревателей, кондиционеров, моторов, вентиляторов, арматурных задвижек и т.д.). Кроме того, двунаправленные, индивидуально программируемые выводы DS2406P могут быть использованы для организации медленного последовательного интерфейса между локальным микроконтроллером и 1-Wire-сетью. Не смотря на невысокую скорость при реализации подобного способа обмена информацией по однопроводной сети, когда один бит данных передается за две стандартные посылки, такое решение является приемлемым и достаточно надежным для большого числа конкретных применений.

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

На базе узла часов реального времени кристалла DS2404 кампанией Dallas Semiconductor Corp. выпускается еще два компонента, весьма полезных для создания однопроводных систем автоматизации. Это устройства DS2415 и DS2417. Применяя любой из этих приборов можно организовать дешевые часы/календарь с однопроводным сетевым интерфейсом. Кроме того, второе устройство благодаря наличию в его составе отдельного вывода прерывания, может также дополнительно управлять по времени переключением внешнего оборудования или обеспечивать синхронизацию работы других устройств с процессами, происходящими на 1-Wire-линии.

Значительно расширяет возможности однопроводных сетей по аналоговому управлению рассредоточенным, в том числе силовым, оборудованием цифровой потенциометр DS2890 укомплектованный сетевым 1-Wire-интерфейсом. Используя этот прибор можно создавать самые разнообразные системы удаленного безударного управления, благодаря возможности плавного изменения аналогового регулирующего сигнала по 256 градациям.

При всем многообразии однопроводных компонентов, очевидно, что наиболее универсальным из них является уникальный прибор DS2408. Это индивидуально двунаправленный восьмиразрядный свободно поразрядно программируемый по 1-Wire-шине порт ввода/вывода, который позволяет реализовать любой интерфейс между внешним устройством произвольной модификации и однопроводной линией. Этот прибор имеет двунаправленный вывод внешней синхронизации, обеспечивающий аппаратное тактирование передаваемых или принимаемых данных. Использование микросхемы DS2408 позволяет обеспечить управление посредством 1-Wire-шины: сосредоточенным двунаправленным вводом/выводом по 8 независимым каналам, приводом светодинамических, жидкокристаллических индикаторов и дисплеев различных видов, сканированием матричных клавиатур и дискретных датчиков самых различных типов, а так же позволяет реализовать действительно полномасштабный интерфейс с различными типами микроконтроллеров, как в последовательной, так и в параллельной моде.

Некоторые компоненты 1-Wire-сетей содержат в своем составе массив постоянной (однократно заполняемой пользователем) или энергонезависимой памяти того или иного объема. Это позволяет хранить специальную служебную информацию, связанную с применением конкретного компонента и особенностями его использования (идентификатор, территориальное положение, калибровочные коэффициенты, размерность, значение уставок по умолчанию и т.д.), непосредственно в составе однопроводного прибора. Благодаря этому для организации работы каждой новой однопроводной сети не нужно готовить отдельное специальное программное обеспечение, достаточно иметь одну стандартную программу, которая переконфигурируется в зависимости от специфики конкретной системы (конечно, если память всех компонентов 1-Wire-системы заполнена в соответствии с определенными, заранее оговоренными правилами). Если же в процессе работы системы требуется хранить дополнительные объемы информации, в распоряжении разработчика имеются специальные однопроводные приборы, содержащие как постоянную (DS2502/ DS2505/ DS2506), так и энергонезависимую (DS2430A/ DS2432/ DS2433) память различных объемов.

Целый ряд компонентов семейства iButton в корпусах MicroCAN также может быть использован в составе 1-Wire-сетей в качестве ведомых однопроводных устройств, которые решают специфические задачи идентификации, накопления, хранения и переноса информации. Например, для реализации процедуры идентификации в системах промышленной автоматизации обычно достаточно применения распространенных носимых электронных меток DS1990A. А многоточечный температурный мониторинг легко может быть выполнен сетью из нескольких приборов DS1921# или иначе устройств ТЕРМОХРОН, каждое из которых регистрирует температурные значения, измеренные через определённые, заранее заданные, промежутки времени и сохраняет полученную информацию в собственной энергонезависимой памяти, по существу, являясь программируемым "температурным магнитофоном". Для решения проблемы переноса данных, накопленных автономной 1-Wire-системой, к персональному компьютеру выпускаются разнообразные приборы iButton, которые в этом случае играют роль, так называемых, "транспортных таблеток". К подобным устройствам, прежде всего, относятся приборы энергонезависимой памяти, включающие в состав своей конструкции литиевый элемент питания. Это целый ряд "таблеток" начиная с DS1992 (1Кбит) до DS1996 (64Кбита), и среди них, конечно, модификация DS1994 (4Кбита), содержащая дополнительно узел часов реального времени, удобный для генерации временных меток сохраняемых данных или для организации автономных логгеров ресурса.

Кроме того, для этих же целей могут быть использованы приборы с электрически стираемой памятью типа EEPROM модификаций DS1971(32байта), DS1973(512байт) и DS1977(32Кбайта). При перемещении больших массивов информации "транспортную таблетку" удобно использовать совместно с адаптером USB-порта типа DS9490B, который обеспечивает высокую скорость передачи при обмене данными между устройством iButton и персональным компьютером. Если же речь идет только о решении задачи накопления и хранения данных в 1-Wire-сети, любая из перечисленных выше "транспортных таблеток" может быть легко включена в состав подобной сети. При этом для подключения приборов в корпусах MicroCAN к проводникам однопроводной линии используют специальные защелки типа DS9100 или DS9098P, или же более простые зажимы типа DS9094.

С точки зрения схемотехнической реализации однопроводного интерфейса и устойчивости работы на проблемных линиях все ведомые однопроводные компоненты исторически отличаются друг от друга, делясь при этом на группы:
1. DS2401, DS2405 - первые приборы с 1-Wire-интерфейсом в пластиковых корпусах, полностью аналогичны по схемотехнике первым моделям приборов iButton, которые были ориентированные для работы на коротких шинах (до 1994 года),
2. DS1820, DS2407P, DS2450, DS2404, DS2415, DS2417, DS1920 и т.д. - вторая версия, специально ориентированная для работы на длинных линиях (до 2000 года сейчас эти компоненты в основном снимаются с производства),
3. DS18S20, DS18B20, DS1822, DS2438, DS2406P, DS2409, DS2890, DS1973 и т.д. - третий вариант, более устойчивый к коллизиям на 1-Wire-магистрали по сравнению с предыдущим (с 2000 года),
4. DS2411, DS2408, DS1921#, DS1977 и т.д. - последний вариант, наиболее удачной по надежности схемотехники 1-Wire-интерфейса (c 2003 года).

Линия связи и топология

Большую роль при построении 1-Wire-сетей играет исполнение однопроводной линии связи. Как правило, такие линии имеют структуру, состоящую из трех основных проводников: DATA - шина данных, RET - возвратный или земляной провод, EXT_POWER - внешнее питание не только обслуживаемых ведомых устройств, но и внешних относительно них цепей датчиков и органов управления. В зависимости от способа прокладки, сопряжения с ведомыми устройствами и используемых при прокладке материалов, в соответствии с ниже следующей Таблицей различают три основных варианта качества организации 1-Wire-сетей, каждый из которых подразумевает использование особой технологии и аксессуаров при реализации линии.

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

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

Применения

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

Наиболее последовательно отстаивает линию на использование технологии 1-Wire-сетей в области автоматизации американская фирма Embedded Data Systems, LLC (приемница PointSix, Inc.). Можно сказать, что эта кампания сделала себе имя на внедрение и пропаганде достижений однопроводной шины в области автоматизации. И это, не смотря на то, что основной областью ее деятельности является не автоматизация оранжерей и не создание систем пожарной сигнализации, а разработка средств и систем для обслуживания высокотехнологичных отраслей машиностроения и химической промышленности, и даже создание уникального экспериментального и научного оборудования. Подтверждением этому служит широчайший спектр продукции, который выпускается фирмой (разнообразные зонды для измерения высоких и низких температур, датчики влажности, давления и кислотности с особыми функциями, специальные оптические сенсоры, платы сбора информации, устройства сопряжения с различным аналитическим оборудованием и многое другое), причем каждый из приборов содержит элементы однопроводной технологии.

К перспективным примерам в области применения 1-Wire-технологии для автоматизации, несомненно, можно отнести деятельность таких известных мировых производителей как SYSTRONIX или AAG Electronica. LLC.

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

Другим примером, наглядно демонстрирующим на практике возможности технологии однопроводной шины, является проект построения полностью автоматических метеорологических станций (1-Wire Weather Station), который разрабатывался совместно фирмами PointSix, Inc., AAG Electronica LLC, Dallas Semiconductor Corp. и Texas Weather Instruments, Inc. Вначале (еще в середине 90-х годов) было создано несколько экспериментальных систем, построенных на базе ведущего персонального компьютера с адаптером DS9097U, который является сердцем комплекса, из трех термометров DS18S20, выполняющих контроль температуры, микросхемы DS2438 для обслуживания датчика влажности воздуха, компонента DS2423 для определения скорости ветра и 16-ти электронных меток DS2401 определяющих его направление. Эти первые метеосистемы были установлены и успешно испытаны в процессе длительной эксплуатации в штате Техас. Причем отдельные из них комплектовались дополнительными однопроводными решениями, которые обеспечивали контроль сигналов от датчиков: барометрического давления, разрядов молнии, количества осадков на поверхности, солнечной активности, влажности почвы и т.д. Данные со всех сенсоров, регистрируемые каждой из подобных систем, поступали в персональный компьютер и через Интернет транслировались в режиме реального времени на центральный операторский пульт, где выполнялся прием и архивация данных о погоде региона, получаемый благодаря анализу информации от нескольких территориально рассредоточенных станций. После успешного завершения проекта Texas Weather Instruments Inc. уже на протяжении нескольких лет успешно торгует готовыми полностью автоматическими метеостанциями, не требующими обслуживания человеком. Причем популярность подобных устройств настолько велика по всему миру, что фирма Dallas Semiconductor Corp. была вынуждена начать производство специализированного набора микросхем WS-1, который включает комплект однопроводных компонентов, минимально необходимый для построения подобной станции. А полную комплектацию подобных систем для многочисленных пользователей со всего мира, включая платы для самостоятельной сборки, сертифицированные механические и конструкционные элементы, выполняет фирма AAG Electronica LLC.

Довольно перспективной областью, в которой в полной мере используются преимущества технологии 1-Wire-сетей, и которой, особенно много внимания уделяет кампания Dallas Semiconductor Corp. является менеджмент автономных химических источников тока - аккумуляторных батарей. Под менеджментом здесь понимается, - прежде всего, строгая и полная идентификация источников энергии, сохранение в памяти каждого отдельного встроенного в батарею электронного устройства особенностей ее изготовления и индивидуальных технических характеристик, наиболее полный мониторинг их основных эксплуатационных параметров на протяжении всего срока службы, а также формирование корректного управляющего воздействия, связанного с восстановлением заряда обслуживаемого автономного источника энергии. От правильного менеджмента и знания истории эксплуатации батареи во многом зависит выбор алгоритма ее повторного заряда, что непосредственно связанно с эффективностью использования и сроком службы многих типов аккумуляторов. Для этого каждая из батарей многоэлементных энергетических конструкций (особенно для мобильных устройств и средств бесперебойного питания) снабжается индивидуальным однопроводным компонентом, превращаясь по существу в интеллектуальный системный элемент автономного питания. Целый ряд микросхем, выпускаемых фирмой, связан с этим направлением. Dallas Semiconductor Corp. сегодня доминирует на рынке интеллектуальных систем обслуживания автономных источников питания, исповедуя при этом новый комплексный сетевой подход к проблеме менеджмента энергетических элементов. При этом, используются 1-Wire-решения, позволяющие организовать многоточечную шину обслуживания устройств менеджмента и управления зарядом, что дает возможность сопровождать не только отдельные источники энергии, но и целые батареи, составленные из множества отдельных подобных элементов. Более того, подобные устройства способны обеспечить не только идентификацию или простейший температурный контроль аккумуляторов, но и полномасштабный мониторинг их основных параметров (напряжение, ток, разряд, контроль "короткого замыкания" и т.д.) на протяжении всего времени эксплуатации. Результаты, накопленные такими приборами, сохраняются во встроенной энергонезависимой памяти либо в виде гистограммы (DS2436), либо в виде массива последовательных отсчетов "привязанных" к временным меткам (DS2438).

В настоящее время кампания Dallas Semiconductor Corp. выпускает целый ряд прецизионный кристаллов для мониторинга, менеджмента, защиты и управления восстановлением заряда автономных источников питания самых различных типов и назначений (DS2720, DS2740, DS2751, DS2770 и т.д.). К ним, в том числе, относятся кристаллы семейства DS276#, которые в отличие от иных модификаций подобных устройств, требующих внешней обвязки с использованием прецизионных и стабильных пассивных компонентов, обеспечивают более высокую точность при контроле тока, расходуемого контролируемой батареей. Это достигается, в том числе, за счет встроенной калиброванной резистивной схемы (шунта), выполненной по специальной полупроводниковой технологии, а также благодаря наличию в составе подобных приборов специального аппаратно-программного механизма предварительной калибровки.

Ограничения и сопряжение с промышленными сетями

Безусловно, 1-Wire-сети имеют свою нишу для применения при построении систем автоматизации. Бессмысленно всерьез использовать их для передачи больших массивов информации, при построении, к примеру, систем видео-наблюдения или скоростного обмена, связанных с обслуживанием быстрых процессов, или же сравнивать возможности однопроводных сетей с такими мощными сетевыми промышленными интерфейсами, как ProfiBus, FeldBus, LonWorks, CAN, Industrial Internet и т.д. Можно даже сформулировать основные на сегодняшний день ограничения для применения систем на базе однопроводных 1-Wire-сетей в области автоматизации:

  • необходимость непрерывной временной синхронизации или синхронной работы отдельных устройств в сети (эта проблема может быть решена вводом в структуру шины сети дополнительной линии для передачи сигнала общей синхронизации),
  • низкая скорость обмена информацией, и как следствие невозможность высокой динамики при обслуживании быстрых процессов в режиме реального времени (если контролируемый быстрый процесс является относительно непродолжительным, локальный микроконтроллер в составе однопроводной шины может обслужить его, сохранив результирующие данные в буферной памяти, а затем уже осуществить их передачу непосредственно к мастеру),
  • сложность в реализации мультимастерного режима работы сети (специализированный ветвитель 1-Wire-сетей DS2409 разрешает проблему конфликтов между несколькими ведущими на одной однопроводной шине).

Как видно из замечаний приведенных в скобках, даже эти очевидные для 1-Wire-сетей, трудности не являются непреодолимыми. Более того, существуют подходы, позволяющие органично интегрировать медленные однопроводные территориально рассредоточенные структуры в состав таких производительных сетей как CAN и Industrial Internet. Это достижимо благодаря применению специальных аппаратно-программных решений, реализуемых на базе современных микроконтроллеров, а так же уникального инструмента кампании Dallas Semiconductor Corp. - устройства TINI (Tiny InterNet Interface ).

TINI400 - это целая микросистема, основой которой является центральный процессор, реализованный на высокопроизводительном сетевом микроконтроллере DS80С400, который объединяет ресурсы целого ряда наиболее распространенных сетевых интерфейсов, как-то: RS232, 1-Wire, CAN 2.0B, Ethernet, не говоря о возможности использования параллельной шестнадцатиразрядной синхронной магистрали, а также автономных узлов для организации стандартных локальных последовательных интерфейсов I2C и SPI. Кроме того, плата TINI400 содержит 1Мбайт программной Flash-памяти, 1Мбайт статического ОЗУ, узел часов реального времени, литиевую батарею и кремниевый идентификационный номер. Работает TINI400 под управлением мощной операционной среды, которая включает в себя поддержку TCP/IP и виртуальной машины Java, которая тщательно отработана и испытана еще на модели TINI предыдущего поколения - плате TINI390. Последнее определяется тем фактом, что технология программной поддержки для TINI390 на протяжении нескольких лет развивалась специалистами Dallas Semiconductor Corp. совместно с сотрудниками компании Sun Microsystems, Inc., являясь при этом полностью открытым проектом. Такой подход позволил иметь максимально эффективную обратную связь с конечными пользователями, что помогло выявить и устранить большинство недостатков программного обеспечения. И сейчас на сайте Dallas Semiconductor Corp. можно найти всю необходимую документацию и средства разработки программного обеспечения, что значительно облегчает построение на базе устройства TINI локальных однопроводных систем удаленного контроля и управления, объединяющих достоинства быстрых и производительных, но дорогих, и медленных, но дешевых и эффективных интерфейсов.

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



Просмотров