Wenn IO auf einem uC begrenzt ist, wie bewegen Sie die Logik vom uC weg?

Wenn Sie beispielsweise einen Arduino mit 4 digitalen IO-Pins hätten, wie könnten Sie > 4 LEDs unabhängig voneinander leuchten oder den Zustand von > 4 Tasten lesen?

Sie fragen im Titel nach PICs und beziehen sich dann auf ein Arduino!
@LeonHeller: Bitten Sie dann um Klärung und / oder bearbeiten Sie die Frage selbst. Allerdings könnte man in diesem Fall einfach "uC" für PIC/Arudino substituieren.
Es gibt viele Arten von I/O-Expander- ICs. Oft werden sie über I2C (z. B. PCA9554) oder SPI (z. B. MCP23S08) verbunden.
Wenn Sie bereits Arduino verwenden, würde ich einfach eine größere Version auswählen. Für einen etwas teureren Arduino bekommt man in der Regel viele I/O-Pins, mehr FLASH, RAM und EEPROM und es erspart einem das Zusammenlöten zusätzlicher Chips wie 74HC595 (mit Kondensatoren, Printheadern, ...), die einen gewissen Preis haben zu.
@jippie - Du verstehst es nicht. Steve Ciarcia schrieb einmal in BYTE über sein Hausautomationssystem als „übereifrigen Versuch, die Welt zu kontrollieren“ (Paraphrase). Das ist es, was Sie wollen: die Welt kontrollieren. Und dann ist keine I/O-Menge genug. ;-)
@stevenvh - Hausautomation nützt nichts, wenn du einen (Jungen|Mädchen)Freund hast, der dich liebt ;o)
Ich stimme zu, dass Hardware billiger zu warten ist.
@jippie - Und dann lautet die Geek-Antwort: "Was ist eine Freundin?" :-)
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, um einen zusätzlichen Pin zu sparen.

Antworten (5)

Ein Schieberegister wie das 74595 ermöglicht es Ihnen, viele Ausgänge mit nur 2 Anschlüssen zu haben: einem Daten-Pin und einem Takt-Pin. Sie setzen den Datenpin auf den nächsten Wert, den Sie in das Register verschieben möchten, und pulsieren dann den Taktpin.

Das ist klasse. Also habe ich darüber nachgelesen und nur zur Verdeutlichung, mit einem davon kann ich 8 Ausgänge haben, wenn ich 2 Arduino-Pins verwende? Ich nehme an, ich kann sie nicht auch als Eingänge verwenden?
Mit zwei können Sie 16 Ausgänge haben. Mit drei, 24 und so weiter, begrenzt nur durch die gewünschte maximale Latenz. Der 74595 ist seriell-zu-parallel, aber es gibt auch parallel-zu-seriell ( 74165 ) sowie seriell-zu-parallel-zu-seriell Schieberegister.
@cheesysam - "Mit zwei können Sie 16 Ausgänge haben. Mit drei 24 und so weiter." Das ist nicht richtig. Sie benötigen 3 Pins: Daten, Takt und Latch, egal wie viele Geräte Sie anschließen 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: "... mit einem davon kann ich 8 Ausgänge haben ...". Sind Sie sicher, dass sie den 74AC595 nicht wollen? 74F595? 74LVX595?
@Ignacio - "mit zwei ..." ist verwirrend, da es wie ich als "mit zwei E / A" gelesen werden kann. Es tut uns leid. 74F595? Für die Taktung durch einen 16-MHz-Controller? Ich glaube nicht. 74F ist sehr leistungshungrig und die Geschwindigkeit bringt Ihnen keine Vorteile. 74LVX hat nur 3,3 V und ist daher nicht mit Arduino verbunden. Was ist falsch an 74HC? Es ist die Standardlogikfamilie.
"Was ist los mit 74HC?" Absolut gar nichts. Was ist falsch daran, das "XX" wegzulassen?
@Ignacio - Wenn Sie 74595 schreiben, ist das ein TTL-IC. Wenn Sie 74xx595 schreiben, ist das ein IC mit der Funktionalität eines 74595, aber in einer nicht spezifizierten Technologie, entweder einer von wenigen TTL-Familien oder einem von vielen CMOS.
Ich denke, dass dies eine interessante Diskussion darüber ist, wie man IC-Teilenummern ausdrückt. In diesem Fall ist die Logikfunktion (74xx595) wichtig, aber gleichzeitig sagt das OP, dass er einen Arduino hat, wodurch die 74HCxx-Familie am besten geeignet ist. Sie könnten dies in Ihrer Antwort besser erläutern.

