Forum: Mikrocontroller und Digitale Elektronik struct in for schleife auslesen


von Siegfried S. (dieleena)


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 ""
1
typedef union
2
{
3
    byte _byte;
4
    struct{
5
          unsigned LCD_D0:    1;            //  
6
          unsigned LCD_D1:    1;            //  
7
          unsigned LCD_D2:    1;            //  
8
          unsigned LCD_D3:    1;            //  
9
          unsigned LCD_D4:    1;            //  
10
          unsigned LCD_D5:    1;            //  
11
          unsigned LCD_D6:    1;            //  
12
          unsigned LCD_D7:    1;            //  
13
    };
14
     unsigned char Data;
15
} my_LCD_DATA;                              //Buffer Descriptor Data Register
16
my_lcd_wd_c2704m_1hnn my_LCD_DATA LcdData;
Gruß Siegfried

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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:
1
typedef union
2
{
3
    byte _byte;
4
    struct{
5
          unsigned LCD_D[8]:  1;            //  
6
    };
7
     unsigned char Data;
8
} my_LCD_DATA;                              //Buffer Descriptor Data Register
9
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;

von Sven P. (Gast)


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.

von Klaus W. (mfgkw)


Lesenswert?

Lothar Miller schrieb:
> unsigned LCD_D[8]:  1;            //

Das wird sicher nicht gehen.

von Siegfried S. (dieleena)


Lesenswert?

Hallo,
wie Sven geschrieben.

non-integral type bitfield detected

Gruß Siegfried

von Karl H. (kbuchegg)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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...)

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.