Hallo, ich habe ein paar Routinen zum Testen von CRC16-Algorithmen geschrieben, die evtl. jemandem nützen. Ich habe jedenfalls lange erfolglos nach einer einfachen (!) vollständigen Vorlage gesucht. 1. Routine für bitweise Berechnung der CRC16 2. Erzeugen einer Tabelle für schnellere byteweise Rechnung 3. Routine für byteweise Berechnung 4. Routine für byteweise Berechnung mit 8bit-Variablen (Vorlage für ASM) 5. Anzeige der drei Ergebnisse zum Vergleich 6. Berechnung über Datenblock mit angehängter CRC, soll Null ergeben 7. Ausgabe der erzeugten Tabelle zur Verwendung in anderem Programmcode Das Programm kann über die Kommandozeile mit beliebigen 16bit-Polynomen und CRC-Startwerten aufgerufen werden. Als dritten Parameter kann man einen Text (bis fast 80 Zeichen) vorgeben, über den die Prüfsummen berechnet werden. Sonst nimmt das Programm einen Standardtext. Vielleicht kann mal jemand schauen, ob die bitweise Berechnung so stimmt, die anderen Prozeduren liefern identische Ergebnisse. Oder möchte jemand das Programm auf CRC32 erweitern ? Da kenne ich mich nicht aus. Wenn alles stimmt, kann ich das Programm in die Codesammlung legen. Gruß, Martin
Hier nun die Routine in Assembler für den ATmega16 Sie berechnet die CRC über einen Datenblock. Die Tabelle wird an einer Speicherseite ausgerichtet, dann wird der Zugriff auf die Tabelle sehr einfach und schnell. Die Berechnung braucht knapp 1µs pro Datenbyte bei 16MHz (95,8µs für 100 Bytes). ;-------------------------------------------------------- ;CRC-Berechnung mit Tabelle ; ;r18 Parameter Anzahl Bytes ;r16 Ergebis crc low ;r17 Ergebnis crc high ;r19 Tabellenindex ;xh:xl Zeiger in Datenblock ;zh:zl Zeiger in Tabelle im ROM ;-------------------------------------------------------- ; crc16: push r19 push xl push xh ldi xl ,low (twi_buffer) ;Zeiger auf Datenblock ldi xh ,high(twi_buffer) ldi r16 ,0xFF ;CRC-Startwert ldi r17 ,0xFF crc16tab_loop: ldi zh ,high(crc16tab_lo<<1) ld zl ,X+ eor zl ,r16 lpm r16 ,Z eor r16 ,r17 ldi zh ,high(crc16tab_hi << 1) lpm r17 ,Z dec r18 brne crc16tab_loop movw zh:zl ,xh:xl pop xh pop xl pop r19 ret ;Die Tabellen müssen an Speicherseiten ausgerichtet sein, ;damit eine Adressberechnung beim Tabellenzugriff entfällt. .ORG 0x80 crc16tab_lo: .db 0x00, 0xC1, 0x81, 0x40, . . . (256 Bytes) crc16tab_hi: .db 0x00, 0xC0, 0xC1, 0x01, . . . (256 Bytes)
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.