Schieberegister – Am Arduino anschließen

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:

 

 

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 3mA pro LED und bleiben deutlich 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.


4 Comments

Johann

2. Juli 2020 at 10:02 am

Vielen Dank für dieses ausführliche Tutorial!

In einem Punkt stehe ich noch auf dem Schlauch:
Wenn man von der 5v Eingangsspannung die 2v, die die LED selber als Widerstand hat, abzieht, hat man noch 3v.
Wenn wir jetzt also auf 6mA kommen wollen, sollten wir doch 3 / 0,006 = 500 Ohm und nicht 1k Ohm als Widerstand benötigen?

    Ronin

    3. Juli 2020 at 12:25 pm

    Hallo Johann,

    Du hast natürlich Recht. Es verbleiben ja nur noch 3V nach Abzug der Betriebsspannung der LED.
    Die entsprechende Zeile im Text habe ich entsprechend geändert.

    Viele Grüße,
    Michael

Plumps

31. Dezember 2018 at 2:17 pm

Sehr schön ausführlich erklärt, Danke.

Aber etwas ist komisch am Schaltplan. Ich dachte immer der 74hc595 zieht die LEDs auf Masse. Eigentlich müsste rechts unten die LED Versorgungsspannung sein und die LEDs im Schaltplan gedreht werden, oder? Zumindest ist das so in anderen Tuts erklärt.
Auf dem Breadboard ist es etwas schwer zu erkennen wo deine LEDs stecken.

    Ronin

    3. Januar 2019 at 7:03 pm

    Hallo Plumps,

    vielen Dank, Dein Lob freut mich.

    Zu Deiner Frage … Ich hab nochmal nachgeschaut, aber es passt. Fritzing ist da leider etwas unübersichtlich, aber die flache Seite der LED (GND) liegt oben auf der Versorgungsschiene auf Blau, also GND.

    Aber mal generell ist das eine interessante Frage von Dir, denn mit einem 74HC595 musst/kannst Du nicht nur die LEDs auf Masse ziehen.
    Der 74HC595 ist ein CMOS Baustein mit komplementären Ausgängen, was heißt, dass die Ausgänge sowohl VCC als auch GND schalten.

    Du kannst auch mischen. Somit lässt sich die Gesamtlast des Bausteins von 70mA reduzieren. Schau mal auf https://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister#Acht_LEDs_mit_je_20mA_pro_Schieberegister rein.

    Mehrere LEDs anschließen

    Viele Grüße,
    Michael

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.