Hola de nuevo a todos, le comento que en este momento me encuentro modificando una librería de comunicación por medio del protocolo 1-wire de dallas y otra librería para el control del termómetro DS18B20 de la misma empresa, como el código que me encontré solo podía mostrar la temperatura de uno solo de estos termómetros y nada más, me puse manos a la obra y decidí expandirla para que tuviera control absoluto sobre el DS18B20 o el DS18S20, que tienen diferente resolución.
En este momento ya he logrado hacer funciones que me lean el código ROM de 64 bits de 1 solo sensor conectado al bus, leer la temperatura de todos los que estén conectados sabiendo anteriormente su ROM de 64 bits de cada uno, y me encuentro implementando la función que va a preguntar a cada dispositivo 1-wire conectado al bus su ROM y a guardarla en memoria, solo que aquí es donde tengo el problema.
Resulta que leyendo el datasheet, menciona que para lograrlo se debe ir preguntando bit por bit y los dispositivos mandaran el bit correspondiente y luego su complemento, y hay que contestar con el valor del primero, ya logre hacer esta función, pero el problema es que solo me lee adecuadamente la ROM de un solo dispositivo, si conecto más, resulta una combinación de todos los presentes.
Alguien sabe que estoy haciendo mal a la hora de mandar un SEARCH ROM al bus y leer los bits que me mandan?, el código de la funcion es el sig:
void ds1820_search_rom()
{
int1 normal_bit,complement_bit;
int8 rom_number[8],i,j,k,l;
onewire_reset();
for(l=0;l<NUMBER_DEVICES;l++) //Realiza la función para el numero de dispositivos conectados
{
onewire_write_byte(SEARCH_ROM); //Manda el comando search rom
for(i=0;i<8;i++) // Van a ser 8 bytes
{
for(j=0;j<8;j++) // van a ser 8 bits por byte
{
normal_bit=onewire_read_bit(); //Lee el primer bit
complement_bit=onewire_read_bit(); // Lee el segundo bit (complemento del primero)
if(complement_bit==~normal_bit) //Checa que sean correctos...
{
onewire_write_bit(normal_bit); //...y envia el valor del primer bit
rom_number[i]=rom_number[i]&(1<<(j+1)); //va guardando cada bit de cada byte
}
}
}
}
}
Y otra duda respecto a lo mismo, alguien sabe por que para checar el CRC se necesita una tabla de datos TÁAAN extensa?
unsigned char dscrc_table[] = {
0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220,
35,125,159,193, 66, 28,254,160,225,191, 93, 3,128,222, 60, 98,
190,224, 2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7,
219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154,
101, 59,217,135, 4, 90,184,230,167,249, 27, 69,198,152,122, 36,
248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185,
140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139,
87, 9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53};
unsigned char page_data[32];
y la función para realizar el CRC:
//////////////////////////////////////////////////////////////////////////////
// ONE WIRE CRC
//
unsigned char ow_crc( unsigned char x)
{
dowcrc = dscrc_table[dowcrc^x];
return dowcrc;
}
/////////////////////////////////////////////////////////////////////////////////
Muchas gracias por su ayuda