www.mikrocontroller.net

Forum: Compiler & IDEs struct's mit avr-gcc


Autor: Alexander Starke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe mal wieder eine kleine C-Frage, bei dir mir meine Literatur (C-
Das Grundlagen Buch) nicht weiter hilft.

Ich habe eine Struktur wie folgt definiert:

struct motordaten {
  unsigned char nr: 1;
  unsigned char v: 3;
  unsigned char dir: 1;
  unsigned char mod: 2;
};
typedef struct motordaten mdaten;

Das funktioniert soweit auch, nur erfordert es meine Anwendung, dass
ich eine Variable vom Typ mdaten zu einem unsigned char konvertieren
möchte.

mdaten testvariable;
unsigned char anderevariable;
anderevariable = (unsigned char) testvariable;

Hierbei bringt mir avr-gcc allerdings nur Fehlermeldungen. Eigentlich
sollten ja beide Variablen 1 Byte groß sein ?!

Alex

Autor: Alexander Starke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat keiner eine Idee?
Das Problem ist, dass die Motorsteuerung über das SPI erfolgen soll und
es praktischer ist, alle 4 Parameter mit einer 8Bit Variablen zu
übergeben, anstatt extra 4 Byte zu senden.
Eigentlich legt doch die Deklaration einer Variablen lediglich fest,
wie eine Variable zu interpretieren ist. Da meine neu definierter
Datentyp die gleiche Größe (?) wie ein unsigned char hat, sollte doch
eine Hin- und auf Empfängerseite Rückkonvertierung kein Problem sein.
Habe ich eventuell Syntaxfehler oder ein generelles
Verständnisproblem?

Alex

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, Du hast ein generelles Verständnisproblem.  Auch wenn's ein
Bitfeld ist, es bleibt eine Struktur, und die kann man nicht einfach
auf einen Skalarwert casten.

union ist das Stichwort.  Den Rest findest Du in jedem C-Buch.

Autor: Daniel Jelkmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Ich glaube, das was Du vor hast, das funktioniert so direkt nicht.
Du kannst eine struct nicht einfach auf einen einfachen Datentyp wie
int konvertieren.

Was aber gehen müsste: Du brauchst einen Zeiger auf einen unsigned
char, und diesen lässt Du auf die Adresse der struct zeigen.
mdaten testvariable;
unsigned char * andereVariable = (unsigned char*)&testvariable;
Mit diesem Zeiger kannst Du nun direkt auf das Byte zugreifen.
Ich weiss nicht genau was Du hiermit machen willst, aber Du solltest
beachten, dass die Anordnung der einzelnen Bits nicht in der
Sprachdefinition festgelegt ist und jeder Compiler die einzelnen Bits
anders anordnen kann, also in Deinem Fall liegt das Bit "nr"
vielleicht mal ganz vorne im Byte, vielleicht aber auch ganz hinten...

Daher wäre es vielleicht sicherer, "von Hand" aus der struct ein Byte
zu machen. Also in etwa so:
unsigned char andereVariable = (testvariable.nr << 6) | (testvariable.v
<< 3) | (testvariable.dir << 2) | (testvariable.mod);
Dann weisst Du wenigstens sicher, was an welcher Stelle im Byte steht,
unabhänging vom verwendten Compiler.

Bye
 Daniel

Autor: Daniel Jelkmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm, die Idee mit der Union von Jörg ist natürlich noch besser...

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.