Forum: Mikrocontroller und Digitale Elektronik SDCC, shift ändert Daten?


von Martin (Gast)


Lesenswert?

Hallo!

Ich habe in einem C-Programm einen komischen Fehler und wüsste gerne ob 
jemand eine Idee hat wo er her rührt.
In meinem Code gebe ich die Daten eines empfangen Arrays aus. Da die 
Daten 16 bit Werte sind muss ich sie vor der Ausgabe zusammenrechen. 
Zwecks debugging habe ich jetzt auch einmal 8 bit Werte übertragen die 
ich mir extra Ausgeben lassen wollte (payload[0] und payload[1]).
Dabei hab ich gemerkt dass die Werte vor der Schleife korrekt ausgegeben 
werden danach aber nicht mehr.
1
    printf_fast_f("DEBUG:%d,%d",payload[0],payload[1]);
2
3
    for (i = 0; i < 27; i++)//for (i = 0; i < SIZE_PAYLOAD; i++)
4
    {
5
6
      sensor_data[i / 2] = (int16_t) ((payload[i] << 8) & 0xff00)
7
          | (0x00ff & (payload[i + 1]));
8
      printf_fast_f("%d,", sensor_data[i / 2]);
9
10
11
      i++;
12
13
    }
14
    printf_fast_f("DEBUG:%d,%d",payload[0],payload[1]);
15
    printf_fast_f("\r\n");

Ausgabe:
1
DEBUG:170,0-22016,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,DEBUG:255,255
Hier sieht man das am Anfang 170 und 0 steht am Ende für die selben 
Werte aber 255 und 255. Mir ist leider nicht ganz klar wodurch dass 
entsteht? Durch die Typumwandlung oder das Shiften? Eigentlich werden 
die Daten ja nur gelesen und nie aufs Array zurück geschrieben.
Es wird ein SDCC Compiler für einen 8051 verwendet aber daran sollte es 
ja nicht liegen.

Martin

von irgendwer (Gast)


Lesenswert?

> Eigentlich werden
> die Daten ja nur gelesen und nie aufs Array zurück geschrieben.

Seh ich genauso, kannst du dazu mal mehr code schreiben, bzw. den code 
wo sensor_data und payload definiert werden

von irgendwer (Gast)


Lesenswert?

Also ich denke bei dir überschneiden sich die arrays.
sensor_data ist signed short? (int16)
payload ist unsigned char? (uint8)
sensor_data überschneidet payload, schreibt da -1 rein und -1 = 255 in 
unsigned char

von Martin (Gast)


Lesenswert?

Hallo!
Danke für die schnelle Antwort. Ihr habt wahrscheinlich recht. Bin 
gerade draufgekommen, dass sensor_data keinen Datentyp hat. Wird also zu 
klein sein. Komm leider erst wieder am Montag dazu ob es dadurch besser 
wird aber ist auf jeden Fall ein heißer Typ.

Danke
Martin

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.