www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Shiftregister in C realisieren


Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich wollte fragen, ob mein nachfolgender Code einem Shiftregister
gleichkommt... ist grad etwas spät und ich bin mir nicht wirklich sicher
ob das so klappt... das Shiftregister soll vom MSB zum LSB durchgehen...
falls jemand einen besseren Vorschlag hat bin ich dafür gerne offen...
  for(int i=7;i>=0;i--)
  {
    if(Data & (1<<i)
    {
      PORTB |= (1<<PB3);
    }
    else
    {
      PORTB &= ~(1<<PB3);
    }
  }
Mfg Chris

Autor: (geloescht) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(Dieser Beitrag wurde geloescht)

Autor: Magnus Müller (magnetus) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube, dat funzt.

@guido: (1<<PB3) ist schon ok. Wenn das "i"-te Bit in "Data"
gesetzt ist (Data&(1<<i)) wird PB3 gesetzt, anderenfalls wird PB3
gelöscht.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Prinzip geht das schon.

(Du moechtest die 8 Bits aus Data seriell an PB3
'hinaustakten' )

1 << i  ist aber auf vielen Prozessoren ein
Zeitfresser, da die meistens nur um eine Stelle shiften
koennen. Der Compiler implementiert dann sowas wie

    unsigned char Tmp = 1;
    for( int j = 0; j < i; ++j )
      Tmp = Tmp << 1;

Das geht auch einfacher:
Du willst von Data immer das 7. Bit abnehmen und shiftest
Data immer um eine Stelle unter diesem 7. Bit durch:

  unsigned char Temp = Data;

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

    if( Temp & 0x80 )
      PORTB |= (1<<PB3);
    else
      PORTB &= ~(1<<PB3);

    Temp = Temp << 1;
  }

Autor: Profi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
/*
oder anderherum:

  unsigned char Temp = 0x80;

  while(Temp){

    if( Data & Temp )
      PORTB |= (1<<PB3);
    else
      PORTB &= ~(1<<PB3);

    Temp /= 2;
  }

oder noch kürzer:
  unsigned char Temp = 0x80;
  do
    if( Data & Temp )
      PORTB |= (1<<PB3);
    else
      PORTB &= ~(1<<PB3);
  while(Temp /= 2);   //solange wiederholen, bis das Bit weg ist
//while(Temp >>= 1);  //ginge auch

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.