register mit struct beschreiben

Gast #4144510
Lesenswert?
• ▲
▼
Hallo,
ich möchte gerne einen Struct erstellen, mit dem ich ein Register 
beschreiben kann.
1
typedef struct C1RX0B1{
2
    unsigned char BYTE0:8;
3
    unsigned char BYTE1:8;
4
} CAN1_Buffer0;

Im code schreibe ich dann
1
if(CAN1_Buffer0.BYTE0 == 0){...}


Dann bekomme ich allerdings den fehler
error: expected expression before 'CAN1_Buffer0'

weiss jemand, was daran noch falsch ist?

das ganze ist für einen dspic30f4011 mit xc16 compiler

Johannes
#4144517
Lesenswert?
• ▲
▼
Johannes schrieb:
> Hallo,
> ich möchte gerne einen Struct erstellen, mit dem ich ein Register
> beschreiben kann.
>
>
1
> typedef struct C1RX0B1{
2
>     unsigned char BYTE0:8;
3
>     unsigned char BYTE1:8;
4
> } CAN1_Buffer0;
5
>

Das definiert erst mal nur einen Datentyp. Sozusagen die Blaupause. So 
würde eine Variable vom Typ 'CAN1_Buffer0' aussehen, wenn du eine 
definieren würdest.

> Im code schreibe ich dann
>
1
> if(CAN1_Buffer0.BYTE0 == 0){...}
2
>
>
>
> Dann bekomme ich allerdings den fehler
> error: expected expression before 'CAN1_Buffer0'

Logisch. CAN1_Buffer0 ist ja keine Variable, sondern der Name des 
Datentyps. So wie int oder long oder char oder double.

> weiss jemand, was daran noch falsch ist?

Ich weiss, was dir fehlt.
Ein C-Buch und die Zeit das mal in Ruhe durchzuarbeiten.
typedef nicht verstanden?
#4144520
Lesenswert?
• ▲
▼
Johannes schrieb:
> Hallo,
> ich möchte gerne einen Struct erstellen, mit dem ich ein Register
> beschreiben kann.
> typedef struct C1RX0B1{
>     unsigned char BYTE0:8;
>     unsigned char BYTE1:8;
> } CAN1_Buffer0;
>
> Im code schreibe ich dann
> if(CAN1_Buffer0.BYTE0 == 0){...}
>
> Dann bekomme ich allerdings den fehler
> error: expected expression before 'CAN1_Buffer0'

CAN1_Buffer0 ist ja auch ein Typ. Das ist so, als ob du schreibst
1
    if (int == 5)

Ergibt also keinen wirklichen Sinn. Wenn du das "typedef" weglässt, wird 
es durch den Compiler gehen, da CAN1_Buffer0 dann eine Variable ist 
statt ein Typ. Wenn das ein Register darstellen soll, wirst du diese 
aber auch noch auf die richtige Adresse fixieren und sie als volatile 
definieren müssen.
Gast #4144542
Lesenswert?
• ▲
▼
Oha, jetzt funktioniert es. jetzt möchte nur mein controller nicht mehr. 
er amcht gar nichts mehr, obwohl ich eigentlich ncihts gemacht habe. 
Aber in der Simulation wurden die richtigen Bits abgefragt und auch 
gesetzt.

danke
#4144562
Lesenswert?
• ▲
▼
Ich sehe gerade, dass ich was übersehen habe: Die Endianness, ich weiß 
jetzt nicht auswendig welche der dsPIC30 verwendet. Vllt. klappt es, 
wenn du die beiden Zeilen
1
  unsigned char BYTE0:8;
2
  unsigned char BYTE1:8;
vertauschst.

Ansonsten kannst du es einfach so machen:
1
 
2
#define HIGH_BYTE(var) (((var) >> 8) & 0xFF)
3
#define LOW_BYTE(var) ((var) & 0xFF)
4

5
// Abfrage, dann mit 
6
if(LOW_BYTE(C1RX0B1) == <IRGENDWAS>)
7
//bzz.
8
if(HIGH_BYTE(C1RX0B1) == <IRGENDWAS>)
Gast #4144662
Lesenswert?
• ▲
▼
Ich möchte nochmals auf die typedef-Geschichte zurückkommen - ich habe 
da auch immer wieder Verständnisprobleme.
Das folgende Beispiel soll zeigen, dass praktisch zwei Definitionen 
ineinandergeschachtelt wurden:
1
typedef struct C1RX0B1{
2
    unsigned char BYTE0:8;
3
    unsigned char BYTE1:8;
4
} CAN1_Buffer0;
5

6

7
CAN1_Buffer0 test; 
8
struct C1RX0B1 test2;
9
unsigned char read;
10

11

12
int main()
13
{
14
  while(1)
15
  {
16
    test.BYTE0 = 1;
17
    test.BYTE1 = 3;
18
    test2.BYTE0 = 5;
19
    test2.BYTE1 = 7;
20

21
    read = test.BYTE0;
22
    read = test.BYTE1;
23
    read = test2.BYTE0;
24
    read = test2.BYTE1;
25
  }
26
}

Antwort schreiben

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.

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.