Wenn IO auf eine uC beschränkt ist, wie können Sie die Logik von der uC entfernen?

8

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?

Cheesysam
quelle
Sie fragen nach PICs im Titel und beziehen sich dann auf ein Arduino!
Leon Heller
2
@LeonHeller: Dann bitte um Klarstellung und / oder bearbeite die Frage selbst. In diesem Fall könnte man jedoch einfach "uC" für PIC / Arudino unterschreiben.
Chris Laplante
2
Ich bin damit einverstanden, dass die Wartung von Hardware billiger ist.
Jippie
3
@jippie - Und dann lautet die Antwort des Geeks: "Was ist eine Freundin?" :-)
Stevenvh
1
Ich würde vorschlagen, Ihre akzeptierte Antwort zu überdenken. Ignacios ist falsch (es gibt drei Signale, nicht zwei), Brunos ist vollständiger (Ignacio erwähnt zum Beispiel keine Eingabe) und hat eine originelle Lösung zum Speichern eines zusätzlichen Pins.
Stevenvh

Antworten:

4

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.

Ignacio Vazquez-Abrams
quelle
Das ist großartig. Also habe ich es nachgelesen und nur um zu verdeutlichen, mit einem von denen kann ich 8 Ausgänge haben, wenn ich 2 Arduino-Pins benutze? Ich nehme an, ich kann sie nicht auch als Eingänge verwenden?
Cheesysam
3
@cheesysam - "Mit zwei können Sie 16 Ausgänge haben. Mit drei, 24 und so weiter". Das stimmt nicht Sie benötigen 3 Pins: Daten, Uhr und Latch, egal wie viele Geräte Sie verbinden möchten. Brunos Antwort ist genauer. Sprechen Sie auch nicht über den 74595, das ist die ursprüngliche TTL-Technologie, die seit Jahrzehnten tot und begraben ist. Sie wollen den 74HC595.
Stevenvh
1
@stevenvh: "... mit einem von denen kann ich 8 Ausgänge haben ...". Sind Sie auch sicher, dass sie den 74AC595 nicht wollen? 74F595? 74LVX595?
Ignacio Vazquez-Abrams
1
@Ignacio - "mit zwei .." ist verwirrend, wie "mit zwei E / A" gelesen werden kann, wie ich es getan habe. Es tut uns leid. 74F595? Zum Takten mit einem 16 MHz Controller? Das glaube ich nicht. 74F ist sehr leistungshungrig und die Geschwindigkeit bringt Ihnen keine Vorteile. 74LVX ist nur 3,3 V, daher keine Schnittstelle zu Arduino. Was ist los mit 74HC? Es ist die Standardlogikfamilie.
Stevenvh
2
"Was ist los mit 74HC?" Absolut gar nichts. Was ist falsch daran, das "XX" wegzulassen?
Ignacio Vazquez-Abrams
7

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.

stevenvh
quelle
1
+1 Tolle Idee, die du letzte Nacht hattest! Ich habe das bis jetzt noch nie erwähnt. Andererseits denke ich, dass Sie Brunos Antwort falsch interpretiert haben. Er meinte, das Taktsignal des 74XX595 und des 74XX165 miteinander zu kombinieren und das Latch-Signal des 74XX595 und des 74XX165 miteinander zu kombinieren.
m.Alin
@ m.Alin - Ja, anscheinend habe ich es getan. Vielen Dank für den Hinweis. Ich werde meine Antwort bearbeiten, aber es als Möglichkeit belassen.
Stevenvh
Natürlich ist es definitiv eine Möglichkeit, die andere empfohlen haben. Es lohnt sich, darauf einzugehen.
m.Alin
@ m.Alin - Ich denke, der Grund, warum es vorher nicht verwendet wurde, ist, dass entweder Benutzer die 70-mA-Grenze nicht kannten oder sich nicht darum kümmerten :-(. Ich gehe jetzt zum Patentamt! ;-)
Stevenvh
3
Schon zurück. Das Büro war geschlossen. Sie waren alle in der Kirche.
Stevenvh
6

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.

Diagramm von 74LS595

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.

Geben Sie hier die Bildbeschreibung ein

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:

  • Uhr (gemeinsam mit allen Schieberegistern)
  • Latch Enable (gemeinsam mit allen Schieberegistern)
  • Data In (Verbunden mit dem seriellen Ausgang des letzten Schieberegisters in der Kette)
  • Datenausgang (Verbunden mit dem seriellen Eingang des ersten Schieberegisters in der Kette)

Bearbeiten

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:

  1. Konfigurieren Sie den Pin als Ausgang
  2. Stellen Sie den Datenwert ein
  3. Senden Sie einen Takt
  4. Konfigurieren Sie den Pin als Eingang
  5. Lesen Sie die Daten

