TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: IngRandall en 01 de Septiembre de 2011, 12:10:07

Título: Como hacer el CRC del protocolo BSAP
Publicado por: IngRandall en 01 de Septiembre de 2011, 12:10:07
Hola amigos del foro, estoy intentando realizar algunas cosas del protocolo BSAP para pruebas, no se nada del protocolo, apenas empece a leerlo, pero ahora me toca hacer la comprobacion del CRC, pero no entiendo como hacerlo, ya he hecho pruebas pero ninguno me funciona, aquí esta la explicación que encontré por internet:

CRC Calculation

The CRC under the ISO standard is CRC-CCITT which uses a generator polynomial
with the (16, 12, 5, 1) terms.

CRC calculation will begin following the STX in the initiating sequence. The first DLE
in each two character DLE sequence (DLE DLE, DLE ETX) will not be included in the
CRC calculation.

The CRC calculation will terminate following the ETX in the
terminating sequence.

Lo implemente así, pero a esto le hace falta información, si alguien sabe como hacerlo y me puede ayudar, me seria de gran ayuda, muchas gracias.
Título: Re: Como hacer el CRC del protocolo BSAP
Publicado por: BrunoF en 01 de Septiembre de 2011, 12:19:52
Hola.

Hace unos años hice un hilo y expliqué bastante del tema. Hay algún problema con las fórmulas del LATEX,pero algo todavía se entiende.

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

Saludos.
Título: Re: Como hacer el CRC del protocolo BSAP
Publicado por: IngRandall en 01 de Septiembre de 2011, 16:16:25
hola BrunoF, ya había mirado tu post, pero tampoco me sirvió, ya me estoy volviendo loco he intentado hacer todas las combinaciones posibles pero nada, muchas gracias de todas maneras por la ayuda.
Título: Re: Como hacer el CRC del protocolo BSAP
Publicado por: Suky en 02 de Septiembre de 2011, 00:06:31
No tenes un ejemplo numérico como para experimentar opciones?
Título: Re: Como hacer el CRC del protocolo BSAP
Publicado por: IngRandall en 02 de Septiembre de 2011, 11:02:35
Hola suky, claro, tengo no uno si no varios ejemplos, pero en ninguno ha dado, he hecho muchas combinaciones pero no han tenido resultado, te voy a poner varios ejemplos y lo que dice un libro en español y mi código para ver si alguien puede hacer algo:

CRC: Campo para la verificación de error. Se calcula desde STX a ETX y no toma en cuenta los DLE intermedios. Utiliza el algoritmo CRC UIT-T V.41. (DLE,DLE,STX,DATOS,DLE,ETX,CRC1,CRC2)

0,10,2,1,32,8B,31,10,3,E3,F6

0,10,2,1,33,85,0,10,3,39,55

0,10,2,0,32,86,1,0,4,10,3,84,44

char CRC1, CRC2;
unsigned int CRC;
int ContBan;
unsigned int j, i, z;
short d;

        CRC1=CRC2=0;
   CRC = 65535;//;

        z = 0;d = 0;
        for (j=0; j<tamano_crc; j++){
                //d = (crc_vector[j]*256);
                CRC = CRC^crc_vector[j];//d;
                i = 0;
                for (i=0; i<8; i++){
                        z = CRC & 1;//32768;
                        if (z>0){
                                CRC = CRC >> 1;//<< 1;
                                CRC = CRC & 0x7FFF;//65534;
                                CRC = CRC ^ 0x1021;//polinomio
                        }else{
                                CRC = CRC >> 1;//<< 1;
                                CRC = CRC & 0x7FFF;//65534;
                        }
                }
        }

        //CRC
        CRC1 = CRC & 255;
        CRC  = CRC >> 8;
        CRC2 = CRC & 255;

Este metodo ha sido cambiado varias veces pero ninguna ha dado, ojala me puedan ayudar en algo.

Título: Re: Como hacer el CRC del protocolo BSAP
Publicado por: Suky en 02 de Septiembre de 2011, 13:37:09
No veo donde apliques el polinomio del CRC  :roll: Explícate que significa cada dato, cual es DLE, STX, DATOS, ETX, etc en los ejemplos numéricos. Porque dice que alguno de estos bytes no se incluyen en el calculo del CRC.


Saludos!
Título: Re: Como hacer el CRC del protocolo BSAP
Publicado por: IngRandall en 02 de Septiembre de 2011, 13:42:59
hola, el polinomio lo aplico aquí " CRC = CRC ^ 0x1021;//polinomio"

0x1021=x16+x12+x5+1

Cuales son los datos en una trama:

0,10,2,1,32,8B,31,10,3,E3,F6
DLE,DLE,STX,DATO1,DATO2,DATO3,DATO4,DLE,ETX,CRC1,CRC2

Si no me supe explicar, por favor discúlpame, gracias por la colaboración.
Título: Re: Como hacer el CRC del protocolo BSAP
Publicado por: Suky en 02 de Septiembre de 2011, 14:16:39
El polinomio está mal, seria x16+x12+x5+x

