Du solltest in der union ein in32 dazudefinieren.
union {
int12 LANG;
char bB[3];
} mixit;
mixit.bB[0] = LSB
mixit.bB[2] = MSB
if (mixit.LANG & 0x800000) .,.....
oder mixit.LANG <<= 12;
das eigentliche MSB des int32 kannst du ignorieren.
Hallo zusammen,
ich steuere Hardware, die 24-bit-Register beinhaltet. Um die Bits bequem hindrehen zu können, habe ich mir folgendes definiert:
union PLL_Register
{
unsigned char b[3];
} N_PLL_Reg;
Also ein 24 Bit großes Datenfeld, wobei ich per Indizierung auf jedes einzelne der 3 Bytes zugreifen kann
(z.B. N_PLL_Reg.b[1] = 0xAB).
Es funktioniert aber leider nicht alles wie gewünscht:
N_PLL_Reg.b = (N_PLL_Reg.b << 2);
// alle 24 Bits um 2 Bits nach links schieben, die obersten fallen raus
oder auch
if (N_PLL_Reg.b & 0x800000) // wenn Bit 23 = 1 ...
....
bewegen den Compiler nur zu einem müden
error: invalid operands to binary << (bzw. &)
Wenn ich N_PLL_Reg als long definiere, geht das Ganze, aber das ist erstens nicht 24 Bits lang und zweitens ist der schöne Zugriff auf die einzelnen Bytes weg...
Hat jemand 'ne Idee?
KP
Du solltest in der union ein in32 dazudefinieren.
union {
int12 LANG;
char bB[3];
} mixit;
mixit.bB[0] = LSB
mixit.bB[2] = MSB
if (mixit.LANG & 0x800000) .,.....
oder mixit.LANG <<= 12;
das eigentliche MSB des int32 kannst du ignorieren.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
union {
int12 LANG;
char bB[3];
} mixit;
gibt compiler fehler bei mir
union {
long LANG;
char bB[3];
} mixit;
scheint okay
gruss
Henk
@ beide
Danke für den Tip, ich werd's mal probieren!
KP
@Arexx : logo, int12 ist eine legasthenische Erfindung von mir.
Lesezeichen