Forum: Mikrocontroller und Digitale Elektronik CRC16 funktioniert nicht


von Olaf R. (gruser)


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);

//...

}

von holger (Gast)


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.

von Olaf R. (gruser)


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

von Lothar S. (magic33)


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);
}

von eProfi (Gast)


Lesenswert?

zu CRC gibt es hier im Forum 112 Treffer. Schon alle durchgelesen?

Ich finde, viele machen es sich viel zu kompliziert und umständlich.
Hier meine einzeiligen Vorschläge:
Beitrag "Re: Ideen um CRC-Routine zu beschleunigen? (AVR, gcc)"
Beitrag "Re: Ideen um CRC-Routine zu beschleunigen? (AVR, gcc)"

Lösungen mit Tabellen sind auch recht brauchbar und schnell.

von Olaf R. (gruser)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.