Datentyp umwandeln

Gast #3041113
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
Gast #3041216
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
Gast #3041310
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
#3041332
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;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren