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).
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.
Sie können zwei Komparatoren und die High-Input-Low-Werte verwenden. Zum Beispiel:
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:
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
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:
Natürlich bin ich ein Nerd, also hier sind Lösungen, die von Ihnen weniger wahrscheinlich umgesetzt werden, aber zum Spaß erwähnenswert sind:
Die folgenden Ideen basieren auf Seriell-zu-Parallel-Schieberegistern.
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 1
einen 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 B
auf 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->1
markiert den Beginn eines Zeitraums, und die Menge 1
innerhalb dieses Zeitraums legt fest, ob es sich um eine logische 0 oder 1 handelt.
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).
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.
Idee ist einfach:
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.
Idee : wie oben, aber einfacher.
Lassen Sie es zwei unabhängige Informationen geben:
Sie können die Einschaltdauer > 50 % entweder durch haben
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.
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.
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.
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:
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.
OUT0
und OUT1
können die entsprechenden Namen und Pull-Up/Down-Widerstände haben, um die gewünschte Kombination von Signalen zu erzeugen.
Trevor_G
Transistor
Paul Bonzini
Paul Bonzini
Transistor
Paul Bonzini
David Schwarz
bin ich
Cort Ammon
Jennifer