Forum: Analoge Elektronik und Schaltungstechnik 1-wire Sterntopologie


von Christian R. (cmrudolph)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

in der Appnote 148 (https://www.maximintegrated.com/en/an148) von Maxim 
habe ich über zuverlässige große 1-wire-Netzwerke gelesen.
Nun ist es gerade der Fall, dass ich hier ein "großes" Netzwerk im Haus 
installieren und dazu die vorhandene strukturierte Verkabelung 
(UC1500-Kabel von Draka) verwenden möchte. In die Netzwerkdosen sollen 
jeweils Temperatursensoren gesteckt werden. Deren Kabelenden laufen im 
Netzwerkschrank zusammen, wo der 1-wire-Master rein soll.
Die Kabel sind geschätzt maximal 25-30m lang und an jedem Ende soll wie 
oben beschrieben jeweils ein 1-wire-Gerät hängen. Es wird je Sensor 3 
Steckverbindungen geben (Sensor -> Dose, Patchfeld -> Patchkabel, 
Patchkabel -> Master), die die Leitungswerte auch beeinflussen dürften.

Um nun so ein geswitchtes Netzwerk, wie in der verlinkten Appnote 
angesprochen, herzustellen, würde da ein logiclevel Mosfet ausreichen, 
um die einzelnen Geräte auszuwählen?
Grob stelle ich mir das wie im angehängten Schaltplan vor. Dabei sind 
1-WIRE-SEL1 / 2 logic high, wenn die jeweilige Leitung gewählt wird. 
1-WIRE-OUT ist der 1-wire-Port vom Mikrocontroller.

Es könnte jetzt natürlich ein anderes als das ausgewählte Gerät den 
1-wire-Port low ziehen, aber in der Regel sind die ja still, sofern sie 
nicht angesprochen wurden.

Viele Grüße
Christian

: Bearbeitet durch User
von Route_66 H. (route_66)


Lesenswert?

Hallo!
Es gibt so etwas auch als IC, nennt sich Analogschalter oder 
Analogmultiplexer. z.B.4066, 4051 und viele weitere

: Bearbeitet durch User
von Christian R. (cmrudolph)


Lesenswert?

Danke! Der 4051 hört sich gut an. Die Widerstandswerte sind zwar etwas 
schlechter als beim 4066, dafür braucht der 4051 weniger Platz.

Der 4066 wiederum hätte den Vorteil, dass man etwas flexibler ist, falls 
man doch mal mehrere Sensoren gleichzeitig ansprechen möchte.
Wenn man eine Kaskade von Schieberegistern davor setzt, braucht man auch 
für die Auswahl der Ausgänge nicht so viele Pins am Mikrocontroller.

von Ralf D. (doeblitz)


Lesenswert?

Warum den 1wire-Bus multiplexen statt einfach mehrere Busse, z.B. mit 
dem DS2482-800 zu erzeugen?

Mir erscheint das zuverlässiger, da 1wire ja doch recht empfindlich 
bzgl. Timing ist und der Durchgangs-Widerstand durch den Multiplexer 
typisch im Bereich 100 Ohm liegt - das entspricht nicht gerade wenigen 
Metern Leitungslänge und dürfte in Verbindung mit den 
Leitungskapazitäten das Leben nicht gerade einfacher machen.

von Christian R. (cmrudolph)


Lesenswert?

Das war und ist auch eine Möglichkeit, die ich gedanklich noch 
durcharbeite.
Ob der zusätzliche Widerstand problematisch ist, weiß ich nicht. Ich 
glaube eher nicht, denn in der oben verlinkten Appnote wird unter 
"Distributed Impedance Matching" vorgeschlagen, bei einem Bus mit 
mehreren Abzweigungen an den Beginn jedes Zweiges einen 150 Ohm 
Widerstand zu hängen, um die Reflektion zu reduzieren.
In diesem Fall wäre ein Master mit aktivem Pullup laut der Appnote nicht 
geeignet.

Allerdings schreckt mich das Risiko mit dem DS2482 einen Fehlkauf zu 
machen doch etwas ab. Der Baustein kostet immerhin fast 10 Euro und ich 
bräuchte wohl 3 davon. Wenn das dann nicht funktioniert, wäre das 
ärgerlich.
Zumindest für den DS2480B steht in der Appnote, dass man einen 
R-C-Filter einsetzen soll, wenn die Leitungslänge zwischen 10 und 100m 
liegt.
Ob das auch für den DS2482-800 gilt, konnte ich nicht herausfinden.
Der DS2482 hat natürlich noch den Charme, dass er sowohl das Übertragen 
von ganzen Bytes als auch das Ausführen vom Search-ROM-Befehl 
vereinfacht und man sich über das Timing keine Gedanken mehr machen 
muss.

Laut Maxim erreicht man wie in Appnote 224 
(https://www.maximintegrated.com/en/an244 "Advanced 1-Wire Network 
Driver") beschrieben maximale Leitungslängen (ok, ich bewege mich mit 
unter 50m definitiv nicht an den Grenzen). Einen ähnlichen Treiber 
könnte man aber trotzdem in Kombination mit einem Multiplexer verwenden, 
falls man die Treiberstufe hinter den Multiplexer legt (dementsprechend 
mehrfach ausführt - die Bauteile sind ja aber nur Kleinigkeiten). 
Dadurch sollte nur noch die zu lesende Kurve verfälscht werden, weil die 
ausgewählte Leitung aktiv hoch oder runter gezogen wird.

von Timm T. (Gast)


Lesenswert?

Ralf D. schrieb:
> und der Durchgangs-Widerstand durch den Multiplexer
> typisch im Bereich 100 Ohm liegt

Na sorry, vor 100 Jahren vielleicht. Es gibt von Maxim durchaus moderne 
Multiplexer mit unter 1 ohm Schalterwiderstand. Man muß ja nicht immer 
den 4066 aus rauskramen.

Ralf D. schrieb:
> Warum den 1wire-Bus multiplexen statt einfach mehrere Busse, z.B. mit
> dem DS2482-800 zu erzeugen?

Warum dann nicht gleich - wenn das Protokoll per µC eh in Software 
erzeugt wird - mehrere Pins des µC verwenden.

Mit 3-4 Sensoren pro Pin und 8 Pins sollte das doch machbar sein. Selbst 
mit einem ATmega32 und 24 Pins verwendet ist man noch günstiger als der 
DS2482 - wenn man es eh selbst programmieren muß.

von Pete K. (pete77)


Lesenswert?

Also ich habe hier 15 Sensoren an einem Bus dranhängen. Kein Problem.

Warum nicht alles auf einen Pin schalten? Die Sensoren werden per 
Seriennummer identifiziert und nicht "durchgeschaltet".

Einer (Bus) für alle! :-)

