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); //... }
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.
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
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); }
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.