mikrocontroller.net

Forum: Compiler & IDEs UNION


Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey Leute ich will bei einer 16 Bit Variable auf einzelne Bits oder die
gesamte Variable zugreifen  ich habe das so gemacht:

warum geht dass nicht ? mit WINAVR

typedef union
{
   unsigned char bit_1:1; // 1. Bit
   unsigned char bit_2:1; // 2. Bit
   unsigned char bit_3:1; // 3. Bit
   unsigned char bit_4:1; // 4. Bit
   unsigned char bit_5:1; // 5. Bit
   unsigned char bit_6:1; // 6. Bit
   unsigned char bit_7:1; // 7. Bit
   unsigned char bit_8:1; // 8. Bit
   unsigned char bit_9:1; // 9. Bit
   unsigned char bit_10:1; // 10. Bit
   unsigned char bit_11:1; // 11. Bit
   unsigned char bit_12:1; // 12. Bit
   unsigned char bit_13:1; // 13. Bit
   unsigned char bit_14:1; // 14. Bit
   unsigned char bit_15:1; // 15. Bit
   unsigned char bit_16:1; // 16. Bit
   unsigned short bitfield;// ganze Variable
}manchester_bitfield;

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mußt du nicht jeweils das char weglassen?

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
steht mal so im GCC Tutorial

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das "char" ist hier nicht das Problem. Eher schon, dass alle 16 Bits
an der selben Stelle stehen.

Bitfields sind tendentiell eher Problem als Lösung. Masken sehen nicht
so elegant aus, dafür funktionieren sie. Und kommen ohne solche
schauderhaften overlay unions aus.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du vermischt hier zwei Dinge, ein Bitfeld und eine Union.

Das geht so nicht, da eine Union die Überlagerung aller einzelnen
Elemente ist (das wäre hier also eine Überlagerung aller einzelnen
Bits), Du aber willst ein Bitfeld und eine andere Variable überlagern.

Das sollte so gehen:
typedef union 
{
  struct
  {
    unsigned short bit_1:1; // 1. Bit 
    unsigned short bit_2:1; // 2. Bit 
    unsigned short bit_3:1; // 3. Bit 
    unsigned short bit_4:1; // 4. Bit 
    unsigned short bit_5:1; // 5. Bit 
    unsigned short bit_6:1; // 6. Bit 
    unsigned short bit_7:1; // 7. Bit 
    unsigned short bit_8:1; // 8. Bit 
    unsigned short bit_9:1; // 9. Bit 
    unsigned short bit_10:1; // 10. Bit 
    unsigned short bit_11:1; // 11. Bit 
    unsigned short bit_12:1; // 12. Bit 
    unsigned short bit_13:1; // 13. Bit 
    unsigned short bit_14:1; // 14. Bit 
    unsigned short bit_15:1; // 15. Bit 
    unsigned short bit_16:1; // 16. Bit 
  };
  unsigned short bitfield;// ganze Variable
} manchester_bitfield;

Das Bitfeld ist in einer anonymen Struktur verpackt und damit sollte es
funktionieren.

Im übrigen ist es ratsam, Bits korrekt durchzunumerieren. C ist nicht
Pascal, also ist das erste Bit "Bit 0" und nicht "Bit 1", ebenso
wie das letzte Bit nicht "Bit 16", sondern "Bit 15" ist.

Einfach angewöhnen, das hilft spätere Fehler zu vermeiden.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.