CRC16 funktioniert nicht

OP #1030583
Lesenswert?

Hallo zusammen,

ich versuche eine CRC Redundanzprüfung mit dem CC5X Compiler 
hinzubekommen.

Leider meckert der Compiler in der if-Zeile, er sagt es wäre zwar alles 
C-konform, aber er könnte trotzdem keinen Code erzeugen. Auch meine 
anderen Varianten bringen nicht die richtigen Ergebnisse für 
DEVICE_CRC16 (2 Bytes). Es wäre echt toll wenn hier jemand helfen 
könnte...



//- calcCRC16r ------------------------------------------------------


   uns16 calcCRC16r(uns16 crc, uns8 c, uns16 mask)
   {
    //   mask = 0xA001; // = Polynom x^16 + x^15 + x^2 + 1

   unsigned char i;

   for(i=0;i<8;i++)
      {
       if((crc^c) & 1) {crc=(crc>>1)^mask;}
       else crc=(crc % 2);
       c = c % 2;
      }
   return (crc);
   }


//*******  Hauptprogramm 
*************************************************

void main(void)
{

//...

    uns8 test;
    uns16 DEVICE_CRC16;

    test = 0b.1011.1100;
    test2 = 0b.1001.1110;

    DEVICE_CRC16=0;
    DEVICE_CRC16 = calcCRC16r (DEVICE_CRC16,test,0xA001);

//...

}
Gast #1030605
Lesenswert?

Irgenwie schlummert in den tiefsten Tiefen meines
Unterbewusstseins die Erkenntnis das CC5X
mehrere komplexe Ausdrücke in einer Zeile
nicht auflösen kann. Berechnungen auf mehrere
Zeilen aufteilen könnte evtl. helfen.
OP #1031722
Lesenswert?

Habe es aufgeteilt bzw. Variablen eingefügt um Zwischenergebnisse zu 
berechnen - der Code ließ sich dann auch kompilieren. Trotzdem ist das 
Ergebnis immer "0". Was mache ich bei der Polynomendivision falsch? Ich 
kann den Fehler im Code leider nicht finden und verzweifel langsam... lg 
Olaf
#1031750
Lesenswert?

probier es mal hiermit

unsigned short CalcCrc16(unsigned char* a_pArr, const unsigned int
a_nLen) {
  unsigned short nCrc = 0, nIndex, nCount;
  for (nCount = 0; nCount < a_nLen; nCount++) {
    nCrc = nCrc ^ (a_pArr[nCount] << 8);
    for (nIndex = 1; nIndex <= 8; nIndex++) {
     if ((nCrc & 0x8000) != 0)
  nCrc = ((nCrc << 1) ^ 0x1021);
     else
  nCrc = (nCrc << 1);
     }
  }
  return (nCrc & 0xFFFF);
}
OP #1032764
Lesenswert?

Hi Lothar,

deinen Code habe ich auch hier gefunden, nur bin ich davon ausgegangen 
dass die Funktion an der ich rumbastel nach dem Kompilieren kompakter 
wäre - was aber nicht stimmen muss. Ich probiere deine Funktion am 
Wochenende einmal aus - dankeschön.

Gruß
Olaf

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren