Sida 1 av 1

PIC MPLAB C30 Fråga - Binär omvandling

Postat: 24 februari 2010, 07:40:05
av mcdanne82
Hej
Jag har kört fast och googlandet har inte gett något konkret.
Jag har precis börjat överge Basic för att börja med C.

Jag har ett tal, som just nu är en byte men kan behöva bli en Integer och skulle behöva omvandla detta till bitar för att kunna skicka olika långa pulser beroende på om biten är 1 eller 0

Så har jag tex 4 (00000100)
så vill jag anropa:

Kod: Markera allt

funcLow();  //0  128
funcLow();  //0  64
funcLow();  //0  32
funcLow();  //0  16
funcLow();  //0  8
funcHigh();  //1  4
funcLow();  //0  2
funcLow();  //0  1
Jag skulle behöva kunna variera antalet "ut bitar" som i fallet ovan 8bitar, ibland kan det vara ett lägre tal tex 4bitar



Det borde väl finnas något fint kommando så man skulle kunna använda tex:

Kod: Markera allt

BYTE bValue;

if (bValue.bit8==1)
    funcHigh();
else
    funcLow();

if (bValue.bit7==1)
    funcHigh();
else
    funcLow();

if (bValue.bit6==1)
    funcHigh();
else
    funcLow();

osv....
Man kan ju kanske skriva en funktion själv som drar av -16 och kollar om den är positiv -8 kollar om den är positiv -4 osv, men det känns inte som enklaste vägen.

Eller om man kan göra denna omvandling på ett annat smartare sätt.

Re: PIC MPLAB C30 Fråga - Binär omvandling

Postat: 24 februari 2010, 08:54:10
av stekern
Det du vill göra är att skifta ut bitarna, ungefär såhär t.ex..

Kod: Markera allt

  for(int i=0;i<8;i++) {
    if(bValue & 0x80)
      funcHigh();
    else
      funcLow();
    bValue <<= 1;
  }

Re: PIC MPLAB C30 Fråga - Binär omvandling

Postat: 24 februari 2010, 11:58:58
av sodjan
Det vanligaste/enklaste är att shifta variablen och kolla
någon lämplig bit. I ASM hade det sannolikt varit C-flaggan,
men om det är enkelt att göra i C (alltså inte samma "C" som
ovan) vet jag inte...

Re: PIC MPLAB C30 Fråga - Binär omvandling

Postat: 24 februari 2010, 18:23:16
av mcdanne82
Tackar!!
Verkar funka precis som önskat, fick dock bara deklarera i före for loopen då kompilatorn klagade.
Efter denna lilla justering funkar de fint! :P

Kod: Markera allt

int i;
for(i=0;i<8;i++)