Forum: Mikrocontroller und Digitale Elektronik Unions definieren


von Stefan Dreyer (Gast)


Lesenswert?

Hallo!

Ich will in einer funktion auf das low und highbyte einer int Variablen
zugreifen, bis jetzt habe ich das so gelößt:

void WriteData2(unsigned char Command, unsigned int Data)
{
  CHECK_BUSSY(STA1_STA0);
  DATA_WRITE((unsigned char) Data);
  CHECK_BUSSY(STA1_STA0);
  DATA_WRITE((unsigned char) Data>>8); Highbyte selektieren
  CHECK_BUSSY(STA1_STA0);
  COMMAND_WRITE(Command);
}


Nun is meine Frage wie oder ob mann das überhaupt mit einen Union lößen
könnte;
z.b. so
union{
      unsigned int test;
      unsigned char Lowbyte;
      unsigned char Highbyte (Adresse +1???);
     };

Ich weis das das so net geht, aber wie könnte es denn gehen damit dann
dieser aufruf möglich währe

void WriteData2(unsigned char Command, unsigned int Data)
{
  CHECK_BUSSY(STA1_STA0);
  DATA_WRITE(Lowbyte von Date);
  CHECK_BUSSY(STA1_STA0);
  DATA_WRITE(Highbyte von Data);
  CHECK_BUSSY(STA1_STA0);
  COMMAND_WRITE(Command);
}



Gruß Stefan

von Steffen (Gast)


Lesenswert?

union data{
      unsigned int test;
      unsigned char array[2];
     };

void WriteData2(unsigned char Command, union data uData )
{

  CHECK_BUSSY(STA1_STA0);
  DATA_WRITE(uData.array[0]);
  CHECK_BUSSY(STA1_STA0);
  DATA_WRITE(uData.array[1]);
  CHECK_BUSSY(STA1_STA0);
  COMMAND_WRITE(Command);
}

von Steffen (Gast)


Lesenswert?

#define LOW(x)  ((int)x & 0x0FF)
#define HIGH(x) ((int)x >> 8)

void WriteData2(unsigned char Command, unsigned int Data)
{
  CHECK_BUSSY(STA1_STA0);
  DATA_WRITE(LOW(Data));
  CHECK_BUSSY(STA1_STA0);
  DATA_WRITE(HIGH(Data));
  CHECK_BUSSY(STA1_STA0);
  COMMAND_WRITE(Command);
}

so geht das natürlich auch.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Noch 'ne Möglichkeit:
1
union data
2
{
3
  unsigned int test;
4
  struct
5
  {
6
    unsigned char lowbyte;
7
    unsigned char high;
8
  };
9
};
10
11
void WriteData2(unsigned char Command, union data uData)
12
{
13
  CHECK_BUSSY(STA1_STA0);
14
  DATA_WRITE(uData.lowbyte);
15
  CHECK_BUSSY(STA1_STA0);
16
  DATA_WRITE(uData.highbyte);
17
  CHECK_BUSSY(STA1_STA0);
18
  COMMAND_WRITE(Command);
19
}

Das ist aber ebensowenig portabel wie der Vorschlag von Steffen -
Probleme hierbei sind die unterschiedlichen Größen des Datentyps
"int", die "endianness" des Prozessors und die Anordnung der
Strukturelemente im Speicher (Stichwort "alignment").

Das gleiche ohne "anonyme" Struktur:
1
union data
2
{
3
  unsigned int test;
4
  struct
5
  {
6
    unsigned char lowbyte;
7
    unsigned char high;
8
  } s;
9
};
10
11
void WriteData2(unsigned char Command, union data uData)
12
{
13
  CHECK_BUSSY(STA1_STA0);
14
  DATA_WRITE(uData.s.lowbyte);
15
  CHECK_BUSSY(STA1_STA0);
16
  DATA_WRITE(uData.s.highbyte);
17
  CHECK_BUSSY(STA1_STA0);
18
  COMMAND_WRITE(Command);
19
}


CHECK_BUSSY? Küsschen?!

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.