von Wolfgang (Gast)


Lesenswert?

Pete K. schrieb:
> Warum nicht alles auf einen Pin schalten?

Weil viele 30m Kabel schon eine beträchtliche Kapazität darstellen, die 
ausreichend schnell umgeladen werden muss.

> Also ich habe hier 15 Sensoren an einem Bus dranhängen. Kein Problem.

Und welche Kapazität stellt deine Verkabelung dar?

von Falk B. (falk)


Lesenswert?

@ Wolfgang (Gast)

>> Warum nicht alles auf einen Pin schalten?

>Weil viele 30m Kabel schon eine beträchtliche Kapazität darstellen, die
>ausreichend schnell umgeladen werden muss.

Richtig.

Aber OneWire ist ebenso wie I2C nicht wirklich für längere Verdrahtung 
gedacht, auch wenn es bisweilen geht. I2C ist synchron, das kann man 
langsam takten. OneWire ist wie UART asynchron, das braucht ein 
definiertes Timing. Ab einer bestimmten Buskapazität, ich glaub 
offiziell 800pF, ist Feierabend.

von (prx) A. K. (prx)


Lesenswert?

Falk B. schrieb:
> OneWire ist wie UART asynchron, das braucht ein definiertes Timing.

Ab 750m ist aufgrund des Timings Feierabend.

Mit passivem Pullup und externem Treibertransistor geht bis 200m.

Mit einfachem Portpin sind max 3m empfohlen.

Quelle AN148.

Ich habe in einer Installation einen recht heterogenen Stern mit so 
30-40m Summenlast im Einsatz, mit 5K Pullup und 100 Ohm 
Serien-Schutzwiderstand am µC. Das Ergebnis ist nicht perfekt, aber 
brauchbar. 2 DS18x20 sind am längsten Zweig (>20m) in 10 Jahren 
verreckt.

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Falk B. schrieb:
> Ab einer bestimmten Buskapazität, ich glaub
> offiziell 800pF, ist Feierabend.

Möglicherweise verwechselst du was. Ein parasitärer 1-Wire Slave stellt 
eine Last von 800pF dar, allerdings nur oberhalb von 2,8V (MicroLAN 
Design Guide).

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@ A. K. (prx)