Bruno hat eine gute Antwort gegeben, aber ich möchte ein paar Notizen machen.

Die berüchtigten 70 mA
Der 74HC595 wird oft als E/A-Erweiterung verwendet und ebenso oft 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, also halten Sie sich besser davon fern. Daher sind 8 LEDs bei 10 mA zu viel, und bei 20 mA übertreffen Sie AMR um nicht weniger als 130 %! Die Grenze liegt wahrscheinlich an der Stromkapazität der Bonddrähte, und dann kann der zu hohe Strom nicht nur die Leistung des Teils 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 den Erdstrom. Warum teilen Sie dann nicht unsere Summe oder 80 mA und lassen Icc die Hälfte davon und den Erdstrom die andere Hälfte? Alles, was Sie tun müssen, ist, 4 der LEDs auf Masse (aktiv hoch) und die anderen 4 auf Vcc (aktiv niedrig) zu beziehen. Dann kommt der Strom des ersteren von Icc, der Strom der anderen geht auf Masse. 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 darauf gekommen zu sein.)

Die kombinierten Uhren
Ich dachte, Bruno sparte einen zusätzlichen I / O-Pin, indem er die Uhr des Schieberegisters mit der des Latches kombinierte. Anscheinend habe ich seine Antwort falsch interpretiert. Ich möchte diese Option noch erweitern.

Was passiert dann? Die Tabelle auf Seite 5 des Datenblatts sagt:

Inhalt des Schieberegisters durchgeschoben; vorheriger Inhalt des Schieberegisters wird an das Speicherregister und die parallelen Ausgangsstufen übertragen

(Hervorhebung von mir)
Es sind also nicht die neuen Daten, sondern die vorherigen , die zwischengespeichert werden. Kein wirkliches Problem, stellen Sie einfach sicher, dass Sie ein zusätzliches Dummy-Bit einfügen, um die letzten Daten zu speichern, oder alles wird einen Pin falsch sein.

Das Kombinieren der Takte bedeutet auch, dass die Ausgänge ständig umschalten, während Sie neue Daten hineinschieben. Die Funktion des Latches bestand eigentlich darin, dies zu vermeiden. In vielen Fällen ist dies kein Problem, wenn Sie es schnell tun können, aber im schlimmsten Fall können unerwünschte Effekte auftreten. Im schlimmsten Fall könnte der 74HC595 verwendet werden, um ein Display mit einer sehr hohen Abtastfrequenz zu multiplexen + eine sehr lange Kette von Schieberegistern zu haben + alle 1er außer einer 0 zu haben, eine LED, die ausgeschaltet ist + einen dunklen Raum. Da diese LED in einem dunklen Raum von Zeit zu Zeit alle Einsen sieht, kann sie sehr schwach leuchten.

Oder wenn Sie dieses Hochfrequenz-Multiplexing mit einem Relais-Steuerausgang kombinieren. Alle Nullen und dann eine 1 für das Relais können bedeuten, dass der Ausgang des Relais nicht lange genug hoch ist, um anzuziehen.

Zugegeben, das sind Extremfälle, aber ich würde den seriellen und den Latch-Takt nach Möglichkeit getrennt halten, wenn Sie multiplexen oder auf andere Weise hohe Aktualisierungsraten haben möchten.

