Перейти к содержанию
    

1-wire протокол

Доброго времени суток! написал программку опроса 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);

}

}

post-40823-1284727918_thumb.png

post-40823-1284727928_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

может где то ошибка которую не могу увидеть
Когда ключ "прислоняется" к контактам, он (ключ) генерит Presence pulse. Причем делает это сам, без сигнала сброса. Вероятно, Вы этот сигнал воспринимаете как ответ на сброс, поэтому дальнейшая работа с ключом и не идёт...

Нужно слушать линию, и после того как на ней обнаружится Presence pulse (после его окончания), сформировать сигнал Reset, дождаться повторного Presence pulse, ну и т.д.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Когда ключ "прислоняется" к контактам, он (ключ) генерит Presence pulse. Причем делает это сам, без сигнала сброса. Вероятно, Вы этот сигнал воспринимаете как ответ на сброс, поэтому дальнейшая работа с ключом и не идёт...

Нужно слушать линию, и после того как на ней обнаружится Presence pulse (после его окончания), сформировать сигнал Reset, дождаться повторного Presence pulse, ну и т.д.

Попробовал как Вы рекомендуете ни чего не получилось ключ, ключ ответил сгенерировав импульс Presence дошул до места где в терминал выбрасывает символ 'p' и опять пошли одни единицы такое ощущение что он не воспринимает команду 33h хотя вроде отправля все как по дашиту

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не воспринимает команду 33h хотя вроде отправля все как по дашиту
Еще раз посмотрите DS и сравните с тем, что сделано у Вас: например, при передаче бита команды с нулевым значением линия в высокий уровень не возвращается...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще раз посмотрите 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);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добавил поднятие шины в высокий логический уровень
Вы - невнимательны:

//отправка третьего бита(0)

PORTB&=~(1<<1);

_delay_us(80);

//отправка четвертого бита(1)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы - невнимательны:

Спасибо большое! заработало, да просто кусок кода правил уже глубокой ночью вот наверное и не заметил это строчки :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...