Имеется следующее - датчик DS18S20 и tiny2313
Делаю поиск устройств на шине SearchROM, находится одно устройство
64 битная последовательность возвращается следующая:
Код: Выделить всё
10001101 00000000 00001000 00000001 11011101 00001101 10110100 00000000
Делаю сброс, ReadROM и вуаля:
Код: Выделить всё
10001101 00000000 00001000 00000001 11011101 00001101 10110100 00010000
В чём может быть дело?
куски кода:
Код: Выделить всё
unsigned int SearchSensors(void)
{
uint8_t i;
uint8_t id[OW_ROMCODE_SIZE];
uint8_t diff, nSensors;
ow_reset();
nSensors = 0;
diff = OW_SEARCH_FIRST;
while ( diff != OW_LAST_DEVICE && nSensors < MAXSENSORS ) {
FindSensor( &diff, &id[0] );
if( diff == OW_PRESENCE_ERR ) {
USARTWriteString_P( "not found" NEWLINE );
break;
}
if( diff == OW_DATA_ERR ) {
USARTWriteString_P( "bus error" NEWLINE );
break;
}
for ( i=0; i < OW_ROMCODE_SIZE; i++ )
sensors_romcode[nSensors][i] = id[i];
nSensors++;
}
return nSensors;
}
Код: Выделить всё
unsigned int FindSensor( unsigned int *diff, unsigned int id[] )
{
uint8_t go;
uint8_t ret;
ret = DS18X20_OK;
go = 1;
do {
*diff = ow_rom_search( *diff, &id[0] );
if ( *diff == OW_PRESENCE_ERR || *diff == OW_DATA_ERR ||
*diff == OW_LAST_DEVICE ) {
go = 0;
ret = DS18X20_ERROR;
} else {
if ( id[0] == DS18B20_FAMILY_CODE || id[0] == DS18S20_FAMILY_CODE ||
id[0] == DS1822_FAMILY_CODE ) {
go = 0;
}
}
} while (go);
return ret;
}
Код: Выделить всё
uint8_t ow_rom_search( uint8_t diff, uint8_t *id )
{
uint8_t i, j, next_diff;
uint8_t b;
if( ow_reset() ) return OW_PRESENCE_ERR; // error, no device found
ow_byte_wr( OW_SEARCH_ROM ); // ROM search command
next_diff = OW_LAST_DEVICE; // unchanged on last device
i = OW_ROMCODE_SIZE * 8; // 8 bytes
do {
j = 8; // 8 bits
do {
b = ow_bit_io( 1 ); // read bit
if( ow_bit_io( 1 ) ) { // read complement bit
if( b ) // 11
return OW_DATA_ERR; // data error
}
else {
if( !b ) { // 00 = 2 devices
if( diff > i || ((*id & 1) && diff != i) ) {
b = 1; // now 1
next_diff = i; // next pass 0
}
}
}
ow_bit_io( b ); // write bit
*id >>= 1;
if( b ) *id |= 0x80; // store bit
i--;
} while( --j );
id++; // next byte
} while( i );
return next_diff; // to continue search
}
