www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik CRC16 funktioniert nicht


Autor: Olaf Rechtner (gruser)
Datum:

Bewertung
0 lesenswert
nicht 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);

//...

}

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Olaf Rechtner (gruser)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Sammel (magic33)
Datum:

Bewertung
0 lesenswert
nicht 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);
}

Autor: eProfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Olaf Rechtner (gruser)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.