Forum: Mikrocontroller und Digitale Elektronik Union Struct RAW


von Gerhard (Gast)


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!!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von (prx) A. K. (prx)


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.

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Wenn das Format des 24-Bit Wortes bereits fest vorgegeben ist, dann ist 
hier mit Bitfeldern recht wahrscheinlich kein Blumentopf zu gewinnen. 
Denn cs1 liegt über einer Wortgrenze und entzieht sich so einem 
einfachen Zugriff, da der MSP430 Wortalignment voraussetzt.

: Bearbeitet durch User
von (prx) A. K. (prx)


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.

von Gerhard (Gast)


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.

von Gerhard (Gast)


Lesenswert?

Ah verstehe!

Das würde ich gerne vermeiden da ich via RS232 genau in die Felder 
schreibe. Dadurch hätte ich 2 Befehle anstelle von einem.
(als Plan B allerdings sehr gut)

von (prx) A. K. (prx)


Lesenswert?

Gerhard schrieb:
> Kann ich das umgehen indem ich das Struct auf insgesamt 32 Bit
> vergrößere?

Nein.

von Gerhard (Gast)


Lesenswert?

Schade.

Naja, ich kann den Befehl (via RS232) lassen und die Daten dann im µC 
aufteilen.

DANKE für Eure Hilfe

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.