Fragen zum Shift-Register und Matrixsteuerung

Guten Tag zusammen!

Ich freue mich, jetzt endlich die Möglichkeit zu haben, das Thema Shift-Register anzugehen.

Dachte erst, dass es umständlich scheint, da, wenn ich bei einem 8-Bit-Register bspw. Spalte 2, 3 und 4 ansteuern möchte, ich den entsprechend Takten muss. Also ein Mal HIGH Takten - HIGH auf Platz 1, dann ein Mal LOW, wieder zwei Mal HIGH und wieder LOW. Wenn ich das richtig verstanden haben, kann ich das aber auch direkt binär übermitteln!?

const byte numbers[1] = {
0b01101000}; // 2, 3, 4

Verstehe ich das richtig?

Des Weitern, wenn es so passt, würde ich gerne in einer Matrix gezielt LED´s ansteuern.
Bsp. in klein: 5 x 5 Matrix

-----X X X X 0
-----1 2 3 4 5
0 1
0 2
0 3
X 4 L L L L
0 5

Die Xe symbolisieren die Spalten und Zeilen die Angesteuert werden Sollen, um die vier LED´s(L) anzusteuern. Muss ich die Anzusteuernden Kombinationen vorher alle händisch festlegen und diese dann über 2D-Arrays ansteuern und in den Arrays die Binären Stellen hinterlegen? Scheint mir sehr aufwändig.

Danke vorab! :slight_smile:

Für die Zeilen habe ich dann natürlich auch ein shift-Register, das jetzt 0b00010 hätte.

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.
mfg ein Moderator.

Warum hast du es aus dem deutschen Abschnitt verschoben, als ich es dorthin verschoben habe?

schau Dir shiftout() an

und

Wenn Du ein 8 Bit Schiberegister ( Serial In Paralell Out) zB ein HC595 dann mußt Du immer 8 Bit rausschicken.
Bei einer 5x5 Matrix brauchst Du 2 Schieberegister, zB eines für die Reihen und das andere für die Spalten.
Du Setzt die Bit einer Reihe in denen die LED leuchten sollen auf HIGH und setzt die entsprechende Spalte auf LOW.
Je nach Polung der LED kann HIGH und LOW vertauscht sein und duch Reihne mit Spalten.
In meinem Beispiel brauchen die Spalten einen Transistor da der Ausgang den Strom aller gleichzeitig eingeschaltene LED vertragen muß.
Das Ansteuern muß kontinuierlich, jede Spalte nur kurze Zeit, erfolgen. Darum ist das ein dauerndes Schreiben auf die Schieberegister der Matrix

Es gibt spezielle ICs die das automatisch machen und dazu noch den Strom der Led begrenzen. ZB der MAX7219 Dieser Kann 8 Stellen 7 Segmentanzeige ansteuern oder 8x8 LED MAtrix.

Grüße Uwe

Jap, das meine ich ja. An der Stelle der Variable j kann ich doch die Binäre, anzusteuernde, Stelle angeben - numbers[0] Oder nicht? Das mit den Transistoren und ein Shift-Register, je für die Spalten und Zeilen, ist klar.

Gruß

Du schickst immer ein Byte, also 8 Bit raus. Jedes Bit entspricht einem Ausgang des Shiftregisters. ist das Bit 1 so geht der entsprechende Ausgang auf HIGH bzw umgekehrt.
Grüße Uwe

Hallo Uwe,

bitte verstehe es nicht patzig... Ist meine Denkweise verkehrt? Dass immer ein Byte komplett rausgeschickt wird, ist mir klar. Ich habe jetzt aber schon zwei Mal gefragt, ob es möglich sei, ein Byte(binär) über den Array - numbers[0] zu schicken. Sodass alle Bits, mit einem mal schicken, den Zustand 00110101 und beim anderen Mal bspw. 10111001 annehmen. Oder müssen die Bits durchgeschoben werden, also dass, wenn ich 8 neue Bits haben möchte, auch Mal getaktet werden muss? - eben das will ich ja nicht. Oder schiebt der Shifter die 8 Bits, wenn´s Binär geschickt wird, automatisch direkt alle 8Bits durch?

