Autor Tema: CRC con polinomio 0x131 para DS18B20  (Leído 6962 veces)

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

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
CRC con polinomio 0x131 para DS18B20
« en: 14 de Diciembre de 2013, 17:22:37 »
hola.estoy buscando una rutina en ensamblador para el calculo del crc del sensor de temperatura DS18B20.
pero todo lo que encuentro esta en ccs

hay dos formas de generar los CRC.con tabla y sin tabla.con tabla es mas rapido pero ocupa mas memoria.y sin tabla es mas lento pero
ocupa menos espacio.

seria bueno tener las dos opciones.pero por el momento necesito velocidad asi que necesito la rutina con tabla.
ya hice un codigo de CRC A001 para MODBUS pero me costo mucho trabajo.

si pudiera ahorrarme el trabajo,mucho mejor.ya que el tiempo no es de lo que mas dispongo.

he encontrado un codigo en ccs que quisiera saber si alguien puede convertirlo.

Código: [Seleccionar]
Practice:
Here the table driven crc-8 we use. Not sure what the polynomial is.
First is the table:

const int8 crc8_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
} ;

To use the table:

crc = initial_Value ;
// The initial value is usually zero, but non-zero values are better.
// You can pick any byte you want, just be sure it's the same every time.

for ( each byte_Value in the message or file )
{
   crc = crc8_Table[ crc ^ byte_Value ] ;
}

// Some CRC implementations xor the final value with some other value.
crc = crc ^ xor_Value
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: CRC con polinomio 0x131 para DS18B20
« Respuesta #1 en: 15 de Diciembre de 2013, 11:23:47 »
pues la verdad es que estoy un poco pegado en C.pero creo poder entender lo que dice el codigo.corregirme si me equivoco.

en esta direccion: http://ghsi.de/CRC/index.php?Polynom=100110001&Message=0087

tenemos un generador de CRC online.introduciendo el polinomy "00110001" =0x131 y poniendo los datos 0087 el crc obtenido es 0xed.asi que realizo la practica:


en la linea crc =[crc ^ xor_value]

valor inicial de rcr=0x00

si tenemos los valores 0x00,0x87. el primer calculo seria crc=[0x00 xor 0x00] = 0X00

el valor en la tabla de la posicion 0x00= .0

en el segundo calculo                                     crc=[0x00 xor 0x87] =crc[87] que en la tabla corresponde al valor 0x0f= 15 decimal.

y esto es lo que no me cuadra.ya que el valor que da el generador es 0xed

Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: CRC con polinomio 0x131 para DS18B20
« Respuesta #2 en: 15 de Diciembre de 2013, 15:21:41 »
al final me veo haciendo el codigo a mano.y no precisamente lo de las tablas.ya que no lo entiendo.no se que relacion hay entre los numeros y
el indexado a las tablas.

he tenido que aprenderme el procedimiento de generacion del CRC.asi que lo explicare para el que le haga falta:

GENERACION DE CRC PARA POLINOMIO 0X131

generaremos el CRC de dos valores exagesimales. 0xB1 y 0xA2

                0xB1      0xA2   0x00   <-    valor inicial"0x00"

  
Código: [Seleccionar]
 principio ->      101100011010001000000000
    polinomio  0x0131   100110001
_________
    XOR                 001010010
                          101001001      ->eliminamos los ceros de la izquierda.y bajamos del principio dos cifras porque son dos ceros los eliminados
    polinomio             100110001
                          _________
                xor       001111000
                            111100000    ->eliminamos 2 ceros bajamos 2 siguienes cifras
           polinomio        100110001
                            _________
                xor         011010001
                             110100010   ->eliminamos 1 cero bajamos 1 cifra
              polinomio      100110001
                             _________
                  xor        010010011
                              100100111      ->eliminamos 1 cero bajamos 1 cifra
               polinomio      100110001
                              __________
                     xor      000010110
                                  101100000       ->eliminamos 4 ceros bajamos 4 cifras
                   polinomio      100110001
                                  _________
                       xor        001010001
                                    101000100         ->eliminamos 2 ceros bajamos 2 cifras
                      polinomio     100110001
                                    _________
                           xor      001110101
                                      111010100          ->eliminamos 2 ceros bajamos 2 cifras
                        polinomio     100110001
                                      _________
                              xor     011100101
                                       111001010           ->eliminamos 1 cero bajamos 1 cifra
                        polinomio      100110001
                                       _________
                               xor     011111011           resultado: 0xFB


esta operacion es para calcular el crc de dos bytes.pero no se como hacer para calcular una cadena mas larga.haber si lo veo.

Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: CRC con polinomio 0x131 para DS18B20
« Respuesta #3 en: 15 de Diciembre de 2013, 16:34:58 »
Grounman has visto este hilo de Brunof:

http://www.todopic.com.ar/foros/index.php?topic=25627.0;wap2

A ver si te sirve de algo.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: CRC con polinomio 0x131 para DS18B20
« Respuesta #4 en: 15 de Diciembre de 2013, 17:01:12 »
Hola groundman.

La tabla se usa como el código explica.

Asumiendo que tenés que generar el CRC de la cadena, por ejemplo: [63, 128, 254]

Teniendo la tabla sólo te resta hacer:
crc= 0
crc = crc8_Table[ crc xor 63 ] = crc8_Table[0 xor 63] = crc8_Table[63] = 255
crc = crc8_Table[ crc xor 128 ] = crc8_Table[255 xor 128] = crc8_Table[127] = 185
crc = crc8_Table[ crc xor 254 ] = crc8_Table[185 xor 254] = crc8_Table[71] = 197

