Erhalten von zwei (oder anderthalb) Ausgängen von einem einzigen Pin

Ich mache ein Projekt mit einem ATtiny85 und natürlich fehlen mir die E / A-Pins. Eine Idee, die ich hatte, war, einen einzigen Pin für zwei Ausgänge zu verwenden (nennen wir sie EN und DATA).

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Ich weiß, dass DATA keine Rolle spielt, wenn EN = 0 ist. Das heißt, diese beiden Ausgänge können nur die Werte EN=0/DATA=x, EN=1/DATA=0, EN=1/DATA=1 annehmen. Gibt es eine einfache Möglichkeit, zum Beispiel 0 EN=0/DATA=x, 1 EN=1/DATA=1, Z (Eingangspin) EN=1/DATA=0 zuzuordnen? Der Stromverbrauch spielt nur bei EN=0 eine Rolle.

Nicht von einem binären Eingang. Wenn Sie einen ADC-Eingang verwenden, können Sie dies tun.
Ich bin verwirrt! Der Titel sagt: " Eine 0 und eine 1 von einem schwebenden Eingang erhalten ", aber die Frage sagt: " Verwenden Sie einen einzelnen Pin für zwei Ausgänge ". Welches ist es?
@Transistor: Ich möchte zwei Ausgänge (insgesamt drei Zustände) von meiner Platine erhalten, indem ich einen einzelnen GPIO-Pin vom Mikrocontroller und etwas Klebelogik auf der Platine verwende. Meine Idee war, dass der Mikrocontroller den Pin als Output-Low/Output-High/Input konfigurieren kann, um die gewünschten Zustände zu erhalten.
@Trevor: Die Verwendung eines PWM-Ausgangs anstelle des Floating-Eingangs ist möglicherweise möglich, da ich keinen verwende, aber wie würde ich das tun? ;)
@Paulo: Es ist immer noch nicht klar. Versuchen Sie, einen Pin für zwei Ausgänge zu verwenden, oder versuchen Sie, zwei Signale an einem Eingangspin zu überwachen. Es gibt eine Schaltplan-Schaltfläche in der Editor-Symbolleiste. Skizzieren Sie es. Sie müssen Ihre Frage bearbeiten.
@Transistor: ein Pin für zwei Ausgänge, Schaltplan hinzugefügt
Es ist viel einfacher, 5 Ausgänge von 4 Pins zu erhalten, als 2 Ausgänge von 1 Pin. Vielleicht stellst du die falsche Frage.
Sie haben 3 Ausgangszustände: 0, 1 und hi-Z; Verwenden Sie also 2 Rs, um die Hi-Z-Spannung auf halbem Weg einzustellen, und dann 2 Komparatoren, um 00, 01 (oder 10) und 11 zu erhalten.
Ich bezweifle also, dass die PWM-Lösungen das sind, wonach Sie suchen, aber mein erster Gedanke ist die Telefonie. Telefone übertragen alle Nummern auf der Tastatur mit einem einzigen Draht (plus Rückleitung). Und ich bin mir sicher, dass es dafür Hardware gibt =)
Sie haben drei verschiedene Zustände. Könnten Sie etwas mit Pin-Low für einen Zustand, Pin-High für den nächsten Zustand und Pin-Low-to-High-to-Low ganz schnell für den dritten Zustand machen?

Antworten (7)

Sie können zwei Komparatoren und die High-Input-Low-Werte verwenden. Zum Beispiel:

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Die beiden Komparatoren geben eine logische 1 aus, wenn die Spannung am Eingang höher als 3/4 * Vcc(DATA eins) oder 1/4 * Vcc(EN eins) ist.

Wenn der Attiny-Pin nach unten gezogen wird, wird die Spannung auf 0 V fixiert; Die Komparatoren haben dann die Werte 0 und 0. Wenn der Pin schwebend gelassen wird (als Eingang eingestellt ist), geht die Spannung aufgrund der beiden Widerstände auf Vcc / 2; die Komparatoren zeigen 1 für EN, 0 für DATA. Wenn der Pin hochgezogen wird, wird die Spannung auf Vcc fixiert; beide Komparatoren zeigen eine 1. Zusammenfassend:

