Forum: Mikrocontroller und Digitale Elektronik Output expander (1 Pin zur Verfügung)


von Lks (Gast)


Lesenswert?

Hallo zusammen,

ich bin auf der Suche nach einem Output Expander. Ich habe ein externes 
device, bei dem ich nur einen Ausgangspin zur Verfügung habe (ein 
Eingangspin wäre auch vorhanden). Mit dem Ausgangspin würde ich gerne 
mindestens 3 Ausgänge eines Output Expanders Schalten. Welcher wäre 
dafür geeignet?

Ich habe 12V und 5V zur Versorgung und als Ausgangspegel zur Verfügung. 
Das ganze darf beliebig langsam sein (keine 
Geschwindigkeitsanforderungen). Das entsprechende Protokoll müsste ich 
eh durch pin togglen implementieren, deswegen bin ich da recht offen 
(uart, 1wire, ..?).

Wichtig ist, dass die Signale erst gesetzt werden, wenn alle 
Informationen vorhanden sind. Also erst den Ausgang definieren (z.B. 
High Low High) und dann soll das für alle Ausgänge übernommen werden. 
Ich glaube, dass dadurch ein klassisches Shiftregister entfällt.

Wäre ggf. der DS2408 geeignet? Ich hab nur kurz ins Datenblatt geschaut 
aber ich konnte nicht direkt erkennen, wann die Ausgänge geschaltet 
werden.

Beste Grüße

von H.Joachim S. (crazyhorse)


Lesenswert?

Irgendo hier gabs doch den 1wire-bus von Peter Dannegger, scheint mit 
perfekt dafür. Empfänger wäre dann ein Tiny25 o.ä. Keine besonderen 
Anforderungen ans timing, der interne Oszillator reicht völlig.

von Timo (Gast)


Lesenswert?

Lks schrieb:
> Wäre ggf. der DS2408 geeignet? Ich hab nur kurz ins Datenblatt geschaut
> aber ich konnte nicht direkt erkennen, wann die Ausgänge geschaltet
> werden.

Dafür sind Datenblätter aber da ... -> Seite 17 "Channel-Access Write 
[5Ah]"

Die Ausgänge werde gleichzeitig geändert nachdem der neue Zustand und 
der invertierte neue Zustand übertragen wurden. Die Ausgänge werden nur 
geändert wenn wenn beide übereinstimmen.

Der Baustein ist also geeignet wenn die Ausgänge passen (Open Drain, max 
20mA insgesamt)

von Carl D. (jcw2)


Lesenswert?

Vor kurzem hatte jemand hier einen Bus anhand der Hardware zu 
"reengenieren", der wie die RGB-LED's funktionierte.

Zyklus beginnt mit einer Flanke, nach n μ-/m-sec wird gesampled, d.h. 
z.B. eine 0 wird zu: _|-|___|...
                 ^  ^  ^
eine 1 wird zu: _|---|_|...
                 ^  ^  ^
                 a  b  c
a: Anfang einer Bit-Zelle
b: Sample-Zeitpunkt
c: Anfang nächste Bitzelle

Die Daten werden in ein Schieberegister geschoben.
Nach einer Pause von 5..10 Bitzeiten werden die Daten in die 
Ausgangs-Latches des SR übernommen. Notfalls reicht, neben dem SR, ein 
retrigferbares Dual-Monoflop aus. Mit μC natürlich auch sehr easy.

Beitrag "Schaltung 1Wire Ansteuerung Schieberegister verstehen"

von Joe F. (easylife)


Angehängte Dateien:

Lesenswert?

Carl D. schrieb:
> Vor kurzem hatte jemand hier einen Bus anhand der Hardware zu
> "reengenieren"

Genau diesen Beitrag möchte auch ich empfehlen.
Da der Stromlaufplan im Beitrag leider ein paar Fehler hat, anbei eine 
"aufgeräumte" Version.

Mit den 3 Signalen DATA, CLK und STROBE steuerst du dann ein CD4094 
Schieberegister an (oder auch mehrere hintereinander).

