Forum: Mikrocontroller und Digitale Elektronik Verständnis zur Verwendung einer CRC Tabelle


von Florian P. (eckel)


Lesenswert?

Hallo hab leider keine für mich verständliche Antwort zu diesem Thema 
gefunden.
Wollte einfach wissen ob es ausreicht das datenbyte zu nehmen und 
mithilfe dessen die richtige CRC Summe aus der tabelle auszulesen?

Meinetwegen für das Datenpaket 0x05 die CRC Summe 0x3f


CRC8_TAB:       db      0x00, 0x5e, 0xbc, 0xe2, 0x61, 0x3f, 0xdd, 0x83
                db      0xc2, 0x9c, 0x7e, 0x20, 0xa3, 0xfd, 0x1f, 0x41
                db      0x9d, 0xc3, 0x21, 0x7f, 0xfc, 0xa2, 0x40, 0x1e
                db      0x5f, 0x01, 0xe3, 0xbd, 0x3e, 0x60, 0x82, 0xdc
                db      0x23, 0x7d, 0x9f, 0xc1, 0x42, 0x1c, 0xfe, 0xa0
                db      0xe1, 0xbf, 0x5d, 0x03, 0x80, 0xde, 0x3c, 0x62
                db      0xbe, 0xe0, 0x02, 0x5c, 0xdf, 0x81, 0x63, 0x3d
                db      0x7c, 0x22, 0xc0, 0x9e, 0x1d, 0x43, 0xa1, 0xff
                db      0x46, 0x18, 0xfa, 0xa4, 0x27, 0x79, 0x9b, 0xc5
                db      0x84, 0xda, 0x38, 0x66, 0xe5, 0xbb, 0x59, 0x07
                db      0xdb, 0x85, 0x67, 0x39, 0xba, 0xe4, 0x06, 0x58
                db      0x19, 0x47, 0xa5, 0xfb, 0x78, 0x26, 0xc4, 0x9a
                db      0x65, 0x3b, 0xd9, 0x87, 0x04, 0x5a, 0xb8, 0xe6
                db      0xa7, 0xf9, 0x1b, 0x45, 0xc6, 0x98, 0x7a, 0x24
                db      0xf8, 0xa6, 0x44, 0x1a, 0x99, 0xc7, 0x25, 0x7b
                db      0x3a, 0x64, 0x86, 0xd8, 0x5b, 0x05, 0xe7, 0xb9
                db      0x8c, 0xd2, 0x30, 0x6e, 0xed, 0xb3, 0x51, 0x0f
                db      0x4e, 0x10, 0xf2, 0xac, 0x2f, 0x71, 0x93, 0xcd
                db      0x11, 0x4f, 0xad, 0xf3, 0x70, 0x2e, 0xcc, 0x92
                db      0xd3, 0x8d, 0x6f, 0x31, 0xb2, 0xec, 0x0e, 0x50
                db      0xaf, 0xf1, 0x13, 0x4d, 0xce, 0x90, 0x72, 0x2c
                db      0x6d, 0x33, 0xd1, 0x8f, 0x0c, 0x52, 0xb0, 0xee
                db      0x32, 0x6c, 0x8e, 0xd0, 0x53, 0x0d, 0xef, 0xb1
                db      0xf0, 0xae, 0x4c, 0x12, 0x91, 0xcf, 0x2d, 0x73
                db      0xca, 0x94, 0x76, 0x28, 0xab, 0xf5, 0x17, 0x49
                db      0x08, 0x56, 0xb4, 0xea, 0x69, 0x37, 0xd5, 0x8b
                db      0x57, 0x09, 0xeb, 0xb5, 0x36, 0x68, 0x8a, 0xd4
                db      0x95, 0xcb, 0x29, 0x77, 0xf4, 0xaa, 0x48, 0x16
                db      0xe9, 0xb7, 0x55, 0x0b, 0x88, 0xd6, 0x34, 0x6a
                db      0x2b, 0x75, 0x97, 0xc9, 0x4a, 0x14, 0xf6, 0xa8
                db      0x74, 0x2a, 0xc8, 0x96, 0x15, 0x4b, 0xa9, 0xf7
                db      0xb6, 0xe8, 0x0a, 0x54, 0xd7, 0x89, 0x6b, 0x35

von Falk B. (falk)


Lesenswert?

@  Florian Patzer (eckel)

>Wollte einfach wissen ob es ausreicht das datenbyte zu nehmen und
>mithilfe dessen die richtige CRC Summe aus der tabelle auszulesen?

Im Prinzip ja, siehe CRC. Wobei natürlich das Ergebnis der 
vorherigen Operation in die Berechung des aktuellen Bytes einfliesst.

Sinngemäss

CRC = CRC_table[CRC]^Data.

MFG
Falk

von Florian P. (eckel)


Lesenswert?

das gilt nur wenn ich das ganze für mehrere Bytes mache.
wenn ich aber jedes byte nehme und für jedes extra ein crc dann kann ich 
es direkt aus der tabelle nehmen?

von Falk B. (falk)


Lesenswert?

@  Florian Patzer (eckel)

>das gilt nur wenn ich das ganze für mehrere Bytes mache.

Ja was denn sonst?

>wenn ich aber jedes byte nehme und für jedes extra ein crc dann kann ich
>es direkt aus der tabelle nehmen?

Das ist keine CRC, das ist schlicht Unsinn. Der Sinn einer CRC besteht 
ja darin, dass man eben über viele Byte die CRC berechnen kann und damit 
wenig zusätzliche Daten (die CRC) übertragen muss.

MFG
Falk

von Florian P. (eckel)


Lesenswert?

und wie fasse ich die crc für mehrere bytes zusammen?

von Matthias D. (marvin42)


Lesenswert?

Normalerweise ver-XOR-t man die Bytes (weil die meisten CRCs auf Basis 
eines binären Polynoms aufgebaut sind)

Ich versuche das mal zu erklären (ich verwende das für den SHT-11 Sensor 
von Sensirion):

0. man hat eine Folge Bytes zu prüfen b1, b2, b3 usw
1. man nehme eine BYTE Variable byCRC, diese hat den Startwert 0
2. nun bildet man index = b1 XOR byCRC
3. und verwendet index als Zeiger in die CRC-Tabelle
4. also ist der neue byCRC = CRC-Tabelle[index]
5. goto 2 bis alle Bytes fertig sind

es gibt durchaus Ausnahmen, wobei man dann ggf noch die Bit-Order drehen 
muss usw, das ist aber normalerweise durch den Hersteller dokumentiert.

von Florian P. (eckel)


Lesenswert?

Also im Prinzip so hier.

crc_check:
  push zh
  push zl
  eor daten,crc_byte
  add zl,daten
  brcc crc_check1
  ldi temp,1
  add zh,temp
crc_check1:
  lpm
  mov crc_byte,r0

  pop zl
  pop zh

  ldi temp,1<<crc
  eor ctrl,temp

  ret

Das ganze wird nach jedem empfangenen byte aufgerufen.
so das ich beim zweiten byte den crc des ersten ver-XOR und mit diesem 
wert den aktuellen aus der tabelle lade. kommt kein byte mehr ist das 
was im crc_byte steht mein crc.

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.