Forum: Mikrocontroller und Digitale Elektronik Typedef struct -> Portzuweisung


von Andreas (Gast)


Lesenswert?

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

von Grrrr (Gast)


Lesenswert?

Ich kenne leider den Mikroeletronica MikroC 8.1 Compiler nicht.
Aber vielleicht hilft es, sich einmal die Definition von "portb" 
anzuschauen.

von Hans (Gast)


Lesenswert?

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

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.