Forum: Compiler & IDEs struct in udr schreiben


von Michael D. (michaeld)


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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> habe es auch schon mit
>
> UDR=(char)a;
> probiert

Das aber ist der zu verfolgende Ansatz.

> aber das geht auch nicht.

Lautet die Compiler-Fehlermeldung tatsächlich

"This won't work"?

von Stefan B. (stefan) Benutzerseite


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
}

von Michael D. (michaeld)


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...

von Michael D. (michaeld)


Lesenswert?

es klappt danke dh. das ich in das udr genau 6 bit reinschiebe?

von Karl H. (kbuchegg)


Lesenswert?

Michael Dietz wrote:
> es klappt danke dh. das ich in das udr genau 6 bit reinschiebe?

Nein.
Es ist immer 1 Byte = 8 Bit

von Falk B. (falk)


Lesenswert?

@ Michael Dietz (Firma na) (michaeld)

>es klappt danke dh. das ich in das udr genau 6 bit reinschiebe?

Du solltest dich mal mit den UART-Grundlagen beschäftigen.

RS232
AVR-Tutorial: UART
AVR-GCC-Tutorial

MfG
Falk

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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).

von Falk B. (falk)


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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Mist hast mich erwischt! Ich habe im ASM-Listing gecheatet. Ich bekenne! 
Es sieht dort ziemlich seltsam aus.

von Michael D. (michaeld)


Lesenswert?

demnach sollte das das gleiche sein und es sollte damit auch klappen?

Variablendeklaration:
1
char Sensor_1bis6;


Einlesen:
1
Sensor_1bis6 = PINC;


Senden:
1
UDR=(char)Sensor_1bis6;

von Matthias L. (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.