Schieberegister – Am Arduino anschließen

  • 0

Schieberegister – Am Arduino anschließen

Kategorien:

Arduino

Ausdrucken Ausdrucken

74hc595

Gehen uns die Ausgabepins an unserem Arduino aus, können wir einfach und preisgünstig mit einem oder mehreren Schieberegistern die Pinanzahl erhöhen.

Pro Schieberegister können wir 8 weitere Pins hinzufügen.

Zum Anschließen von weiteren 8 Pins werden lediglich einmalig 3 freie Pins am Arduino benötigt.

Wie eine Schieberegister funktioniert, könnt Ihr unter „Schieberegister – Was ist das?“ nachlesen.

In diesem Beitrag zeige ich Euch, wie Ihr ein Schieberegister über das SPI-Bussystem anschließen könnt und gehe auf den Schaltplan ein.
Danach erweitern wir noch unser Schieberegister um ein weiteres Register.

Zuerst einmal die Liste der Bauteile die wir benötigen:

Icon

Alle notwendigen Bauteile im Warenkorb Reichelt anzeigen:
https://www.reichelt.de/my/1273677

 

Beginnen wir mit dem Schaltplan:

74hc595

Fangen wir von hinten an. Pin QA – QH sind unsere 8 Ausgabepins, an die wir jeweils 8 Vorwiderstände und 8 LEDs anschließen.

Der Pin 9 „QH*“ ist in diesem Schaltplan nicht belegt. Dieser Pin leitet den seriellen Input an ein weiteres vorhandenes Schieberegister.

Der Pin 14 „SER“ (in einigen Datenblättern auch SI oder DS genannt) ist der serielle Input. An diesem Pin werden wir Bit für Bit den gewünschten Zustand in das Schieberegister übertragen.
Das Schieberegister verfügt über einen Zwischenspeicher und erst durch ein Freischalten werden alle Bits in einem Rutsch an die Ausgabepins weitergleitet.

Pin 11 „SCK“ (alias SHCP, SRCLK) ist der ShiftRegisterClock-Pin, der dafür sorgt, dass durch eine LH-Flanke (Ein Zustandswechsel von Low nach High wird als Flanke bezeichnet) alle Bits im Register um jeweils eine Stelle verschoben werden und das am PIN 14 „SER“ anliegende Bit in das Schieberegister aufgenommen werden kann. Das geschieht so lange, bis das oder die Register (bei mehreren) voll sind.

Die Flankenwechsel, so wie das Übertragen der einzelnen Bits werden wir von unserem Arduino aus übernehmen, genau so wie das Kopieren aller Bits des Zwischenspeichers an die Ausgabe, wofür ein weiterer LH-Flankenwechsel am Pin 12 „RCK“ (alias STCP (StoreClockPin), RCLK) Register Clock ausgeführt wird, damit dies geschieht.

Pin 13 „G“ (alias OE) Open enabled ist ein Low-Aktiver Pin. Dies erkennt man daran, dass im Datenblatt über dem G ein Strich ist. Low-Aktiv heißt, wenn wir die Ausgabepins des Bausteins nutzen wollen, müssen wir ihn aktivieren und somit den Pin mit GND verbinden.

Pin 10 „SCLR“ (alias SRCLK, MR) ist der StoreClockPin-Reset oder auch MasterReset-Pin genannt. Dieser Pin ist ebenfalls Low-Aktiv und resettet das gesamte Register. Das wollen wir nicht, also müssen wir den Pin mit +5V verbinden.

Pin 8 „GND“ und Pin 16 „VCC“ sollten klar sein.

So, jetzt setzen wir den Schaltplan auf unserem Breadboard um, das sollte dann in Etwa so aussehen:

74hc595_steckplatine

 

Beachtet, dass ich als Vorwiderstand 1kΩ gewählt habe. Der Grund ist, dass das Schieberegister auf allen Pins eigentlich nur insgesamt 70mA (8,75mA pro Pin) verträgt. Bei sehr vielen Seiten im Netz ignoriert man das.
Das Bauteil läuft auch wenn wir jede LED mit 18mA (insgesamt 144mA) pro Pin betreiben, aber damit liegen wir mit dem doppelten Wert weit drüber und auf Dauer ist das keine gute Idee.
Mit 1kΩ haben wir rund 6mA pro LED und bleiben im Rahmen.

Lösungen, um das Problem zu umgehen könnt Ihr auch unter „Schieberegister – Was ist das?“ nachlesen.
Es gibt beispielsweise preisgünstige Darlington-Arrays in IC-Form, um höhere Lasten ordnungsgemäß betreiben zu können.

So, jetzt brauchen wir noch einen Arduino-Sketch, um unsere Schaltung endlich ausprobieren zu können.

Was genau geschieht, habe ich im Quellcode dokumentiert und wenn Ihr es richtig angeschlossen habt, sollte nach dem Hochladen des Sketches die erste LED aufleuchten und dann um eine Stelle nach vorne wandern, dann kommt eine zweite LED usw.
Es werden die Zahlen von 0-255 in binärer Schreibweise dargestellt. Alles was leuchtet ist 1 und die anderen 0.

 

Statt mit dem Befehl „shiftOut“ können wir auch mittels digitalWrite eine binäre Zahl ausgeben lassen.

 

 

Doch was machen wir, wenn wir mehr Pins brauchen? Ganz einfach, wir kaskadieren ein weiteres Schieberegister, oder auch zwei, drei, usw. und gehen fast genau so vor.

Einziger Unterschied ist, dass wir bei zwei Schieberegistern einen größeren Adressbereich haben. Bei einem Register waren das 8Bit, also 8Pins, bei zwei Registern haben wir schon 16Bit.

Zuerst wieder der Schaltplan:

74hc595kaskadiert

Es hat sich nicht viel verändert. Lediglich benutzen wir nun den Pin 9 „QH*“ des ersten Schieberegisters, der den seriellen Input zum zweiten Register weiterschleift.

Das zweite Register ist zusätzlich mit PIN 11 SCK und Pin 12 RCK mit dem Arduino und dem ersten Register verbunden. Klar, denn auch hier muss ja der Arbeitstakt synchron sein mit dem ersten Register, wenn nun 16Bits durch alle Registerfelder durchgereicht werden müssen.
Dasselbe gilt für die Übergabe der Kopie des Registers an den Output, damit jedes Register seine 8Bit auf einmal ausgeben kann.

Und das Ganze wiederholt sich, je mehr Schieberegister wir in Serie aneinanderhängen.

74hc595kaskadiert_steckplatine

Für zwei Schieberegister nochmal die beiden oberen Sketches ein wenig abgeändert:

 

Da wir ja nun statt 2^8 Möglichkeiten haben (2 ergibt sich aus 0 oder 1 hoch 8Bit) 2^16 Möglichkeiten haben, steht uns ein Zahlenbereich von 0-65535 zur Verfügung.

Für diesen Wert reicht der Datentyp int nicht mehr aus. Wir brauchen was größeres und initialisieren in Zeile 12 stattdessen mit unsigned short.

Damit es etwas schneller läuft habe ich das Delay auf 100ms in Zeile 26 gesetzt.

Unsere if-Bedingung in Zeile 29 hat sich entsprechend unserem 16Bit-Register auch geändert. Statt 255 benutzen wir 65535.

 

Auch hier in Zeile 11 den Datentyp unsigned short und die Erweiterung des Arrays auf 16 Felder.
Entsprechend müssen wir noch in Zeile 20 die for-Schleife auf unsere 16Bit anpassen.


Schreibe einen Kommentar