Lauflicht uController

Gast #2342117
Lesenswert?

Hallo zusammen
Ich habe eine Frage bezüglich eines Lauflichts mit der Schiebefunktion.
Kann mir jemand die Bedingung in der if-Abfrage ganz genau erläutern.
------------------------------------------------------------------------ 
-----
int main()
{
  int i=1;
  DDRB=255;
  while(1)
  {
    PORTB=i;
    _delay_ms(250);
    if(!(i&(1<<7)))
    {
      i=i<<1;
    }
    else i=1;
  }
}
------------------------------------------------------------------------ 
-----
Danke im Voraus
mfg Raini_Breite
Gast #2342140
Lesenswert?

Hallo
erst mal danke für die schnelle antwort.
Ich habe es leider noch nicht ganz verstanden. Ich will damit 8 LED's 
ansteuern aber ich verstehe es nicht wieso da die 7 steht und wieso 
alles negiert wird.
Die &-Verknüpfung ist einfach das mit der Maske oder?
mfg Raini_Breite
Gast #2342153
Lesenswert?

1<<7 -> = 128...

d.h. auf i wird ein and 128 gemacht und das negiert...das heisst wenn 
das hoechste bit nicht gesetzt ist shiftet er sonst setzt er i wieder 
auf 1...

bit 7 ist ja das letzte bit danach muss ja wieder das bit 0 (also 1 ) 
gesetzt werden sonst laeuft es ja nicht ;) sprich ist nur dafuer da um 
den sprung von der letzten led zur ersten zu machen...
Gast #2342191
Lesenswert?

das ausrufezeigen negiert nur... z.b.

bei einem lauflicht hast du ja 8 positionen

bit 7 entspricht ja 128

7      0

00000001 i&(128) = 0 !i&(128) -> 1
00000010 i&(128) = 0 !i&(128) -> 1
00000100 i&(128) = 0 !i&(128) -> 1
00001000 i&(128) = 0 !i&(128) -> 1
00010000 i&(128) = 0 !i&(128) -> 1
00100000 i&(128) = 0 !i&(128) -> 1
01000000 i&(128) = 0 !i&(128) -> 1
10000000 i&(128) = 1 !i&(128) -> 0

wenn eine if anweisung 1 oder true hat geht sie ja in den ersten zweig 
sonst in den else zweig...
sprich bei den ersten 7 shifted er bei dem letzten macht er den sprung 
von bit 7 zu 1...
Gast #2342201
Lesenswert?

bisschen einfacher zu lesen waere z.b. das:

int main()
{
  char i=1;
  DDRB=255;
  while(1)
  {
    PORTB=i;
    _delay_ms(250);
    if(i>0)
    {
      i=i<<1;
    }
    else i=1;
  }
}

wenn bit 7 gesetzt ist wird die zahl bei einem char negativ... sprich so 
lange es groesser 0 ist wird geshiftet sonst der sprung gemacht...
Moderator (Firma: Titel) Persönliche Seite #2342403
Lesenswert?

tim schrieb:
> noch einfacher waere das:
     PORTB=1<<(i++&7);
Das ist allerdings ganz was anderes als der ursprüngliche Ansatz, denn 
hier wird die 1 unterschiedlich weit geschoben. Im Original wird mit dem 
Schiebebefehl nur die Maske berechnet:
     if(!(i&(1<<7)))

tim schrieb:
> bisschen einfacher zu lesen waere z.b. das:
>     if(i>0)
Unter der impliziten Annahme, dass i vorzeichenbehaftet ist....

Raini_Breite schrieb:
> Kann mir jemand die Bedingung in der if-Abfrage ganz genau erläutern.
Das hier:
    if(!(i&(1<<7)))   i=i<<1;
    else              i=1;
heißt im Klartext: wenn das MSB nicht gesetzt ist, dann schiebe i um 
eins nach links.
Das könnte auch so aussehen:
    if( i&(1<<7) )  i=1;
    else            i=i<<1;
Oder so:
    if(i&0b10000000) i=1;
    else             i=i<<1;
#2342423
Lesenswert?

Man kann fast alles beliebig komplex und kryptisch schreiben.

Für einen Anfänger ist aber wohl das hier
1
  while( 1 ) {
2

3
    PORTB = 0x01;
4
    delay_ms( 250 );
5

6
    for( i = 0; i < 6; ++i ) {
7
      PORTB = PORTB << 1;
8
      delay_ms( 250 );
9
    }
10
  }

die wohl am einfachsten zu verstehende Variante.

Und Reini. Auf sowas solltest du schon auch alleine kommen.
#2343664
Lesenswert?

00000001 du kannst jetzt 7 mal nach links schieben dann steht die 1 ganz 
links wenn du weiter schiebst verschwindet sie vielleicht im Nirvana. 
Aber das ganz man verhintern, z.B. durch den passenden Befehl oder einen 
Begrenzung damit man nicht über 255 und unter 1 schieben kann.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren