Autor Tema: Ayuda con librería para one wire y multiples DS18B20  (Leído 7115 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado falflores

  • PIC16
  • ***
  • Mensajes: 173
    • Control, electrónica y programación en español
Ayuda con librería para one wire y multiples DS18B20
« en: 16 de Marzo de 2011, 03:42:27 »
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:

Código: [Seleccionar]
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?
Código: [Seleccionar]
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:

Código: [Seleccionar]
//////////////////////////////////////////////////////////////////////////////
// ONE WIRE CRC
//
unsigned char ow_crc( unsigned char x)
{

   dowcrc = dscrc_table[dowcrc^x];
   return dowcrc;
}

/////////////////////////////////////////////////////////////////////////////////

Muchas gracias por su ayuda


Los invito a mi blog "Control, electrónica y programación en español" www.robotnias.blogspot.com

Desconectado geneisl

  • PIC10
  • *
  • Mensajes: 1
Re: Ayuda con librería para one wire y multiples DS18B20
« Respuesta #1 en: 30 de Abril de 2011, 15:41:52 »
hola necesito urgentemente que me ayuden estoy diseñando un sensor ds18b20 y que se observe pero lo tengo q hacer ccs c y proteus y no me da ayuda
#include <16F877.h>
#fuses XT,nowdt, nolvp,noprotect
#use delay(clock=4M)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)
#define TOUCH_PIN   pin_a0
#include <lcd.c>
int16 temp;
void main (void)
{
   int8 buffer[2];
lcd_init();
   setup_adc(ADC_OFF);
   setup_adc_ports(NO_ANALOGS);

 while (TRUE)
  {
     if(touch_present())
    {

        touch_write_byte(0xCC);
        touch_write_byte (0x44);
        delay_ms(750);
        touch_present();

        touch_write_byte(0xCC);
        touch_write_byte (0xBE);
        buffer[0] = touch_read_byte();
        buffer[1] = touch_read_byte();
        printf (lcd_putc,"Tempe: %c%3.1f C\r\n", (buffer[1])?'-':' ',(float)buffer[0]/2);

       delay_ms (1000);
     }
 }
}

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ayuda con librería para one wire y multiples DS18B20
« Respuesta #2 en: 30 de Abril de 2011, 15:47:54 »
Y otra duda respecto a lo mismo, alguien sabe por que para checar el CRC se necesita una tabla de datos TÁAAN extensa?

Porque el CRC seguramente sera un CRC8, de 8 bits de longitud y estas utilizando una tabla con los valores de los CRC pre-calculados. Podrias realmente calcular el CRC desarrollando el algoritmo que lo calcule, y ahorrarias ROM.

Fijate que hace tiempo creé un hilo que explica y da algunos algoritmos a los CRC más utilizados.

hola necesito urgentemente que me ayuden estoy diseñando un sensor ds18b20 y que se observe pero lo tengo q hacer ccs c y proteus y no me da ayuda

Ojo que con el proteus he tenido problema para simularlo al sensor este. Te recomiendo que le pongas en la simulacion una pullup, pero de 1MegaOhm.


Si el problema es tambien la libreria, utiliza el buscador. Aqui hay librerias que funcionan perfectamente con ese sensor.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado ltorres

  • PIC10
  • *
  • Mensajes: 1
Re: Ayuda con librería para one wire y multiples DS18B20
« Respuesta #3 en: 31 de Julio de 2013, 14:11:44 »
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:

Código: [Seleccionar]
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?
Código: [Seleccionar]
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:

Código: [Seleccionar]
//////////////////////////////////////////////////////////////////////////////
// ONE WIRE CRC
//
unsigned char ow_crc( unsigned char x)
{

   dowcrc = dscrc_table[dowcrc^x];
   return dowcrc;
}

/////////////////////////////////////////////////////////////////////////////////

Muchas gracias por su ayuda



[Hola, pudiste resolver este inconveniente, a mi se me presento el mismo problema, gracias!]

Desconectado giorgio78

  • PIC10
  • *
  • Mensajes: 1
Re: Ayuda con librería para one wire y multiples DS18B20
« Respuesta #4 en: 14 de Marzo de 2014, 13:37:26 »
Hola a todos....
Leyendo estos topics vi que no soy el unico con problemas para desarrollar  el SEARCH-ROM en un bus que tiene por lo menos 10 ds18B20.
Yotambien logre hacer todo... pero descubrir y buscar  los ds18b20 que estsan en  el bus  no pude.
Agradezco mucho si alguno tiene un codigo que me funcione.
Yo estoy usando la DEMO-BOARD pic-web con el pic18f67j60...   mplab con c18....
Espero que alguno me pueda ayudar....
En internet hay muchos codigos pero ninguno me funciona.  Cuando pueda resolver este problema les envio mi proyecto que pone
a disposicion la temperatura de 10 DS18B20 en internet.
Gracias a todos.