struct in udr schreiben

OP #750946
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
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
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...
@ 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
>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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.