Forum: Compiler & IDEs C Befehle für schieben und rollen


von Ladi (Gast)


Lesenswert?

Hi, ich suche die C-Befehle für schieben und rollen. in asm ist nach
links schieben ja glaub ich LSL oder? gibts dafür auchn befehl in C?

THX

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

<< und >> schieben.

Rollen gibt's nicht wirklich.  Je nach Intelligenz des Compilers kann
er eine Verschiebung a la

foo = ((bar & 0x80) >> 7) | (bar << 1);

erkennen und sehen, dass dafür ein rotate taugen würde.  Ansonsten
kann man in zeitkritischem Code eventuell an inline asm dafür
denken.

von Ladi (Gast)


Lesenswert?

ja und wie schaut das dann aus wenn ich an PortC an Pin0 0b00010000
hinausschieben möchte?

thx

von Andreas W. (Gast)


Lesenswert?

@Ladi: Such mal im Forum nach "Software SPI"

von Ladi (Gast)


Lesenswert?

kann mir da keiner ein code beispiel geben?

please

@Andreas W.: hast du den link für dieses forum?

von Andreas W. (Gast)


Lesenswert?

http://www.mikrocontroller.net/forum/read-1-109099.html#109191
1
void write_data(unsigned char data) //msb first
2
{
3
  unsigned char loop, mask;
4
5
  for(loop=0, mask=0x80; loop<8; loop++, mask=mask>>1)
6
  {
7
    if(data & mask)
8
    {
9
      PORTC |= (1<<PC0);
10
    }
11
       else
12
    {
13
      PORTC &= ~(1<<PC0);
14
    }
15
  }
16
}

von Ladi (Gast)


Lesenswert?

thx Andreas W.

von Oliver Regenfelder (Gast)


Lesenswert?

Die Loop kann noch etwas vereinfacht werden, da links shiften
für unsigned char von links mit nullen auffüllt kann man die
Ausgabeschleife auch wie folgt schreiben:
1
void write_data(unsigned char data) //msb first 
2
{ 
3
  unsigned char mask; 
4
 
5
  for(mask=0x80; mask!=0; mask>>=1)
6
  { 
7
    if(data & mask) 
8
    { 
9
      PORTC |= (1<<PC0); 
10
    } 
11
    else 
12
    { 
13
      PORTC &= ~(1<<PC0); 
14
    }
15
  } 
16
}

mfg

Oliver

von Mark (Gast)


Lesenswert?

Hi kann mir einer erklären für was die MASK sein soll?

thx mark

von Rick Dangerus (Gast)


Lesenswert?

Mit der Maske wird immer nur ein Bit eingeblendet
(0x80 = 0b100000). In der for-Schleife wird das Bit der Maske über Dein
Datenbyte geschoben und geguckt, was bei einer UND-Verknüpfung
rauskommt.

Rick

von Mark (Gast)


Lesenswert?

und für was ist mask>>=1?

Mark

von Andreas W. (Gast)


Lesenswert?

mask einmal nach >> rechts schieben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.