реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> 1-wire протокол, не могу разобраться помогите
Rom20
сообщение Sep 17 2010, 12:52
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 10-10-08
Пользователь №: 40 823



Доброго времени суток! написал программку опроса 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);
}
}
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Палыч
сообщение Sep 17 2010, 13:41
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Rom20 @ Sep 17 2010, 16:52) *
может где то ошибка которую не могу увидеть
Когда ключ "прислоняется" к контактам, он (ключ) генерит Presence pulse. Причем делает это сам, без сигнала сброса. Вероятно, Вы этот сигнал воспринимаете как ответ на сброс, поэтому дальнейшая работа с ключом и не идёт...
Нужно слушать линию, и после того как на ней обнаружится Presence pulse (после его окончания), сформировать сигнал Reset, дождаться повторного Presence pulse, ну и т.д.
Go to the top of the page
 
+Quote Post
Rom20
сообщение Sep 18 2010, 12:01
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 10-10-08
Пользователь №: 40 823



Цитата(Палыч @ Sep 17 2010, 17:41) *
Когда ключ "прислоняется" к контактам, он (ключ) генерит Presence pulse. Причем делает это сам, без сигнала сброса. Вероятно, Вы этот сигнал воспринимаете как ответ на сброс, поэтому дальнейшая работа с ключом и не идёт...
Нужно слушать линию, и после того как на ней обнаружится Presence pulse (после его окончания), сформировать сигнал Reset, дождаться повторного Presence pulse, ну и т.д.

Попробовал как Вы рекомендуете ни чего не получилось ключ, ключ ответил сгенерировав импульс Presence дошул до места где в терминал выбрасывает символ 'p' и опять пошли одни единицы такое ощущение что он не воспринимает команду 33h хотя вроде отправля все как по дашиту
Go to the top of the page
 
+Quote Post
Палыч
сообщение Sep 18 2010, 13:24
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Rom20 @ Sep 18 2010, 16:01) *
не воспринимает команду 33h хотя вроде отправля все как по дашиту
Еще раз посмотрите DS и сравните с тем, что сделано у Вас: например, при передаче бита команды с нулевым значением линия в высокий уровень не возвращается...
Go to the top of the page
 
+Quote Post
Rom20
сообщение Sep 18 2010, 14:33
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 10-10-08
Пользователь №: 40 823



Цитата(Палыч @ 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);
Go to the top of the page
 
+Quote Post
Палыч
сообщение Sep 18 2010, 15:09
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



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

Go to the top of the page
 
+Quote Post
Rom20
сообщение Sep 19 2010, 13:10
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 10-10-08
Пользователь №: 40 823



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

Спасибо большое! заработало, да просто кусок кода правил уже глубокой ночью вот наверное и не заметил это строчки laughing.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 21:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01393 секунд с 7
ELECTRONIX ©2004-2016