Hast du den Output des ersten Schieberegisters mit dem Input(Data) des zweiten verbunden und den Output des zweiten mit Input des dritten?
Hier ein ausführliches Tutorial (engl., ab Kapitel 4).
könnte mir jemand unter die Arme greifen beim Verstehen helfen??
Ich habe 20 LED´s an drei Schieberegister Angeschlossen (74HC595) .....
Ziel ist es das alle LED nach ein nach einander angehen und bei der 20ten LED angekommen gehen alle wieder aus!
Ich komm aber mit der Bit Geschichte nicht klar, das will nicht in mein Kopf rein -.-
Ich denke ich hab verstanden das ich zuerst das dritte Schieberegister ansprechen muss, das es die letzte LED anmacht
weil ja immer durchgereicht wird ....
Dann bekomm ich auch noch nicht hin bzw, versteh ich´s nicht ganz, das bei mir alle drei Schieberegister das gleiche machen!
Kann mir da jemand Licht ins Dunkle bringen ?
Mfg Benny
Hast du den Output des ersten Schieberegisters mit dem Input(Data) des zweiten verbunden und den Output des zweiten mit Input des dritten?
Hier ein ausführliches Tutorial (engl., ab Kapitel 4).
Geändert von Sisor (23.03.2014 um 17:44 Uhr)
Die Daten für die LEDs werden nacheinander gesandt. In der Regel schreibt man die Daten für alle LEDs und übernimmt dann gleichzeitig die Daten aus den Schieberegistern zu den Ausgängen: Zuerst kommen die Daten für das Letzte der Schieberegister in der Reihe. Die Reihenfolge im Byte übernimmt in der Regel die SPI- (ggf. auch USART) Hardware im µC.
Das zusammensetzen der Daten muss man vorab im Programm machen, etwa mit D = (D << 1) +1 für das anschalten. D sollte dabei wenigstens 20 Bit Breit sein, also etwa long. Zu senden sind dann erst das 3. Höchste Byte, dann das 2. und zuletzt das low Byte.
Für den Fall das die LEDs nacheinander an / Ausgehen sollte, könnte man ausnahmsweise auch das Schiebend er Daten sofort sichtbar machen. Also erst 20 mal eine 1 rein schieben und dann gleich Übernehmen. Damit gehen die LEDs nacheinander an. Danach das ganze mit einer 0 wiederholen.
ja sisor hab es richtig verbunden denke ich, habe es nach diesem Schaltbild ausgebaut:
das is mein code dazu, habe ihn schon von zwei auf drei Schieberegister geändert:
hier der code:
wie gesagt vom Code her das die LED einzeln nacheinander angehen erstmal ned schlimm, erstmal verstehen das alle nacheinander angehen.Code://Pin connected to ST_CP of 74HC595 int latchPin = 4; //Pin connected to SH_CP of 74HC595 int clockPin = 3; ////Pin connected to DS of 74HC595 int dataPin = 2; void setup() { //set pins to output because they are addressed in the main loop pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { int data1 = 256; int data2 = 1; int data3 = 2; for(int i=0; i<8; i++) { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, data1 >>8); shiftOut(dataPin, clockPin, MSBFIRST, data2 & 255); shiftOut(dataPin, clockPin, MSBFIRST, data3 & 255); digitalWrite(latchPin, HIGH); data1*=2; data2*=2; data3*=2; delay(1000); } }
@ besserwessi,
ja das hab ich verstanden das ich zuerst das letze ansprechen muss und dann das vorletzte und dann das erste,
aber wie ich das umsetze O.o
hier noch ein Bild wie es im echten aussieht:
Ich hab noch nicht mit mehreren Schieberegistern gearbeitet, daher ist der folgende Code ohne Gewähr.
So hab ich das verstanden:Code:long data = 0; // alle Bits aus -> alle LEDs aus void loop() { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, data >>16); shiftOut(dataPin, clockPin, MSBFIRST, data >>8); shiftOut(dataPin, clockPin, MSBFIRST, data); digitalWrite(latchPin, HIGH); data = (data<<1)+1; if (data > 1048576) data = 0; // 1048576 = 2^20 delay(1000); }
okay...... also funktunieren tust genau so wie ich es mir vorgestellt habe!
jetzt muss ich nur noch mit while(1); das ganze begrenzen auf einmal
so funktioniert es doch wenn man was nur ein mal ausführen möchte oder ?
oder kann man es auch in die Setup Funktion schreiben? wie macht man es richtig wenn man
was nur einmal ausführen will?
das ich es aber auch verstehe frage ich nochmal, möchte es ja auch verstehen
data = (data<<1)+1;
if (data > 1048576) data = 0; // 1048576 = 2^20
diesen teil verstehe ich nicht, bzw is mir nicht so klar .... wo kann man sowas nachlesen
oder dieses Wissen herbekommen ... echt klasse =)
und du hast in der shiftOut Methode noch >>16 >>8 geändert und dann nur data
damit sprichst du erst den dritten, dann den zweiten und zu letzt das erste Schieberegister an richtig ?
Die Funktion hier kannst du im setup mit ledLine(); aufrufen.
Jedes Bit im long data repräsentiert letztendlich eine LED. Das kleinste Bit wird durch die Zahl 1 dargestellt, das nächstgrößere durch 2, dann 4,8,16... D.h. man kann auch sagen 2^n = repräsentierende Zahl. Bsp: 2^4 = 16, also repräsentiert 16 die 4.LED. Insgesamt gibt's 20 LEDs, also ist nach 2^20 = 1048576 Schluss.Code:void ledLine() { long data = 0; // alle Bits aus -> alle LEDs aus while (data <= 1048576) { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, data >>16); shiftOut(dataPin, clockPin, MSBFIRST, data >>8); shiftOut(dataPin, clockPin, MSBFIRST, data); digitalWrite(latchPin, HIGH); data = (data<<1)+1; delay(1000); } }
Ja, richtig.und du hast in der shiftOut Methode noch >>16 >>8 geändert und dann nur data
damit sprichst du erst den dritten, dann den zweiten und zu letzt das erste Schieberegister an richtig ?
Im Zweifelsfall Elektrotechnik studieren, so wie ich.diesen teil verstehe ich nicht, bzw is mir nicht so klar .... wo kann man sowas nachlesen
oder dieses Wissen herbekommen ... echt klasse =)
Geändert von Sisor (23.03.2014 um 19:03 Uhr)
also man muss void loop() durch void ledLine() ersetzen, nur mit while(1); geht es nicht ?
okay dann muss ich mir das bei Wiki oder so mit den bit und Byte nochmal genau anschauen und durchlesen.
Ah ja Elektrotechnik studiert, daher weht der Wind, ich als Konstrukteur beherrsche nur die Technische Seite
Könnte man erahnen wenn mein mein Roboter genauer anschaut, wie schon erwähnt, muss mal ne ruhige Minute
finden und ein ausführlichen Bericht schreiben, bzw hier im Forum vorstellen.
Aber so langsam wird's
Die 20 LED´s dienen dazu mir ein Ladebalken zu erstellen, wenn ich die Fernsteuerung meines Roboter RSL-7 einschalte,
bis alle Systeme gebootet und hochgefahren sind, anzeigt.
Habe mir folgendes bei Reichelt bestellt:
Das ihr auch wisst für was die 20 LED gut sind
Wenn dann die Arduinos und die Funkmodule da sind und der LED Ladebalken auch .... gehts mächtig ans löten und basteln
Hübsches Projekt, ich hoffe du hältst das Forum auf dem Laufenden!
Nur zum Verständnis: while(1) ist eine Endlosschleife. Übersetzt: Solange die Bedingung in den Klammern nicht 0 ist tue{...}. Und bevor 1 = 0 ist friert die Hölle ein.
ja ich werde noch einen ausführlichen Bericht machen das is versprochen, hab ja auch noch jede Menge vor mit meinem Roboter ....
Zur Zeit bin ich an einem 5-Achs Roboter Arm dran, aber ich will nichts verraten
Eine Frage noch zu dem Code? .... habe jetzt dein void ledLine89 eingefügt und jetzt lässt es sich nicht mehr Kompilieren O.o
Code:int latchPin = 4; int clockPin = 3; int dataPin = 2; void setup() { pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void ledLine() { long data = 0; // alle Bits aus -> alle LEDs aus while (data <= 1048576) { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, data >>16); shiftOut(dataPin, clockPin, MSBFIRST, data >>8); shiftOut(dataPin, clockPin, MSBFIRST, data); digitalWrite(latchPin, HIGH); data = (data<<1)+1; delay(1000); } }
Lesezeichen