Forum: Mikrocontroller und Digitale Elektronik crc8 problem


von Steve (Gast)


Lesenswert?

Seit Stunden habe ich ein Problem mit crc8.

Initialwert: 0x00
Polynom:     0x07   /    (x^8 + x^2 + x^1 + x^0)

daten: uint8_t crc_data[5] = {0x00, 0x00, 0x34, 0x13, 0x00};

Mehrere Online-Rechner sowie die Java-Klasse, die ich mir 
heruntergeladen habe (diese arbeitet mit einer vorgegebenen Tabelle) 
bringen folgendes ergebnis:

crc8 = 34dez   bzw.  0x22


///

Ich habe nun 3 verschiedene crc8 codes hier aus dem Forum ausprobiert 
(und natürlich das polynom angepasst), es kommt aber einfach immer was 
anderes raus (197dez bzw. c5) hex.


Hier der c-code (von "avr-code" auf google code):
1
#include <inttypes.h>
2
3
#define CRC8INIT  0x00
4
#define CRC8POLY  0x07              //0X18 = X^8+X^5+X^4+X^0
5
                                    //0x07 = x^8+x^2+x^1+x^0
6
7
uint8_t crc8 ( uint8_t *data_in, uint16_t number_of_bytes_to_read )
8
{
9
  uint8_t  crc;
10
  uint16_t loop_count;
11
  uint8_t  bit_counter;
12
  uint8_t  data;
13
  uint8_t  feedback_bit;
14
  
15
  crc = CRC8INIT;
16
17
  for (loop_count = 0; loop_count != number_of_bytes_to_read; loop_count++)
18
  {
19
    data = data_in[loop_count];
20
    
21
    bit_counter = 8;
22
    do {
23
      feedback_bit = (crc ^ data) & 0x01;
24
  
25
      if ( feedback_bit == 0x01 ) {
26
        crc = crc ^ CRC8POLY;
27
      }
28
      crc = (crc >> 1) & 0x7F;
29
      if ( feedback_bit == 0x01 ) {
30
        crc = crc | 0x80;
31
      }
32
    
33
      data = data >> 1;
34
      bit_counter--;
35
    
36
    } while (bit_counter > 0);
37
  }
38
  
39
  return crc;
40
}

aufgerufen mit:
1
uint8_t crc_data[5] = {0x00, 0x00, 0x34, 0x13, 0x00};
2
crc = crc8 ( ccc,5 );


Ich verstehs wirklich garnicht... Sieht da jemand einen Fehler?

Danke!!!

von Steve (Gast)


Lesenswert?

ein fehler, da sollte stehen:

[c]
aufgerufen mit:
uint8_t crc_data[5] = {0x00, 0x00, 0x34, 0x13, 0x00};
crc = crc8 ( crc_data,5 );
[/]

von рёхэль в. ниэмэр (Gast)


Lesenswert?

Die Procedur ist deklariert als : uint8_t crc8 ( uint8_t *data_in, ..

data als pointer.  Gebraucht als

uint8_t crc_data[5] = {0x00, 0x00, 0x34, 0x13, 0x00};
crc = crc8 ( ccc,5 );

Ich wuerd's mal mit

crc = crc8 ( &ccc,5 );

probieren.

von рёхэль в. ниэмэр (Gast)


Lesenswert?

Sry. ccc ist eh falsch als parameter. Wie auch immer, mit einem 
Singlestepper haett man's auch rausgefunden.

von Steve (Gast)


Lesenswert?

ob crc_data oder &crc_data macht beim Ergebnis keinen Unterschied.

Ich meine mich auch aus einer Vorlesung drann zu erinnern, dass crc_data 
== &crc_data[0]  ist.


Habe mir innerhalb der crc routine schonmal jedes byte einzeln ausgeben 
lassen und es kommt auch der richtige Eingangswert raus.

von Steve (Gast)


Lesenswert?

Für andere hilfesuchende:

http://code.google.com/p/rayaairbot/source/browse/trunk/microcontroller/Shared/basura/Crc8.c?r=2

das teil "funktioniert"; Liefert also die gleichen Werte wie die anderen 
Implementationen.

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.