Федеральное агентство по образованию Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «Национальный исследовательский ядерный университет «МИФИ» Кафедра «Автоматика» ОТЧЕТ О УЧЕБНО-ИССЛЕДОВАТЕЛЬСКОЙ РАБОТЕ по теме «Модуль управления 1-Wire шиной» Выполнил: студент группы А6-02 Логинов А.В Руководитель: Рахматулин А.Б. Москва, 2011 РЕФЕРАТ Отчет 20 стр., 2 табл., 7 рис., 6 источников. Ключевые слова: 1-Wire, протокол обмена, передача данных Объектом исследования является модуль управления 1-Wire шиной Цель работы – создание модуля управления 1-Wire шиной на примере датчика температуры Проведена учебно-исследовательская работа. 1 СОДЕРЖАНИЕ ВВЕДЕНИЕ .............................................................................................................. 3 Постановка задачи и технические требования ................................................. 5 МОДУЛЬ УПРАВЛЕНИЯ 1-WIRE ШИНОЙ ...................................................... 6 1. Основные принципы работы 1-Wire сети ..................................................... 6 2. Физическая реализация интерфейса 1-Wire ................................................. 8 3. Передача данных в сети 1-Wire ..................................................................... 9 4. Протокол обмена информацией .................................................................. 13 5. Электрическая схема устройства................................................................. 15 6. Програмная реализация протокола обмена ................................................ 17 7. Аналоги .......................................................................................................... 20 ЗАКЛЮЧЕНИЕ ..................................................................................................... 21 СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ ........................................... 22 2 ВВЕДЕНИЕ Однопроводной интерфейс 1-Wire , разработанный в конце 90-х годов фирмой Dallas Semiconductor Corp., регламентирован разработчиками для применения в трех основных сферах-приложениях: приборы в специальных корпусах MicroCAN для решения проблем идентификации, переноса или преобразования информации (технология iButton); программирование встроенной памяти интегральных компонентов; системы автоматизации (технология сетей 1-Wire-сетей). 1-Wire-net представляет собой информационную сеть, использующую одну линию данных и один возвратный (или земляной) провод для осуществления цифровой связи. Таким образом, для реализации среды обмена этой сети могут быть применены доступные кабели, содержащие неэкранированную витую пару той или иной категории, в т.ч. даже обычный телефонный провод. Такие кабели при их прокладке не требуют наличия какого-либо специального оборудования, а ограничение максимальной длины однопроводной линии регламентировано разработчиками на уровне 300м. Основой архитектуры 1-Wire-сетей, является топология общей шины, когда каждое из устройств подключено непосредственно к единой магистрали, без каких-либо каскадных соединений или ветвлений. При этом в качестве базовой используется структура сети с одним ведущим или мастером и многочисленными ведомыми (т.н. master и slave). Конфигурация любой 1-Wire-сети может произвольно меняться в процессе ее работы, не создавая помех дальнейшей эксплуатации и работоспособности всей системы в целом, если при этих изменениях соблюдаются основные принципы организации однопроводной шины. Эта возможность достигается благодаря присутствию в протоколе 1-Wireинтерфейса специальной команды поиска ведомых устройств (поиск 3 ПЗУ), которая позволяет быстро определить новых участников информационного обмена. [1] Основные преимущества 1-Wire сетей: Не требуется дорогого оборудования для передачи данных; Легкое изменение конфигурации сети; Скорость до 125 Кбит / сек; Высокая помехозащищенность; Дальность работы до 300 метров; Большинство датчиков поддерживают паразитное питание. Чаще всего 1-Wire устройства недороги, наиболее распространенными примерами являются датчики температуры и ключи - "таблетки" для домофонов (т.н. iButton). Рисунок 1. Пример использования устройства 1-Wire 4 Постановка задачи и технические требования В ходе учебно-исследовательской работы требовалось разработать модуль управления 1-Wire шиной. В качестве основы устройства предлагалось использовать микроконтроллер Atmega-8 с частотой 16 МГц. Питание схемы должно осуществляться от источника постоянного напряжения 5В, максимальное токопотребление 100 мА. Модуль управления должен быть выполнен в виде печатной платы с возможностью подключения переходника uart-usb. Для модуля управления необходимо было выполнить разработку электрической схемы, чертеж печатной платы и реализацию прошивки микроконтроллера в пакете WinAVR. Результатом работы должен являться настоящий отчет по УИР. 5 МОДУЛЬ УПРАВЛЕНИЯ 1-WIRE ШИНОЙ 1. Основные принципы работы 1-Wire сети Сеть 1-Wire использует два или три провода для осуществления цифровой связи: линия данных, также называемая шиной, земляной провод и иногда, но не всегда, провод питания. Каждое 1-Wire устройство имеет свой индивидуальный адрес, из чего следует, что сеть может иметь практически неограниченное адресное пространство. При этом, каждый из однопроводных приборов сразу готов к использованию в составе 1-Wire-сети, без каких-либо дополнительных аппаратно-программных модификаций. Однопроводные компоненты являются самотактируемыми полупроводниковыми устройствами, в основе обмена информацией между которыми, лежит управление изменением длительности временных интервалов импульсных сигналов в однопроводной среде и их измерение. Передача сигналов для 1-Wire-интерфейса асинхронная и полудуплексная, а вся информация, циркулирующая в сети, воспринимается абонентами либо как команды, либо как данные. Команды сети генерируются мастером и обеспечивают различные варианты поиска и адресации ведомых устройств, определяют активность на линии даже без непосредственной адресации отдельных компонентов, управляют обменом данными в сети и т.д. Стандартная скорость работы 1-Wire-сети, которая составляет 15,4 Кбит/сек, была выбрана с учетом обеспечения максимальной надежности передачи данных на большие расстояния, также во внимание принималось быстродействие наиболее широко распространенных типов микроконтроллеров, которые в основном должны использоваться при реализации ведущих устройств однопроводной шины. Это значение скорости обмена может быть уменьшено до любого возможного значения благодаря введению принудительной задержки между передачей в линию отдельных битов данных (растягиванию временных слотов протокола). Или увеличено за счет перехода на специальный ускоренный режим обмена (скорость Overdrive 6 до 125Кбит/сек), который допускается для отдельных типов однопроводных компонентов на небольшой по расстоянию, качественной, не перегруженной другими приборами линии связи. При реализации однопроводного интерфейса используются стандартные логические уровни сигналов, а питание большинства однопроводных компонентов может осуществляться от внешнего источника с рабочим напряжением в диапазоне от 2,8В до 6,0В. Альтернативой применению внешнего питания служит механизм паразитного питания, действие которого заключается в использовании каждым из ведомых компонентов 1-Wire-линии электрической энергии импульсов, передаваемых по шине данных, которая аккумулируется специальной, встроенной в прибор емкостью. Кроме того, отдельные компоненты однопроводных сетей могут использовать режим питания по шине данных, когда энергия к приемнику поступает непосредственно от мастера по линии связи, при этом обмен информацией в сети принудительно прекращается.[2] 7 2. Физическая реализация интерфейса 1-Wire Как было сказано выше, для обеспечения работы сети требуется ведущее устройство – master и ведомое устройство - slave. На рисунке показана упрощенная схема аппаратной реализации интерфейса 1-Wire. Рисунок 2 . Аппаратная реализация интерфейса 1-Wire Вывод DQ устройства представляет собой вход КМОП-логического элемента, который может быть зашунтирован (замкнут на общий провод) полевым транзистором. Сопротивление канала этого транзистора в открытом состоянии - около 100 Ом. Когда транзистор заперт - имеется небольшой ток утечки (примерно 5 мкА) на общий провод. Шина 1-Wire должна быть подтянута отдельным резистором к напряжению питания устройств. Стандартное сопротивление этого резистора 4.7 КОм, однако, это значение рекомендовано только для достаточно коротких линий. Если шина 1-Wire используется для подключения удаленных на большое расстояние устройств, то сопротивление этого резистора следует уменьшить. Минимально допустимое его сопротивление - около 300 Ом, а максимальное - около 20 - 30 кОм. Данные величины - ориентировочные, и всегда уточняются по характеристикам конкретного устройства 1-Wire его максимальный втекающий ток линии DQ, который и определяет минимум внешнего сопротивления. 8 3. Передача данных в сети 1-Wire Основные правила передачи данных в сети 1-Wire: Обмен всегда ведется по инициативе одного ведущего устройства, которое в большинстве случаев является микроконтроллером; Любой обмен информацией начинается с подачи импульса сброса ("RESET Pulse") в линию 1-Wire ведущим устройством; Для интерфейса 1-Wire в общем случае предусматривается "горячее" подключение и отключение устройств; Любое устройство, подключенное к 1-Wire после получения питания выдает в линию DQ импульс присутствия, называемый "PRESENCE pulse". Этот же импульс устройство всегда выдает в линию, если обнаружит сигнал RESET; Появление в шине 1-Wire импульса PRESENCE после выдачи RESET однозначно свидетельствует о наличии хотя бы одного подключенного устройства; Обмен информации ведется так называемыми тайм-слотами: один тайм-слот служит для обмена одним битом информации; Данные передаются побайтно, бит за битом, начиная с младшего бита. Достоверность переданных/принятых данных (проверка отсутствия искажений) гарантируется путем подсчета циклической контрольной суммы. Перечисленные правила определяют логический низкоуровневый протокол обмена данными. На рисунке показана диаграмма сигналов RESET и PRESENCE, с которых всегда начинается любой обмен данными. Выдача импульса RESET в процессе обмена служит так же для досрочного завершения процедуры обмена информацией. 9 Рисунок 3. Диаграмма сигналов RESET и PRESENCE Длительность большинства временных интервалов приблизительная и имеет только ограничение только по минимуму (не меньше указанного). Тем не менее, в настоящей реализации модуля управления используются рекомендованные длительности импульсов и времен задержки между ними. Импульс RESET формирует ведущий МК, переводя в низкий логический уровень шину 1-Wire и удерживая ее в этом состоянии минимум 480 микросекунд. Затем МК должен "отпустить" шину. Через некоторое время, зависящее от емкости линии и сопротивления подтягивающего резистора, в линии установится высокий логический уровень. Протокол 1-Wire ограничивает время "релаксации" диапазоном от 15 до 60 микросекунд, что и является определяющим для выбора подтягивающего резистора (как правило, емкость линии не поддается изменению, а именно она оказывает существенное влияние на время возврата линии к высокому уровню). Обнаружив импульс RESET, ведомое устройство приводит свои внутренние узлы в исходное состояние и формирует ответный импульс PRESENCE не позже 60 микросекунд после завершения импульса RESET. Для этого устройство переводит в низкий уровень линию DQ и удерживает ее в этом состоянии от 60 до 240 микросекунд. Конкретное время удержания может варьироваться, но всегда находится в указанном диапазоне. После этого устройство так же "отпускает" шину. 10 После завершения импульса PRESENCE ведомому устройству дается еще некоторое время для завершения внутренних процедур инициализации, таким образом, МК должен приступить к любому обмену с устройством не ранее, чем через 480 микросекунд после завершения импульса RESET. Процедура инициализации интерфейса, с которой начинается любой обмен данными между устройствами, длится минимум 960 микросекунд, состоит из передачи от МК сигнала RESET и приему от устройства сигнала PRESENCE. Если сигнал PRESENCE не обнаружен - значит на шине 1-Wire нет готовых к обмену устройств. Процедуры обмена битами информации осуществляются определенными тайм-слотами, то есть с использованием определенных и довольно жестко лимитированных по времени последовательность смены уровней сигнала в линии 1-Wire. Различают 4 типа тайм-слотов: передача "1" от МК, передача "0" от МК, прием "1" от устройства и прием "0" от устройства. Любой тайм-слот всегда начинает МК путем перевода шины 1-Wire в низкий логический уровень. Длительность любого тайм-слота должна находиться в пределах от 60 до 120 микросекунд. Между отдельными таймслотами всегда должен предусматриваться интервал не менее 1 микросекунды (конкретное значение определяется параметрами ведомого устройства). Тайм-слоты передачи отличаются от тайм-слотов приема поведением МК: при передаче он только формирует сигналы, при приеме, кроме того, еще и опрашивает (т.е. принимает) уровень сигнала в линии 1-Wire. Для передачи данных мастер замыкает шину на землю на определенное время: для передачи "1" на 1-15 мкс, для передачи "0" на 60-120 мкс. После передачи каждого бита, необходима пауза минимум в 1 мкс. Общая длительность передачи каждого бита не может быть меньше 61 мкс. Для чтения данных мастер замыкает шину на землю на 1 - 15 мкс, после чего проверяет – если шина удерживается устройством, значит прочитан "0", 11 если же возвращается в вернуться в исходное состояние резистором, значит прочитана "1". Проверка идет в пределах 15 мкс после спада. Рисунок 4. Временные диаграммы передачи данных в сети 1-Wire на примере передачи и приема двух битов Ошибки в сети могут появиться в результате неправильной установки временных интервалов. Для исключения возникновения такой ситуации нужно все сигналы, формируемые микроконтроллером, следует формировать по принципу необходимого минимума длительности (т.е. немного больше, чем указанная минимальная длительность), а от устройства следует ожидать сигналов по принципу наихудшего (т.е. ориентироваться на самые худшие варианты временных параметров сигнала). [3][4] 12 4. Протокол обмена информацией Каждое устройство 1-Wire обладает уникальным идентификационным 64битным номером, программируемым на этапе производства микросхемы. Перед установкой ведомого устройства в сеть требуется определить его номер. Модуль управления посылает импульс RESET, принимаемый всеми устройствами, они же выдают импульс PRESENCE. Затем мастер посылает в шину команду, которую принимают все устройства. Команд определено несколько общих для всех типов 1-Wire-устройств, а так же могут быть команды, уникальные для отдельных типов. Далее следует таблица наиболее часто используемых команд. Таблица 1. Некоторые команды 1-Wire сети Команда SEARCH ROM READ ROM MATCH ROM Значение Описание Поиск адресов - используется при универсальном 0xF0 алгоритме определения количества и адресов подключенных устройств 0x33 Чтение адреса устройства - используется для определения адреса единственного устройства на шине Выбор адреса - используется для обращения к 0x55 конкретному адресу устройства из многих подключенных Игнорировать адрес - используется для обращения к SKIP ROM 0xCC единственному устройству на шине, при этом адрес устройства игнорируется (можно обращаться к неизвестному устройству) Порядок действий ведущего и ведомого устройства можно рассмотреть на примере команды MATCH ROM. Модуль управления сетью передает один 13 байт команды: 0x55, после чего 8 байт конкретного адреса устройства, с которым будет осуществляться последующий обмен данными. Приняв эту команду, каждое устройство сравнивает передаваемый адрес со своим собственным. Все устройства, адрес которых не совпал, прекращают анализ и выдачу сигналов в линии 1-Wire, а опознавшее адрес устройство продолжает работу. Далее все данные, передаваемые МК, обрабатываются только данным адресованным устройством. То, какие именно данные надо послать в устройство или получить от него после его адресации, зависит от конкретного устройства, например, в данной работе используется запрос чтения значения температуры из памяти термодатчика. Уникальные адрес ведомого устройства состоит из 8 байт: одного байта идентификатора семейства, шести байт (48 бит) собственно уникального адреса и одного байта контрольной суммы всех предыдущих байтов. Контрольная сумма (CRC) - это байт, значение которого передается последним и вычисляется по специальному алгоритму на основе значения всех семи предыдущих байтов. Алгоритм подсчета таков, что если все байты переданы-приняты без искажений, принятый байт контрольной суммы обязательно совпадет с рассчитанным в модуле управления значением. Т.е. при реализации программного алгоритма обмена информацией при передаче и приеме байтов требуется подсчитывать их контрольную сумму по строго определенному алгоритму, а сравнить расчетное значение с принятым значением CRC. Только при совпадении обоих CRC нужно считать принятые данные достоверными. В противном случае продолжение обмена невозможно. Алгоритм подсчета CRC должен быть одинаковым для ведущего и ведомого устройств, он стандартизирован и описан в документации. [5] 14 5. Электрическая схема устройства Рисунок 5. Схема электрическая принципиальная Шина данных подтянута к питанию резистором на 4.7 КОм, такое значение сопротивления обуславливается предположительно малой емкостью цепи 1-Wire сети. Напряжение питания выравнивается стабилизатором L7805 с максимальным током 100мА. Имеются три выхода: экран (в данном проекте остается незадействованным), к переходнику uart-usb и собственно 1-Wire шина. 15 На рисунке ниже представлен внешний вид модуля управления 1-Wire шиной с подключенными к нему переходником uart-usb и датчиком температуры ds18s20. Рисунок 6. Внешний вид модуля управления 16 6. Програмная реализация протокола обмена Создание прошивки для микропроцессора производилось в пакете программ WinAVR. Язык программирования близок по структуре к языку С. В качестве примера приводится команда чтения 1 бита информации с управляемого устройства. Таблица 2. Пример подпрограммы Код Пояснение uint8_t ow_get_bit(void) { uint8_t result; ow_delay; Защитная пауза длиной 10 мкс cli(); Запрет прерываний на время чтения wire_0; Просадка шины в 0 _delay_us(6); Удержание шины в 0 wire_1; Отпускание шины _delay_us(7); Пауза, ожидание ответа от slave result = (OW_PIN >> OW_P) & 1; Чтение состояния шины sei(); Разрешение прерываний _delay_us(90); Задержка перед следующей командой return result; Возвращение результата } Полный листинг программы находится в приложении А. 17 7. Программа обработки и представления информации на LabVIEW. В ходе разработки информационно – измерительной системы (управляющей) написана программа обработки и представления информации на LabVIEW (рис. 7). Она содержит виртуальные приборы для приёма и обработки сигналов от объекта, представления данных в цифровом и графическом виде. Структура программы представлена на рисунке 8. РИСУНОК 7 РИСУНОК 8 18 Принцип работы программы на LabVIEW Сначала необходимо выбрать порт и задать его конфигурацию (рис. 9): скорость передачи данных, временную задержку и т.д. Скорость передачи данных должна соответствовать тому значению, которое было установлено в коде программы микропроцессора (было взято значение ЧЧЧ115200). РИСУНОК 9 На этот порт приходит цифровой код в виде строки данных, сформированной внутренним АЦП микропроцессора. Программа считывает строку данных с порта (рис. (максимальное 16). Затем напряжение проводит 5В, а градуировку число полученных разрядов внутреннего данных АЦП микропроцессора 10, следовательно, нормировочный коэффициент равен 5/210 ~= 0.00488). 19 8. Аналоги Существует множетсво устройств, управляющих 1-Wire шиной. Наиболее часто человек встречатется с такими устройствами в домофонах. Примером управляющего устройства, которое может найти применение в лаборатории, является переходник 1-Wire – USB : DS9490R. Рисунок 7. Внешний вид переходника DS9490R Преимущества: 1. USB интерфейс не требует установки специальных драйверов; 2. Поддерживает как стандартное, так и высокоскоростное (Overdrive) 1-Wire соединение; 3. Простое подключение сети с датчиками; 4. Существуют готовые компьютерные программы для обработки поступающих данных. [6] Минусом такого устройства по сравнению с разработанным модулем управления является цена от 27$. 20 ЗАКЛЮЧЕНИЕ В учебно-исследовательской работе требовалось создать и исследовать модуль управления 1-Wire шиной. В результате работы был изучен протокол обмена данными 1-Wire, созданы принципиальная схема и собрано устройство модуля. Прошивка устройства была реализована и зашита в микроконтроллер. В качестве ведомого устройства был выбран термодатчик, данные с которого считываются модулем управления, обрабатываются и передаются на компьютер. Макет модуля может быть использован в лабораторных условиях в учебных целях, но для использования в промышленных целях требуется доработка. Уменьшение размера и цены устройства может быть достигнуто использованием более дешевого микроконтроллера, например Attiny2313, также возможно изготовление печатной платы на заводе. В будующем предполагатся доработать прошивку устройства, добавив возможность работы сразу с несколькими ведомыми устройствами разных типов, а также програмная реализация usb интерфейса, что позволит передавать данные на компьютер напрямую. По результатам работы был создан настоящий отчет 21 СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 1. http://www.elin.ru/1-Wire/ 2. http://revolution.allbest.ru/programming/00061409_0.html 3. http://logic-bratsk.ru/radio/interface/1_wire/1_wire/1_wire.htm 4. http://usb-osc.narod.ru/1-wire.htm 5. http://www.elin.ru/1-Wire/ 6. http://lib.chipdip.ru/302/DOC000302212.pdf 22 Приложение А Исходный код прошивки микроконтроллера Файл main.h // Подключение кнопок #define SW_PORT PORTD #define SW_DDR DDRD #define SW_PIN PIND #define SW1 2 #define SW2 3 //----- Переобозначения --------------------------------------#define Reset_pin_DDR DDRB //pin to reset AD9834 #define Reset_pin_PORT PORTB //pin to reset AD9834 #define Reset_pin 0 //pin to reset AD9834 #define CS_DDR DDRB #define CS_PORT PORTB //pin to select AD8370 //pin to select AD8370 #define CS 1 //pin to select AD8370 #define FSYNC_DDR DDRB // SPI #define FSYNC_Port PORTB // SPI #define FSYNC PORTB4 // SPI #define SCK 7 #define MISO 6 #define MOSI 5 //#define SS 4 #define UsartPort PORTD #define UsartPortDDR DDRD #define Rx PORTD0 #define Tx PORTD1 #define TIMER_CLK_STOP 0x00 #define TIMER_CLK_DIV1 0x01 #define TIMER_CLK_DIV8 0x02 #define TIMER_CLK_DIV64 0x03 #define TIMER_CLK_DIV256 0x04 #define TIMER_CLK_DIV1024 0x05 #define TIMER_CLK_T_FALL 0x06 #define TIMER_CLK_T_RISE 0x07 23 Файл main.c #include <avr/interrupt.h> #include <stdio.h> #include <util/delay.h> #include "main.h" #include "uart.h" #include <in_out.h> #include <sound.h> #include <timer.h> #include <avr/eeprom.h> #include <util/crc16.h> #include "1w.h" #define UART_BAUD_RATE 115200 uint8_t buf[9]; uint8_t temp_x100(int *temp) { uint8_t result = 1, // результат опроса датчика crc; // контрольная сумма int16_t *tmp = (void*)buf; // указатель на температуру, принятую из датчика int t, tt; // вспомогательные переменные result = 1; ow_reset(); // сброс 1-wire ow_write_byte(OW_SKIP_ROM_CMD); ow_write_byte(CMD_RD_SCRPAD); // команда "пропустить адрес" // команда "считать регистры датчика" crc = 0; for(uint8_t i=0;i<9;i++){ // чтение данных из датчика buf[i] = ow_read_byte(); // чтение байта crc = ow_crc(crc, buf[i]); // и подсчет контрольной суммы } if(crc) result = 0; // если контрольная сумма не нулевая - это ошибка else { //иначе - рассчет температуры tt = 100 * (*tmp>>1); // отброс мл.бита температуры из датчика t = tt - 25 + (16 - buf[6])*100/16; // это "стандартный" алгоритм извлечения долей градуса *temp = t; // готовый результат в переменную-приемник } ow_reset(); // сброс 1-wire ow_write_byte(OW_SKIP_ROM_CMD); // команда "пропустить адрес" ow_write_byte(CMD_START_CONV); // команда "начать измерение" 24 ow_reset(); // сброс 1-wire return result; } FILE uart_str = FDEV_SETUP_STREAM(uart_putc, uart_getc, _FDEV_SETUP_RW); ISR(INT0_vect){ //Кнопки пока не используются } ISR(INT1_vect){ } int main(void) { UsartPortDDR &=~(1 << Rx); //set Rx0 as input UsartPortDDR |= (1 << Tx); //set Tx0 as output uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); SW_DDR &= ~((1 << SW1)|(1 << SW2)); SW_PORT |= (1 << SW1)|(1 << SW2); GIMSK |= (1<<INT0)|(1<<INT1); stdout = stdin = &uart_str; sei(); int i; char s[9]; while(1) { if( temp_x100( &i )) printf( "%i\n\r", i ); _delay_ms(1000); } } 25 Файл 1w.h #ifndef _1_WIRE_H_ #define _1_WIRE_H_ 1 // Назначение порта и пина для подключения датчика #define OW_PORT PORTC /* порт управления */ #define OW_DDR DDRC /* регистр направления порта */ #define OW_PIN PINC /* регистр пинов порта */ #define OW_P 0 /* номер бита порта */ // прототипы функций низкого уровня uint8_t void uint8_t void ow_reset(void); ow_put_bit(uint8_t bit); ow_get_bit(void); ow_write_byte(uint8_t data); uint8_t ow_read_byte(void); uint8_t ow_crc(uint8_t crc, uint8_t x); //Основные команды 1-Wire протокола #define OW_OVRDRV_SKIP_CMD 0x3c #define OW_SEARCH_ALRM_CMD 0xec #define OW_SEARCH_ROM_CMD 0xf0 #define OW_READ_ROM_CMD 0x33 #define OW_MATCH_ROM_CMD 0x55 #define OW_SKIP_ROM_CMD 0xcc #define OW_FAMILY_ROM 0x09 #define OW_FAMILY_TEMP 0x10 #define CMD_START_CONV 0x44 #define CMD_RD_SCRPAD 0xbe #define CMD_WR_SCRPAD 0x4e #define CMD_CPY_SCRPAD 0x48 #define CMD_RECALL 0xb8 #define CMD_RD_PSU 0xb4 #endif 26 Файл 1w.c #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <stdio.h> #include <avr/pgmspace.h> #include <util/crc16.h> #include "1w.h" #define ow_delay _delay_us(10) /* защитная пауза */ #define wire_0 OW_DDR |= (1<<OW_P) #define wire_1 OW_DDR &= ~(1<<OW_P) uint8_t ow_reset(void) { uint8_t result = 1; OW_PORT &= ~(1 << OW_P); // 0 в порт для "просадки" в ноль wire_0; _delay_us(500); // включение "просадки" // RESET Pulse wire_1; // отключение просадки _delay_us(100); if (OW_PIN & (1 << OW_P)) result = 0; _delay_us(400); // защитная пауза в конце return result } void ow_put_bit(uint8_t bit){ ow_delay; cli(); wire_0; _delay_us(6); sei(); if (bit){ wire_1; _delay_us(90); } else { _delay_us(90); wire_1; } ow_delay; } 27 uint8_t ow_get_bit(void) { uint8_t result; ow_delay; cli(); wire_0; _delay_us(6); wire_1; _delay_us(7); result = (OW_PIN >> OW_P) & 1; sei(); _delay_us(90); return result; } void ow_write_byte(uint8_t data) { uint8_t i; for (i = 0; i < 8; i++) { ow_put_bit(data & 0x01); data >>= 1; } } uint8_t ow_read_byte(void) { uint8_t i, result = 0; for (i = 0; i < 8; i++) { result >>= 1; result |= ow_get_bit()<<7; } return result; } uint8_t __attribute__ ((weak, alias ("_crc_ibutton_update"))) crc, uint8_t x); 28 ow_crc(uint8_t