mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik CRC16 Berechnung mit Tabelle


Autor: Martin Cibulski (Gast)
Datum:
Angehängte Dateien:

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

Autor: Martin Cibulski (Gast)
Datum:

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

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.