Typedef struct -> Portzuweisung

Gast #1852898
Hallo,

ich verwende den Mikroeletronica MikroC 8.1 Compiler. Um mir meine 
Arbeit etwas zu erleichtern wollte ich mir eine Struktur definieren die 
8Bit breit ist und die ich dann den Port direkt zuweißen kann. Aber das 
ganze funktioniert irgendwie nicht so wirklich. Bei der Portzuweisung 
bekomme ich die Fehlermeldung "Cannot Assign" zurück
1
 //Datentypdefinitionen
2
 typedef struct   //definiert eigenen Datentyp->niederwertigstes Bit wird zuerst
3
  {               //kodiert
4
   unsigned char       FS_G2 : 1;     //Bit0 am Port -> Fahrstrom Gleis 2
5
   unsigned char       FS_G1 : 1;     //Bit1 -> Fahrstrom Gleis 1
6
   unsigned char       FS_G3 : 1;     //Bit2 -> Fahrstrom Gleis 3
7
   unsigned char       FS_G4 : 1;     //Bit3 -> Fahrstrom Gleis 1
8
   unsigned char       W1    : 1;     //Bit4 -> Weiche 1
9
   unsigned char       W2    : 1;     //Bit5 -> Weiche 2
10
   unsigned char       FS_D  : 1;     //Bit6 -> Fahrtrichtung
11
   unsigned char       FS_On : 1;     //Bit7 -> Anschalten des Fahrstromes
12
  } control_bitfield;
13

14
 control_bitfield port_config;       //legt Variable mit eigenen Datentyp an
15

16
 portb=port_config;  //An dieser stelle stellt der Compiler dann die arbeit ein


Was könnte ich ändern damit das ganze funktioniert??


Vielen Dank für eure Hilfe!



mit freundlichen Grüßen

Andreas
Gast
Das was der Compiler anmeckert ist ganz richtig.
Du versuchst einem int typ (char) ein struct zuzuweisen.
Das paßt nicht.
Aber es geht doch, so:

Definiere eine union aus deinem Struct
und einem (gleich großen) char Element.
Dieses kannst Du dann mit dem Inhalt deines Bitfeldes zuweisen.

Sieht etwa so aus:

typedef struct   //definiert eigenen Datentyp->niederwertigstes Bit wird 
zuerst
  {               //kodiert
   unsigned char       FS_G2 : 1;     //Bit0 am Port -> Fahrstrom Gleis 
2
   unsigned char       FS_G1 : 1;     //Bit1 -> Fahrstrom Gleis 1
   unsigned char       FS_G3 : 1;     //Bit2 -> Fahrstrom Gleis 3
   unsigned char       FS_G4 : 1;     //Bit3 -> Fahrstrom Gleis 1
   unsigned char       W1    : 1;     //Bit4 -> Weiche 1
   unsigned char       W2    : 1;     //Bit5 -> Weiche 2
   unsigned char       FS_D  : 1;     //Bit6 -> Fahrtrichtung
   unsigned char       FS_On : 1;     //Bit7 -> Anschalten des 
Fahrstromes
  } control_bitfield;

 union u
 {
     control_bitfield port_config;       //legt Variable mit eigenen
     unsigned char allebits;
 } bits;

 bits.port_config.FS_G2 = 1;   // ein bit setzen

 portb = bits.allebits;        // Wert aller bits zuweisen


 (habe den Code nicht durch einen Compiler gedreht, es sollte jedoch 
klar
  werden wie man das machen kann)

Gruß
Hans

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.