struct in udr schreiben

OP #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
}
OP #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