www.mikrocontroller.net

Forum: Compiler & IDEs struct in udr schreiben


Autor: Michael D. (michaeld)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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"?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sauber

#include <avr/io.h>

union {
  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; 
    // hier sind Bits undefiniert!
  } a;
  char b;
} c;

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

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

  return 0;
}

Dreckig

#include <avr/io.h>

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;
  // hier sind Bits undefiniert!
} a;

int main(void)
{
  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);

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

  return 0;
}

Autor: Michael D. (michaeld)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Michael D. (michaeld)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es klappt danke dh. das ich in das udr genau 6 bit reinschiebe?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: Michael D. (michaeld)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
demnach sollte das das gleiche sein und es sollte damit auch klappen?

Variablendeklaration:
char Sensor_1bis6;


Einlesen:
Sensor_1bis6 = PINC;


Senden:
UDR=(char)Sensor_1bis6;

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht 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
 Michael Dietz (Firma na) (michaeld)
Datum: 14.01.2008 16:27 
vorgeschlagen hat.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.