xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxx
NEUES THEMA: Table-Driven CRC
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxx
Hallo Community,
Ich möchte eine CRC8 Tabelle generieren. Leider bin ich momentan etwas
verunsichert, ob meine Vorgehensweise korrekt ist.
1) Das angehängte Bild zeigt wie ich mir das ganze vorstelle. Ist das so
richtig?
Bei einer Bitweise(Seriell) CRC- Berechnung benutze ich als Startwert
0xFF.
Um eine CRC8- Tabelle zu generieren, nehme ich zuerst einen
Startwert(0xFF) mit einem Prüfbyte(=0), und erzeuge daraus
Bitweise(Seriell) die Prüfsumme.
Diese Prüfsumme wird in der Tabelle gespeichert, und anschließend das
Prüfbyte um eins erhöht.
Soweit so gut.
Doch jetzt wo das Prüfbyte(=1) eins beträgt,
soll es jetzt wieder mit dem Startwert(0xFF) Bitweise verknüpft werden,
Oder soll der vorherige Remainder Wert aus der ersten Polynomdivision
mit dem neuen Prüfbyte Wert(=1) verknüpft werden???
Kurzfassung:
;--------------------------------
1) Startwert(0xFF)---Bitweise EXOR--- Prüfbyte(=0)
2) Inkrement Prüfbyte(+1)
3) Startwert(0xFF)--- Bitweise EXOR ---Prüfbyte(=1)
oder
Remainder--- Bitweise EXOR ---Prüfbyte(=1) ????
4) Inkrement Prüfbyte(+1)
u.s.w.
Beide Möglichkeiten führen zu einem Ergebnis, doch welches von beiden
ist das Richtige?
Was meint Ihr?
1 | ; Routine zum generieren einer CRC8- Tabelle
|
2 | ;---------------------------------------------
|
3 | CRC_Build_main:
|
4 | ldi temp3, CRC_Init // mit CRC_Init laden = $FF, Remainder
|
5 | clr temp1 // CRC- Prüfbyte löschen
|
6 | ldi YL, Low(SRAM_START) // CRC-Tabellen Speicherort
|
7 | ldi YH, High(SRAM_START) // init
|
8 | CRC_Build_m_loop:
|
9 | mov b0, temp1 // CRC- Prüfsumme für's
|
10 | rcall CRC8_Build_Tab // Prüfbyte errechnen
|
11 | ST Y+, temp3 // CRC- Ergebnis abspeichern
|
12 | inc temp1 // Prüfbyte um 1 erhöhen
|
13 | tst temp1 // CRC- Prüfung für 2^8 Bytes
|
14 | Brne CRC_Build_m_loop // ausgeführt?
|
15 | ret // Wenn ja, dann return
|
16 | ;************************************************************
|
17 | ;* CRC8- Berechnungen
|
18 | ;* -------------------
|
19 | ;* Parameter:
|
20 | ;* 1) temp0- Bitcounter. Zählt die schiebeoperationen
|
21 | ;* 2) temp2- CRC8- Polynomregister
|
22 | ;* 3) temp3- remainder.
|
23 | ;* 4) b0 - Message Data.
|
24 | ;*
|
25 | ;************************************************************
|
26 | CRC8_Build_Tab: // Optimized for actual Application
|
27 | ; CRC8 Table generator init
|
28 | ldi temp2, Polynom // load polynom
|
29 | ldi temp0, 8 // bit counter load to 7, EXOR are one time executed
|
30 | CRC8_BT_bit_loop:
|
31 | lsl b0 // shift next data bit into carry
|
32 | rol temp3 // shift in new data bit and shift out old MSB
|
33 | Brcc CRC8_BT_no_XOR //
|
34 | eor temp3, temp2 // XOR data with poly
|
35 | CRC8_BT_no_XOR:
|
36 | dec temp0 // dec bitcounter
|
37 | brne CRC8_BT_bit_loop // branch if not zero
|
38 | ret
|
Danke im Voraus für eure Bemühungen!
Mit freundlichen Grüßen
gtf