Tag an alle,
ich habe leichte Verständnisschwierigkeiten bei der Generierung meines
CRC-Wertes.
Wie ich meinen Rest der Polynomdivision auf dem Papier bilde, versteh
ich.
Mein Problem ist, dass ich die Umsetzung im µC (ich programmiere ein
8051-Derivat) nicht hinbekomme.
Ich dachte mir, dass ich erstmal einen CRC8 versuche. Dazu habe ich im
Anhang einen Beispielcode aus dem Internet.
Ich verstehe die Generierung des Rests im µC noch nicht. Vorallem, da
mein Generatorpolynom ja 9Bit hat, mein µC aber nur 8Bit Werte
verarbeiten kann.
Danke schon mal für eure Hilfe,
MC
Das 9-te Bit steckt im Carry Flag.
Nach dem Schieben:
Carry=0 fuehre keine Subtrakation (=Exor) durch. Ergebniscarry =0
Carry=1 exor mit (1)00011000
(1) exor Carry(=1) => 0, also Ergebniscarry =0
-Gast
>> aber was du versuchst, mir zu vermitteln
Es ist sinnlos ein Bit zu speichern, welches immer 0 ist
und im Endergebnis nicht benoetigt wird; Es muss da auch 0 sein,
denn ansonsten koenntest du das Polynom nochmals
"subtrahieren" (exoren).
-Hans
>; Meine 8051 X^8 + X^5 + X^4 + 1 Lieblingsroutine:
so wie ich deine Lieblingsroutine verstehe, verxorst du immer den Inhalt
des Akkus (da sind deine Daten drin, oder?) mit dem crc8 Register. Mit
dem Ergebnis holst du aus einer Tabelle dann einen Wert, der in crc8
dann reingeschrieben wird. Das soll dann bestimmt der Rest der Division
sein, oder? Dann sollte bei der ersten Durchführung crc8=0 sein, oder?
Aber was machst du, wenn im Akku führende 0en sind? Der erste Durchlauf
muss doch immer mit einer führenden 1 beginnen? Und bei der Division
werden doch 9Bit mit eingeschlossen1!???
Bitte nehmt mir meine vielen dummen Fragen nicht übel, aber ich habe die
genaue Funktionsweise noch nicht ganz geschnallt.
>so wie ich deine Lieblingsroutine verstehe, verxorst du immer den Inhalt>des Akkus (da sind deine Daten drin, oder?)
genau...
>mit dem crc8 Register. Mit>dem Ergebnis holst du aus einer Tabelle dann einen Wert, der in crc8>dann reingeschrieben wird. Das soll dann bestimmt der Rest der Division>sein, oder?
genau.
> Dann sollte bei der ersten Durchführung crc8=0 sein, oder?
Kommt auf die Spec an, bei ISO-CRC8 ist das IMHO (steht in der Spec) so.
-> nachsehen.
Zum Startwert... und jetzt etwas "anschaulicher" formuliert:
Stell Dir vor, ich lasse Dich die ("normale") Division 17/7 ausfuehren.
Kein Problem. Right? Jetzt sage ich Dir, dass vorher schon eine
Uebertragung stattgefunden hat (bsp eine 8, aber das weisst
Du nicht(!!) ;-) )....
und gebe Dir nur die Information, dass der bisherige Rest eine 1 ist.
Das ist der Startwert fuer Deine Division:
1 17 / 7 = irgendwas Rest 5 (Ueberraschung: 817/7=... Rest 5)
Bei den Startwerten <>0 (und mit Polynomen im GF(2) Koerper) wird
also vorher schon eine Datenuebertragung "_fingiert_", die einen
gewissen Rest (der der in der Spec definiert ist) hat. Nur den
(Start-)Rest muss man wissen.
Das hat Vorteile, naemlich wenn lange Folgen von 0en am
Uebetragungsbeginn sind (s.u.).
>Aber was machst du, wenn im Akku führende 0en sind? Der erste Durchlauf>muss doch immer mit einer führenden 1 beginnen?
Nein. Aber waere sinnvoll :-)
Begruendung siehe oben.
>Und bei der Division>werden doch 9Bit mit eingeschlossen1!???
Im Algorithmus ja. Das 9te Bit des Divisionsschrittes ist immer Null.
>Bitte nehmt mir meine vielen dummen Fragen nicht übel, aber ich>habe die genaue Funktionsweise noch nicht ganz geschnallt.
Es gibt keine dummen Fragen, nur dumme Antworten ;-)
Fuer die Herleitung der Tabellenversion ist u.U.
http://www.geocities.com/SiliconValley/Pines/8659/crc.htm
sinnvoll.
Zum kommandozeilenbasierten Spielen & Generieren der CRC Tabellen
(Parameter: Startwerte, Schieberichtungen, Iterativ/Tabelle,
Standard-CRCs)
http://www.tty1.net/pycrc/
(viele der Java/Javascript/...-CRC Webseiten sind kaputt...)
-Hans
PS: Willst Du verraten, fuer welche Anwendung Du den
ISO-CRC-8 einsetzen willst, ggf. waere da eine Tabellenversion
Overkill...
Vielen Dank für die Links. So langsam versteh ich, was der Algorythmus
macht!!!
>PS: Willst Du verraten, fuer welche Anwendung Du den>ISO-CRC-8 einsetzen willst, ggf. waere da eine Tabellenversion>Overkill...
Ich möchte mein Haus etwas automatisieren. Dazu habe ich mir ein
Multi-Master System ausgedacht. Läuft soweit auch alles super, mit
ausnahme der Netzwerkkommunikation. Dafür möchte ich jetzt ein richtiges
Protokoll aufsetzen (momentan schicke ich die Informationen einfach so
über die Leitungen). Auch eine Kollisionsvermeidung ähnlich wie beim
CAN-Bus wird mit eingebunden.
Mein µC hat 12k internen Flash und kann auf bis zu 64k erweitert werden.
Davon nutze ich im moment etwas mehr als 1k. Ein Speicher-Overkill ist
also ausgeschlossen.