>> OneWire ist wie UART asynchron, das braucht ein definiertes Timing.

>Ab 750m ist aufgrund des Timings Feierabend.

;-) Na da kann man schon ein kleines LANs aufbauen

>Mit passivem Pullup und externem Treibertransistor geht bis 200m.

Würde ich trotzden nicht machen wollen. Bestenfalls für Hobbykram.

>Mit einfachem Portpin sind max 3m empfohlen.

Das klingt OK.

>Ich habe in einer Installation einen recht heterogenen Stern mit so
>30-40m Summenlast im Einsatz, mit 5K Pullup und 100 Ohm
>Serien-Schutzwiderstand am µC. Das Ergebnis ist nicht perfekt, aber
>brauchbar. 2 DS18x20 sind am längsten Zweig (>20m) in 10 Jahren
>verreckt.

Das war eher ESD als Buskapazität. Oder ne Einkopplung eines entfernten 
Blitzeinschlags.

von Falk B. (falk)


Lesenswert?

@A. K. (prx)

>> Ab einer bestimmten Buskapazität, ich glaub
>> offiziell 800pF, ist Feierabend.

>Möglicherweise verwechselst du was. Ein parasitärer 1-Wire Slave stellt
>eine Last von 800pF dar,

Das bezweifle ich mal grundlegend. Selbst bei parasitärer Versorgung hat 
ein OneWire Device KEINE Ausgangskapazität von 800pF. Bei normaler 
Versorgung erst recht nicht.

Beim DS18B20 steht z.B.

Capacitance CIN/OUT 25 pF

Das klingt realistisch.

von (prx) A. K. (prx)


Lesenswert?

Falk B. schrieb:
> Das war eher ESD als Buskapazität. Oder ne Einkopplung eines entfernten
> Blitzeinschlags.

So habe ich das auch verbucht. In einem Fall hat der zwar noch 
funktioniert, hat aber eine permanent hohe DC-Last auf die Leitung 
gelegt.

von (prx) A. K. (prx)


Lesenswert?

Falk B. schrieb:
> Das bezweifle ich mal grundlegend.

Von nix kommt nix. Bei parasitärer Versorgung hängt über eine Diode ein 
Kondensator an der Datenleitung. Der wird im Datasheet an dieser Stelle 
nicht berücksichtigt.

MicroLAN Design Guide:

"In Figure 1, whenever the data line is pulled high by the bus pull-up 
resistor the diode in the half wave rectifier turns on and charges the 
internal 800pF capacitor. When it drops below the voltage on the 
capacitor, the diode is reverse biased, isolating the charge."

"However, the 800 pF parasitic power supply capacitance only exists at 
voltage levels above 2.8V minimum. Ignoring the capacitance of the 
parasitic power capacitor, the bus pull-up resistor value, together with 
the cable capacitance and 1-Wire device input capacitance represent the 
network time constant ?. This is a reasonable omission since parasite 
capacitance does not become a factor until the bus has already passed 
the 2.2V logic one threshold."

Er spielt also im Leitunsdesign keine Rolle. Aber das ist die m.W. 
einzige Stelle, wo bei 1-Wire der Wert 800pF vorkommt. Mit 1K Pullup und 
slewrate controlles 2N7000 Treiber sehen die kein Problem bis 200m aka 
10nF.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Schon klar, das mit der parasitären Versorgung. Ich dachte nur bisher, 
dass die Entladung des internen Speicherkondensators während einer 
Bitzeit eher gering ist, sodaß der Nachladevorgang nicht ins Gewicht 
fällt.

von (prx) A. K. (prx)


Lesenswert?

Ist auch so. Aber woanders kannst du m.E. die 800pF nicht gefunden 
haben. In dem MicroLAN Dings fahren die als Beispiel 100m / 5nF, mit 1K 
pullup und slewrate controlled 2N7000 Treibertransistor als pulldown am 
µC.

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Christian R. schrieb:
> Um nun so ein geswitchtes Netzwerk, wie in der verlinkten Appnote
> angesprochen, herzustellen, würde da ein logiclevel Mosfet ausreichen,
> um die einzelnen Geräte auszuwählen?

Wenn du die Gates auf 10V legst ja.

Andernfalls wird es bei 0=>1 oberhalb von 3-4V etwas unschön, weil der 
Transistor mit steigendem Leitungspegel den Kanal zu macht und die 
Leitung am µC dann floatet.