Diagramm

Bruno Ferreira
quelle
1
Der übermäßig scharfsinnige Schieberegister kann nur solche Zeichenfolgen mit einem einzigen Ausgangspin und wahrscheinlich auch Eingangs- / Ausgangsstrings steuern. Frag mich woher ich weiß :-). Dies wird durch die Verwendung von R / C-Verzögerungen für Daten und Latch erreicht, wobei der Takt direkt mit dem Ausgangspin verbunden ist. Die genaue Sequenzierung hängt von der relativen Flanken-Triggerpolarität für Takt und Latch ab, diese sind jedoch normalerweise so ausgelegt, dass sie auf diese Weise zusammenarbeiten.
Russell McMahon
Und wie ich in meiner Antwort sagte, können Sie auch beide Uhren kombinieren, so dass Sie nur zwei Stifte benötigen. Es ist eine kluge Idee, aber ich werde dies kein zweites Mal positiv bewerten. Einmal ist genug :-)
Stevenvh
Ich sehe keine Notwendigkeit, den letzten Ausgang des 74HC595 in den 74HC165 zu verschieben. Könnte jemand das erklären? Soweit ich weiß, würden 16 Taktimpulse für beide ausreichen, um die Ausgänge des 2 x 74HC595 (16 Ausgänge) einzustellen und die Eingänge des 2 74HC165 (16 Eingänge) ohne diese Verbindung zu lesen.
@Dario: Wenn der letzte Ausgang des 74HC595 in den 74HC165 eingespeist wird, kann ein Controller, der weiß, dass die Kette nicht länger als eine bestimmte Länge ist, feststellen, ob die Kette verbunden ist und wie lang sie ist . Wenn es akzeptabel wäre, beim Start alle Tiefs des '595 zu takten, und wenn der erste' 165 mindestens einen Eingang hoch hat, kann der Code sogar bestimmen, wie viele '595' und '165' es gibt.
Supercat
5

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:

  • Jeder E / A-Pin kann als Ein- oder Ausgang konfiguriert werden
  • 100-kΩ-Pullups an allen E / A-Pins (der PCA9506 verfügt nicht über Pullups, was für Anwendungen mit geringem Stromverbrauch relevant sein kann).
  • Alle Ausgänge können gleichzeitig 15 mA aufnehmen, bei einer Gesamtmenge von 600 mA
  • Ein Interrupt-on-Change-Ausgang macht ein kontinuierliches Scannen der Eingänge überflüssig
  • Nur zwei Drähte zum Anschluss an den Mikrocontroller.

Lesen Sie weiter
GPIO-Expander , NXP-Broschüre
PCA9505-Datenblatt

stevenvh
quelle
4

Für eine Lösung ohne zusätzliche ICs können Sie Techniken wie Multiplexing und Charliplexing verwenden :

Multiplexing (keine Strombegrenzungswiderstände gezeigt):

Multiplex-LEDs

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:

Charlieplexing

Alternatives (übersichtlicheres) schematisches Layout (von Supercat vorgeschlagen):

Charlieplexing 2

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.

Oli Glaser
quelle
Diese Antwort zeigt, wie man Charlieplexing für gemultiplexte Eingangstasten verwendet: electronic.stackexchange.com/a/37362/8627
jippie
Eine einfachere Möglichkeit, ein Charlieplexed-Display zu zeichnen, besteht darin, es einfach als NxN-Gitter mit nicht ausgefüllter Diagonale zu zeichnen.
Supercat
@supercat - Ich habe gerade das erste Beispiel aus Google-Bildern gekniffen. Ich habe gerade ein weiteres Beispiel hinzugefügt - ist dies das Layout, das Sie gemeint haben?
Oli Glaser
@OliGlaser: Ja, obwohl ich vorschlagen würde, die Widerstände zu den Zeilen-Spalten-Übergängen zu verschieben. Wenn Sie dies tun, können neun LEDs gleichzeitig angesteuert werden, sofern dies entweder vom High-Side- oder vom Low-Side-Treiber unterstützt wird. Alternativ könnte man die Widerstände dort lassen, wo sie sind, aber an jedem Zeilen-Spalten-Übergang einen Transistor hinzufügen (für das gezeigte Schema einen NPN mit der Basis auf der Zeile, dem Emitter auf der Säule und dem Kollektor, der an der positiven Schiene angebracht ist ). Das Hinzufügen des Transistors würde die für den gleichzeitigen Betrieb von neun LEDs erforderliche High-Side-Ansteuerungsstärke erheblich verringern.
Supercat