Pin state |  EN  | DATA
------------------------
  OUT 0   |   0  |   0
  INPUT   |   1  |   0
  OUT 1   |   1  |   1

Beachten Sie, dass dies im Gegensatz zu den Lösungen mit PWM oder Port-Expander nicht skalierbar ist. Wenn Sie mehr Pins benötigen, ist es vielleicht besser, ein Schieberegister zu bekommen und ihm zwei Pins zu widmen (Uhr und Daten); Auf diese Weise haben Sie mehr Ausgänge, wenn Sie sie brauchen.

BEARBEITEN: Eine andere Lösung, bei der keine ICs, sondern nur diskrete Komponenten verwendet werden, ist die folgende:

schematisch

Simulieren Sie diese Schaltung

In diesem Fall müssen Sie die MOS so wählen, dass sie mit Vcc/2 eingeschaltet werden können; Beachten Sie, dass die Werte der Widerstände auch erhöht werden können, wenn Sie möchten, dass ein geringerer Strom fließt. Sie können auch den P-MOS mit einem PNP und den N-MOS mit einem NPN ändern, aber Sie müssen einen Strombegrenzungswiderstand an ihrer Basis hinzufügen (und ich bin mir nicht sicher, wie dies die drei Zustände beeinflusst).

Hier ist jedenfalls die Tabelle mit den Status

Pin state |  EN  | DATA
------------------------
  OUT 0   |   1  |   1
  INPUT   |   1  |   0
  OUT 1   |   0  |   0
Eleganter als meine Lösung. Ich habe die Tri-State-Option vergessen. +1.
Das kommt dem, was ich mir gedacht habe, am nächsten. Bei Vcc = 3,3 V sollten BSS84 und BSS138 für die MOSFETs funktionieren. Um den Stromverbrauch für EN = 0 zu reduzieren, könnte ich zwei Dioden zwischen R1 und R2 hinzufügen und den Eingang zwischen den Dioden und den Gates auf beiden Seiten verbinden. Dann kann der rechte Teil der Schaltung CMOS-Inverter verwenden. Wenn der Eingang schwebend ist, sollten sie auf 0 (für DATA) bzw. 1 (für EN) gehen.
@PaoloBonzini Beachten Sie, dass Sie möglicherweise etwas außerhalb der Spezifikationen arbeiten, da die Schwellenspannung sehr nahe an Vcc / 2 liegt ... Was die Dioden betrifft, warum sollte sie den Stromverbrauch verringern? Sie können (und sollten wahrscheinlich) den Wert der Widerstände auf einige Hundert Kiloohm erhöhen. Beachten Sie bei den CMOSs, dass der Bereich zwischen 0,8 V und 2,0 V verboten ist (1,65 V sind also für CMOS-Ports nicht in Ordnung).
Die Dioden würden an den Gates eine andere Spannung als 1,65 V für beide liefern, sodass ich CMOS-Inverter (diskret, nicht 7404) verwenden und den statischen Stromverbrauch verringern kann. Ist das überhaupt sinnvoll?

Ehrliche Wahrheit: Was Sie versuchen zu tun, ist einfacher zu implementieren, indem Sie einfach einen Mikrocontroller mit genügend Pins verwenden. Es ist wahrscheinlich sogar billiger als ein Attiny85. Wer weiß.

Aber: Wenn Sie wirklich müssen, können Sie verschiedene Dinge tun, um mehr Leistung aus einer einzigen Zeile herauszuholen:

  • Kaufen Sie einen IO-Expander, der den 1-Wire-(Pseudo-)Standard verwendet , und implementieren Sie einen 1-Wire-Sender auf dem Attiny
  • Ein UART-Gerät könnte es auch tun, aber ich kenne keinen Single-Wire-UART-to-IO-Adapter, der nicht eigentlich nur ein weiterer programmierter Mikrocontroller ist
  • Implementieren Sie einen DAC, gefolgt von einem ADC
    • DAC durch PWM'ing Ihrer Ausgabe,
    • Einspeisen der PWM in einen RC-Tiefpassfilter, was eine "glatte" variable Spannung ergibt
    • Kaufen Sie einen billigen ADC mit parallelem Ausgang, oder
    • Implementieren Sie Ihren eigenen Parallelausgangs-ADC mit Zenerdioden
