Forum: Mikrocontroller und Digitale Elektronik Datentyp umwandeln


von Hamster (Gast)


Lesenswert?

Liebe Leute,
ich habe mit XMEGA 128 A1 eine Datenaufnahme programmiert (avr-gcc), wo 
immer 16 uint16_t vom ADC auf einem uint16_t-array gspeichert werden. Im 
selben array folgen dann 6 Werte, die als einzelne bytes nacheinander da 
abgespeichert werden (kommen von einem digitalen Akzelerometer) und 
jeweils 2 bytes breit sind. Das ganze wiederholt sich so. Diese 6 Werte 
sind je 2 Byte breite int16_t Werte (also signed).

Ich könnte diese Daten auf 2 versch Arrays geben, aber das andere geht 
viel schneller.

Ich muss nur die 6 int16_t-Werte nun igendwie umvandeln, damit der ganze 
array als unsigned interpreteirt werden kann (also z.B. 2048 addieren, 
es sind 12-bit-Werte), weiss aber nicht, wie ich das programmtechnisch 
anstellen soll.

Ich möchte also, dass das Programm diese Daten als int16_t interpretiert 
(obwohl sie auf einem uint16_t array sind), damit ich damit rechnen 
kann. Geht das mit typecast? bin mir da nicht sicher.

Danke für Hilfe, Hamster

von minifloat (Gast)


Lesenswert?

Hamster schrieb:
> Ich könnte diese Daten auf 2 versch Arrays geben, aber das andere geht
> viel schneller.

Bist du dir da sicher? Was heißt "schneller"? Hattest du ein Oszi an 
einem zu Beginn der Datenablage ein- und zu Ende ausgeschalteten 
Portpin?
Warum machst du dir kein Array aus einer Struktur, dann weißt du gleich, 
welche Daten zueinander gehören(haben ja dann die gleiche Hausnummer)?

Hamster schrieb:
> igendwie umvandeln

Wert vom ADC linksbündig in eine signed 16bit Variable einlesen.
Offset von dieser Variable abziehen.
Variable in Array Speichern.
mfg mf

von Hamster (Gast)


Lesenswert?

Danke mf,

aber das löst nicht mein Problem.

Habs jetzt so gelöst:
int16 pointer auf die int16-Daten im uint16-Array

     int16_ptr = (int16_t *) &ADC_Array[nn];

dann mit dem pointer den Wert aufrufen und ändern.

     ADC_Array[nn] = (uint16_t) *int16_ptr + 32768;

das klappt.
Weiss jemand eine elegantere Lösung?

Gruß, Hamster

von Fabian O. (xfr)


Lesenswert?

Hamster schrieb:
> Weiss jemand eine elegantere Lösung?

Eleganter wäre, gleich die richtigen Datentypen zu nehmen:
1
typedef struct {
2
  uint16_t adc[16];
3
  int16_t  accel[6];
4
} datensatz_t;
5
6
datensatz_t daten_array[5];

Oder eben zwei Arrays. Was soll daran langsamer sein?

Ansonsten halt bei der Berechnung casten:
1
ADC_Array[nn] = (int16_t) ADC_Array[nn] + 32768;

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.