Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: 1-wire протокол
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Интерфейсы
Rom20
Доброго времени суток! написал программку опроса Dalles-ключа все вроде сделал как по даташиту ну все равно что то работает на половину, выложу первую часть кода может где то ошибка которую не могу увидеть, ключ затянут на порт В, МК ATmega8 PB1. Ключ включил согласно схеме через резистор на +5в

..........
//ожидание чтения Dallas-ключа
PORTB = 0;
while(1)
{
DDRB|=(1<<1); //настраиваем порт В на выход
PORTB&=~(1<<1); //генерируем сигнал Reset
_delay_us(500);
DDRB&=~(1<<1);//настраиваем порт В на вход
_delay_us(60);
ds=PINB&0x02;//считываем состояния порта В
_delay_us(30);
ds=PINB&0x02;
if(!ds) //если устройство с генерировало сигнал Presence то переходим к выполнению функции
{
UDR='p';//<<<<<<<<<<<<<<<< вот до этого места программ работает нормально выкидывает в порт 'р'

а дальше идут в порт идут одни единицы толи запрос на передачу серийного номера генерирую не правильно толи еще что



_delay_us(410);
// передача команд 33h(00110011) запрос на передачу серийного номера Dallas-ключа
DDRB|=(1<<1);
//отправка нулевого бита(1)
PORTB&=~(1<<1);
_delay_us(4);
PORTB|=(1<<1);
_delay_us(80);
//отправка первого бита(1)
PORTB&=~(1<<1);
_delay_us(4);
PORTB|=(1<<1);
_delay_us(80);
//отправка второго бита(0)
PORTB&=~(1<<1);
_delay_us(80);
//отправка третьего бита(0)
PORTB&=~(1<<1);
_delay_us(80);
//отправка четвертого бита(1)
PORTB&=~(1<<1);
_delay_us(4);
PORTB|=(1<<1);
_delay_us(80);
//отправка пятого бита(1)
PORTB&=~(1<<1);
_delay_us(4);
PORTB|=(1<<1);
_delay_us(80);
//отправка шестого бита(0)
PORTB&=~(1<<1);
_delay_us(80);
//отправка седьмого бита(0)
PORTB&=~(1<<1);
_delay_us(80);


//чтение серийного номера ключа<<<<<<<<<<<<вот этот кусок программы выполняется не правильно думаю причина кроется выше но ошибки найти не могу
for(j=0; j<=7;j++
{
for(i=7;i>=0;i--)
{
DDRB|=(1<<1);
PORTB&=~(1<<1);
_delay_us(4);
DDRB&=~(1<<1);
_delay_us(5);
key=PINB&0x02;
_delay_us(7);
key=PINB&0x02;
if(key)
{
key = 1;
_delay_us(10);
UDR=key+0x030;
_delay_us(10);
}
else
{
key = 0;
_delay_us(10);
UDR=key+0x030;
_delay_us(10);
}
_delay_us(50);
}
}
Палыч
Цитата(Rom20 @ Sep 17 2010, 16:52) *
может где то ошибка которую не могу увидеть
Когда ключ "прислоняется" к контактам, он (ключ) генерит Presence pulse. Причем делает это сам, без сигнала сброса. Вероятно, Вы этот сигнал воспринимаете как ответ на сброс, поэтому дальнейшая работа с ключом и не идёт...
Нужно слушать линию, и после того как на ней обнаружится Presence pulse (после его окончания), сформировать сигнал Reset, дождаться повторного Presence pulse, ну и т.д.
Rom20
Цитата(Палыч @ Sep 17 2010, 17:41) *
Когда ключ "прислоняется" к контактам, он (ключ) генерит Presence pulse. Причем делает это сам, без сигнала сброса. Вероятно, Вы этот сигнал воспринимаете как ответ на сброс, поэтому дальнейшая работа с ключом и не идёт...
Нужно слушать линию, и после того как на ней обнаружится Presence pulse (после его окончания), сформировать сигнал Reset, дождаться повторного Presence pulse, ну и т.д.

Попробовал как Вы рекомендуете ни чего не получилось ключ, ключ ответил сгенерировав импульс Presence дошул до места где в терминал выбрасывает символ 'p' и опять пошли одни единицы такое ощущение что он не воспринимает команду 33h хотя вроде отправля все как по дашиту
Палыч
Цитата(Rom20 @ Sep 18 2010, 16:01) *
не воспринимает команду 33h хотя вроде отправля все как по дашиту
Еще раз посмотрите DS и сравните с тем, что сделано у Вас: например, при передаче бита команды с нулевым значением линия в высокий уровень не возвращается...
Rom20
Цитата(Палыч @ Sep 18 2010, 17:24) *
Еще раз посмотрите DS и сравните с тем, что сделано у Вас: например, при передаче бита команды с нулевым значением линия в высокий уровень не возвращается...

Добавил поднятие шины в высокий логический уровень, действительно этого не хватало по правилом передачи протокола, ну все равно ключ отказыватеся выдавать свой номер1



// передача команд 33h(00110011) запрос на передачу серийного номера Dallas-ключа
DDRB|=(1<<1);
//отправка нулевого бита(1)
PORTB&=~(1<<1);
_delay_us(4);
PORTB|=(1<<1);
_delay_us(80);
//отправка первого бита(1)
PORTB&=~(1<<1);
_delay_us(4);
PORTB|=(1<<1);
_delay_us(80);
//отправка второго бита(0)
PORTB&=~(1<<1);
_delay_us(80);
PORTB|=(1<<1);
_delay_us(10);
//отправка третьего бита(0)
PORTB&=~(1<<1);
_delay_us(80);
//отправка четвертого бита(1)
PORTB&=~(1<<1);
_delay_us(6);
PORTB|=(1<<1);
_delay_us(80);
//отправка пятого бита(1)
PORTB&=~(1<<1);
_delay_us(6);
PORTB|=(1<<1);
_delay_us(80);
//отправка шестого бита(0)
PORTB&=~(1<<1);
_delay_us(80);
PORTB|=(1<<1);
_delay_us(10);
//отправка седьмого бита(0)
PORTB&=~(1<<1);
_delay_us(80);
PORTB|=(1<<1);
_delay_us(10);
Палыч
Цитата(Rom20 @ Sep 18 2010, 18:33) *
Добавил поднятие шины в высокий логический уровень
Вы - невнимательны:
Цитата(Rom20 @ Sep 18 2010, 18:33) *
//отправка третьего бита(0)
PORTB&=~(1<<1);
_delay_us(80);
//отправка четвертого бита(1)

Rom20
Цитата(Палыч @ Sep 18 2010, 19:09) *
Вы - невнимательны:

Спасибо большое! заработало, да просто кусок кода правил уже глубокой ночью вот наверное и не заметил это строчки laughing.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.