Du solltest dafür den Pullup-R aufteilen. Einer niederohmig so wie 
gezeigt, der andere hochohmiger am µC Pin.

: Bearbeitet durch User
von Christian R. (cmrudolph)


Lesenswert?

Da ich sowieso 8 Adern (plus GND) zur Verfügung habe, werde ich wohl 
keine parasitäre Versorgung der Sensoren machen. Dadurch wird die 
Kapazität des Busses nicht zusätzlich durch die Wiederaufladung 
beeinträchtigt.

Wenn ich die AN148 richtig verstanden habe, ist bei dem sternförmigen 
Aufbau nicht die Kapazität der Leitung, sondern die Reflektion das 
Hauptproblem. Deshalb wird dort vorgeschlagen, den Bus zu switchen.

Mein Master soll so ausgelegt sein, dass ich bis zu 16 Sensoren 
anschließen kann. Aufgrund der Leitungslänge werde ich ein aktives 
pullup und pulldown einsetzen. Das bedeutet, dass pro Bus / Sensor drei 
I/Os benötigt werden. Bei 16 Sensoren kommt da schon einiges zusammen.
Ich hätte auch gerne die Möglichkeit, alle Sensoren gleichzeitig 
anzusprechen (Temperaturkonversion starten). Deshalb kann ich eigentlich 
keinen Multiplexer einsetzen.

Eine halbwegs realistische Option wäre wohl, Analogschalter für die 
Steuerleitungen vom aktiven pullup / pulldown einzusetzen. R_on wäre in 
diesem Fall egal, weil sowieso ein 4k7 Vorwiderstand vor den Treiber 
kommt. Man muss den Widerstand dann ja nur um R_on reduzieren.
Um die Pins für die Auswahl der Schalter zu sparen, könnte man ein 
Schieberegister einsetzen (sonst bräuchte man die Analogschalter auch 
gar nicht, weil man die Leitungen dann auch direkt hätte schalten 
können).

Bleiben also 16 Eingänge für die Leserichtung, zwei Ausgänge für die 
Steuerleitung vom pullup / pulldown und drei Ausgänge für die 
Schieberegisterkaskade.
Mit 21 I/Os für das Bussystem kommt man also hin. Der Mikrocontroller 
steht natürlich nicht alleine da, deshalb kommen noch Leitungen für UART 
oder I2C dazu.

von LOL (Gast)


Lesenswert?

Eine Möglichkeit, deine 8 Adern sinnvoll zu nutzen wäre, wenn du 1-Wire 
in einem Kabel jeweils zu dem W1 Slave hin- und zurückführst. Dann 
brauchst du u.U. keine Switches oder Ähnliches.

Dadurch bekommst du am Ende zwar die doppelte Buslänge, kannst dir aber 
eine zentrale Kopfstation bauen, weil das Ganze kabelseitig/in der Wand 
wie ein Stern aussieht, die Verdrahtung aber ein Bus ist.

Mit 4 Doppeladern/Netzwerkkabel geht das ganz gut: 1DA 1-Wire+GND hin, 
1DA 1-Wire+GND zurück, 1DA 5V Spannungsversorgung. Du hättest sogar noch 
1 DA frei, z.B. für 12V.

Nachteil: Du hast die doppelte Buslänge und "verschwendest" viele Adern 
für einen Bus, der dem Namen nach nur eine braucht.

Vorteile:
A) Du kannst an der "Kopfstation" so viele Busmaster hinhängen, wie du 
willst - der Bus kann prinzipiell an jeder Stelle in mehrere Segmente 
aufgeteilt werden.

B) Du hast einen "echten" Bus. Also genau das, was man braucht, um 
maximale Reichweite zu erzielen.

Ich habe so ein System mit über 300m Buslänge / 150m Kabellänge und >30 
Slaves am Laufen . Bis 350m lief alles mit meinem USB-Busmaster 
störungsfrei (0 "Error"s im OWFS). Aktuell brauch spezielle Timings, der 
Bus ist derzeit ca. 470m lang. Läuft zwar, ist aber nicht mehr 
Störungsfrei (ein paar hundert "Error"s im OWFS pro Monat).
Insofern werde ich da demnächst mindestens einen zusätzlichen Busmaster 
installieren müssen.

von Christian R. (cmrudolph)


Lesenswert?

LOL schrieb:
> Eine Möglichkeit, deine 8 Adern sinnvoll zu nutzen wäre, wenn du 1-Wire
> in einem Kabel jeweils zu dem W1 Slave hin- und zurückführst. Dann
> brauchst du u.U. keine Switches oder Ähnliches.

