Forum: Mikrocontroller und Digitale Elektronik CRC16 per hand berechnen!


von Patrick (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich verzweifle bald daran, die CRC16 Prüfsumme per Hand zu berechnen!

Hier mal die Ausgangsdaten:
Daten: 0x01
Init: 0xFFFF
Polynom: 0x8408

Ich will einfach nur zum Test die Prüfsumme für den Beispielwert 1 
berechnen.
Wenn ich eine Schieberegister Simuliere, und es so berechne, wie das 
Schieberegister arbeitet, dann bekomme ich die richtige Prüfsumme 
heraus! (0E1E)

Wenn ich es aber normal mit Hand, per Division mit Modulo 2 versuche, 
dann scheitere ich immer erfolgreich daran! :-(
Ich weiß, es sieht so aus als hätte ich nicht fertig gerechnet. Dass 
hatte ich aber vorher schon mal so versucht und da bekam ich was 
falsches heraus!
Ich kann mir nicht erklären, was ich da anders machen muss!

Ist der Init das gleiche wie der Startwert, also muss 0xFFFF einfach vor 
das Datenbyte gehangen werden?
Muss ich an den Polynom noch was ändern?

Ich würde mich sehr freuen, wenn mir einer weiterhelfen kann!

Mfg Patrick

von Thosch (Gast)


Lesenswert?

Patrick schrieb:
> Polynom: 0x8408

> Muss ich an den Polynom noch was ändern?

denke ja.
Die höchstwertige Position x^16 ist im Polynom stets implizit enthalten.
Eine Polynomdefinition 0x8408 bedeutet also, das Polynom ist:

x^16 + x^15 + x^10 + x^3

von Thosch (Gast)


Lesenswert?

zum Rechnen mußt Du also 0x18408 als Polynom verwenden...

von Thosch (Gast)


Lesenswert?

siehe den Wikipedia-Artikel über CRC: 
http://de.wikipedia.org/wiki/Zyklische_Redundanzpr%C3%BCfung

von Patrick (Gast)


Lesenswert?

Ok, ich werde es mal mit dem Polynom versuchen!

Aber wie muss ich den Init-Wert 0xFFFF behandeln?
Stell ich das einfach vor das Datenbyte, also 0xFFFF01 und dann die 
Polynomdivision durchführen?
Ooder mach ich erst ein Polynomdivision von 0x01 durch 0xFFFF und 
erhalte 0xFFFE und mach damit dann die Polynomdivision?

Vielen Dank schonmal für die bisherige Hilfe!

Mfg Patrick

von Patrick (Gast)


Angehängte Dateien:

Lesenswert?

Guten Morgen,

ich hab es mal mit dem Polynom von Thosch probiert!

x^16 + x^15 + x^10 + x^3

Ich habe beide Varianten ausprobiert, einmal  dem Init-Wert als 
Startwert vorn dran gehangen und das zweite mal habe ich den Init wert 
vorher mit dem Datenbyte verknüpft.
Bei beiden Varianten kam ich leider nicht zum gewünschten Erfolg! :-)

Hat noch jemand eine Idee, wie es klappen könnte?

Mfg Patrick

von Christopher B. (chrimbo) Benutzerseite


Lesenswert?

Hi,

liegt es vielleicht einfach daran, dass dein Polynom falsch ist?
0x8408 -> 1000 0100 0000 1000
du hast aber
1000 1000 0001 0000 verwendet also
0x8810


gruß
Christopher

von Patrick (Gast)


Lesenswert?

Diesen Einwand versteh ich nicht so ganz!

Mein verwendetes Polynom lautet: x^16 + x^15 + x^10 + x^3

Also: 1 1000 0100 0000 1000

Und dieses habe ich auch benutzt!

Siehe auch Zitat von Thosch weiter oben:
>Die höchstwertige Position x^16 ist im Polynom stets implizit enthalten.
>Eine Polynomdefinition 0x8408 bedeutet also, das Polynom ist:

>x^16 + x^15 + x^10 + x^3

von Christopher B. (chrimbo) Benutzerseite


Lesenswert?

Also wenn ich meien CRCs berechne, dann hänge ich da nicht vorher noch 
ne Eins an...
Aber ganz oben (in deinem ersten Post), da hast du doch mit 0x8810 
gerechnet, statt mit 0x8408

von Dietrich L. (dietrichl)


Lesenswert?

Patrick schrieb:
> Mein verwendetes Polynom lautet: x^16 + x^15 + x^10 + x^3

Polynome enden nach meinem Kenntnisstand immer mit 1 (=x^0), siehe:
http://de.wikipedia.org/wiki/Zyklische_Redundanzpr%C3%BCfung#Polynome_und_Typen

Dann wäre Dein Polynom vielleicht in Wirklichkeit
   x^16 + x^15 + x^10 + x^3 + 1
und die Bitfolge
   1 1000 0100 0000 1001

Siehe hierzu auch: 
http://de.wikipedia.org/wiki/Zyklische_Redundanzpr%C3%BCfung#Beispiel

Gruß Dierich

von Patrick (Gast)


Angehängte Dateien:

Lesenswert?

Danke Dietrich für den Typ!
Ich hab es gleich mal probiert. Leider kam ich wieder nicht zum 
gewünchten Erfolg! :-)
Es muss wohl doch noch einen anderen Trick geben!

Wie oben schon mal erwähnt, bei der berechnung per Schieberegister 
klappt es einwandfrei!

CRC16 per Hand zu berechnen ist anscheinend doch nicht so leicht, wie es 
am anfang aussieht! :-)

Wenn noch jemand ne idee hat, ich würde Sie gern versuchen!

von ansel (Gast)


Lesenswert?

Patrick schrieb:
> Wenn noch jemand ne idee hat, ich würde Sie gern versuchen!

Wie schaut denn die Simulierte Schaltung einklich aus?  Nicht, dass die 
Rückkopplung per XNOR statt XOR erfolgt, oder das LSB auf der "falschen" 
Seite steht.

Christopher B. schrieb:
> Also wenn ich meien CRCs berechne, dann hänge ich da nicht vorher noch
> ne Eins an...

Wenn man 16 Bits in der Prüfsumme will, braucht man nunmal ein 
17-Bit-Polynom, da der Grad des Rests bei Division immer kleiner ist.

von Steffen (Gast)


Lesenswert?

Es gibt Zusatzmechanismen um die CRC sicherer zu machen. Auf 
http://zorc.breitbandkatze.de/crc.html kannst Du versch. Mechanismen 
ausprobieren. Wenn es dann online mit der Berechnung klappt, dann 
solltest Du auch manuell auf das gleiche Ergebnis kommen.

Grüße, Steffen

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.