mikrocontroller.net

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


Autor: Ladi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ladi (Gast)
Datum:

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

thx

Autor: Andreas W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Ladi: Such mal im Forum nach "Software SPI"

Autor: Ladi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann mir da keiner ein code beispiel geben?

please

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

Autor: Andreas W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.mikrocontroller.net/forum/read-1-109099...
void write_data(unsigned char data) //msb first
{
  unsigned char loop, mask;

  for(loop=0, mask=0x80; loop<8; loop++, mask=mask>>1)
  {
    if(data & mask)
    {
      PORTC |= (1<<PC0);
    }
       else
    {
      PORTC &= ~(1<<PC0);
    }
  }
}

Autor: Ladi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
thx Andreas W.

Autor: Oliver Regenfelder (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
void write_data(unsigned char data) //msb first 
{ 
  unsigned char mask; 
 
  for(mask=0x80; mask!=0; mask>>=1)
  { 
    if(data & mask) 
    { 
      PORTC |= (1<<PC0); 
    } 
    else 
    { 
      PORTC &= ~(1<<PC0); 
    }
  } 
}

mfg

Oliver

Autor: Mark (Gast)
Datum:

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

thx mark

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und für was ist mask>>=1?

Mark

Autor: Andreas W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mask einmal nach >> rechts schieben.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.