Vielleicht verstehe ich diesbezüglich auch deine Antwort nicht.

Gruß

Vermutlich ja!

Ich verstehe deine Probleme nicht.
Ich schätze die projizierst du nur dahin.

Das Problem für mich ist, dass ich Erklärungen bekomme, aber kein "Ja, es geht" oder "Nein, das geht so nicht, weil..." . Das finde ich verwirrend.

Wenn ich mich missverständlich ausdrücke, dann fragt bitte.

Aus meiner Sicht sind schon die Fragen falsch/seltsam.
Darum auch von mir kein klares nein oder ja.

Wie gesagt, ich vermute, dass du auf einem fürchterlich falschen Dampfer bist..

Für mich klingt das völlig verwirrt!
Irrational.

Natürlich weiß ich exakt, wie man mit so einem Schieberegister umgehen muss!
Aber deinem Text kann ich nicht entnehmen, welches Problem du damit hast.

Ok, ich versuche es noch einmal anders.
Ich möchte die hier beschriebene Kombination ansteuern:

-----X X X X 0 0 0 0
-----1 2 3 4 5 6 7 8
0 1
0 2
0 3
X 4 L L L L
0 5
0 6
0 7
08

Also die LED´s(L) in der Matrix.

Um diese, und vielleicht andere Kombinationen ansteuern zu können, frage ich mich, wie das am einfachstem möglich ist. Eine Möglichkeit, bei der ich mir aber nicht sicher bin, wäre es, dass diese Kombination in zwei Arrays festgehalten wird.:

int LED_C[8] //Shift für Spalten
{
{0b11110000}
};

int LED_R[8] //Shift für Reihen
{
{0b00010000}
};

Wenn ich nun diese vier LED´s ansteuern möchte, würde ich, so meine Gedanken, das Array im shift aufrufen - >

shiftOut(dataPin_C, clockPin_C, MSBFIRST, LED_C[0]);
shiftOut(dataPin_R, clockPin_R, MSBFIRST, LED_R[0]);

Ist es so möglich?

Gruß

zuerst mal von
00110101
zu
10111001
Wird zwar nur 3 Bit geändert aber Du mußt alle 8 Bit rausschicken.

Erklährung
Ein Serial in paralell out Shift Register hat 8 Eimerchen. Die füllst Du mit einer Gißkanne nacheinander (serial) mit Wasser (1) oder leerst sie (0) dann werden alle Eimerchen in die leeren Ausgangseimerchen ausgelehrt und so sind die Ausgangseimechen HIGH oder LOW.
Jeder Füllen beginnt am Anfang der Eimerchen und endet an deren Ende.
Du kannst nicht ein Eimerchen einzeln gezielt füllen oder leeren.

Grüße Uwe

Das hatte ich bereits verstanden. Es sollen auch immer alle 8 geändert, bzw. angepasst, werden.
Ich wollte ja nicht einzelne Bits ändern, sondern wissen, ob es möglich sei, mit einem Takt, alle 8 Bits zu aktualisieren.

Verrückt!

Du kannst immer nur alle 8 Bit in das Register schieben.
Also braucht es auch 8 Takte.

Um die Takte musst du dich nicht kümmern, das macht shiftOut() oder SPI für dich

Ahh, ok! Das wollte ich hören.

Also ich stelle shiftOut(), wie in meinem letzten Beispiel, die 8 Bit, in dieser Form, zur verfügung und der Taktet dann immer 8 Mal durch!? Was, wenn ich dem weniger Bits gebe? Bspw. 5. Taktet der dann dennoch 8 mal durch und füllt die fehlenden Stellen mit 0(LOW)?

Ein Byte hat nun mal 8 Bit und die werden gesendet. Wenn Du nur 2 davon gesetzt hast, bleibt für die anderen der alte Inhalt.

Gruß Tommy

Wie willst du das anstellen?

Was du hörst, und was du verstehst, scheinen verschiedene Dinge zu sein.
Zumindest ich, sehe da keinen/wenig Zusammenhang.

Indem ich im Array nur 0b00110 angebe. Aber der füllt dann vermutlich hinten oder vorne, je nach MSB/LSB, mit drei Nullen auf, oder?