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
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.
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)
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"
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).
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.
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.
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.
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
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.
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.
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...
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.
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