Forum: Mikrocontroller und Digitale Elektronik CRC16 Berechnung mit Tabelle


von Martin Cibulski (Gast)


Angehängte Dateien:

Lesenswert?

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

von Martin Cibulski (Gast)


Lesenswert?

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)

von Holger (Gast)


Lesenswert?

Moin, hat R19 irgendeine Funktion oder fehlt hier was?


Holger

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.