Das könnte in der Tat eine Lösung sein (Kauf eines anderen Mikrocontrollers :) oder einfach PB5 und einen Hochspannungsprogrammierer verwenden). Es ist hauptsächlich eine Lernübung in Elektronik, den Bau meines eigenen E / A-Expanders mit so wenig Programmierung wie möglich und diskreter Glue-Logik. Ich dachte an die Verwendung von Widerständen und Dioden, konnte es aber nicht zum Laufen bringen.
Hochgestimmt. Ich habe eine Lösung, von der bekannt ist, dass sie funktioniert, aber erfordert, dass der betreffende Stift unnatürlich vorgerückt ist.

Natürlich bin ich ein Nerd, also hier sind Lösungen, die von Ihnen weniger wahrscheinlich umgesetzt werden, aber zum Spaß erwähnenswert sind:

Schieberegisterbasierte Spielereien

Die folgenden Ideen basieren auf Seriell-zu-Parallel-Schieberegistern.

Ausgangspin -> Dateneingang

Sie können Ihre Daten einfach in den seriellen Dateneingang Ihres Schieberegisters verschieben.

Problem: Schieberegister benötigen eine Uhr, um zu wissen, wann der Eingang "abgetastet" werden soll.

Lösung: Generieren Sie einen Taktimpuls, wenn sich der Eingang ändert.

Neues Problem: OK, wir können das mit einem einfachen logischen UND-Gatter machen, indem wir Ihren DataIN und eine minimal verzögerte Version seines Ausgangs kombinieren (Verzögerung durch diskrete Komponenten, z. B. einen RC-Filter). Aber: Dann können wir nur alternierende Bitmuster haben.

Lösung: Die Ausgangsreihenfolge Ihres Pins muss immer sein

0->1[long]->B[short]->0.

Was hier passiert, ist, dass der erste 1einen Kondensator lädt (daher die "lange" 1), die Spannung an dieser Kappe löst einen verzögerten One-Shot (z. B. durch einen NE555) aus, wenn sie einen Schwellenwert überschreitet, der dann einen Taktimpuls verursacht für das Schieberegister.

In dem Moment, in dem dieser Impuls auftritt, haben Sie bereits das gewünschte Ausgangsbit Bauf den Ausgang gesetzt. Diese muss kürzer sein als die „feste“ 1, damit der Takt nicht erneut getriggert wird.

Sie tun das Obige zweimal, um zwei verschiedene Bits B1 und B2 in das Schieberegister zu verschieben.

Sie können das obige Schema senden implementieren

0b1111BB00

mit der UART-Einheit (falls Ihr Mikrocontroller über eine solche verfügt).

Wenn Sie genau hinsehen, ist dies sehr ähnlich zu dem, was die WSxxxx-„Neopixel“-Dinge tun, um zu kommunizieren: 0->1markiert den Beginn eines Zeitraums, und die Menge 1innerhalb dieses Zeitraums legt fest, ob es sich um eine logische 0 oder 1 handelt.

Polynomiales passives populäres Pulsieren

Dazu brauchte es einen sich reimenden Titel. In Wahrheit sollte dies wahrscheinlich als "linear rückgekoppelte Schieberegistererzeugung einer Ausgangssequenz" oder so bezeichnet werden.

Die Idee ist, dass Sie, wenn Sie ein Schieberegister verwenden und seinen Eingang mit einer logischen Kombination seiner internen Zellen verbinden, etwas bauen können, das alle möglichen Ausgangszustände durchläuft (wenn Sie die Rückkopplungsfunktion entsprechend wählen). Ich würde das hier erklären, aber meh, faul, also lesen Sie den Wikipedia-Artikel über Linear Feedback Shift Registers .

