Forum: Mikrocontroller und Digitale Elektronik Arduino LED Schieberegibster


von Mario (Gast)


Lesenswert?

Hallo Jungs,
Hab folgendes Problem und bitte um Hilfe.

Habe ein Schieberegister mit 8 LED´s an meinem Arduino Borad.
Des weiteren befindet sich ein Taster auf dem Arduino Board.
Ich möchte das sobald ich den Taster betätige die LED´s von links nach 
rechts durchlaufen, bzw wenn ich auf dem Taster bleibe die LED´s der 
reihe nach an gehen, und an bleiben bis ich den Taster wieder öffne und 
dann der reihe nach aus gehen.

Ich möchte Digital dem Eingang auslesen woran der Taster hängt:

Value = digitalRead (buttonPin);

Value ist somit mein Ergebniss also 0 oder 1.

Gibt es da eine Automatisierung oder wie stelle ich das an das aus der 1 
von Taster folgende Werte erstellt werden:


         LED 1, LED 2, LED 3, LED 4; LED 5, LED 6, LED 7, LED 8;

           1      2      4      8     16      32     64     128




Das Schieberegister spreche ich mit Zahlen von 0 - 255 an.
Der Wert 0 - 255, wird mit j übergeben.

von Karl H. (kbuchegg)


Lesenswert?

Mario schrieb:

> Gibt es da eine Automatisierung oder wie stelle ich das an das aus der 1
> von Taster folgende Werte erstellt werden:
>
>
>          LED 1, LED 2, LED 3, LED 4; LED 5, LED 6, LED 7, LED 8;
>
>            1      2      4      8     16      32     64     128

Wenn du genau schaust, ist jede Zahl weiter rechts immer das doppelte 
der Zahl links.

Und nein. Nicht für alles gibt es fertige Komponenten, die du einsetzen 
kannst. Das nennt man dann eben programmieren. Sonst wärs ja auch 
einfach und es würde nicht Jahre dauern, bis man ordentlich 
programmieren kann.

von Mario (Gast)


Lesenswert?

Ja das ist klar das Das ergebniss immer mal 2 genommen wird.
Aber wie mache ich das das er mir alle 100ms die Zahl mit 2 
multipliziert.

Habe folgendes versucht:

int Value1 = Value;
Value1 = Value1 *2;
allerdings ist dann das ergebniss immer 2

von Karl H. (kbuchegg)


Lesenswert?

Mario schrieb:
> Ja das ist klar das Das ergebniss immer mal 2 genommen wird.
> Aber wie mache ich das das er mir alle 100ms die Zahl mit 2
> multipliziert.
>
> Habe folgendes versucht:
>
> int Value1 = Value;
> Value1 = Value1 *2;
> allerdings ist dann das ergebniss immer 2


und wenn du dann nochmal

  Value1 = Value1 * 2;

machst, dann ist das Ergebnis 4

und beim nöchsten mal

  Value1 = Value1 * 2;

ist das Ergebnis 8


Hmmm.

  int Value1 = 1;

  Value1 = Value1 *2;   // 2. die müsste man jetzt auf das
                        // Schieberegister ausgeben


  Value1 = Value1 * 2;  // 4. Auch die müsste man jetzt auf das
                        // Schieberegister ausgeben


  Value1 = Value1 * 2;  // 8. Auch die müsste man jetzt auf das
                        // Schieberegister ausgeben

  ...


Im Prinzip ist das doch immer der gleiche Code. Da gibts doch noch was. 
Das nennt sich: eine Schleife. In einer Schleife kann man Code 
wiederholen lassen.

   Value1 = 1;
   for( i = 0; i < 8; i++ ) {
     Value1 am Schiebregister ausgeben
     bischen warten
     Value1 = Value1 * 2;
   }

von Mario (Gast)


Lesenswert?

int Value = digitalRead (buttonPin);

    Value1 = Value;
   for ( i = 0; i < 8; i++ ) {
   Value1 = Value1 * 2;
   }

   j = Value1;

    Serial.println (Value1);

wenn ich es so ausführe ist Value1 immer 256 sobald der taster betätigt 
wird er zählt nicht erst die schritte hoch

von Karl H. (kbuchegg)


Lesenswert?

Mario schrieb:
> int Value = digitalRead (buttonPin);
>
>     Value1 = Value;
>    for ( i = 0; i < 8; i++ ) {
>    Value1 = Value1 * 2;
>    }
>
>    j = Value1;
>
>     Serial.println (Value1);
>
> wenn ich es so ausführe ist Value1 immer 256 sobald der taster betätigt
> wird er zählt nicht erst die schritte hoch

Doch tut er. Er tut das genau hier

>    for ( i = 0; i < 8; i++ ) {
>    Value1 = Value1 * 2;
>    }

Nur: Du machst nichts mit den Zwischenstufen!
Wenn du sie sehen willst, dann musst du auch was damit tun!

  for ( i = 0; i < 8; i++ ) {
    Serial.println (Value1);
    Value1 = Value1 * 2;
  }

Der Computer tut genau und zu 100% das, was du hingeschrieben hast. Von 
alleine passiert da gar nichts. Wenn du keine Anweisung gibst, die 
Zwischenergebnisse auszugeben, dann werden die auch nicht ausgegeben, 
sondern nur der Endstand nach 8 mal verdoppeln. Und der ist 
logischerweise 256.

von Mario (Gast)


Lesenswert?

Ja ok das sehe ich ein.
Aber wie bekomme ich die Zwischenstufen raus.

von Mario (Gast)


Lesenswert?

Ok das mit der Zwischenausgabe habe ich hinbekommen.
Aber ist doch niht so das ware.

Gibt es die möglichkeit einen Taster auszulesen und das ergebnis in 8bit 
binärcode auszugeben.

so das sich alle 10 ms eine 1 wenn taster gedrückt oder eine 0 wenn 
nicht gedrück von links nach rechts in den binär code schiebt

von PittyJ (Gast)


Lesenswert?

Es wird wohl Zeit für ein gutes C-Buch.

Dort enthalten sind z.B. Shift-Operationen (Schieben), logische 
Verknüpfungen (um ein Bit an ein bestimmte Stelle setzen) und noch 1000 
andere interessante Details.

Vielleicht lohnt sich auch ein Blick in den Arduino-Dokumentation
http://arduino.cc/en/Reference/HomePage
Dort wird z.B. beschrieben, wie man ihn mit delay warten lassen kann.

Damit sollte sich dein Programm in 20 Zeilen erledigen lassen.

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.