Wenn Sie beispielsweise ein Arduino mit 4 digitalen E / A-Pins hätten, wie könnten Sie dann unabhängig> 4 LEDs leuchten oder den Status von> 4 Tasten lesen?
Wenn Sie beispielsweise ein Arduino mit 4 digitalen E / A-Pins hätten, wie könnten Sie dann unabhängig> 4 LEDs leuchten oder den Status von> 4 Tasten lesen?
Antworten:
Mit einem Schieberegister wie dem 74595 können Sie viele Ausgänge mit nur 2 Verbindungen haben: einen Daten-Pin und einen Clock-Pin. Sie setzen den Daten-Pin auf den nächsten Wert, den Sie in das Register verschieben möchten, und pulsieren dann den Takt-Pin.
Bruno gab eine gute Antwort, aber ich möchte ein paar Notizen machen.
Die berüchtigten 70 mA
Der 74HC595 wird häufig als erweiterte E / A und zur Steuerung einer Reihe von LEDs verwendet. Was oft übersehen wird, ist, dass Sie es auf diese Weise außerhalb der Spezifikation betreiben können. Das Datenblatt besagt, dass der Gesamtversorgungsstrom nicht mehr als 70 mA (Absolute Maximum Ratings, AMR) betragen sollte. Halten Sie sich daher besser mit einem gewissen Abstand davon fern. Daher sind 8 LEDs bei 10 mA zu viel und bei 20 mA überschreiten Sie die AMR um nicht weniger als 130%! Die Grenze ist wahrscheinlich auf die Stromkapazität der Bonddrähte zurückzuführen, und dann kann der zu hohe Strom die Leistung des Teils nicht nur verschlechtern, sondern es dauerhaft außer Betrieb setzen, wenn dieser Draht brechen würde.
Aber letzte Nacht bin ich aufgewacht, weil ich eine Idee hatte . Die 70-mA-Grenze gilt sowohl für Icc- als auch für Erdstrom. Warum also nicht unseren Gesamt- oder 80-mA-Wert aufteilen und Icc die Hälfte davon und den Erdstrom die andere Hälfte geben? Alles, was Sie tun müssen, ist, 4 der LEDs auf Masse (aktiv hoch) und die anderen 4 auf Vcc (aktiv niedrig) zu verweisen. Dann kommt der Strom des ersteren von Icc, der Strom der anderen geht zu Boden. Auf diese Weise können Sie 15-mA-LEDs verwenden. (Es ist so einfach, dass ich mich wie ein Idiot fühle, nicht früher daran gedacht zu haben.)
Die kombinierten Uhren
Ich dachte, Bruno sparte einen zusätzlichen E / A-Pin, indem er die Uhr des Schieberegisters mit der des Latch kombinierte. Scheint, als hätte ich seine Antwort falsch interpretiert. Ich möchte diese Option noch erweitern.
Was passiert dann? Die Tabelle auf Seite 5 des Datenblattes heißt es:
Inhalt des Schieberegisters verschoben; Bisherige Inhalt des Schieberegisters wird in das Speicherregister und die parallelen Ausgangsstufen übertragen
(von mir hervorgehoben) Es werden
also nicht die neuen Daten, sondern die vorherigen zwischengespeichert. Kein wirkliches Problem, stellen Sie einfach sicher, dass Sie in einem wechseln zusätzliches Dummy-Bit verschieben, um die letzten Daten zu speichern, da sonst ein Pin falsch ist.
Das Kombinieren der Uhren bedeutet auch, dass die Ausgänge ständig umgeschaltet werden, während Sie neue Daten verschieben. Die Funktion des Latch bestand darin, dies zu vermeiden. In vielen Fällen ist dies kein Problem, wenn Sie es schnell erledigen können, aber im schlimmsten Fall können unerwünschte Effekte auftreten. Im schlimmsten Fall könnte der 74HC595 verwendet werden, um eine Anzeige mit einer sehr hohen Abtastfrequenz zu multiplexen + eine sehr lange Kette von Schieberegistern zu haben + alle Einsen außer einer 0 zu haben, eine LED, die aus ist + ein dunkler Raum. Da diese LED sieht, dass alle Einsen von Zeit zu Zeit in einem dunklen Raum vorbeiziehen, kann sie sehr schwach leuchten.
Oder wenn Sie dieses Hochfrequenz-Multiplexing mit einem Relaissteuerausgang kombinieren. Alle Nullen und dann eine 1 für das Relais können bedeuten, dass der Ausgang des Relais nicht lang genug hoch ist, um eingezogen zu werden.
Zugegeben, das sind Extremfälle, aber ich würde die serielle und die Latch-Uhr nach Möglichkeit getrennt halten, wenn Sie multiplexen möchten oder auf andere Weise hohe Aktualisierungsraten haben möchten.
Ich stimme Ignacio hinsichtlich der Verwendung eines 74XX595-Seriell-Parallel-Out-Schieberegisters für die Ausgangserweiterung zu, aber tatsächlich benötigen Sie 3 Verbindungen, eine für Daten , eine für Takt und eine Latch-Freigabe , die die Daten aus dem internen Schieberegister übertragen zu den Ausgangs-Latches.
Für die Erweiterung der Eingänge können Sie ein 74XX165-Schieberegister mit parallelem seriellem Ausgang verwenden. Dies ermöglicht bis zu 8 Tasten pro 74XX165.
Das Gute an diesem Ansatz ist, dass Sie mehrere Schieberegister hintereinander schalten können, um eine erhöhte Anzahl von Ein- oder Ausgängen zu ermöglichen. Besser, Sie können 74XX595 und 74XX165 mischen und eine beliebige Anzahl von Ein- oder Ausgängen haben.
Außerdem können Sie die Takt- und Latch-Signale gemeinsam nutzen, wodurch die Anzahl der benötigten Verbindungen reduziert und die Software erheblich vereinfacht wird. Auf diese Weise benötigen Sie nur 4 Verbindungen für eine beliebige Anzahl dieser Schieberegister:
Als ich nach einem Diagramm suchte, fand ich auf dieser Website eine sehr clevere Möglichkeit, die Anzahl der erforderlichen Verbindungen auf 3 zu reduzieren. Es besteht darin, denselben Pin für die Dateneingabe und -ausgabe zu verwenden.
Die Software führt für jeden Takt einen Vorgang aus:
Nick erwähnt I / O-Expander und sie sind definitiv einen Blick wert. Digikey listet mehr als tausend davon auf. Ich werde eine mit einer I2C-Schnittstelle als Beispiel auswählen, da dies die geringsten E / A-Pins erfordert. mindestens zwei.
Der NXP PCA9505 verfügt über 40 konfigurierbare E / A-Pins, was fünf 74HC595 entspricht. Es ist eine etwas teurere Lösung, aber dafür erhalten Sie viel mehr Funktionalität:
Lesen Sie weiter
GPIO-Expander , NXP-Broschüre
PCA9505-Datenblatt
Für eine Lösung ohne zusätzliche ICs können Sie Techniken wie Multiplexing und Charliplexing verwenden :
Multiplexing (keine Strombegrenzungswiderstände gezeigt):
Die Art und Weise, wie Multiplexing funktioniert, ist recht einfach: Wenn wir im obigen Beispiel LED1 leuchten lassen möchten, setzen wir Pin C1 auf High und PIN R1 auf Low, alle anderen Pins können High oder Hi-Z sein (auf Input High setzen) Impedanz, die sie "getrennt" aussehen lässt)
Wenn wir LED5 aufleuchten möchten, setzen wir Pin C2 auf High und R2 auf Low.
Die Anzahl der zum Ansteuern von x LEDs benötigten Pins kann durch 2n Pins für n² LEDs berechnet werden, z. B. für 16 LEDs benötigen wir (√16) * 2 = 8 Pins.
Charlieplexing:
Alternatives (übersichtlicheres) schematisches Layout (von Supercat vorgeschlagen):
Dies ist etwas komplexer, verwendet jedoch weniger Pins, um eine höhere Anzahl von LEDs anzusteuern. Zum Beispiel können wir wie im obigen Beispiel nur 5 Pins verwenden, um 20 LEDs anzusteuern (verglichen mit mindestens 10 Pins mit "normalem" Matrixmultiplexing (nicht zu verwechseln mit der Verwendung eines ICs. In diesem Fall beträgt die Anzahl der benötigten Pins log2 (nLED).
Für eine externe Lösung können Sie beispielsweise Schieberegister oder Multiplexer wie 74HC595 und 74HC151 verwenden.
Ein Schieberegister nimmt einen getakteten seriellen Eingangsdatenstrom und gibt Ausgänge parallel (Serial In Parallel Out SIPO) oder umgekehrt (PISO) aus.
Sie haben im Allgemeinen 8 Ausgänge (oder Eingänge), aber Sie können beliebig viele miteinander verketten, um sie zu erweitern Dinge. Der Nachteil ist, dass die Geschwindigkeit, die Sie aktualisieren können, durch die Anzahl der Ausgänge pro Eingang geteilt wird (z. B. für ein Register mit 8 Ausgängen, wenn Sie einen 8-MHz-Eingangstakt haben, können Sie mit 1 MHz aktualisieren, für 16 Ausgänge mit 500 kHz usw.).
Diese Techniken können auch für Eingaben umgekehrt funktionieren.