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
@ 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
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?
@ 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
und wie fasse ich die crc für mehrere bytes zusammen?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.