Forum: Mikrocontroller und Digitale Elektronik Ckecksum Berechnung mit Startwert


von chisna (Gast)


Lesenswert?

Hi,
ich habe eine Frage.
Und zwar geht es um die CRC Berechnung mit einem Startwert.
Weiß leider gar nicht wie ich da vorgehen soll und muss. Hoffe jemand 
kann mir da helfen. Habe auch ein Beispiel. Wäre nett und gut, wenn 
jemand das Beispiel vorrechnen könnte. Muss es echt dringend verstehen. 
Es geht um SAE-J1850 CRC8 mit folggenden Daten. Was ich nicht verstehe 
ist, wie man den Startwert mit in die Berechnung einbringt.

CRC Result with: 8 bits
Polynomial: 1Dh
Initial Value: FFh
Input Data reflected: No
Result Date reflected: No
XOR value: FFh
Check: 4Bh
Magic Check: C4h

Danke schon mal im vorraus

von Nick M. (Gast)


Lesenswert?

chisna schrieb:
> Was ich nicht verstehe
> ist, wie man den Startwert mit in die Berechnung einbringt.

Dann schau dir mal die Funktion an, die den CRC berechnet. Garantiert 
findet sich dazu ein Beispiel in C. Und dann weißt du auch, wie der 
Startwert verarbeitet wird.

von Yalu X. (yalu) (Moderator)


Lesenswert?

chisna schrieb:
> Muss es echt dringend verstehen.

Warum? Sitzt du gerade in einer Prüfung?

Wenn nicht: In Wikipedia und gefühlten 1000 weiteren Webseiten ist doch
alles (einschließlich dem Startwert) haarklein erklärt. Was konkret
verstehst du daran nicht?

von Boris (Gast)


Angehängte Dateien:

Lesenswert?

Einen guter Überblick über CRC & Co. enthält das Dokument im Anhang 
(Author: Ross N. Williams).

von Joerg (Gast)


Lesenswert?


von chisna (Gast)


Lesenswert?

Yalu X. schrieb:
> chisna schrieb:
>> Muss es echt dringend verstehen.
>
> Warum? Sitzt du gerade in einer Prüfung?
>
> Wenn nicht: In Wikipedia und gefühlten 1000 weiteren Webseiten ist doch
> alles (einschließlich dem Startwert) haarklein erklärt. Was konkret
> verstehst du daran nicht?

Ich habe mir die Seiten schon alle angeguckt so ist es  nicht. Habe die 
Berechnung mit Startwert= 0 auch verstanden. Mir fehlt das Verständnis, 
wie berechnet wird wenn der Startwert nicht gleich 0 ist sondern einen 
bestimmen Wert hat. Also wie in dem Beispiel oben. Vielleicht kann es 
jemand Handschriftlich lösen für ein besseres Verständnis. Das würde mir 
echt sehr weiterhelfen.

und nein bin in keiner Prüfung haha
Ist nur wichtig damit ich weiter komme in einem Projekt in der Uni

von Nick M. (Gast)


Lesenswert?

chisna schrieb:
> Habe die Berechnung mit Startwert= 0 auch verstanden.

Dann setz halt für 0 den Wert xFF ein, und versteh es genauso.

von Joe F. (easylife)


Lesenswert?

Hier findest du eine einfach zu verstehende Implementierung in C:
https://www.elektronik-keller.de/index.php/tipps/15-avc-lan-crc-8-j-1850/24-avc-lan-crc-8-berechnung-j1850

Den Algorithmus "von Hand" durchzurechnen kann man natürlich versuchen, 
aber ob das zum Verständnis beiträgt weiss ich ja nicht.

Ganz am Anfang in crc8() siehst du, dass der Startwert dort auf 0xFF 
gesetzt wird.

Die letzte Zeile in crc8() finde ich etwas unglücklich:
1
return (~crc)&0xFF;

verständlicher wäre:
1
return (crc ^ 0xFF);

von Boris (Gast)


Lesenswert?

> Hier findest du eine einfach zu verstehende ...

Besser ist es er versteht wie & warum der CRC funktioniert.

von A. S. (Gast)


Lesenswert?

Joe F. schrieb:
> verständlicher wäre: return (crc ^ 0xFF);

Es ist dabei verwirrend, dass 0xFF nun 3 verschiedene Bedeutungen hat:
Startwert
Int zu 8 Bit abschneiden
Invertiermaske

Just saying

von c-hater (Gast)


Lesenswert?

Joe F. schrieb:

> Die letzte Zeile in crc8() finde ich etwas unglücklich:
>
>
1
> return (~crc)&0xFF;
2
>
>
> verständlicher wäre:
>
1
> return (crc ^ 0xFF);
2
>

Verständlicher vielleicht. Aber u.U. auch schlicht falsch...

Kommt drauf an, wie im Kern der Sache genau gerechnet wird. Da gibt es 
viele Implementierungen, die zugunsten der Performance im Kern nur 
sicherstellen, das die unteren Bits korrekt sind. Dann muss am Ende 
maskiert werden und genau das ist, was deine bevorzugte Variante eben 
nicht tut, die von dir beanstandete aber schon.

von Joe F. (easylife)


Lesenswert?

c-hater schrieb:
> Dann muss am Ende
> maskiert werden und genau das ist, was deine bevorzugte Variante eben
> nicht tut, die von dir beanstandete aber schon.

Die Funktion
unsigned char crc8()
kann nur die unteren 8 Bit zurückgeben.
Daher ist das Maskieren mit 0xFF sehr unnötig.

von c-hater (Gast)


Lesenswert?

Joe F. schrieb:

> Die Funktion
> unsigned char crc8()
> kann nur die unteren 8 Bit zurückgeben.

Das ist richtig. Richtig ist aber auch: richtige Programmiersprachen 
würden meckern, wenn du einfach was wegschneidest, ohne explizit 
hinzuschreiben, dass das deine Absicht ist.

Genau deswegen, weil C solch einen Programmierer-Schmutz zuläßt, ist es 
so hassenswert.

Trügerische Sicherheit eines de facto nicht wirklich vorhandenen 
Typsystems.

Da nimmt man besser gleich Assembler.

Aber: zumindest eine klitzekleine Warnung sollten heutige C-Compiler 
doch zumindest auch werfen?

von Yalu X. (yalu) (Moderator)


Lesenswert?

c-hater schrieb:
> Aber: zumindest eine klitzekleine Warnung sollten heutige C-Compiler
> doch zumindest auch werfen?

GCC mit Option -Wconversion.

Besser wäre es aber, crc gleich mit dem richtigen Typ (nämlich uint8_t
statt unsigned long) zu deklarieren, dazu passend auch der Rückgabewert
der Funktion.

von Nick M. (Gast)


Lesenswert?

c-hater schrieb:
> Genau deswegen, weil C solch einen Programmierer-Schmutz zuläßt, ist es
> so hassenswert.

Das Problem ist eher, dass die Leute kein lint hernehmen wollen, und 
dass sie über K&R nicht rausgekommen sind.
Wenn ich unsigned char oder long int lese, dreht's mir die Zehennägel 
auf. Das heißt uint8_t und uint32_t. Sonst nix.


Nick

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.