Forum: Mikrocontroller und Digitale Elektronik C - Anfängerfrage


von Sonya W. (Gast)


Lesenswert?

Einen wunderschönen guten Abend,
1
uint8_t crc8 ( uint8_t inCrc , uint8_t inData )      
2
{
3
  uint8_t   i;
4
  uint8_t   data;
5
6
  data = inCrc ^ inData;
7
8
  for ( i = 0; i < 8; i++ )
9
  {
10
    if (( data & 0x80 ) != 0 )
11
    {
12
      data <<= 1;
13
      data ^= 0x07;
14
    }
15
    else
16
    {
17
      data <<= 1;
18
    }
19
  }
20
  return data;
21
}
22
23
24
void buildCmd( uint8_t addr , uint32_t cmd , bool crcEn )    
25
{
26
  uint8_t frameLow  []  = { 0xFF , addr    , ( cmd & 0x000000FF ) , ( ( cmd & 0x0000FF00) >> 8 ) , 0x00 };
27
  uint8_t frameHigh  []  = { 0xFF , addr + 1 , ( ( cmd & 0x00FF0000 ) >> 16 ) , ( ( cmd & 0xFF000000) >> 24 ) , 0x00 };
28
  
29
  uint8_t x = 0;
30
  uint8_t result = 0;
31
  
32
  for ( x = 0 ; x < ( 4 + crcEn ) ; x++ )
33
  {
34
    result = crc8( frameLow[4] , frameLow[x] );
35
  }
36
  frameLow[4] = result;
37
  cmdOut( frameLow , ( 4 + crcEn ) );
38
  
39
  
40
  for ( x = 0 ; x < ( 4 + crcEn ) ; x++ )
41
  {
42
    result = crc8( frameHigh[4] , frameHigh[x] );
43
  }
44
  frameHigh[4] = result;
45
  cmdOut( frameHigh , ( 4 + crcEn ) );
46
}


Wieso klappt die Übergabe hier nicht? Kann es was damit zu tun haben das 
es das gleiche Array ist? Bekomme jedesmal "0" raus beim CRC
1
result = crc8( frameLow[4] , frameLow[x] );

Danke schon mal für die nette Erklärung (:

von Jim M. (turboj)


Lesenswert?

Was tut denn die Anweisung
1
data <<= 1;

Deiner Meinung nach?

Das ist ein Linksshift, nach 8x shiften ist ein Byte leer...

von Sonya W. (Gast)


Lesenswert?

Jim M. schrieb:
> Was tut denn die Anweisung
> data <<= 1;
>
> Deiner Meinung nach?
>
> Das ist ein Linksshift, nach 8x shiften ist ein Byte leer...

Das hat doch nichts mit der Übergabe zu tun?

von Felix (Gast)


Lesenswert?

Du hast zweimal dieses Konstrukt:

for ( x = 0 ; x < ( 4 + crcEn ) ; x++ )
  {
    result = crc8( frameLow[4] , frameLow[x] );
  }

result ist kein Array, daher scheint diese Schleife völlig sinnlos.
Steht die Funktion crc8 noch im .lss-File oder wurde die wegoptimiert?

von Sonya W. (Gast)


Lesenswert?

Felix schrieb:
> Du hast zweimal dieses Konstrukt:
>
> for ( x = 0 ; x < ( 4 + crcEn ) ; x++ )
>   {
>     result = crc8( frameLow[4] , frameLow[x] );
>   }
>
> result ist kein Array, daher scheint diese Schleife völlig sinnlos.
> Steht die Funktion crc8 noch im .lss-File oder wurde die wegoptimiert?

Das passt schon alles.
Wenn ich jetzt anstatt den oben erwähten Code nehmen..
1
> for ( x = 0 ; x < ( 4 + crcEn ) ; x++ )
2
>   {
3
>     frameLow[4] = crc8( frameLow[4] , frameLow[x] );
4
>   }

Kommt immer nur "0" raus.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Sonya W. schrieb:
> Wieso klappt die Übergabe hier nicht? Kann es was damit zu tun haben das
> es das gleiche Array ist? Bekomme jedesmal "0" raus beim CRC

Ich nicht.

Damit ich das Programm überhaupt übersetzen konnte, habe ich die Aufrufe 
von cmdOut() auskommentiert, da diese Funktion von Dir nicht angegeben 
wurde. Anschließend habe ich unter jedem Aufruf von crc8() per printf() 
den Wert von result ausgeben lassen.

Ausserdem noch folgende includes hinzugefügt:
1
#include <stdio.h>
2
#include <stdint.h>
3
#include <stdbool.h>

Dann noch main() hinzugefügt:
1
int main ()
2
{
3
    buildCmd (10, 330, 1);
4
    return 0;
5
}

Nach Ausführen wird das folgende ausgegeben:
1
243
2
54
3
241
4
7
5
0
6
243
7
49
8
0
9
0
10
0

Von "jedesmal 0" kann also keine Rede sein.

Bitte gib ein vollständig kompilierbares Programm an, mit dem man das 
nachvollziehen kann. Bruchstücke helfen hier offenbar nicht.

von Sonya W. (Gast)


Lesenswert?

> Nach Ausführen wird das folgende ausgegeben:243
> 54
> 241
> 7
> 0
> 243
> 49
> 0
> 0
> 0
>
> Von "jedesmal 0" kann also keine Rede sein.

Mein Fehler.
framex[4], dort sollte die CRC drin stehen. Das tut sie aber nicht wie 
man sieht..

von void (Gast)


Lesenswert?

Sonya W. schrieb:
> Kommt immer nur "0" raus.

Die crc8 Funktion erwartet als Eingangs-Parameter inCrc, das Ergebnis 
der crc8 von der vorhergehenden Stelle. Sonst rechnest du jedes mal von 
vorne...
1
  result = frameLow[4];
2
  for ( x = 0 ; x < ( 4 + crcEn ) ; x++ )
3
  {
4
    result = crc8( result , frameLow[x] );
5
  }

von MaWin (Gast)


Lesenswert?

Sonya W. schrieb:
> Bekomme jedesmal "0" raus beim CRC

Natürlich.
Die crc8 Funktion will ihr letztes Ergebnis erneut verwursten, also
1
result=crc8(result,frameLow[x]);
Nur beim ersten Aufruf wird frameLow[4] verwendet.

von Stromverdichter (Gast)


Lesenswert?

Hallo Sonya,

da hast du ja einen super kommentierten Code gebastelt. Da erkennt man 
sofort, was er machen soll.

Sonya W. schrieb:
> Kommt immer nur "0" raus.

Vielleicht schiebst du ja immer 0 rein?

Was steht den vor Ausführung genau in framelow[]?
Hast du keinen Debugger?
Geh doch die Ausführung schrittweise durch.

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.