Forum: Mikrocontroller und Digitale Elektronik Shiftregister in C realisieren


von Chris (Gast)


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...
1
  for(int i=7;i>=0;i--)
2
  {
3
    if(Data & (1<<i)
4
    {
5
      PORTB |= (1<<PB3);
6
    }
7
    else
8
    {
9
      PORTB &= ~(1<<PB3);
10
    }
11
  }
Mfg Chris

von (geloescht) (Gast)


Lesenswert?

(Dieser Beitrag wurde geloescht)

von Magnus Müller (magnetus) (Gast)


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.

von Karl H. (kbuchegg)


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;
  }

von Profi (Gast)


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

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.