Проблемы с Onewire
Добавлено: Ср апр 13, 2011 11:42:27
Здравствуйте. Мне нужно написать программу, которая могла общаться с некоторым устройством по onewire. Хочу сделать домофонный ключ-отмычку по примерам с этого сайта, но сначала думаю потренироваться на датчике DS18B20. Программирую микроконтроллер atmega8, пользуюсь WinAVR.
Вот код моей программы:
Проблема в том, что при чтении с датчика температуры идет какой-то мусор. Пожалуйста, подскажите, в чем может быть ошибка ?
Вот код моей программы:
Код: Выделить всё
#define OW_PORT PORTD
#define OW_DDR DDRD
#define OW_PIN PIND
char CheckPresence( void )
{//*send 'master reset pulse'
char tmp;
OW_DDR |= (1 << OW); //set line as output
OW_PORT &= ~(1 << OW);
_delay_us(500);
//*releas the line, and read the iButton presence pulse (low level)
OW_DDR &= ~(1 << OW); //set line as input
_delay_us(80);
tmp = OW_PIN & (1 << OW );
_delay_us(100);
if( tmp)
return 0;
else
return 1;
}
char GetBit( void )
{
char tmp;
//send 'initiate bit'
OW_DDR |= (1 << OW); //set line as output
OW_PORT &= ~(1 << OW);
_delay_us(7);
//*releas the line, and read the iButton data bit
OW_DDR &= ~(1 << OW); //set line as input (release the line)
_delay_us(5);
tmp = (OW_PIN & (1 << OW ));
_delay_us(85);
//*return the data bit value
return tmp;
}
void SendBit( char bit )
{
//*send 'initiate bit'
OW_DDR |= (1 << OW); //set line as output
OW_PORT &= ~(1 << OW);
_delay_us(10);
//*send the data bit
if( bit )
OW_DDR &= ~(1 << OW); //set line as input (release the line)
_delay_us(70);
//*release the line
OW_DDR &= ~(1 << OW); //set line as input
_delay_us(50);
}
void ReadData( char *data )
{
char tmp, i;
//send 'read ROM command'
i = 0x33;
for( tmp = 0; tmp < 8; tmp++ ){
SendBit( i & 0x01 );
i >>= 1;
}
//get Data
for( i = 0; i < 8; i++ ) { //8 байт
*data = 0; //init variable
for ( tmp = 0; tmp < 8; tmp++ ){
*data >>= 1;
*data |= GetBit();
}
data++;
}
}
Проблема в том, что при чтении с датчика температуры идет какой-то мусор. Пожалуйста, подскажите, в чем может быть ошибка ?