Das ist eine gute Idee, um die Komplexität des Masters zu reduzieren.
Am Donnerstag werden die Leitungen vermessen und dann weiß ich auch, wie 
lang sie genau sind. Dann könnte ich immer noch überlegen, wie viele 
Einzelbusse sinnvoll sind. Denn bei 16 Leitungen mit im Schnitt sagen 
wir mal 15m Länge (ist wahrscheinlich noch zu wenig), wären das auch 
schon 465m Leitungslänge.
Damit ist man schon gefährlich nahe an der laut Maxim realistisch 
erreichbaren Obergrenze von 500m.

Auf vier Busse aufgeteilt wären da dann aber sicherlich keine Probleme 
zu erwarten.

Dann kann ich mir die Komplexität von Analogschalter + Schieberegister 
sparen, die sich ja auch auf die Software niederschlägt.

: Bearbeitet durch User
von Timm T. (Gast)


Lesenswert?

Christian R. schrieb:
> Das ist eine gute Idee, um die Komplexität des Masters zu reduzieren.

Achje. Dann kannst Du aber auch gleich eine RS485 in Sterntopologie 
machen. Die kannst Du dann beliebig langsam fahren und hast keine 
Probleme mit Reflexionen. Und brauchst nur 2 Leiterpaare (D-, D+, GND, 
5V-24V), kannst also auf den anderen 2 Leiterpaaren noch LAN machen.

von Christian R. (cmrudolph)


Lesenswert?

Timm T. schrieb:
> Achje. Dann kannst Du aber auch gleich eine RS485 in Sterntopologie
> machen.

Was ist an dem Ansatz denn verkehrt, vier Busse mit einem 
Mikrocontroller zu betreiben?

RS485 verträgt sich mit den 1-wire-Sensoren nicht so gut ;-)

von Timm T. (Gast)


Lesenswert?

Christian R. schrieb:
> Was ist an dem Ansatz denn verkehrt, vier Busse mit einem
> Mikrocontroller zu betreiben?

Nichts. Hab ich ja oben vorgeschlagen.

Es ging aber gerade darum, den Bus über die Cat-Kabel durchzuschleifen, 
also immer hin und zurück, plus die Stromversorgung dann 3 Leiterpaare. 
Unter 1-wire stell ich mir was anderes vor.

von Christian R. (cmrudolph)


Lesenswert?

Wahrscheinlich werde ich jetzt folgende Komponenten wählen:
- ATMega1284P
- 3 Schieberegister (74HC4094) von NXP
- 10 Quad-Analogschalter (74HC4066) von NXP
- Microchip ENC424J600 Ethernetcontroller

Vom ATMega1284P sind bis auf einen Pin bei 20 1-wire-Bussen alle Pins 
belegt. Der eine Pin kann dann noch für eine Statusausgabe mittels LED 
oder so verwendet werden. Die JTAG-Schnittstelle ist in dem Fall nur 
nutzbar, wenn man die letzten vier 1-wire-Busse nicht nutzt.

Der Vorteil gegenüber einer "Schleifenverdrahtung" ist, dass die 
Leitungslänge nicht so groß wird. Vor allem bei den entfernteren Geräten 
wären sehr viele Steckverbindungen dazwischen (bei 4 in Reihe wären es 
schon 8 Steckverbindungen).
Wenn jeweils nur ein Sensor an einem Bus hängt, kann man den 1-wire-Bus 
ohne ROM-Adressen betreiben. Außerdem hat man die Möglichkeit, 
Multicasts zu senden (z. B. Alarm Search oder Convert T).

Die Analogschalter sollen dann, wie in einem meiner letzten Beiträge 
beschrieben, für die Schaltung der aktiven Pullups / Pulldowns verwendet 
werden. Die Sense-Leitungen gehen direkt auf einen Eingang des µC.

Gegen Multiplexer habe ich mich entschieden, weil damit die 
Multicast-Option wegfiele.

Ich hoffe, dass der ATMega1284P leistungsfähig genug ist, um sowohl die 
1-wire-Busse als auch die Ethernet-Schnittstelle bedienen zu können.
Vielleicht kann da jemand kompetenteres als ich eine Einschätzung zu 
abgeben.

Wenn das zu eng werden sollte, würde ich einen weiteren Mikrocontroller 
nur für die Netzwerkschnittstelle verwenden.

: Bearbeitet durch User
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.