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
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);
}
#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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.