alfa20 0 17 сентября, 2010 Опубликовано 17 сентября, 2010 · Жалоба Доброго времени суток! написал программку опроса 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); } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 11 17 сентября, 2010 Опубликовано 17 сентября, 2010 · Жалоба может где то ошибка которую не могу увидетьКогда ключ "прислоняется" к контактам, он (ключ) генерит Presence pulse. Причем делает это сам, без сигнала сброса. Вероятно, Вы этот сигнал воспринимаете как ответ на сброс, поэтому дальнейшая работа с ключом и не идёт... Нужно слушать линию, и после того как на ней обнаружится Presence pulse (после его окончания), сформировать сигнал Reset, дождаться повторного Presence pulse, ну и т.д. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alfa20 0 18 сентября, 2010 Опубликовано 18 сентября, 2010 · Жалоба Когда ключ "прислоняется" к контактам, он (ключ) генерит Presence pulse. Причем делает это сам, без сигнала сброса. Вероятно, Вы этот сигнал воспринимаете как ответ на сброс, поэтому дальнейшая работа с ключом и не идёт... Нужно слушать линию, и после того как на ней обнаружится Presence pulse (после его окончания), сформировать сигнал Reset, дождаться повторного Presence pulse, ну и т.д. Попробовал как Вы рекомендуете ни чего не получилось ключ, ключ ответил сгенерировав импульс Presence дошул до места где в терминал выбрасывает символ 'p' и опять пошли одни единицы такое ощущение что он не воспринимает команду 33h хотя вроде отправля все как по дашиту Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 11 18 сентября, 2010 Опубликовано 18 сентября, 2010 · Жалоба не воспринимает команду 33h хотя вроде отправля все как по дашитуЕще раз посмотрите DS и сравните с тем, что сделано у Вас: например, при передаче бита команды с нулевым значением линия в высокий уровень не возвращается... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alfa20 0 18 сентября, 2010 Опубликовано 18 сентября, 2010 · Жалоба Еще раз посмотрите 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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 11 18 сентября, 2010 Опубликовано 18 сентября, 2010 · Жалоба Добавил поднятие шины в высокий логический уровеньВы - невнимательны: //отправка третьего бита(0) PORTB&=~(1<<1); _delay_us(80); //отправка четвертого бита(1) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alfa20 0 19 сентября, 2010 Опубликовано 19 сентября, 2010 · Жалоба Вы - невнимательны: Спасибо большое! заработало, да просто кусок кода правил уже глубокой ночью вот наверное и не заметил это строчки :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться