модуль управления 1

advertisement
Федеральное агентство по образованию Российской Федерации
Федеральное государственное бюджетное образовательное
учреждение высшего профессионального образования
«Национальный исследовательский ядерный университет «МИФИ»
Кафедра «Автоматика»
ОТЧЕТ
О УЧЕБНО-ИССЛЕДОВАТЕЛЬСКОЙ РАБОТЕ
по теме «Модуль управления 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
Related documents
Download