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.
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.
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.
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.
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
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.
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 - >
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.
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.
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)?