Forum: Mikrocontroller und Digitale Elektronik Über union auf einzelne Bits zugreifen


von Andreas (Gast)


Lesenswert?

mein Problem ist folgendes ich versuche über eine union direkt auf die 
von WINAVR definierten Controller Register zuzugreifen und bekomme immer 
die Warnung:

Warning:typecast makes Pointer from integer with different types

mein Code sieht folgendermaßen aus:


struct bits {
  unsigned char bit0:1;
  unsigned char bit1:1;
  unsigned char bit2:1;
  unsigned char bit3:1;
  unsigned char bit4:1;
  unsigned char bit5:1;
  unsigned char bit6:1;
  unsigned char bit7:1;
};



typedef union
{
    unsigned int  byte1;    /* 1 Byte */
    struct   bits  bit;     /* bitweise */
}char_8_bit;



#define  L_IFC0_STOPBIT_LENGHT_BIT     ((volatile struct bits 
*)UCSRC)->bit3
#define  L_IFC0_CARACTER_LENGHT_BIT_0  ((volatile struct bits *) 
UCSRC)->bit1
#define  L_IFC0_CARACTER_LENGHT_BIT_1  ((volatile struct bits *) 
UCSRC)->bit2
#define  L_IFC0_PARITY0_BIT       ((volatile struct bits *) UCSRC)->bit4
#define  L_IFC0_PARITY1_BIT       ((volatile struct bits *) UCSRC)->bit5

Kann mir da jemand weiterhelfen ?

von Andreas (Gast)


Lesenswert?

und der zugriff dann so :


L_IFC0_CARACTER_LENGHT_BIT_0 = 1


von Stefan K. (_sk_)


Lesenswert?

Ich denke, da fehlt das Adress &, um aus UCSRC einen Ptr zu mchen:

#define  L_IFC0_PARITY1_BIT       (((volatile struct bits *) 
&UCSRC)->bit5)

Ausserdem würde ich unbedingt den kompletten Ausdruck zusätzlich 
klammern, sonst kannst Du in bestimmten Fällen ganz böse Effekte 
bekommen.

Aber warum so kompliziert? Vor kurzem wurde hier doch eine sehr hübsche 
Methode diskutiert, um Bits anzusprechen (im gcc-Forum)?

Stefan

von Andreas (Gast)


Lesenswert?

JAAAAA Stimmt jetzt funztzz DANKE

von yalu (Gast)


Lesenswert?

Warum nimmst du überhaupt eine Union, wenn auf byte1 gar nicht
zugegriffen wird?

Zudem sollte byte1 ein 8-Bit-Typ sein, also z. B. uint8_t.

Das Thema Einzelbitzugriffe auf I/O-Register wurde übrigens hier vor
Kurzem schon nahezu erschöpfend behandelt:

Beitrag "sbit macro für avr-gcc"

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.