Autor Tema: Calcular CRC - Tema finalizado safisfactoriamente  (Leído 9320 veces)

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

Desconectado kuauhtemok

  • PIC16
  • ***
  • Mensajes: 116
Calcular CRC - Tema finalizado safisfactoriamente
« en: 28 de Junio de 2006, 11:53:34 »
Hola amigos, tengo un problema al calcular el CRC con cualquier polinomio, lo que quisiera saber es si alguno de ustedes me puede explicar como es el proceso.

Digamos q para el siguiente ejemplo (me parece q estoy abusando demasiado pero porfavor si alguien lo sabe por favor expliqueme) tengo la cadena en HEX "0AFF" y con un polinomio CRC-16 (x^16+x^15+x^2+1) se q el resultado es "E046" en HEX.

¿Pero como es q llego a ese resultado?

Alguien me podria explicar por favor ??

se lo agradecere como no tienen idea.. muchas gracais de antemano
« Última modificación: 30 de Junio de 2006, 19:07:44 por kuauhtemok »
La felicidad no es mas q la ausencia momentanea del dolor

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Calcular CRC
« Respuesta #1 en: 28 de Junio de 2006, 14:53:37 »

Hola amigos, tengo un problema al calcular el CRC con cualquier polinomio, lo que quisiera saber es si alguno de ustedes me puede explicar como es el proceso.

Digamos q para el siguiente ejemplo (me parece q estoy abusando demasiado pero porfavor si alguien lo sabe por favor expliqueme) tengo la cadena en HEX "0AFF" y con un polinomio CRC-16 (x^16+x^15+x^2+1) se q el resultado es "E046" en HEX.

¿Pero como es q llego a ese resultado?

Alguien me podria explicar por favor ??

se lo agradecere como no tienen idea.. muchas gracais de antemano

Amigo, 'saber' como se calcula el CRC no es algo trivial, es decir, no es algo simple de explicar en 2 palabras.

Te paso un par de links que puse en otro foro en inglés, te lo paso al castellano, donde se explica (en inglés) como es el proceso.  Además te doy una página donde te muestra una rutina muy útil para codificar en microcontroladores ya que ocupan poco espacio.


Mi solución favorita para microcontroladores y pequeños sistemas

Embedded Small Table CRC16 Routines
http://www.digitalnemesis.com/info/codesamples/embeddedcrc16/


A  PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS
http://www.geocities.com/SiliconValley/Pines/8659/crc.htm


The Great CRC Mystery
http://www.ciphersbyritter.com/ARTS/CRCMYST.HTM


Una buena página para entender porqué algunos cálculos de CRC son erróneos de acuerdo a los estandars

Joe Geluso site
http://www.joegeluso.com/software/articles/ccitt.htm

Te sugiero que leas y releas el documento de Ross Williams (Painless Guide).  Yo realmente tuve que leer bastante hasta más o menos comprender como funciona pero aún así, cuando lo necesito voy y recurro a alguna función que me lo calcule y listo.

Si vas a usar el algoritmo para tu uso propio no tendrás problemas en usar la forma 'incrementada' y 'no incrementada' del algoritmo de CRC. 

Si te vas a comunicar con algún dispositivo estandar deberás tener muy en cuenta todo esto.


Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado kuauhtemok

  • PIC16
  • ***
  • Mensajes: 116
Re: Calcular CRC
« Respuesta #2 en: 28 de Junio de 2006, 16:06:11 »

Gracias maunix, acabo de leer la info y ahi vienen ejemplos paso a paso de lo q  buscaba q era lo de la division q estaba muy rara, pero ya lo estoy comprendiendo...

GRACIAS Q DIOS TE LO PAGUE CON MUCHOS HIJOS !!!!    :-/

SALUDOS !!!   :D  :-)
« Última modificación: 28 de Junio de 2006, 19:43:43 por kuauhtemok »
La felicidad no es mas q la ausencia momentanea del dolor

