Union Struct RAW

Gast #3342379
Lesenswert?

Liebe Kollegen!

Ich habe ein Union mit einem Struct und den RAW Werten.
1
union fnc_lat
2
{
3
  struct {
4
  unsigned int cb      :2;    // Control Bit
5
  unsigned int cr      :1;    // Counter Reset
6
  unsigned int pd1    :1;    // Power Down 1
7
  unsigned int mux    :3;    // MUX Control
8
  unsigned int pcp    :1;    // PD Polarity
9
  unsigned int cdt    :1;    // CP Threestate
10
  unsigned int fe      :1;    // Fastlock Enable
11
  unsigned int fm      :1;   // Fastlock Mode
12
  unsigned int tcc    :4;    // Timer Counter Control
13
  unsigned int cs1    :3;   // Current Setting 1
14
  unsigned int cs2    :3;    // Current Setting 2
15
  unsigned int pd2    :1;    // Power Down 2
16
  unsigned int pv      :2;    // Prescaler Value
17
} BITS;
18
  uint32_t RAW;
19
}

Da Ihr mit schon einmal super geholfen habt habe ich erneut die Hoffnung 
auf eine Lösung.

Wenn ich die Werte im Debug Modus ansehe ist das RAW nicht richtig. TTC 
hat dort 5 Bit (oder fm 2 Bit). Warum ist das so? Wie kann ich das 
berichtigen??

Ich verwende CCS5 auf einem MSP430f168

DANKE!!
Moderator Persönliche Seite #3342431
Lesenswert?

Gerhard schrieb:
> TTC hat dort 5 Bit (oder fm 2 Bit).

Womit hast du das festgestellt?

Davon abgesehen, dass bei Bitfeldern so ziemlich alles
implementierungsspezifisch ist (sprich: die Dokumentation deines
Compilers muss dir erklären, was sie wie konkret tut): wenn ich deine
Bitanzahlen zusammenzähle, komme ich auf 24, aber in der Union hast
du eine 32-Bit-Zahl dagegen stehen.  Das geht irgendwie nicht auf.
Du solltest das Bitfeld auf jeden Fall vollständig auscodieren, damit
die Sache Sinn hat.

Der Standard gestattet durchaus auch, dass der Compiler ein “padding”
zwischen den Bitfeldern anlegt, wenngleich ich nicht vermuten würde,
dass das beim MSP430 irgendwie zutrifft.  Ggf. kannst du nochmal
probieren, ob statt “unsigned int” für die Bitfeld-Typen ein “uint8_t”
(oder “unsigned char”) eine Änderung bringt.
#3342435
Lesenswert?

Gerhard schrieb:
> Wenn ich die Werte im Debug Modus ansehe ist das RAW nicht richtig. TTC
> hat dort 5 Bit (oder fm 2 Bit). Warum ist das so? Wie kann ich das
> berichtigen??

Bitfelder werden auf einem 16-Bit Prozessor ziemlich wahrscheinlich auf 
16-Bit Verarbeitung abgebildet. Bis einschliesslich tcc sind es 15 Bits, 
folglich wird das 3 Bit breite Feld cs1 ins nächste Maschinenwort 
verfrachtet, also effektiv ein Bit davor eingefügt.

Lösung: Keine Bitfelder verwenden. Achtung: 32-Bit Schiebeoperationen 
sind möglicherweise etwas ineffizient.
#3342448
Lesenswert?

Machbar wäre vielleicht sowas wie
1
struct {
2
  unsigned int cb      :2;    // Control Bit
3
  unsigned int cr      :1;    // Counter Reset
4
  unsigned int pd1     :1;    // Power Down 1
5
  unsigned int mux     :3;    // MUX Control
6
  unsigned int pcp     :1;    // PD Polarity
7
  unsigned int cdt     :1;    // CP Threestate
8
  unsigned int fe      :1;    // Fastlock Enable
9
  unsigned int fm      :1;    // Fastlock Mode
10
  unsigned int tcc     :4;    // Timer Counter Control
11
  unsigned int cs1_lo  :1;    // Current Setting 1 low
12
  unsigned int cs1_hi  :2;    // Current Setting 1 high
13
  unsigned int cs2     :3;    // Current Setting 2
14
  unsigned int pd2     :1;    // Power Down 2
15
  unsigned int pv      :2;    // Prescaler Value
16
} BITS;
wobei du cs1 in 2 Teilen verarbeiten muss.
Gast #3342450
Lesenswert?

Kann ich das umgehen indem ich das Struct auf insgesamt 32 Bit 
vergrößere?
Ich brauche die RAW Werte genau so angelegt wie sie im Struct stehen. 
Die werden dann über eine Serielle Schnittstelle rausgeschrieben.

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