Alguna teoría para ver el calculo?
Título: Re: Como hacer el CRC del protocolo BSAP
Publicado por: BrunoF en 02 de Septiembre de 2011, 14:28:58
No creo Suky. Todos los polinomios que conozco de CRC son impares...Sino se perdería resolución(azar) en la división.

Por favor, primero encontrá el polinomio invertido correcto siguiendo mi explicación(o cualquier otra). Luego someté los datos correspondientes a un algorítmo de CRC16, y luego podríamos ver si hace falta algún valor inicial de entrada o salida para acomodar los valores.

Saludos.
Título: Re: Como hacer el CRC del protocolo BSAP
Publicado por: Suky en 02 de Septiembre de 2011, 14:36:14
Puede ser, yo lo digo por lo que puso aquí:

The CRC under the ISO standard is CRC-CCITT which uses a generator polynomial with the (16, 12, 5, 1) terms.

 :tongue:
Título: Re: Como hacer el CRC del protocolo BSAP
Publicado por: IngRandall en 02 de Septiembre de 2011, 15:21:46
Bueno, la verdad nunca lo he visto pero me parece que es algo lógico, allí en ese polinomio están mostrando los coeficientes, si el ultimo fuera 0 el final del polinomio fuera 1, tiene lógica aunque lo que dice BrunoF es cierto también, voy a hacer las pruebas y les comento a ver que paso, gracias por la ayuda.

La teoría que encontré acerca del crc es que utiliza el algoritmo CRC UIT-T V.41.

Nota: hice las pruebas pero tampoco resulto.
Título: Re: Como hacer el CRC del protocolo BSAP
Publicado por: om@r en 05 de Septiembre de 2011, 19:23:40
Hola a Todos ,solo por curiosidad  :shock: porque de crc nose nada  :shock: aplique un par de calculadoras de crc a la trama de ejemplo ,0,10,2,1,32,8B,31,10,3,E3,F6  y no arroja el crc que dice ser el correcto E3 F6 ,por el polinomio tendria que ser alguno del tipo ccitt kermit o crc16 de los que figuran para calculo en los programas :shock: pero no dan el mismo resultado ,te pego los links :shock:
Saludos!
http://www.lammertbies.nl/comm/info/crc-calculation.html
http://www.zorc.breitbandkatze.de/crc.html


 
Título: Re: Como hacer el CRC del protocolo BSAP
Publicado por: IngRandall en 06 de Septiembre de 2011, 09:32:20
hola om@r, gracias por los link, ya los tengo, con esos hago tambien mis pruebas para corroborar mis programas, con respecto a la teoria el libro divce algo pero en la realidad da otra cosa, asi q todavia estoy en la búsqueda, cuando sepa algo les avisare, gracias.
Título: Re: Como hacer el CRC del protocolo BSAP
Publicado por: IngRandall en 26 de Septiembre de 2011, 11:34:19
Hola amigos del foro, les tengo buenas noticias, ya me dio el bendito crc, bueno en realidad me lo pasaron, en la pagina www.lammertbies.nl hay una sesión de foros también, allí pregunte y un forista me respondió, me dijo algunas inconsistencias que también yo vi del mismo libro y me dijo que tipo de crc podria ser, y lo mejor de todo, me dio el código en c++ de este crc ya probado, lo pase a mi pic24 y para sorpresa mía, me funciono, ya lo probé con varias tramas y me funciona a la perfeccion, gracias a todos por ayudarme, les voy a subir el programa con el que lo probe, ojala a alguien mas le sirva.

         while(1)
        {
                unsigned int RandallEx[] = {0x00,0x33,0x87,0x01,0x00,0x04,0x03};
                unsigned int crc;

                crc = CRC16_MCRF4XX(RandallEx, 7);

                CRC1=CRC2=0;

                CRC1 = crc & 255;
                crc  = crc >> 8;
                CRC2 = crc & 255;

                U1(CRC2);//para mostrar los dos bytes por el uart 1 del pic
                U1(CRC1);
        }

        int CRC16_MCRF4XX(unsigned int *data, unsigned int len) {
        unsigned int crc = 0xFFFF;

        int i, j;
        // Note: 0x8408 is the reflection of 0x1021
        for (j=len; j>0; j--) {
        crc ^= *data++;
        for (i=0; i<8; i++) {
        if (crc & 1) crc = (crc >> 1) ^ 0x8408;
        else crc >>= 1;
            }
         }
         return (crc);
      }

si necesitan mas información no duden en preguntar.
Título: Re: Como hacer el CRC del protocolo BSAP
Publicado por: BrunoF en 26 de Septiembre de 2011, 15:20:42
Hola.

Si te fijas la implementación es identica a la mía y utiliza el polinomio revertido.

Tuviste suerte de que hicieron la tarea por vos.

Saludos.
Título: Re: Como hacer el CRC del protocolo BSAP
Publicado por: IngRandall en 26 de Septiembre de 2011, 15:32:15
Hola BrunoF, si claro, es la misma implementacion tuya y la que yo tengo  para mis distintos crc´s lo que se necesitaba era el polinomio y algunas otras cosillas que mi libro no decía, pero si gracias a Dios conseguí la respuesta.