+1 Tolle Idee, die du letzte Nacht hattest! Habe das bisher nirgendwo erwähnt gesehen. Andererseits glaube ich, dass Sie Brunos Antwort falsch interpretiert haben. Er meinte, das Taktsignal des 74XX595 und 74XX165 zusammen zu kombinieren und das Latch-Signal des 74XX595 und 74XX165 zusammen zu kombinieren.
@m.Alin - Ja, anscheinend habe ich das getan. Danke für den Hinweis. Ich werde meine Antwort bearbeiten, aber als Möglichkeit belassen.
Natürlich ist es definitiv eine Möglichkeit, die andere empfohlen haben. Es lohnt sich, darauf einzugehen.
@m.Alin - Ich denke, der Grund, warum es vorher nicht verwendet wurde, ist, dass entweder die Benutzer die 70-mA-Grenze nicht kannten oder sich nicht darum kümmerten :-(. Ich gehe jetzt zum Patentamt! ;-)
Oh... du wirst so reich!
Schon wieder zurück. Das Büro war geschlossen. Sie waren alle in der Kirche.
+1 Das ist eine sehr gute Idee, um die Strombegrenzung des 74XX595 zu überwinden. Bezüglich der Steuersignale hat m.Alin es richtig gemacht, was ich meine, war, einen Pin des µC für Takt und einen anderen für Latches zu verwenden.
@Bruno - Ja, ich weiß, ich habe es falsch interpretiert. Später sah ich Ihre Liste der E / A am Ende Ihres Beitrags mit getrennter Uhr und Verriegelung. Aber es ist machbar, sie zusammen zu haben, wenn Ihre Aktualisierungsrate relativ niedrig ist (statische Ausgänge). Wie gesagt, wenn Sie auch Dateneingang und Datenausgang zu 1 Pin kombinieren, benötigen Sie nur 2 Pins.

Ich stimme Ignacio bezüglich der Verwendung eines 74XX595-Schieberegisters mit seriellem parallelem Ausgang für die Ausgangserweiterung zu, aber tatsächlich benötigen Sie 3 Verbindungen, eine für Daten , eine für die Uhr und eine Latch-Aktivierung , die die Daten aus dem internen Schieberegister überträgt zu den Ausgangslatches.

Diagramm von 74LS595

Für die Erweiterung der Eingänge könnten Sie ein 74XX165, Parallel-in-Seriell-Schieberegister 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 verketten können, was eine erhöhte Anzahl von Ein- oder Ausgängen ermöglicht, und besser, Sie können 74XX595 und 74XX165 mischen, was eine beliebige Anzahl von Ein- oder Ausgängen ermöglicht.

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 beliebig viele 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)
  • Data Out (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 wird für jeden Taktimpuls etwa so vorgehen:

  1. Pin als Ausgang konfigurieren
  2. Legen Sie den Datenwert fest
  3. Sende einen Takt
  4. Pin als Eingang konfigurieren
  5. Lesen Sie die Daten

Diagramm

Die übermäßig Scharfen können Schieberegister-Ausgangs-Strings wie diese nur mit einem einzigen Ausgangs-Pin und wahrscheinlich auch Eingangs-Ausgangs-Strings steuern. Fragen Sie mich, woher ich das 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 Flankentriggerpolarität für Takt und Latch ab, aber diese sind normalerweise so ausgelegt, dass sie auf diese Weise zusammenarbeiten.
Und wie ich in meiner Antwort sagte, können Sie auch beide Uhren kombinieren, sodass Sie nur zwei Pins benötigen. Es ist eine clevere Idee, aber ich werde dies kein zweites Mal positiv bewerten. Einmal reicht :-)
Ich sehe keine Notwendigkeit, den letzten Ausgang des 74HC595 in den 74HC165 zu verschieben. Könnte das jemand erklären? Soweit ich verstehe, würden 16 Takte ausreichen, um sowohl die Ausgänge der 2 x 74HC595 (16 Ausgänge) zu setzen als auch die Eingänge der 2 x 74HC165 (16 Eingänge) zu lesen, ohne diese Verbindung.
@Dario: Wenn der letzte Ausgang des 74HC595 in den 74HC165 eingespeist wird, ist dies eine "kostenlose" Möglichkeit, einem Controller, der weiß, dass die Kette nicht länger als eine bestimmte Länge sein wird, zu ermöglichen, festzustellen, ob die Kette verbunden ist und wie lang sie ist . Wenn es akzeptabel wäre, alle 595er beim Hochfahren niedrig zu takten, und wenn der erste 165er mindestens einen Eingang hoch hat, kann der Code sogar bestimmen, wie viele 595er und 165er es gibt.

Nick erwähnt E/A-Expander, und sie sind definitiv einen Blick wert. Digikey listet mehr als tausend davon auf, ich wähle als Beispiel eine mit einer I2C-Schnittstelle aus, weil dies die wenigsten I/O-Pins erfordert; mindestens zwei.

