Установка низкого уровня в 1-wire микроконтроллером

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
XDN
Родился
Сообщения: 6
Зарегистрирован: Сб дек 23, 2006 20:11:46

Установка низкого уровня в 1-wire микроконтроллером

Сообщение XDN »

Доброго времени суток, товарищи РадиоКотовцы!
Довелось мне поработать с шиной 1-wire. Всё бы ничего, штука занятная, но застрял в необычно простой ситуации: не могу понять, при помощи чего выставляется низкий уровень в шине.

Если не ошибаюсь, в продуктах DALLAS этим занимается MOSFET, который "стягивает", когда нужно, линию в low. Но за счёт чего просадка реализуется в том же AVR (для пример, AppNote AVR318) одной ножкой? На схеме I/O из даташита не видно ничего, за счёт чего можно было бы "заземлиться".
Понимаю, что думаю куда-то не в ту сторону. :) Укажите, пожалуйста, правильное направление.
Реклама
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Re: Установка низкого уровня в 1-wire микроконтроллером

Сообщение smac »

XDN писал(а):Доброго времени суток, товарищи РадиоКотовцы!
Довелось мне поработать с шиной 1-wire. Всё бы ничего, штука занятная, но застрял в необычно простой ситуации: не могу понять, при помощи чего выставляется низкий уровень в шине.

Если не ошибаюсь, в продуктах DALLAS этим занимается MOSFET, который "стягивает", когда нужно, линию в low. Но за счёт чего просадка реализуется в том же AVR (для пример, AppNote AVR318) одной ножкой? На схеме I/O из даташита не видно ничего, за счёт чего можно было бы "заземлиться".
Понимаю, что думаю куда-то не в ту сторону. :) Укажите, пожалуйста, правильное направление.
В составе порта АВР тоже есть МДП транзисторы, один из которых может подтягивать вывод порта к земле, другой к плюсу питания - это если соответствующая линия порта настроена на вывод.
Как я понимаю для реализации 1 W с помощью линий порта возможны два случая.
1. Если в качестве подтягивающего (к плюсу) резистора используется встроенный подтягивающий резистор МК.
В этом случае для "стягивания" линии в 0 PORTn.x нужно записать 0, а в DDRn.х нужно записать 1, в результате линия порта будет настроена как выход (DDRn.х=1), а ее значение определится содержимым PORTn.x (0).
Если нужно отпустить шину, то в DDRn.х нужно записать 0, а в PORTn.x нужно записать 1, что настроит линию порта как вход (DDRn.х=0) и подключит подтягивающий резистор (PORTn.x =1) к ней.
2. Если используется внешний подтягивающий резистор, то тут все проще - в данном случае в PORTn.x нужно записать 0 и не трогать бит до конца работы с 1-W. Управление ведется с помощью DDRn.х
Если нужно "притянуть" шину к 0, то в DDRn.х записываем 1, т. о. линия порта настраивается на выход, а поскольку в PORTn.x 0, то она "притягивается" к 0.
Если нужно отпустить шину, то, как все уже догадались, нужно в DDRn.х записать 0, т. о. линия порта настраивается на вход, а поскольку в PORTn.x 0, то внутренний подтягивающий резистор отключен и линия переходит в высокоимпедансное состояние. К плюсу ее подтягивает внешний резистор.
Вобщем вроде бы так.
Прием соответсвенно ведется чтением PINn.x
Реклама
XDN
Родился
Сообщения: 6
Зарегистрирован: Сб дек 23, 2006 20:11:46

Сообщение XDN »

Вариант 1, к сожалению, не походит из-за номинала встроенного Pull-up.
В варианте 2 не совсем понятно состояние "выход-0": где на схеме (она ниже) элемент, который стягивает к 0? Один такой MOSFET есть, но он, если не ошибаюсь, замыкает на 0 только в режиме SLEEP.
Вложения
ATmega8-DIO.png
(34.47 КБ) 505 скачиваний
Аватара пользователя
biDE
Встал на лапы
Сообщения: 84
Зарегистрирован: Пн ноя 12, 2007 20:53:05
Откуда: Одесса

Сообщение biDE »

Действительно внутренняя подтяжка для 1-wire слабовата, лучше вариант 2.
Вложения
ATmega8-DIO_.png
структура вывода с комментариями
(43.38 КБ) 447 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

XDN писал(а):Вариант 1, к сожалению, не походит из-за номинала встроенного Pull-up.
В варианте 2 не совсем понятно состояние "выход-0": где на схеме (она ниже) элемент, который стягивает к 0? Один такой MOSFET есть, но он, если не ошибаюсь, замыкает на 0 только в режиме SLEEP.
На этой схеме транзисторы явно не показаны, и признаюсь, я несколько опрометчиво заявил что они МДП (возможно на самом деле это и не так), но в любом случае эти транзисторы входят в состав порта, на схеме они должны крыться за треугольником, к верхней наклонной грани которого идет линия от выхода Q тригера DDxn. О том что они есть можно судить по тОковым характеристикам выходов (см параметр IoL) т. е. атмел заявляет, что нагрузочная способность выхода, как в состоянии лог 1, так и в состоянии лог. 0 составляет 40 ма (максимум).

З. Ы. Пока сочинял пост меня уже опередили :)
Реклама
Аватара пользователя
MOHOXPOM
Встал на лапы
Сообщения: 108
Зарегистрирован: Вт мар 18, 2008 08:25:31
Откуда: Красноярск
Контактная информация:

Еще ответик

Сообщение MOHOXPOM »

Можно еще вот так (кусок моего кода с макросами):

#define _SetBit(port,bit) (port=port|(1<<bit))
#define _ClrBit(port,bit) (port^=(port&(1<<bit)))
#define _InvBit(port,bit) (port=port^(1<<bit))
#define SetBit(x) _SetBit(x)
#define ClrBit(x) _ClrBit(x)
#define InvBit(x) _InvBit(x)



Это функци сброса устройства на 1-wire

ClrBit(DeviceQ_PORT); NOP;
SetBit(DeviceQ_DDR); NOP; //на ноге 0
_delay_us(120); // задержка 480us
_delay_us(120);
_delay_us(120);
_delay_us(120);
ClrBit(DeviceQ_DDR); NOP; // для зарядки аккумулятора устройства на порту (нога подтянута через 4.7 ком к +)
_delay_us(66);

if ((PINF&(1<<7))==0) _1_WIRE_ERROR = 0x00; // если на ноге низкий уровень на линии есть устройство

_delay_us(105); // ждем окончания временного промежутка (420us)
_delay_us(105);
_delay_us(105);
_delay_us(105);

if ((PINF&(1<<7))==0) _1_WIRE_ERROR = 0x02; // err нет устройства на шине
:)
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»