: Bearbeitet durch User
von Joe F. (easylife)


Angehängte Dateien:

Lesenswert?

Aufräumen will gelernt sein.
Der vorherige Stromlaufplan enthält einen Fehler (A und Cx des 2. 
Monoflops gehören natürlich nicht verbunden).
Anbei die korrigierte Version.
C2 kann nach eigenem Ermessen dimensioniert werden.
33n kam uns ein wenig zu gut gemeint vor.
1n reicht sicherlich auch und macht eine höhere Refreshrate möglich.

: Bearbeitet durch User
von Carl D. (jcw2)


Lesenswert?

Joe F. schrieb:
> Carl D. schrieb:
>> Vor kurzem hatte jemand hier einen Bus anhand der Hardware zu
>> "reengenieren"
>
> Genau diesen Beitrag möchte auch ich empfehlen.
> Da der Stromlaufplan im Beitrag leider ein paar Fehler hat, anbei eine
> "aufgeräumte" Version.
>
> Mit den 3 Signalen DATA, CLK und STROBE steuerst du dann ein CD4094
> Schieberegister an (oder auch mehrere hintereinander).

Man braucht allerdings nicht unbedingt 1% Widerstände aus der E96-Reihe, 
wenn man Standard-C's mit 20% Toleranz benutzt. Es tun auch 470k, bzw 
etwas Fehlerrechnug, um das Timing in jedem Extremfall einzuhalten.

von Thomas E. (picalic)


Lesenswert?

Wenn man statt "diskreter" Hardware mehrere kleine Mikrocontroller 
benutzt, könnte man auch gleich das Daisy-Chain Prinzip der WS2812-LEDs 
benutzen.

- Lange/kurze Impuls = 1/0 (wie oben)
- der Mikrocontroller behält die ersten N Impulse für sich (seine N 
Digitalausgänge) und gibt die folgenden Impulse, auf definierte 
Impulslänge aufgefrischt, an seinem Ausgang wieder aus, wo dann der 
nächste µC dranhängt.
- kommen für eine gewisse Zeit keine weiteren Impulse, beginnt mit dem 
nächsten Impuls eine neue Übertragung.

Vorteil des Daisy-Chainings: es können beliebig viele, gleiche 
Controller, mit dem gleichen Programm, verkettet werden. Die 
Bit-Adressen ergeben sich aus der Verschaltung, d.h. es braucht keine 
Addressierung und auch keinen unterschiedlichem Code für die einzelnen 
Controller.

von Gerd E. (robberknight)


Lesenswert?

Nimm eine fertige Bitbang-UART-Implementation und sende die Daten damit. 
Dann brauchst Du auf der Seite Deines µCs nicht erst groß was 
entwickeln.

Empfangen würde ich die Daten mit dem UART-Eingang eines einfachen µC 
der dann die entsprechenden Portpins bei sich setzt.

Den UART-RX auf Seite Deines µCs lässt Du weg, den TX auf Seite des 
Portexpanders lässt Du einfach offen. Damit brauchst Du nur einen Pin.

Bei mir wäre der Portexpander-µC wohl ein STM32F030F4, es gehen aber 
natürlich auch andere Modelle wie z.B. Attiny. Wobei die Tinys halt 
meist keinen fertigen Hardware-UART haben.

Vorteile der Lösung sehe ich darin:
- fertiger Code zum Senden gut verfügbar
- fertiger Code für den Empfang gut verfügbar
- sehr verbreitetes Protokoll, fertige Decoder in Oszis und 
Logic-Analyzern vorhanden
- sehr flexibel, Du kannst Deine Anforderung daß alle Pins auf einmal 
gesetzt werden locker umsetzen
- kann auch später leicht erweitert werden, wenn z.B. ein Pin jetzt ein 
PWM-Signal ausgeben soll statt nur dauerhaft 0/1
- ein STM32F030F4 kostet weniger als ein Dallas-1wire-IC oder 
I2C-Portexpander

