- PVSM.RU - https://www.pvsm.ru -

В прошлый раз [1] мы рассмотрели аппаратную часть нашей побрякушки, настало время написать прошивку.
В первой части почти ничего не было сказано о специфике работы 1-wire. Аппаратная часть протокола очень проста: один сигнальный проводник, подтянутый к плюсу питания через резистор. Все, что могут устройства, это замыкать сигнальную линию на землю на то или иное время. Как же организована передача данных?
Каждый акт взаимодействия по 1-wire начинается со сброса.

Ведущее устройство выдает импульс низкого уровня длительностью от 480 мкс до бесконечности. Таким образом, включение питания тоже рассматривается как сброс. После этого ведущий отпускает линию и через 200 мкс проверяет напряжение на ней. Любое ведомое устройство, если оно есть на шине, в это время должно дать ответный импульс, называемый Presence (присутствие). Если Presence принят, можно считать, что ведомые устройства обнаружены и готовы к принятию команд.
Передача данных разбита по времени на тайм-слоты, длительностью от 67 мкс. В пределах одного тайм-слота передается один бит, таким образом скорость передачи может достигать 14,9 кбит/с. Некоторые микросхемы поддерживают еще режим Overdrive, в котором слоты укорачиваются до 10 мкс, а скорость возрастает до 100 кбит/с, но мы этот режим рассматривать не будем, стандартной скорости более чем хватает.
Для передачи единицы ведущий выдает короткий импульс (5 мкс) и до конца тайм-слота отпускает линию. Для передачи ноля импульс длиннее — 60 мкс.

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

Обратите внимание! Некоторые временные параметры передачи для микросхемы DS2413 отличаются от стандартных, в datasheet'е [2] они выделены желтым.
Каждое ведомое устройство должно иметь свой уникальный адрес. В микросхемы, предназначенные для работы с 1-wire адреса прошиваются в процессе производства. Адрес состоит из 64 бит (8 байт), причем младший байт представляет собой код семейства микросхем (для DS2413 — 0x3A), а старший — контрольную сумму. После выбора устройства по адресу все остальные устройства не реагируют на команды до следующего сброса.

Устройства 1-wire управляются однобайтными командами. Существуют команды общие для всех, а также специфичные для определенных микросхем.
Общие команды:
Команды, специфичные для DS2413, их всего две:
Как было упомянуто в первой части статьи, перед сборкой не худо считать адреса, зашитые в купленных микросхемах, иначе мы не сможем ими управлять. Для этого предназначена специальная прошивка-считыватель. Она позволяет прочитать адрес DS2413 и записать в EEPROM контроллера, откуда его можно достать программатором.
К великому сожалению, считыватель был написан немного под другой контроллер (ATTiny12) и на ассемблере. В архиве в конце статьи будет исходник этой прошивки, желающие могут попытаться портировать ее под Tiny13. Также можно воспользоваться готовыми функциями приема и передачи 1-wire из основной прошивки и написать свой считыватель.
Наконец, можно взять адаптер 1-wire/COM (например, такой [4]) и считать микросхемы на компьютере.
Однообразно мигающее украшение очень быстро надоест, поэтому нужно воспроизводить случайные световые эффекты через случайные промежутки времени. В качестве генератора псевдослучайных чисел выбран сдвиговой регистр с обратными связями (Linear feedback shift register [5]) как наиболее просто реализующийся на AVR. Алгоритм не содержит операций умножения, только XOR и сдвиги. Регистр разрядности 15 бит обеспечивает 32767 состояний, чего хватит на час неповторяющейся работы устройства.
Но это еще не все, для инициализации ГСЧ нужен источник энтропии, иначе при каждом включении будет генерироваться одна и та же последовательность. В качестве такого источника может выступать:
В данной конструкции применен третий способ: подсчет числа тактовых импульсов за один период сторожевого таймера. Сторожевой таймер в Tiny13 тактируется от своего собственного осциллятора, частота которого довольно нестабильна.
Каждые 2 секунды генерируется 2 8-битных псевдослучайных числа, биты которых используются следующим образом:
4 старших бита первого числа — выбор текущего эффекта. Это может быть:
Старший бит второго числа — цвет (зеленый или оранжевый).
Оставшиеся биты кодируют номера первого, второго и третьего светодиода для одиночных вспышек (группами по 3 бита). Так как 3 бита кодируют номера от 0 до 7, а всего звеньев 10, для второй вспышки номер увеличивается на 1, для третьей — на 2. Таким образом охватывается весь диапазон, и это проще, чем брать четырехбитные номера и контролировать границы.
Контроллер Tiny13 имеет два встроенных источника тактового сигнала — 9,6 и 4,8 МГц, кроме того, можно включить делитель тактовой частоты. Чем частота ниже, тем ниже энергопотребление контроллера. С другой стороны, слишком низкая частота не позволит задать временные интервалы для протокола 1-wire. При написании прошивки на ассемблере удалось добиться работы на частоте 1,2 МГц, при этом самый короткий отмеряемый интервал составил всего три такта. Для прошивки на C такого быстродействия достичь не получилось, минимальная тактовая частота — 4,8 МГц.
Большую часть времени контроллер находится в режиме PowerDown, при этом работает только сторожевой таймер, который вызывает прерывание каждые 2 секунды.
Для конфигурирования контроллера служит набор так называемых fuse-битов (фьюзов). Их значения нужно установить один раз перед прошивкой. Значения фьюзов для данного проекта (значения, отличные от заводских, выделены):
Прошивать контроллер нужно до установки на плату, подключив его непосредственно к программатору. Если нет панельки для SOIC-корпусов, можно аккуратно подключить проводами. После прошивки и проверки работоспособности контроллер можно распаивать окончательно.
Полные исходники основной прошивки:
pastebin.com/CEKvhYVt [6]
Прошивка для считывателя адресов 1-wire:
pastebin.com/tQ7AqmfN [7]
Видео, показывающее работу прошивки:
На данный момент занято чуть больше половины памяти контроллера, так что есть огромный простор для фантазии. Можно реализовать новые эффекты, можно слегка доработать схему устройства и добавить датчик температуры, освещенности, акселлерометр, микрофон, детектор НЛО или ИК-приемник. Можно организовать загрузку новой прошивки, скажем, через последовательный интерфейс (Tiny13 поддерживает самопрограммирование). Естественно, для всех возможностей одновременно не хватит ни ног, ни памяти контроллера, но одну-две фичи добавить можно.
Поздравляю прекрасную половину хабрачеловечества с наступающим 8 марта!
Автор: Ocelot
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/8-marta/2961
Ссылки в тексте:
[1] В прошлый раз: http://habrahabr.ru/blogs/DIY/128891/
[2] datasheet'е: http://datasheets.maxim-ic.com/en/ds/DS2413.pdf
[3] здесь: http://www.maxim-ic.com/app-notes/index.mvp/id/187
[4] такой: http://arv.radioliga.com/index.php?option=com_content&task=view&id=79&Itemid=44
[5] Linear feedback shift register: http://en.wikipedia.org/wiki/LFSR
[6] pastebin.com/CEKvhYVt: http://pastebin.com/CEKvhYVt
[7] pastebin.com/tQ7AqmfN: http://pastebin.com/tQ7AqmfN
Нажмите здесь для печати.