struct in udr schreiben

#750946
Lesenswert?

Ich lese ich die verschiedenen Bits von den Sensoren in eine struct
variable ein kann diese aber nicht in den udr schreiben, kann mir da 
jemand helfen?

Deklaration der Variable:

struct {
       unsigned char Sens1:1;
      unsigned char Sens2:1;
      unsigned char Sens3:1;
      unsigned char Sens4:1;
      unsigned char Sens5:1;
      unsigned char Sens6:1;
       }a;

Einlesen der Sensoren in die Struct Variable(die letzten beiden Bits
bleiben frei):

a.Sens1 = PINC & (1<<PINC0);
      a.Sens2 = PINC & (1<<PINC1);
      a.Sens3 = PINC & (1<<PINC2);
      a.Sens4 = PINC & (1<<PINC3);
      a.Sens5 = PINC & (1<<PINC4);
      a.Sens6 = PINC & (1<<PINC5);

Warten bis sendepuffer frei ist und udr beschreiben:

while (!(UCSRA & (1<<UDRE)));
UDR=(struct)a;

habe es auch schon mit


UDR=(char)a;

probiert aber das geht auch nicht.
Persönliche Seite #750982
Lesenswert?

Sauber
1
#include <avr/io.h>
2

3
union {
4
  struct {
5
    unsigned char Sens1:1;
6
    unsigned char Sens2:1;
7
    unsigned char Sens3:1;
8
    unsigned char Sens4:1;
9
    unsigned char Sens5:1;
10
    unsigned char Sens6:1; 
11
    // hier sind Bits undefiniert!
12
  } a;
13
  char b;
14
} c;
15

16
int main(void)
17
{
18
  c.a.Sens1 = PINC & (1<<PINC0);
19
  c.a.Sens2 = PINC & (1<<PINC1);
20
  c.a.Sens3 = PINC & (1<<PINC2);
21
  c.a.Sens4 = PINC & (1<<PINC3);
22
  c.a.Sens5 = PINC & (1<<PINC4);
23
  c.a.Sens6 = PINC & (1<<PINC5);
24

25
  while (!(UCSRA & (1<<UDRE)));
26
  UDR = c.b;
27

28
  return 0;
29
}

Dreckig
1
#include <avr/io.h>
2

3
struct {
4
  unsigned char Sens1:1;
5
  unsigned char Sens2:1;
6
  unsigned char Sens3:1;
7
  unsigned char Sens4:1;
8
  unsigned char Sens5:1;
9
  unsigned char Sens6:1;
10
  // hier sind Bits undefiniert!
11
} a;
12

13
int main(void)
14
{
15
  a.Sens1 = PINC & (1<<PINC0);
16
  a.Sens2 = PINC & (1<<PINC1);
17
  a.Sens3 = PINC & (1<<PINC2);
18
  a.Sens4 = PINC & (1<<PINC3);
19
  a.Sens5 = PINC & (1<<PINC4);
20
  a.Sens6 = PINC & (1<<PINC5);
21

22
  while (!(UCSRA & (1<<UDRE)));
23
  UDR = *(char*)(&a);
24

25
  return 0;
26
}
#750983
Lesenswert?

das ist die compiler meldung:

Build started 14.1.2008 at 15:54:48
avr-gcc.exe  -mmcu=atmega8 -Wall -gdwarf-2   -DF_CPU=16000000UL -O0 
-fsigned-char -MD -MP -MT timerfertig.o -MF dep/timerfertig.o.d  -c 
../timerfertig.c
../timerfertig.c: In function 'main':
../timerfertig.c:40: warning: implicit declaration of function 
'init_uart'
../timerfertig.c:42: warning: implicit declaration of function 
'init_timer'
../timerfertig.c: At top level:
../timerfertig.c:54: warning: conflicting types for 'init_timer'
../timerfertig.c:42: warning: previous implicit declaration of 
'init_timer' was here
../timerfertig.c: In function '__vector_9':
../timerfertig.c:87: error: aggregate value used where an integer was 
expected
../timerfertig.c: At top level:
../timerfertig.c:95: warning: conflicting types for 'init_uart'
../timerfertig.c:40: warning: previous implicit declaration of 
'init_uart' was here
make: *** [timerfertig.o] Error 1
Build failed with 1 errors and 6 warnings...
#751010
Lesenswert?

@ Stefan "stefb" B. (stefan) Benutzerseite

>Nee, in UDR landen 8 Bits. Nur sind 2 Bits (Bit 6 und Bit 7) nicht
>definiert, d.h. du solltest keine Annahmen über deren Inhalt machen
>(praktisch steht 0 von der Initialisierung her drin).

Vor allem ist schön undefiniert, in welcher Reihenfolge die Bits im Byte 
abgelegt sind. :-(

MFG
Falk
Gast #751066
Lesenswert?

>a.Sens1 = PINC & (1<<PINC0);
>a.Sens2 = PINC & (1<<PINC1);
>a.Sens3 = PINC & (1<<PINC2);
>a.Sens4 = PINC & (1<<PINC3);
>a.Sens5 = PINC & (1<<PINC4);
>a.Sens6 = PINC & (1<<PINC5);


Ist doch Unsinn. Mache das so wie
1
 Michael Dietz (Firma na) (michaeld)
2
Datum: 14.01.2008 16:27
vorgeschlagen hat.

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