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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren