mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik struct in for schleife auslesen


Autor: Siegfried Saueressig (dieleena)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe folgende "struct". Diese möchte ich in einer for Schleife bit 
für bit auslesen, um die Daten an ein Schieberegister zu senden.
"" KEIN SPI MODE ""
typedef union
{
    byte _byte;
    struct{
          unsigned LCD_D0:    1;            //  
          unsigned LCD_D1:    1;            //  
          unsigned LCD_D2:    1;            //  
          unsigned LCD_D3:    1;            //  
          unsigned LCD_D4:    1;            //  
          unsigned LCD_D5:    1;            //  
          unsigned LCD_D6:    1;            //  
          unsigned LCD_D7:    1;            //  
    };
     unsigned char Data;
} my_LCD_DATA;                              //Buffer Descriptor Data Register
my_lcd_wd_c2704m_1hnn my_LCD_DATA LcdData;

Gruß Siegfried

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siegfried Saueressig schrieb:
> Diese möchte ich in einer for Schleife bit für bit auslesen,
Geht so einfach über einen Index nicht, weil du ja kein Array von Bits 
definiert hast...

Du kannst ja mal sowas probieren:
typedef union
{
    byte _byte;
    struct{
          unsigned LCD_D[8]:  1;            //  
    };
     unsigned char Data;
} my_LCD_DATA;                              //Buffer Descriptor Data Register
my_lcd_wd_c2704m_1hnn my_LCD_DATA LcdData;
Aber ich bin mir da nicht so sicher, was die Bitreihenfolge angeht... 
:-o

> my_lcd_wd_c2704m_1hnn my_LCD_DATA LcdData;
Das erhält von mir das Attribut: ABSOLUT UNLESERLICH
Wieviele Unterschiede sind in den folgenden Zeichenketten:
 my_lcd_wd_c2704m_1hnn my_LCD_DATA LcdData;
 my_lcd wd_c2704m 1hnn_my_LCD DATA_LcdData;

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht leider nicht, Arrays von Bitfeldern sind in C nicht erlaubt.

Ansonsten ist das üble Bitfrickelei, denn du weißt nicht, wie und wo und 
warum der Compiler Füllbits und -bytes einfügt.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> unsigned LCD_D[8]:  1;            //

Das wird sicher nicht gehen.

Autor: Siegfried Saueressig (dieleena)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
wie Sven geschrieben.

non-integral type bitfield detected

Gruß Siegfried

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wie bereits geschrieben, das geht so nicht.

Mach's so wie es alle anderen auch machen:
In einer Schleife aus _byte (oder Data; warum geibt es da eigentlich 2 
mal denselben Member in der union) und einer Maske das jeweils 
interessierenden Bit herausholen. In der Schleife die Maske um jeweils 1 
Stelle nach links (oder rechts; ja nachdem welche Reihengfolge man haben 
will) verschieben und gut ists.

Das ganze ist ein 4 Zeiler. Das lohnt nicht, sich da groß den Kopf zu 
zerbrechen, wie man da unbedingt ein Bitfeld zum Einsatz bringt. 
Manchmal sind die klassischen Verfahren einfach die besten.

Wer die klassiche Schreibweise zur Extraktion einen Bits beherrscht
* hat keine Schwierigkeiten durch unerwarteten Overhead beim
  bitweisen Zugriff in ein Byte, der bei Bitfeldern durch die Syntax
  verschleiert wird.
* weiß sich in allen Lebenslagen zu helfen.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Wer die klassiche Schreibweise zur Extraktion einen Bits beherrscht
> * hat keine Schwierigkeiten durch unerwarteten Overhead beim
>   bitweisen Zugriff in ein Byte, der bei Bitfeldern durch die Syntax
>   verschleiert wird.
Das ist auch der Grund, warum ich nach einem kurzen Blick auf diese 
C-Syntaxelemente solche Bitfelder gleich wieder aus meinem Repertoire 
entfernt habe.
> * weiß sich in allen Lebenslagen zu helfen.
Und kommt in einige nicht, aus denen er kein Entkommen mehr findet (z.B. 
ein 16-Bit Feld, das zwischen einem Little- und einem 
Big-Endian-Prozessor ausgetauscht wird...)

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.