Desconectado gauchosuizo

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 457
Re: Calcular CRC
« Respuesta #3 en: 29 de Junio de 2006, 02:58:31 »
hola

sin dar muchas explicaciones les dejo un ejemplo de como yo calculo el CRC:

int8  const CRC_HIGHBYTE_TAB1[128] = {0x00,0xC0,0xC1,0x01,0xC3,0x03,0x02,0xC2,0xC6,0x06,0x07,0xC7,0x05,0xC5,0xC4,
                                      0x04,0xCC,0x0C,0x0D,0xCD,0x0F,0xCF,0xCE,0x0E,0x0A,0xCA,0xCB,0x0B,0xC9,0x09,
                                      0x08,0xC8,0xD8,0x18,0x19,0xD9,0x1B,0xDB,0xDA,0x1A,0x1E,0xDE,0xDF,0x1F,0xDD,
                                      0x1D,0x1C,0xDC,0x14,0xD4,0xD5,0x15,0xD7,0x17,0x16,0xD6,0xD2,0x12,0x13,0xD3,
                                      0x11,0xD1,0xD0,0x10,0xF0,0x30,0x31,0xF1,0x33,0xF3,0xF2,0x32,0x36,0xF6,0xF7,
                                      0x37,0xF5,0x35,0x34,0xF4,0x3C,0xFC,0xFD,0x3D,0xFF,0x3F,0x3E,0xFE,0xFA,0x3A,
                                      0x3B,0xFB,0x39,0xF9,0xF8,0x38,0x28,0xE8,0xE9,0x29,0xEB,0x2B,0x2A,0xEA,0xEE,
                                      0x2E,0x2F,0xEF,0x2D,0xED,0xEC,0x2C,0xE4,0x24,0x25,0xE5,0x27,0xE7,0xE6,0x26,
                                      0x22,0xE2,0xE3,0x23,0xE1,0x21,0x20,0xE0};
                                    
int8  const CRC_HIGHBYTE_TAB2[128] = {0xA0,0x60,0x61,0xA1,0x63,0xA3,0xA2,0x62,0x66,0xA6,0xA7,0x67,0xA5,0x65,0x64,
                                      0xA4,0x6C,0xAC,0xAD,0x6D,0xAF,0x6F,0x6E,0xAE,0xAA,0x6A,0x6B,0xAB,0x69,0xA9,
                                      0xA8,0x68,0x78,0xB8,0xB9,0x79,0xBB,0x7B,0x7A,0xBA,0xBE,0x7E,0x7F,0xBF,0x7D,
                                      0xBD,0xBC,0x7C,0xB4,0x74,0x75,0xB5,0x77,0xB7,0xB6,0x76,0x72,0xB2,0xB3,0x73,
                                      0xB1,0x71,0x70,0xB0,0x50,0x90,0x91,0x51,0x93,0x53,0x52,0x92,0x96,0x56,0x57,
                                      0x97,0x55,0x95,0x94,0x54,0x9C,0x5C,0x5D,0x9D,0x5F,0x9F,0x9E,0x5E,0x5A,0x9A,
                                      0x9B,0x5B,0x99,0x59,0x58,0x98,0x88,0x48,0x49,0x89,0x4B,0x8B,0x8A,0x4A,0x4E,
                                      0x8E,0x8F,0x4F,0x8D,0x4D,0x4C,0x8C,0x44,0x84,0x85,0x45,0x87,0x47,0x46,0x86,
                                      0x82,0x42,0x43,0x83,0x41,0x81,0x80,0x40};
                       

int8  const CRC_LOWBYTE_TAB1[128] = {0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,
                                     0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,
                                     0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,
                                     0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,
                                     0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,
                                     0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,
                                     0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,
                                     0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
                                     0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41};
                                       
int8  const CRC_LOWBYTE_TAB2[128] = {0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,
                                     0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,
                                     0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,
                                     0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,
                                     0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,
                                     0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,
                                     0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,
                                     0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
                                     0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40};


