PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Binary C operations...



Broeselberger
16.03.2005, 14:06
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

PicNick
16.03.2005, 19:03
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.

Arexx-Henk
16.03.2005, 20:15
union {
int12 LANG;
char bB[3];
} mixit;

gibt compiler fehler bei mir

union {
long LANG;
char bB[3];
} mixit;

scheint okay

gruss

Henk

Broeselberger
17.03.2005, 06:06
@ beide

Danke für den Tip, ich werd's mal probieren!

KP

PicNick
17.03.2005, 06:26
@Arexx : logo, int12 ist eine legasthenische Erfindung von mir. :oops: