Verständnis zur Verwendung einer CRC Tabelle

OP #1061890
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
#1062168
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
#1062230
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
#1062445
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.
OP #1062784
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren