Schieberegister, einzelne Bits ansprechen.

Hallo zusammen,

ich hoffe die Community hier kann mir weiter helfen...

Kurze Erklärung:

Ich möchte einen Schieberegister verwenden, um Ausgänge für LEDs zu sparen...
Soweit so gut...

Kleines BSP

Eine LED-Gruppe besteht aus 4 RGB-LEDs, die Parallel verschaltet werden.
Das heißt mit einem Ausgang vom Schieberegister kann ich alle vier LEDs in blau leuchten lassen und mit einem zweiten Ausgang dann alle in rot und mit dem dritten alle grün..
Natürlich nacheinander.
Funktioniert auch alles.

Jetzt kommt mein Problem:

die zweite LED-Gruppe (auch 4 RGB-LEDs) würde ich gerne unabhängig von der ersten Gruppe, je nach Bedingung über den gleichen Schieberegister steuern.

Ist es möglich dem Schieberegister zu sagen, dass er zb. nur meinen 5. Ausgang schaltet OHNE die anderen Bits zu ändern???

Arbeiten tue ich mit Konstanten
zb "00000010" wird eingesetzt wenn ich Ausgang 2 auf "1" setzen möchte.

Wenn nun die zweite LED-Gruppe durch eine Bedingung leuchten soll, z.B. am Ausgang 5:
"00010000", dann würde ich Ausgang 2 auf Null setzen.

Das würde ich gerne umgehen, in dem ich sage:
6. Stelle im Byte auf "1".
Geht das überhaupt?

Ich hoffe die Erläuterung ist nicht allzu kompliziert...
Schon mal vielen Dank!

Arduino Mega
Schieberegister: 74HC 595
Q0-Q02 LED-Gruppe 1
Q03-Q05 LED-Gruppe 2

die zweite LED-Gruppe (auch 4 RGB-LEDs) würde ich gerne unabhängig von der ersten Gruppe, je nach Bedingung über den gleichen Schieberegister steuern.

Nein, ein 74HC 595 kann das nicht!
Aber wieso kannst du dir den alten Wert nicht merken und dort ändern, und das Zeugs dann raus schieben.

Das würde ich gerne umgehen, in dem ich sage:
6. Stelle im Byte auf "1".
Geht das überhaupt?

Auch das würde gehen....

buffer|=_BV(5);

combie:
Nein, ein 74HC 595 kann das nicht!
Aber wieso kannst du dir den alten Wert nicht merken und dort ändern, und das Zeugs dann raus schieben.

Erst mal danke für die schnelle Antwort.

Das heißt ich kann meinen Schieberegister auslesen, abspeichern, und dann den zweiten Code mit dem ersten zusammenführen?
Oder für jede Möglichkeit eine Konstante?

Bei meinem Projekt sind das insgesamt 20 LED-Gruppen a 3 Ausgänge über ein Schieberegister, die alle unterschiedlich leuchten falls die Bedingung passt....

Sorry.. bei Schieberegistern tue ich mich schwer..

combie:
Auch das würde gehen....

buffer|=_BV(5);

Könntest du das etwas detaillierter beschreiben?

iyiduino:
Sorry.. bei Schieberegistern tue ich mich schwer..

Dann könntest Du MCP23017 verwenden, mehrere davon am I2C-Bus. Die passende Bibliothek von Adafruit macht das Ein- und Ausschalten von Pins einfach.

Oder Du verwendest Adafruit 24-Channel 12-bit PWM LED Driver - SPI Interface - TLC5947 oder Adafruit 16-Channel 12-bit PWM/Servo Driver - I2C interface - PCA9685.

Nur mal so als Alternative.

Könntest du das etwas detaillierter beschreiben?

das verodert das 5. Bit.
Also wird das 5. Bit gesetzt.

Aber zurück zum Anfang: Warum Schieberegister - und nicht LED-Treiber wie ein MAX7219, HT16K33, SX1509 - alles bessere Varianten als so ein Schieberegister!
Echte LED-Treiber - bei einigen sparst dir dann sogar viele Widerstände.

Das heißt ich kann meinen Schieberegister auslesen,

Nein.

Aber du kannst dir das Rauszuschiebende in einem Buffer merken.


das verodert das 5. Bit.
Also wird das 5. Bit gesetzt.

Wenn man davon ausgeht, dass Q0 das erste Bit ist, dann ist Q5 das 6te Bit.
:smiling_imp: :smiling_imp: :smiling_imp:


Suchtipp: "Arduino github 74HC595"

0 oder 1, das ist hier die Frage...

Zur Entwirrung für den TO vieleicht so

/* Name      bit7  bit6  bit5  bit4  bit3  bit2  bit1   bit0 
 _BV(0)  =    0      0    0     0      0     0    0      1 
 _BV(2)  =    0      0    0     0      0     1    0      0 
 _BV(7)  =    1      0    0     0      0     0    0      0 
 */

noiasca:
0 oder 1, das ist hier die Frage...

Eigentlich nicht, da das niederwertigste Bit die logische Position 0 (2 hoch 0) hat.

Gruß Tommy

Wie heißt es so doch schön:

Es gibt exakt 10 Sorten von Leuten!
Nämlich die, welche das Binärsystem verstanden haben und die, welche es nicht kapieren.

Genau :wink:

Gruß Tommy

Eine LED-Gruppe besteht aus 4 RGB-LEDs, die Parallel verschaltet werden.
Das heißt mit einem Ausgang vom Schieberegister kann ich alle vier LEDs in blau leuchten lassen und mit einem zweiten Ausgang dann alle in rot und mit dem dritten alle grün..
Natürlich nacheinander.
Funktioniert auch alles.

Hast Du Leistungsschieberegister? Hat jede LED seinen Vorwiderstand?

Schieberegister gibt es als
SIPO (serial IN - Paralell OUT) und
PISO (Paralell IN Serial OUT)

Das funktioniert immer nur in eine Richtung: Eingang nach Ausgang.

Du kannst in einer Variable den Wert den Du rausschickst abspeichern. So hast Du für das nächste mal den Wert parat.

Grüße Uwe

noiasca:
Aber zurück zum Anfang: Warum Schieberegister - und nicht LED-Treiber wie ein MAX7219, HT16K33, SX1509 - alles bessere Varianten als so ein Schieberegister!
Echte LED-Treiber - bei einigen sparst dir dann sogar viele Widerstände.

Schieberegister waren dann doch nicht die beste Lösung nachdem ich mir die ganzen anderen Treiber angesehen habe.
Dank
agmue
und
noiasca
Habe mich für was komplett anderes entschieden. Werden RGB Ring LEDs...

Trotzdem nochmal danke an alle.

uwefed:
Hast Du Leistungsschieberegister? Hat jede LED seinen Vorwiderstand?

Die Elektronik passt soweit.. Widerstände, Transistoren etc pp
Wobei Widerstände jetzt integriert sein werden.

Ist mein erstes Projekt. Mal sehen wann der nächste Post kommt?!

Gruß

iyiduino:
Werden RGB Ring LEDs...

Es gibt unterschiedliche Typen, eine Nachfrage hier könnte Dich vor einem Fehlkauf schützen!

agmue:
Es gibt unterschiedliche Typen, eine Nachfrage hier könnte Dich vor einem Fehlkauf schützen!

Die Typ-Bezeichnung lautet WS2812b insg. 12 RGB LEDs

Gruß

iyiduino:
Die Typ-Bezeichnung lautet WS2812b insg. 12 RGB LEDs

Das dürfte unkritisch sein :slight_smile:

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.