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