Takeaway: Wenn Sie ein solches LFSR haben können, können Sie durch einfaches Umschalten seiner Uhr alle Ausgänge erreichen (einfach die richtige Anzahl von Zeiten umschalten).

Doh'. Das ist nett, aber schwieriger zu erklären als ein Zähler

Natürlich ist das Obige sehr cool (weil es zahlreiche Anwendungen hat, z. B. in der Kommunikation, Datenintegritätsprüfung usw.) und es ist sehr effektiv in Bezug auf die Anzahl der Gatter, die Sie dafür benötigen, aber:

Sie können genauso gut einen 2bit (oder mehr) Zähler kaufen oder bauen. Und zähle die Knebel deiner Attiny-Nadel. Der parallele Bitausgang des Zählers kann Ihre 2 Ausgangspins (oder mehr) sein.

Ich denke, es sagt viel aus, dass ich zuerst an LFSRs statt an Zähler gedacht habe.

Häufigkeitsbasierte Diskriminierung

Filterbank mit zwei diskreten Frequenzen

Idee ist einfach:

  1. Erzeugen Sie mit dem Pin beispielsweise zwei verschiedene Frequenzen, indem Sie ihn mit einer Frequenz von 1 kHz umschalten (d. h. alle 1 ms wiederholt sich der Ausgang, Sie müssen alle 500 µs umschalten) oder mit 2 kHz (umschalten alle 250 µs) oder der logischen Summe von beide Oszillationen (ziemlich schwer im Kopf zu machen, aber es läuft darauf hinaus, abwechselnd lange und kurze hohe Perioden zu haben).
  2. Filtern Sie die Ausgabe mit zwei verschiedenen Filtern:
    1. Ein Tiefpassfilter, der nur alles unterhalb von sagen wir 1,2 kHz durchlässt, ein RC reicht aus
    2. ein Bandpassfilter, der 2 kHz durchlässt, aber weder 1 kHz noch 3 kHz.
  3. den Ausgang dieser beiden Filter gleichrichten und tiefpassfiltern. Tada, du hast einen 2-Tone 2FSK-Empfänger gebaut, wenn du so geneigt bist.
  4. Dies sind Ihre beiden Ausgangssignale; Verwenden Sie ein Schwellenwertgerät, einen "Diskriminator" (Zenerdiode, Komparator), um sie in binäre 0 oder 1 umzuwandeln.

Bonus

Wenn Sie nicht 1 und 2 kHz, sondern ein paar MHz verwenden, können Sie Ihr Verbindungskabel tatsächlich durch geeignete Antennen ersetzen und diese Übertragung über die Luft durchführen. Sie würden auch gegen das Gesetz verstoßen, wenn Sie Frequenzen missbrauchen, für die Sie keine Lizenz haben.

PWM das

Idee : wie oben, aber einfacher.

Lassen Sie es zwei unabhängige Informationen geben:

  1. Ausgangs-Einschaltdauer > 50 %
  2. Output ändert sich überhaupt

Sie können die Einschaltdauer > 50 % entweder durch haben

  • Schalten des Pins konstant hoch (100 % Einschaltdauer) oder niedrig (0 %) oder durch
  • Einstellen der PWM-Einheit auf 25 % oder 75 % Einschaltdauer.

Dann wie oben, ein Tiefpassfilter, gefolgt von einem Diskriminator, der im halben Ausgangsspannungsbereich schaltet, gibt Ihnen das erste Bit der Ausgabe.

Ein Hochpassfilter, gefolgt von einem Gleichrichter, einem Kondensator und einem Diskriminator ergibt das zweite Bit.

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Abbildung 1. Eine einfache 3-Zustands-Binärcodierung, die durch einen Tiefpassfilter geleitet und von zwei Komparatoren überwacht wird, um die Daten zu extrahieren. Beachten Sie, dass viele Komparatoren Open-Collector-Ausgänge sind und einen Pull-up-Widerstand benötigen.