: Bearbeitet durch User
von Thomas E. (picalic)


Lesenswert?

Gerd E. schrieb:
> Bei mir wäre der Portexpander-µC wohl ein STM32F030F4,

Der hat in der Applikation aber einige Nachteile:

- läuft nicht mit 5V (ok, ich weiß nicht, ob das für den TO eine Rolle 
spielt)
- Gehäuseform nix für Grobmotoriker (ok, ich weiß nicht, ob das für den 
TO eine Rolle spielt)
- der interne Oszi ist für einen UART zu ungenau -> extra Quarz oder 
Resonator notwendig,
- braucht relativ viel Strom

Ich würde evtl. einen kleinen PIC nehmen. Der läuft auch mit 5V, braucht 
<<1mA, hat Hardware-UART und einen internen Oszi, der ohne 
User-Calibration genau genug ist. Und es gibt ihn auch als DIP.

von Gerd E. (robberknight)


Lesenswert?

Thomas E. schrieb:
>> Bei mir wäre der Portexpander-µC wohl ein STM32F030F4,
>
> - der interne Oszi ist für einen UART zu ungenau -> extra Quarz oder
> Resonator notwendig,

das stimmt so nicht. Der interne Oszillator HSI ist 8MHz und auf 1% (bei 
25°C) genau. Das reicht für langsamere UART-Übertragung mit z.B. 19200 
Bps vollkommen aus.

Und falls Du dennoch jemals Probleme in die Richtung bekommen solltest, 
kannst Du immernoch die Autobaud-Funktion nehmen und damit die Baudrate 
genau an die des Senders anpassen.

: Bearbeitet durch User
von Thomas E. (picalic)


Lesenswert?

Gerd E. schrieb:
> das stimmt so nicht. Der interne Oszillator HSI ist 8MHz und auf 1% (bei
> 25°C) genau. Das reicht für langsamere UART-Übertragung mit z.B. 19200
> Bps vollkommen aus.

Das eine Prozent gilt aber lt. Datenblatt nur für "with User 
Calibration", d.h. man müsste erstmal selbst einen Kalibrierungs-Wert 
ermitteln und speichern. Da sind mir die 2% ohne Kalibrierungs-Zinober 
vom PIC lieber.
Billiger ist der PIC außerdem auch noch, die Port-Ansteuerung kriegt man 
noch ohne HAL hin, und den Takt für den Port einzuschalten kann man auch 
nicht vergessen...

: Bearbeitet durch User
von Lks (Gast)


Lesenswert?

Auf einen uC wollte ich gerne verzichten (=> Flash Aufwand).

Der Hinweis von Timo ist sehr wertvoll, dann werde ich mir den IC mal 
näher anschauen.

Zu

"Nimm eine fertige Bitbang-UART-Implementation und sende die Daten 
damit.
Dann brauchst Du auf der Seite Deines µCs nicht erst groß was
entwickeln."

Mein "uC" ist ein zugekauftes device, welches einen FPGA drauf hat über 
den ich nur einen Ausgangspin steuern kann (der FPGA läuft mit einer 
festen, vom Hersteller gelieferten Firmware). Da wird es wohl nichts 
fertiges geben.

Der Hinweis auf die 1Wire Ansteuerung eines Schieberegisters werde ich 
mir anschauen, sollte ich mit dem DS2408 nicht glücklich werden.

Danke für die vielen konstruktiven Antworten.

von Joe F. (easylife)


Lesenswert?

Hier hat noch jemand die Monoflops "wegoptimiert".
DATA und STROBE werden einfach durch RC-Glieder "verzögert".
Die (wichtige) Flankensteilheit von CLK bleibt erhalten.

Diese Sparvariante sollte man natürlich nur wählen, wenn man mit einer 
gewissen Fehlerrate leben kann (z.B. an den Ausgängen hängen nur 
Anzeige-LEDs, und das Schieberegister wird in kurzen Abständen immer 
wieder aktualisiert).

http://www.romanblack.com/shift1.htm

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.