www.mikrocontroller.net

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


Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und der zugriff dann so :


L_IFC0_CARACTER_LENGHT_BIT_0 = 1


Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JAAAAA Stimmt jetzt funztzz DANKE

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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"

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.