Федеральное агентство по образованию Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования
«Национальный исследовательский ядерный университет «МИФИ»
Кафедра «Автоматика»
ОТЧЕТ
О УЧЕБНО-ИССЛЕДОВАТЕЛЬСКОЙ РАБОТЕ
по теме «Модуль управления 1-Wire шиной» Выполнили:
студент группы А6-02 Логинов А.В
студент группы А6-03 Савкин Е.В.
Руководитель:
Рахматулин А.Б. Москва, 2011
РЕФЕРАТ
Отчет 22 стр., 2 табл., 9 рис., 6 источников.
Ключевые слова: 1-Wire, протокол обмена, передача данных
Объектом исследования является модуль управления 1-Wire шиной
Цель работы – создание модуля управления 1-Wire шиной на примере датчика температуры
Проведена учебно-исследовательская работа.
СОДЕРЖАНИЕ
ВВЕДЕНИЕ 5
Постановка задачи и технические требования 7
7
МОДУЛЬ УПРАВЛЕНИЯ 1-WIRE ШИНОЙ 8
1. Основные принципы работы 1-Wire сети 8
2. Физическая реализация интерфейса 1-Wire 10
3. Передача данных в сети 1-Wire 11
4. Протокол обмена информацией 15
5. Электрическая схема устройства 17
6. Програмная реализация протокола обмена 19
7. Программа обработки и представления информации на LabVIEW. 20
8. Аналоги 22
ЗАКЛЮЧЕНИЕ 23
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 24
ВВЕДЕНИЕ Однопроводной интерфейс 1-Wire , разработанный в конце 90-х годов фирмой Dallas Semiconductor Corp., регламентирован разработчиками для применения в трех основных сферах-приложениях:
приборы в специальных корпусах MicroCAN для решения проблем идентификации, переноса или преобразования информации (технология iButton);
программирование встроенной памяти интегральных компонентов;
системы автоматизации (технология сетей 1-Wire-сетей).
1-Wire-net представляет собой информационную сеть, использующую одну линию данных и один возвратный (или земляной) провод для осуществления цифровой связи. Таким образом, для реализации среды обмена этой сети могут быть применены доступные кабели, содержащие неэкранированную витую пару той или иной категории, в т.ч. даже обычный телефонный провод. Такие кабели при их прокладке не требуют наличия какого-либо специального оборудования, а ограничение максимальной длины однопроводной линии регламентировано разработчиками на уровне 300м.
Основой архитектуры 1-Wire-сетей, является топология общей шины, когда каждое из устройств подключено непосредственно к единой магистрали, без каких-либо каскадных соединений или ветвлений. При этом в качестве базовой используется структура сети с одним ведущим или мастером и многочисленными ведомыми (т.н. master и slave).
Конфигурация любой 1-Wire-сети может произвольно меняться в процессе ее работы, не создавая помех дальнейшей эксплуатации и работоспособности всей системы в целом, если при этих изменениях соблюдаются основные принципы организации однопроводной шины. Эта возможность достигается благодаря присутствию в протоколе 1-Wire-интерфейса специальной команды поиска ведомых устройств (поиск ПЗУ), которая позволяет быстро определить новых участников информационного обмена. [1]
Основные преимущества 1-Wire сетей:
Не требуется дорогого оборудования для передачи данных;
Легкое изменение конфигурации сети;
Скорость до 125 Кбит / сек;
Высокая помехозащищенность;
Дальность работы до 300 метров;
Большинство датчиков поддерживают паразитное питание.
Чаще всего 1-Wire устройства недороги, наиболее распространенными примерами являются датчики температуры и ключи - "таблетки" для домофонов (т.н. iButton).
Рисунок 1. Пример использования устройства 1-Wire
Постановка задачи и технические требования В ходе учебно-исследовательской работы требовалось разработать модуль управления 1-Wire шиной. В качестве основы устройства предлагалось использовать микроконтроллер Atmega-8 с частотой 16 МГц. Питание схемы должно осуществляться от источника постоянного напряжения 5В, максимальное токопотребление 100 мА. Модуль управления должен быть выполнен в виде печатной платы с возможностью подключения переходника uart-usb.
Для модуля управления необходимо было выполнить разработку электрической схемы, чертеж печатной платы и реализацию прошивки микроконтроллера в пакете WinAVR. Результатом работы должен являться настоящий отчет по УИР.
МОДУЛЬ УПРАВЛЕНИЯ 1-WIRE ШИНОЙ 1. Основные принципы работы 1-Wire сети Сеть 1-Wire использует два или три провода для осуществления цифровой связи: линия данных, также называемая шиной, земляной провод и иногда, но не всегда, провод питания.
Каждое 1-Wire устройство имеет свой индивидуальный адрес, из чего следует, что сеть может иметь практически неограниченное адресное пространство. При этом, каждый из однопроводных приборов сразу готов к использованию в составе 1-Wire-сети, без каких-либо дополнительных аппаратно-программных модификаций. Однопроводные компоненты являются самотактируемыми полупроводниковыми устройствами, в основе обмена информацией между которыми, лежит управление изменением длительности временных интервалов импульсных сигналов в однопроводной среде и их измерение. Передача сигналов для 1-Wire-интерфейса асинхронная и полудуплексная, а вся информация, циркулирующая в сети, воспринимается абонентами либо как команды, либо как данные. Команды сети генерируются мастером и обеспечивают различные варианты поиска и адресации ведомых устройств, определяют активность на линии даже без непосредственной адресации отдельных компонентов, управляют обменом данными в сети и т.д.
Стандартная скорость работы 1-Wire-сети, которая составляет 15,4 Кбит/сек, была выбрана с учетом обеспечения максимальной надежности передачи данных на большие расстояния, также во внимание принималось быстродействие наиболее широко распространенных типов микроконтроллеров, которые в основном должны использоваться при реализации ведущих устройств однопроводной шины. Это значение скорости обмена может быть уменьшено до любого возможного значения благодаря введению принудительной задержки между передачей в линию отдельных битов данных (растягиванию временных слотов протокола). Или увеличено за счет перехода на специальный ускоренный режим обмена (скорость Overdrive - до 125Кбит/сек), который допускается для отдельных типов однопроводных компонентов на небольшой по расстоянию, качественной, не перегруженной другими приборами линии связи.
При реализации однопроводного интерфейса используются стандартные логические уровни сигналов, а питание большинства однопроводных компонентов может осуществляться от внешнего источника с рабочим напряжением в диапазоне от 2,8В до 6,0В. Альтернативой применению внешнего питания служит механизм паразитного питания, действие которого заключается в использовании каждым из ведомых компонентов 1-Wire-линии электрической энергии импульсов, передаваемых по шине данных, которая аккумулируется специальной, встроенной в прибор емкостью. Кроме того, отдельные компоненты однопроводных сетей могут использовать режим питания по шине данных, когда энергия к приемнику поступает непосредственно от мастера по линии связи, при этом обмен информацией в сети принудительно прекращается.[2]
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, который и определяет минимум внешнего сопротивления.
3. Передача данных в сети 1-Wire Основные правила передачи данных в сети 1-Wire:
Обмен всегда ведется по инициативе одного ведущего устройства, которое в большинстве случаев является микроконтроллером;
Любой обмен информацией начинается с подачи импульса сброса ("RESET Pulse") в линию 1-Wire ведущим устройством;
Для интерфейса 1-Wire в общем случае предусматривается "горячее" подключение и отключение устройств;
Любое устройство, подключенное к 1-Wire после получения питания выдает в линию DQ импульс присутствия, называемый "PRESENCE pulse". Этот же импульс устройство всегда выдает в линию, если обнаружит сигнал RESET;
Появление в шине 1-Wire импульса PRESENCE после выдачи RESET однозначно свидетельствует о наличии хотя бы одного подключенного устройства;
Обмен информации ведется так называемыми тайм-слотами: один тайм-слот служит для обмена одним битом информации;
Данные передаются побайтно, бит за битом, начиная с младшего бита. Достоверность переданных/принятых данных (проверка отсутствия искажений) гарантируется путем подсчета циклической контрольной суммы.
Перечисленные правила определяют логический низкоуровневый протокол обмена данными. На рисунке показана диаграмма сигналов RESET и PRESENCE, с которых всегда начинается любой обмен данными. Выдача импульса RESET в процессе обмена служит так же для досрочного завершения процедуры обмена информацией.
Рисунок 3. Диаграмма сигналов RESET и PRESENCE
Длительность большинства временных интервалов приблизительная и имеет только ограничение только по минимуму (не меньше указанного). Тем не менее, в настоящей реализации модуля управления используются рекомендованные длительности импульсов и времен задержки между ними.
Импульс RESET формирует ведущий МК, переводя в низкий логический уровень шину 1-Wire и удерживая ее в этом состоянии минимум 480 микросекунд. Затем МК должен "отпустить" шину. Через некоторое время, зависящее от емкости линии и сопротивления подтягивающего резистора, в линии установится высокий логический уровень. Протокол 1-Wire ограничивает время "релаксации" диапазоном от 15 до 60 микросекунд, что и является определяющим для выбора подтягивающего резистора (как правило, емкость линии не поддается изменению, а именно она оказывает существенное влияние на время возврата линии к высокому уровню).
Обнаружив импульс RESET, ведомое устройство приводит свои внутренние узлы в исходное состояние и формирует ответный импульс PRESENCE не позже 60 микросекунд после завершения импульса RESET. Для этого устройство переводит в низкий уровень линию DQ и удерживает ее в этом состоянии от 60 до 240 микросекунд. Конкретное время удержания может варьироваться, но всегда находится в указанном диапазоне. После этого устройство так же "отпускает" шину.
После завершения импульса 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", если же возвращается в вернуться в исходное состояние резистором, значит прочитана "1". Проверка идет в пределах 15 мкс после спада.
Рисунок 4. Временные диаграммы передачи данных в сети 1-Wire на примере передачи и приема двух битов
Ошибки в сети могут появиться в результате неправильной установки временных интервалов. Для исключения возникновения такой ситуации нужно все сигналы, формируемые микроконтроллером, следует формировать по принципу необходимого минимума длительности (т.е. немного больше, чем указанная минимальная длительность), а от устройства следует ожидать сигналов по принципу наихудшего (т.е. ориентироваться на самые худшие варианты временных параметров сигнала). [3][4]
4. Протокол обмена информацией Каждое устройство 1-Wire обладает уникальным идентификационным 64-битным номером, программируемым на этапе производства микросхемы. Перед установкой ведомого устройства в сеть требуется определить его номер.
Модуль управления посылает импульс RESET, принимаемый всеми устройствами, они же выдают импульс PRESENCE. Затем мастер посылает в шину команду, которую принимают все устройства. Команд определено несколько общих для всех типов 1-Wire-устройств, а так же могут быть команды, уникальные для отдельных типов. Далее следует таблица наиболее часто используемых команд.
Таблица 1. Некоторые команды 1-Wire сети
Команда
| Значение
| Описание
| SEARCH ROM
| 0xF0
| Поиск адресов - используется при универсальном алгоритме определения количества и адресов подключенных устройств
| READ ROM
| 0x33
| Чтение адреса устройства - используется для определения адреса единственного устройства на шине
| MATCH ROM
| 0x55
| Выбор адреса - используется для обращения к конкретному адресу устройства из многих подключенных
| SKIP ROM
| 0xCC
| Игнорировать адрес - используется для обращения к единственному устройству на шине, при этом адрес устройства игнорируется (можно обращаться к неизвестному устройству)
| Порядок действий ведущего и ведомого устройства можно рассмотреть на примере команды MATCH ROM. Модуль управления сетью передает один байт команды: 0x55, после чего 8 байт конкретного адреса устройства, с которым будет осуществляться последующий обмен данными. Приняв эту команду, каждое устройство сравнивает передаваемый адрес со своим собственным. Все устройства, адрес которых не совпал, прекращают анализ и выдачу сигналов в линии 1-Wire, а опознавшее адрес устройство продолжает работу. Далее все данные, передаваемые МК, обрабатываются только данным адресованным устройством. То, какие именно данные надо послать в устройство или получить от него после его адресации, зависит от конкретного устройства, например, в данной работе используется запрос чтения значения температуры из памяти термодатчика.
Уникальные адрес ведомого устройства состоит из 8 байт: одного байта идентификатора семейства, шести байт (48 бит) собственно уникального адреса и одного байта контрольной суммы всех предыдущих байтов.
Контрольная сумма (CRC) - это байт, значение которого передается последним и вычисляется по специальному алгоритму на основе значения всех семи предыдущих байтов. Алгоритм подсчета таков, что если все байты переданы-приняты без искажений, принятый байт контрольной суммы обязательно совпадет с рассчитанным в модуле управления значением. Т.е. при реализации программного алгоритма обмена информацией при передаче и приеме байтов требуется подсчитывать их контрольную сумму по строго определенному алгоритму, а сравнить расчетное значение с принятым значением CRC. Только при совпадении обоих CRC нужно считать принятые данные достоверными. В противном случае продолжение обмена невозможно. Алгоритм подсчета CRC должен быть одинаковым для ведущего и ведомого устройств, он стандартизирован и описан в документации. [5]
5. Электрическая схема устройства
Рисунок 5. Схема электрическая принципиальная
Шина данных подтянута к питанию резистором на 4.7 КОм, такое значение сопротивления обуславливается предположительно малой емкостью цепи 1-Wire сети. Напряжение питания выравнивается стабилизатором L7805 с максимальным током 100мА. Имеются три выхода: экран (в данном проекте остается незадействованным), к переходнику uart-usb и собственно 1-Wire шина.
На рисунке ниже представлен внешний вид модуля управления 1-Wire шиной с подключенными к нему переходником uart-usb и датчиком температуры ds18s20.
Рисунок 6. Внешний вид модуля управления
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;
| Возвращение результата
| }
|
|
Полный листинг программы находится в приложении А.
7. Программа обработки и представления информации на LabVIEW. В ходе разработки информационно – измерительной системы написана программа обработки и представления информации на LabVIEW, основанная на представленном разработчиками системы программирования примере.
Рисунок 7. Внешний вид программы
На рисунке можно видеть график зависимости температуры, поступающей от термодатчика в 1-Wire сети, от времени. В окне сверху отображаются данные, поступившие от модуля управления и представляющие собой значение температуры, умноженное на 1000.
Рисунок 8. Визуальное представление структуры программы
Программа на LabVIEW удобна своей универсальностью – например, ее легко можно изменить для случая нескольких датчиков. Параметры отображения данных на графике и частота получения данных (кратная 100мс) настраиваются.
8. Аналоги Существует множетсво устройств, управляющих 1-Wire шиной. Наиболее часто человек встречатется с такими устройствами в домофонах. Примером управляющего устройства, которое может найти применение в лаборатории, является переходник 1-Wire – USB : DS9490R.
Рисунок 9. Внешний вид переходника DS9490R
Преимущества:
1. USB интерфейс не требует установки специальных драйверов;
2. Поддерживает как стандартное, так и высокоскоростное (Overdrive) 1-Wire соединение;
3. Простое подключение сети с датчиками;
4. Существуют готовые компьютерные программы для обработки поступающих данных. [6]
Минусом такого устройства по сравнению с разработанным модулем управления является цена от 27$.
ЗАКЛЮЧЕНИЕ В учебно-исследовательской работе требовалось создать и исследовать модуль управления 1-Wire шиной. В результате работы был изучен протокол обмена данными 1-Wire, созданы принципиальная схема и собрано устройство модуля. Прошивка устройства была реализована и зашита в микроконтроллер. В качестве ведомого устройства был выбран термодатчик, данные с которого считываются модулем управления, обрабатываются и передаются на компьютер.
Макет модуля может быть использован в лабораторных условиях в учебных целях, но для использования в промышленных целях требуется доработка. Уменьшение размера и цены устройства может быть достигнуто использованием более дешевого микроконтроллера, например Attiny2313, также возможно изготовление печатной платы на заводе.
В будущем предполагается доработать прошивку устройства, добавив возможность работы сразу с несколькими ведомыми устройствами разных типов, а также программная реализация usb интерфейса, что позволит передавать данные на компьютер напрямую.
По результатам работы был создан настоящий отчет СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ http://www.elin.ru/1-Wire/
http://revolution.allbest.ru/programming/00061409_0.html
http://logic-bratsk.ru/radio/interface/1_wire/1_wire/1_wire.htm
http://usb-osc.narod.ru/1-wire.htm
http://www.elin.ru/1-Wire/
http://lib.chipdip.ru/302/DOC000302212.pdf
Приложение А
Исходный код прошивки микроконтроллера
Файл 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 //pin to select AD8370
#define CS_PORT PORTB //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 Файл main.c
#include
#include
#include
#include "main.h"
#include "uart.h"
#include
#include
#include
#include
#include
#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); // команда "начать измерение"
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< stdout = stdin = &uart_str;
sei();
int i;
char s[9];
while(1)
{
if( temp_x100( &i ))
printf( "%i\n\r", i );
_delay_ms(1000);
}
} Файл 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 ow_reset(void);
void ow_put_bit(uint8_t bit);
uint8_t ow_get_bit(void);
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 Файл 1w.c
#include
#include
#include
#include
#include
#include
#include "1w.h" #define ow_delay _delay_us(10) /* защитная пауза */
#define wire_0 OW_DDR |= (1< #define wire_1 OW_DDR &= ~(1< 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;
}
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"))) ow_crc(uint8_t crc, uint8_t x);
|