Der NXP PCA9505 verfügt über 40 konfigurierbare I/O-Pins, was fünf 74HC595 entspricht. Es ist eine etwas teurere Lösung, aber dafür erhalten Sie viel mehr Funktionalität:

  • Jeder I/O-Pin kann als Ein- oder Ausgang konfiguriert werden
  • 100-kΩ-Pullups an allen I/O-Pins (der PCA9506 hat keine Pullups, die für Low-Power-Anwendungen relevant sein können)
  • Alle Ausgänge können gleichzeitig 15 mA ziehen, für ein Gesamtpaket von 600 mA
  • Ein Interrupt-on-Change-Ausgang macht ein ständiges Abtasten der Eingänge überflüssig
  • Nur zwei Drähte zum Anschluss an den Mikrocontroller.

Weiterführende Literatur zu
GPIO-Expandern , 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 dargestellt):

Multiplex-LEDs

Die Art und Weise, wie Multiplexing funktioniert, ist ganz einfach - wenn wir im obigen Beispiel LED1 zum Leuchten bringen wollen, setzen wir Pin C1 auf High und PIN R1 auf Low, alle anderen Pins können High oder Hi-Z sein (auf Input, High gesetzt). Impedanz, die sie "getrennt" aussehen lässt)
Wenn wir LED5 leuchten möchten, setzen wir Pin C2 auf High und R2 auf Low.

Die Anzahl der Pins, die benötigt werden, um x LEDs anzusteuern, kann durch 2n Pins für n² LEDs berechnet werden, also brauchen wir zB für 16 LEDs (√16) * 2 = 8 Pins.

Charlieplexing:

Charlieplexing

Alternatives (ordentlicheres) schematisches Layout (vorgeschlagen von Supercat):

Charlieplexing 2

Dies ist etwas komplexer, verwendet jedoch weniger Pins, um eine höhere Anzahl von LEDs anzusteuern. Zum Beispiel können wir nur 5 Pins verwenden, um 20 LEDs wie im obigen Beispiel anzusteuern (im Vergleich zu mindestens 10 Pins bei "normalem" Matrix-Multiplexing (nicht zu verwechseln mit der Verwendung eines IC, in diesem Fall ist die Anzahl der benötigten Pins log2 (nLED).

Für eine externe Lösung können Sie Dinge wie Schieberegister oder Multiplexer wie 74HC595 und 74HC151 verwenden.
Ein Schieberegister nimmt einen getakteten seriellen Eingangsdatenstrom auf und gibt parallel (Serial In Parallel Out SIPO) oder umgekehrt (PISO) aus.
Sie haben im Allgemeinen 8 Ausgänge (oder Eingänge), aber Sie können so viele verketten, wie Sie möchten, 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 500 kHz usw.)

Diese Techniken können auch für Eingaben umgekehrt funktionieren.

Diese Antwort zeigt, wie Charlieplexing für Multiplex-Eingangsdrucktasten verwendet wird: electronic.stackexchange.com/a/37362/8627
Eine einfachere Möglichkeit, eine Charlieplex-Anzeige zu zeichnen, besteht darin, sie einfach als NxN-Gitter mit unbestückter Diagonale zu zeichnen.
@supercat - Ich habe gerade das erste Beispiel aus Google-Bildern gekniffen. Ich habe gerade ein weiteres Beispiel hinzugefügt - ist das die Art von Layout, die Sie gemeint haben?
@OliGlaser: Ja, obwohl ich vorschlagen würde, die Widerstände an die Zeilen-Spalten-Übergänge zu verschieben. Wenn Sie das tun, ist es möglich, neun LEDs gleichzeitig anzusteuern, vorausgesetzt, dass entweder die High-Side- oder Low-Side-Treiber dies aufnehmen können. Alternativ könnte man die Widerstände dort lassen, wo sie sind, aber an jedem Zeilen-Spalten-Übergang einen Transistor hinzufügen (für den gezeigten Schaltplan ein NPN mit der Basis in der Zeile, dem Emitter in der Spalte und dem Kollektor an der positiven Schiene). ). Das Hinzufügen des Transistors würde die zum gleichzeitigen Betrieb von neun LEDs erforderliche High-Side-Treiberstärke erheblich reduzieren.