Avatar billede _et Praktikant
14. januar 2006 - 16:37 Der er 3 kommentarer og
1 løsning

funktion til right shift af de 4 LSB uden at påvirke resten.

Davs.

Jeg skal bruge en funktion, som kan shifte Right/left på bit 0 - 3 uden af resten af bitsne påvirkes.
Jeg skal også bruge den til 4-7 bit, men det regnede jeg med selv at rette til.

Jeg har rodet lidt med det, men kan ikke få det til at virke.

Det er til en microprocessor, som skal styre 2 stepmotore.

Timing:
bit 8421
------------
xxxx0011
xxxx0110
xxxx1100
xxxx1001
x= Don't change

Her er lidt pseudo kode til at illustrere virkemåden.

Det SKAL være i C da min compiler ikke er vild med c++
main()
{
funktion(true)
}
void funktion(bool retning)
{
  if (retning)
      shift 1 right;
  else if (!retning)
      shift 1 left;
}
Avatar billede _et Praktikant
14. januar 2006 - 17:24 #1
Her er den funktion jeg selv har fået lavet, men den virker ikke rigtigt

void Right_Frem(void)
{
//          8421 - Motor Right - Bits
//-------------------------
// 00 0000 0011 - 3
// 00 0000 0110 - 6
// 00 0000 1100 - 12
// 00 0000 1001 - 9


//  1000 0000
//  111111100
    int i = 1;
    int x = 0;
    int p;
    IO1SET = 128;   
    for ( i ; i <= 4 ; i++ )
    {
        if ( IO1SET != 12 )
        {
            p = IO1SET;
            IO1SET = IO1SET & ~x;
            x = 1<<i-1;
            x =    x | (1<<i);
            IO1SET = IO1SET | x;
        }
        else if ( IO1SET == 12 )
        {   
            IO1SET = 9;
        }
    }
    IOCLR1 = x;
}
Avatar billede driis Nybegynder
14. januar 2006 - 22:56 #2
Noget i retning af:
char shiftLow(char val, int direction)
{
    char s = 0;
    if ( direction < 0 )
    {
        direction = direction * -1;
        s = ((val & 0x0F) >> direction) & 0x0F;
    }
    else
    {
        s = ((val & 0x0F) << direction) & 0x0F;
    }   
    return s | (val & 0xF0);
}
Avatar billede driis Nybegynder
14. januar 2006 - 23:03 #3
if sætningen der skelner mellem left eller right shift er nødvendig, idet shift af et negativt antal bits giver et udefineret resultat - men alt afhængig af hvilken compiler du bruger, er det muligt det virker uden alligevel. Hvis koden skal være portabel, vil jeg dog anbefale versionen herover.

Fra MS' side som shift operator i C/C++:
"The results are undefined if the right operand of a shift expression is negative or if the right operand is greater than or equal to the number of bits in the (promoted) left operand."
Avatar billede _et Praktikant
15. januar 2006 - 16:40 #4
Det er fint - Med lidt rettelser virker det i mit system.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester