EagleSpirit: Menar du "Search ROM"-rutinen?
Har suttit och försökt kommit på någon smart metod för att lösa det så smidigt som möjligt. Men sen insåg jag att jag troligtvis inte skulle kunna göra det bättre än koden här nedan skriven av någon "Peter Dannegger", som jag troligtvis hittade på avrfreaks.net . Koden är något modifierad för att passa till mina övriga 1-wire-rutiner.
Koden är visserligen skriven i C för AVR, men idén borde du kunna porta till Asm för PIC.
Kod: Markera allt
uint8_t ow_search_rom(uint8_t diff, uint8_t *id)
{
uint8_t i, j, next_diff;
char b;
if (ow_reset())
return 0xFF; // error, no device found
ow_write_byte(0xF0); // ROM search command
next_diff = 0x00; // unchanged on last device
i = 8 * 8; // 8 bytes
do
{
j = 8; // 8 bits
do
{
b = ow_read_bit(); // read bit
if (ow_read_bit())
{ // read complement bit
if (b) // 11
return 0xFF; // 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_write_bit(b); // write bit
*id >>= 1;
if (b) // store bit
*id |= 0x80;
i--;
}while (--j);
id++; // next byte
}while (i);
return next_diff; // to continue search
}
Kod för att anropa ow_search_rom() för varje 1-wire-enhet:
Kod: Markera allt
void search_rom()
{
uint8_t id[8], diff;
uint8_t buf[3];
int8_t i;
for (diff = 0xFF; diff != 0x00;)
{
if ((diff = ow_search_rom(diff, id)) != 0xFF)
{
for (i=7;i>=0;i--)
{
itoa(id[i], buf, 16);
if (id[i] < 0x10)
{
buf[1] = buf[0];
buf[0] = '0';
}
buf[2] = '\0';
lcd_string(buf);
}
}
}
}
Någon som har en ännu bättre lösning?