Sie werden einigen Herausforderungen gegenüberstehen, um die R1-C1-Zeitkonstante richtig einzustellen.

ja, schön, das ist eine der möglichen ADC-Implementierungen, die in meiner ersten Antwort erwähnt wurden .

Eine (schlechte) Lösung ist wie folgt.

data = gpio
schwach invertierender Schmitt-Trigger von gpio zu gpio.
invertiert retriggerbar monostabil von gpio nach en.

Die Grundidee ist, dass, wenn der Ausgang tristated ist, der Schmitt ihn zum Schwingen bringt, was vom Monostabilen aufgenommen wird, um den Ausgang zu deaktivieren. Dies wird jedoch beim Deaktivieren der Ausgabe fehlerhaft. Und hat Stromverbrauch, wenn deaktiviert.

Eigentlich ist das keine schlechte Idee. Ich habe beim Schreiben meiner Antwort die Tri-State-Option vergessen. Führen Sie es in einen RC-Entpreller am Eingang des anderen Chips ein. Der zweite Chip kann den Eingangsstatus lesen, den Eingang auf einen Ausgang schalten und versuchen, ihn auf den anderen Logikpegel zu ziehen, ihn freizugeben und zu sehen, ob er dort bleibt. Wenn dies der Fall ist, ist der erste Chip dreistufig. Wenn nicht, dann sind es Daten. Stärke deine Antwort.
Um das Problem mit dem Stromverbrauch zu beheben, könnte ich einfach die Richtung von EN und DATA umkehren.

Sofern Sie keine Aufgabe ausführen, die ausdrücklich besagt, dass Sie einen Attiny85 verwenden müssen, egal was passiert, ist die bei weitem einfachste Lösung, einen Chip mit mehr Pins zu verwenden (z. B. den Atmega328P). Die Kosten wären praktisch gleich (z. B. 2,00 $ im Vergleich zu 1,50 $).

Einige der anderen Antworten, die die Verwendung von Eindrahtprotokollen, Schieberegistern, Schmitt-Triggern, Komparatoren usw. vorschlagen, fügen ohnehin einfach mehr Teile (und Kosten) hinzu. Es wäre viel einfacher, einen Mikroprozessor zu verwenden, der tatsächlich das tut, was Sie wollen, als zusätzliche Chips hinzuzufügen, um seine Funktionalität auf weniger benutzerfreundliche Weise zu erweitern.


Eine weitere Möglichkeit: Der /RESET-Pin kann als allgemeiner IO-Pin konfiguriert werden. Auf diese Weise können Sie einen zusätzlichen Pin erhalten. Seien Sie gewarnt, dass eine spätere Neuprogrammierung schwieriger sein wird. Allerdings ist es nicht unmöglich. Ich habe einen Beitrag über die Hochspannungsprogrammierung von Chips wie dem Attiny85 mit einem anderen Prozessor (in diesem Fall einem Arduino Uno). Einige Teile ermöglichen es, die 12 V zum /RESET-Pin im geeigneten Moment einzuschalten.

Wenn Sie das zweite Beispiel von @ frarugi87 ( https://electronics.stackexchange.com/a/334700/53375 ) ausgliedern, könnten Sie mit Optoisolatoren etwas Ähnliches tun:

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Der Vorteil dieser Version besteht darin, dass sie sehr wenig Strom verbrauchen kann, wenn die Durchlassspannung des Optos (einschließlich zusätzlicher Dioden in Reihe, um dies sicherzustellen) mehr als die Hälfte der Versorgung beträgt. Natürlich darf es nicht mehr als der volle Vorrat sein, sonst kommen sie gar nicht an.

OUT0und OUT1können die entsprechenden Namen und Pull-Up/Down-Widerstände haben, um die gewünschte Kombination von Signalen zu erzeugen.

Das ist ordentlich, aber seien Sie vorsichtig, dass mit dem GPIO Tri-Stated beide LEDs etwas leitend sind.