void CalcCrc(int8  data_str_len)
{
   int8 Index;
      int8 Cnt = 0;
      CrcLsb = 0xFF;
      CrcMsb = 0xFF;
      while (Cnt < data_str_len)
    {
       Index = CrcLsb ^ modbus.Buffer[Cnt];//Buffer[Cnt];
         if (Index < 128)
        {
           CrcLsb = CrcMsb ^ CRC_LOWBYTE_TAB1[Index];
            CrcMsb = CRC_HIGHBYTE_TAB1[Index];
        }
         else
        {
            CrcLsb = CrcMsb ^ CRC_LOWBYTE_TAB2[Index-128];
           CrcMsb = CRC_HIGHBYTE_TAB2[Index-128];
        }
         ++Cnt;
    }
}


Saludos desde Suiza

Pablo
Saludos desde Suiza, Pablo.

Desconectado kuauhtemok

  • PIC16
  • ***
  • Mensajes: 116
Re: Calcular CRC
« Respuesta #4 en: 29 de Junio de 2006, 12:17:11 »

gracias gauchosuizo, por lo q he visto tu CRC lo usas en MOdbus, cierto ?

yo quiero implementar el CRC de DNP3, pero de verdad q ya lo entendi !!!

Saludos y gracias por susu respuestas  :-/ :-/
La felicidad no es mas q la ausencia momentanea del dolor

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Calcular CRC
« Respuesta #5 en: 29 de Junio de 2006, 18:08:14 »
kuauhtemok me alegro que lo hayas entendido!!  Ahora que has leído esos documentos me habrás comprendido porqué te decía que podría estar muuucho tiempo explicandote eso en castellano,  :) :) 

Opino que el cálculo del CRC es una regla de compromiso entre velocidad y espacio en memoria de programa

Cuanto mayor es la tabla, más ocupará en el programa pero se ejecutará más velozmente

Cuanto menor es la tabla (o también se puede obviar la tabla) la ejecución será más lenta pero ocupará muy poca memoria de programa.

Uno de los ejemplos que puse me parece muy interesante porque combina lo mejor de ambas opciones al usar una tabla de tan solo 16 valores calculando el crc de a 4 bits.  El código está en C


Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado juanpavela

  • PIC10
  • *
  • Mensajes: 37
Re: Calcular CRC - Tema finalizado safisfactoriamente
« Respuesta #6 en: 29 de Agosto de 2007, 13:42:03 »
hola,
en este momento me es importante el calculo del crc debido a que lo necesito en un protocolo modbus, gauchosuizo, da un ejemplo el cual intento comprender e implementar la unica duda, que tengo es que variable es data_str_len, me parece que no entiendo bien cual es ese datos entero que hay que enviarle ala funcion, ademas los registyros del crc, quedan guardados en CrcLsb y CrcMsb, a la hora de enviarlos primero debo enviar el CrcLsb y luego el CrcMsb cierto ??

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Calcular CRC - Tema finalizado safisfactoriamente
« Respuesta #7 en: 29 de Agosto de 2007, 13:51:49 »
hola,
en este momento me es importante el calculo del crc debido a que lo necesito en un protocolo modbus, gauchosuizo, da un ejemplo el cual intento comprender e implementar la unica duda, que tengo es que variable es data_str_len, me parece que no entiendo bien cual es ese datos entero que hay que enviarle ala funcion, ademas los registyros del crc, quedan guardados en CrcLsb y CrcMsb, a la hora de enviarlos primero debo enviar el CrcLsb y luego el CrcMsb cierto ??

Si lo necesitas para el protocolo Modbus, en la documentacion del protocolo vas a encontrar cual se envia primero y cual despues.
Creo que el enlace es Pagina Modbus.Org
« Última modificación: 29 de Agosto de 2007, 14:07:11 por MGLSOFT »
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.