Pages: [1]   Go Down
Author Topic: 4LED Binärzähler PIN-Array?  (Read 1001 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi Folks,

meine Freundin hat mir gestern den gewünschten Arduino UNO geschenkt, und heute musste ich natürlich direkt anfangen...

Mein Ziel ist es, einen Binärzähler zu bauen, der von 0000 bis 1111 zählt.

4 LEDs habe ich schon mit den PINs 2-6 verbunden.

Als erstes habe ich ein Lauflicht geschrieben, welches tatsächlich jede einzelne LED nacheinander ein und ausschaltet.
Dann habe ich einen Codeschnipsel gefunden der diese Lauflichtfunktion in eine loop-Schleife verpackt, ist sinnvoller.

Meine Frage: kann ich (in Ermangelung eines Schieberegisters) ein PIN-Array definieren , sodass ich nur ein byte an dieses Array schicke und demnach die LEDs leuchten?

Also in Hochsprache: "gebe 0110 auf meinem LED-Array aus"
und dann würden die LEDs 2 und 3 leuchten?

Dann könnte ich ja in einer Schleife hochzählen und in jedem Schritt den wert in byte umwandeln und einfach an das Array schicken.

In erwartungsvoller Vorfreude

nahtanoy
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20298
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
4 LEDs habe ich schon mit den PINs 2-6 verbunden.
Das sind 5 Leds oder PIN 2-5. Ich hoffe Du hast Vorwiderstände an die LED getan.

Quote
Meine Frage: kann ich (in Ermangelung eines Schieberegisters) ein PIN-Array definieren , sodass ich nur ein byte an dieses Array schicke und demnach die LEDs leuchten?
Ja ist möglich.

Quote
Also in Hochsprache: "gebe 0110 auf meinem LED-Array aus"
und dann würden die LEDs 2 und 3 leuchten?
Das müßten dann die LEDs 3 und 4 sein.
Grüße Uwe

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

dein aktueller wert ist in einer byte variable.

dann liest du das entsprechende bit mit bitread aus.

also

wenn bitread(zählvariable,bit) == 1 dann entsprechende led an; else led aus;
das ganze 4 mal für die entsprechenden bits und leds.

dann gäbe es noch die möglichkeit mit << >> zu shiften.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@uwefed:

Du hast recht, das war der Unterschied zwischen zählen und rechnen, ich habe beim schreiben nur Pin2 im Kopf gehabt und 4 addiert, tut mir leid.
Ja, ich habe Vorwiderstände benutzt.
Du hast mir eine sehr präzise Antwort gegeben, leider etwas zu präzise, vielleicht hättest Du mir mehr geholfen wenn Du einen Lösungsansatz mit aufgeführt hättest.
Wenn ich 4 LEDs habe, leuchten LED 2+3, die wären an Pin 3+4.

@PhunThom:

Dankeschön, deine Antwort hat mir schon viel weiter geholfen als LED-zählerei und eine Bestätigung der Möglichkeit.


Bis jetzt habe ich es folgendermassen gelöst, vielleicht habt Ihr ja noch Verbesserungsvorschläge:

Code:
void setup (){
  Serial.begin(9600);              //Serielle Ausgabe einleiten zum debuggen
   for (int loop = 2; loop < 6; loop++){
        pinMode (loop, OUTPUT);    // PINs 2-5 definieren
        digitalWrite (loop, LOW);  // PINs direkt ausschalten
   }
}
byte binwert;                      // definiert eine Variable als byte

void loop(){
  for (int zaehler=0; zaehler < 16;zaehler++){ //zählt von 0 bis 15 (also 16 Schritte)
    delay(500);                    // wartet eine halbe Sekunde, für die Optik
    binwert = byte(zaehler);       // schreibt die aktuelle Zahl als binärwert in binwert
    Serial.println(binwert,BIN);   // gibt den aktuellen binärwert Seriell aus (nur zum debuggen)
    for (int n=0; n <4; n++){      // zählt von 0 bis 3 (4 Schritte) um jedes einzelne bit des halbbytes abzufragen
      if (bitRead(binwert,n)==1){  // wenn das aktuelle bit eine eins ist
       digitalWrite(n+2,HIGH);    // setze den entsprechenden PIN auf 1
      }
      else{
       digitalWrite(n+2,LOW);     // ansonsten setze den PIN auf 0
      } 
   }
  }
 }
Logged

0
Offline Offline
Faraday Member
**
Karma: 19
Posts: 3420
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Meine Standardantwort auf alle Blinklicht Fragen: schau mal auf meine Seite www.blinkenlight.net. Da findest Du nicht nur die Antwort auf Deine Frage sondern bestimmt auch gleich noch ein paar weitere Ideen smiley-wink
Logged

Check out my experiments http://blog.blinkenlight.net

Offline Offline
Newbie
*
Karma: 0
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
void setup (){
  Serial.begin(9600);              //Serielle Ausgabe einleiten zum debuggen
   for (int loop = 2; loop < 6; loop++){
        pinMode (loop, OUTPUT);    // PINs 2-5 definieren
        digitalWrite (loop, LOW);  // PINs direkt ausschalten
   }
}
byte binwert;                      // definiert eine Variable als byte

void loop(){
  for (int zaehler=0; zaehler < 16;zaehler++){ //zählt von 0 bis 15 (also 16 Schritte)
    delay(500);                    // wartet eine halbe Sekunde, für die Optik
    binwert = byte(zaehler);       // schreibt die aktuelle Zahl als binärwert in binwert
    Serial.println(binwert,BIN);   // gibt den aktuellen binärwert Seriell aus (nur zum debuggen)
    for (int n=0; n <4; n++){      // zählt von 0 bis 3 (4 Schritte) um jedes einzelne bit des halbbytes abzufragen
      if (bitRead(binwert,n)==1){  // wenn das aktuelle bit eine eins ist
       digitalWrite(n+2,HIGH);    // setze den entsprechenden PIN auf 1
      }
      else{
       digitalWrite(n+2,LOW);     // ansonsten setze den PIN auf 0
      }  
   }
  }
 }

Also eine variable loop zu nennen ist problematisch, da du ja eine prozedur hast die loop heisst. auch wenn es gehen sollte, würde ich das nicht machen.

du kannst dir binwert sparen.

der code macht exakt das selbe (habs nicht compiliert)

Code:
void loop(){
  for (byte zaehler = 0; zaehler < 16; zaehler++) { //zählt von 0 bis 15 (also 16 Schritte)
    delay(500);                    // wartet eine halbe Sekunde, für die Optik
    Serial.println(zaehler,BIN);   // gibt den aktuellen binärwert Seriell aus (nur zum debuggen)
    for (byte n = 0; n <= 3; n++) digitalWrite(n + 2, bitRead(zaehler,n)); //bitread ist 0 oder 1 // low = 0 und high = alles > 0
  }
}
« Last Edit: December 27, 2011, 11:15:54 am by PhunThom » Logged

Pages: [1]   Go Up
Jump to: