Forum: Mikrocontroller und Digitale Elektronik CRC 16 gibt nicht den geleichen Resultat auf den PC wie auf dem uC


von Kabi (Gast)


Lesenswert?

Hallo

Kann mich jemandem helfen, ich habe ein problem mit CRC-16 Berechnung.

Ich verwende den gleichen C Code auf meinem uC (Renesas H8) sowie auf 
dem PC um die CRC zu berechnen, das Problem ist, dass ich nicht den 
geleichen Resulat erhalte!

Hier mein Code:
1
//! CRC value updated by crc_update_crc16_f()
2
static uint16_t mod_crc_value = 0x1D0F;
3
4
/************************************************************************************/
5
void crc_reset_crc16_f(void)
6
{
7
  mod_crc_value = 0x1D0F;
8
}
9
10
/************************************************************************************/
11
uint16_t crc_update_crc16_f(uint8_t const data_to_add)
12
{ 
13
  mod_crc_value  = (mod_crc_value >> 8) | (mod_crc_value << 8);
14
  mod_crc_value ^= data_to_add;
15
  mod_crc_value ^= (mod_crc_value & 0xff) >> 4;
16
  mod_crc_value ^= mod_crc_value << 12;
17
  mod_crc_value ^= (mod_crc_value & 0xff) << 5;
18
19
  return (mod_crc_value);
20
}
21
22
/************************************************************************************/
23
uint16_t crc_get_crc16_f(uint8_t const data[], uint16_t nb_bytes)
24
{
25
  uint16_t bytes_counter;
26
27
  crc_reset_crc16_f();
28
  for(bytes_counter = 0; bytes_counter < nb_bytes; bytes_counter++)
29
  {
30
    crc_update_crc16_f(data[bytes_counter]);
31
  }
32
33
  return (mod_crc_value);
34
}

Ich nehme and, dass es mit big/little endian zu tun hat, aber ich finde 
die Lösung nicht.

Danke für eure Hilfe!

von Olaf (Gast)


Lesenswert?

> Ich nehme and, dass es mit big/little endian zu tun hat

Das liegt natuerlich sehr nahe.....

> aber ich finde die Lösung nicht.

Wir koennten jetzt ja alle mal raten, aber warum laeufst du nicht mal 
parallel mit dem Debugger durch beide Codes und schaust nach an welcher 
Stelle du das erstemal einen anderen Wert zurueckbekommst?

Olaf

von Kabi (Gast)


Lesenswert?

Danke für den Vorschlag!

Aber nach meiner Recherchen auf dem Internet habe in Wikipedia gesehen, 
dass die Implementation für little endian ganz anderst ist. Ich habe 
auch mit eine andere Implementierung probiert, leider ohne erfolg. Ich 
habe keine Lust/Zeit die Herstellung eine CRC16 bis ins letzt Detail zu 
anlaysieren, darucm dachte ich hätte vielleicht jemandem das Problem 
schon gehabt.

von Olaf (Gast)


Lesenswert?

>  Ich habe keine Lust/Zeit die Herstellung eine CRC16 bis ins letzt
>  Detail zu anlaysieren,

Du meinst du kannst mit deinem Problem leben und laesst alles so wie es 
ist? Im uebrigen ist es doch wohl kein Problem mal eben mit den Debugger 
durch den Code zu steppen. Oder wenn du keinen haben solltest, dir 
einfach mal den Wert der Variablen bei einem Durchlauf ausgeben zu 
lassen.
Es mag ja sein das du gerne faul bist, aber wir koennnen gut damit leben 
wenn dein CRC macht was er will. :-)

> darucm dachte ich hätte vielleicht jemandem das Problem
> schon gehabt.

Wenn du ernsthaft auf Hilfe anderer Leute hoffst dann solltest du denen 
auch alle Informationen liefern. Wenn du also ausschliessen kannst das 
es nicht an Intel/Motorola Formaten liegt dann solltest du doch 
mindestens die Definition deiner Datentypen angeben oder?

Olaf

von X- R. (x-rocka)


Lesenswert?

Kabi schrieb:
> ...
> Ich habe keine Lust/Zeit die Herstellung eine CRC16 bis ins letzt Detail
> zu anlaysieren,...

Dann solltest du es ganz lassen. Programmieren / E-Technik verlangt, 
dass man sich auch mit Details beschäftigt. Sonst kommt nix gescheites 
dabei raus.

von Kabi (Gast)


Lesenswert?

Das Problem lag nicht an der CRC-Implementierung, somit habe ich richtig 
entscheiden das ganze nicht auseinander zu nehmen!

Wie oft der Falls ist, war eine falsche Pointerreferenz die Uhrsache, 
somit funktionniert mein Sourcecode auf Systeme mit big und little 
endiant.

@ x-rocka

Ich habe mich mit die Details beschäftigt aber von CRC habe ich 
weiterhin keine Ahnung, aber es funktionniert ;-)

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.