C-fråga (PIC)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
jack
EF Sponsor
Inlägg: 2059
Blev medlem: 5 oktober 2004, 17:32:27

C-fråga (PIC)

Inlägg av jack »

Hej.

Jag har ett 32-bitars heltal som jag bara vill ha ut en viss byte ur. Det vill säga åtta bitar på en viss position i 32-bitarstalet. Har nyligen börjat med C så jag har inte så stor aning om hur man skulle kunna göra detta.


Mycket tacksam för svar.

//jack
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Inlägg av cyr »

Jag skrev några macron till C18 (microchips kompilator) för just detta. De ser hemskt fula ut men ger bra kod (iaf just med den kompilatorn).

Kod: Markera allt

#define BYTE1(x) (*((unsigned char *)(&(x))))
#define BYTE2(x) (*(((unsigned char *)(&(x))+1)))
#define BYTE3(x) (*(((unsigned char *)(&(x))+2)))
#define BYTE4(x) (*(((unsigned char *)(&(x))+3)))
Går att använda typ:

PORTB = BYTE3(var);

Eller:

BYTE2(var) = PORTB;
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Standart är:

Kod: Markera allt

union
  {
  unsigned long TheBigOne;
  unsigned char InBytes[4];
  } SomeValue;
Då kan du komma åt 'SomeValue.TheBigOne' som en 32 bitars heltal samt 'SomeValue.InBytes[0]' som bytes. Indexeringen kan såklart vara 0 - 3.
Användarvisningsbild
jack
EF Sponsor
Inlägg: 2059
Blev medlem: 5 oktober 2004, 17:32:27

Inlägg av jack »

Tack för svar. Tror dock att jag inte var tydlig nog (eller så förstod jag inte er kod). Det jag vill göra är att ta ut åtta bitar från vilken plats som helst, inte bara exakt byte 1,2,3 eller 4.

Om jag har missförstått er så får ni gärna förklara er kod :)

Tack.
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Inlägg av cyr »

Skifta (och maska).

bytevar = (longvar >> nbits) & 0xff;

Typ... (nbits bestämmer från vilken position man plockar).
Skriv svar