Por lo tanto, el crc de la cadena [63, 128, 254] para el polinomio 0x131 sería 197. Algunos suelen hacer una XOR al final del valor resultante con 255 (u otro valor), eso tendrás que verlo en la implementación del dispositivo en cuestión.

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 groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: CRC con polinomio 0x131 para DS18B20
« Respuesta #5 en: 15 de Diciembre de 2013, 20:51:17 »

muchas gracias por el ejemplo.ya tengo medio hecha la rutina.pero necesito una trama de crc correcta para comparar valores.
la trama mas correcta que se me ocurre es la que he cogido del DS18b20 en las practicas que estoy haciendo.he cogido dos tramas del Scratchpad

el Scratchpad tiene 9bytes. el ultimo es el crc de los 7primeros bytes.almenos es lo que he entendido del datasheet.

trama1: 5C,01,1E,19,7F,FF,04,10,9E
trama2: 00,02,FF,FF,7F,FF,0C,10,D5

y esta trama de identidad 28,30,c5,b8,00,00,00,8e

pero en el generador online que puse antes.no salen los datos que debieran.no se donde esta el error.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: CRC con polinomio 0x131 para DS18B20
« Respuesta #6 en: 16 de Diciembre de 2013, 06:23:53 »
La tabla es distinta para cada polinomio.
Tienes que generar una tabla para tu polinomio para que el código funcione correctamente.

Saludos
« Última modificación: 16 de Diciembre de 2013, 06:26:58 por Picuino »

Desconectado Tisco

  • PIC16
  • ***
  • Mensajes: 108
Re: CRC con polinomio 0x131 para DS18B20
« Respuesta #7 en: 16 de Diciembre de 2013, 07:47:21 »
Si te sirve de ayuda, te pongo el código que uso para generar el CRC para ese dispositivo.
Está en C, pero te puede servir para comprobar que tus cálculos son correctos.

Código: C
  1. uint8_t OWCRC(uint8_t *data, uint8_t lengh)
  2. {
  3.     uint8_t i, j;
  4.     uint8_t aux, CRC=0;
  5.     for (i = 0; i < lengh; i ++) {
  6.         aux = data[i];
  7.         for (j=0; j<8; j++) {
  8.             if ((aux&0x01) ^ (CRC&0x01)) {
  9.                 CRC ^= 0x18;
  10.                 CRC >>= 1;
  11.                 CRC |= 0x80;
  12.             }
  13.             else CRC >>= 1;
  14.             aux >>= 1;
  15.         }
  16.     }
  17.     return CRC;
  18. }

Para usarla en C:
Código: C
  1. OWCRC(OWdata, 8);
donde OWdata hace referencia a los datos sobre los que calcular el CRC.

Espero que te sirva.

Un saludo.
« Última modificación: 16 de Diciembre de 2013, 07:53:59 por Tisco »

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: CRC con polinomio 0x131 para DS18B20
« Respuesta #8 en: 16 de Diciembre de 2013, 11:07:58 »
mirare el codigo.pero mi intencion es usar tablas porque le ahorro tiempo al pic.se supone que la tabla que he encontrado es para el polinomio 0x131
que es el que usa el DS18B20. pero ya estoy en duda.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: CRC con polinomio 0x131 para DS18B20
« Respuesta #9 en: 16 de Diciembre de 2013, 15:21:35 »
Vereis es que tengo una preguntonta  :lol: :lol:

¿Que es y para que sirve el CRC?

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: CRC con polinomio 0x131 para DS18B20
« Respuesta #10 en: 16 de Diciembre de 2013, 15:46:46 »
Bueno ya decia que era una preguntonta, ayer busque y no encontre una respuesta simple, todas eran muy complicadas, pero la wikipedia si trae una respuesta para tontos como yo  :D

http://es.wikipedia.org/wiki/Detecci%C3%B3n_y_correcci%C3%B3n_de_errores

Perdonad la interrupcion.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: CRC con polinomio 0x131 para DS18B20
« Respuesta #11 en: 16 de Diciembre de 2013, 16:47:32 »
Hmmm me parecía ya haberlo visto a esto.

Estás de suerte groundman, mirá este post: http://www.todopic.com.ar/foros/index.php?topic=23605

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 groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: CRC con polinomio 0x131 para DS18B20
« Respuesta #12 en: 16 de Diciembre de 2013, 19:04:41 »
muchas gracias a todos por la ayuda.estoy implementado lo que exponeis pero tengo algunas dudas.

en la rutina CALC_CRC8 hay una linea movlw   POLY .que aparte de que el compilador me da error en   #DEFINE POLY  0X8C

no entiendo para que es ese numero.si es que el polinomio es 0x131.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: CRC con polinomio 0x131 para DS18B20
« Respuesta #13 en: 16 de Diciembre de 2013, 19:13:07 »
Qué compilador te da error? El MPASM?

Para calcular el CRC8 mediante el método que utiliza ese algoritmo, se utiliza lo llaamdo polinomio invertido, que del polinomio 0x131 resulta ser el 0x8C.

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 groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: CRC con polinomio 0x131 para DS18B20
« Respuesta #14 en: 16 de Diciembre de 2013, 20:48:09 »
ha sido error mio.tenia un registro con el mismo nombre.
encuanto a la generacion del crc el programa que hicistes ya me funciona.

he hecho varias pruebas con diferentes codigos y no me han funcionado.pero al final he encontrado uno que si.

28
30
c5
b8
00
00
00
8e

que en tu codigo me da crc 8e. aunque por el momento el crc on line no me da esos valores.haber si mañana hago mas pruebas.o si encuentro
otra pagina para generar codigos correctos.

y si encontrara la forma de usar la tabla,mucho mejor.ya que tengo memoria suficiente en el 18F2550 pero me falta velocidad.
Montando mi primera impresora 3D (Raprep Prusa i3)