Forum: Mikrocontroller und Digitale Elektronik Verständnisfrage 1-Wire Kommunikation (DS18B20)


von Gerd (jacke1995)


Lesenswert?

Moin,

ich beschäftige mich momentan mit Temperaturmessungen und da stolpert 
man ja sofort über den DS18B20. Ich hätte eine 3. Ader für VDD, also 
KEINE parasitäre Versorgung. Soweit ich das verstanden habe, könnte ich 
DQ an einen Port hängen der als Open-Drain konfiguriert ist und dann per 
Bit-Banging lesen und schreiben.

Ich frage mich, ob es irgendwelche Bus-Protokolle gibt, die einem da 
Arbeit abnehmen können? Was ist z.B. mit USART im Modus Single Wire 
(Half Duplex)? Könnte man am USART-Pin irgendwie den Reset-Puls senden 
(keine Ahnung wie das gehen soll wenn der Port schon als USART_TX 
konfiguriert ist), dann per HAL_UART_Transmit einen ROM Command senden 
(keine Ahnung wie das ohne die passende Baudrate gehen soll) und z.B. 
per HAL_UART_RxCpltCallback die Antworten empfangen?

Wenn es sein muss, mache ich das alles per Hand und mit Timern, aber 
wenn es einen Weg gibt sich nicht so lange mit Timing-Problemen 
herumzuschlagen, wäre das schön.

Vielen Dank schon mal.

von (prx) A. K. (prx)


Lesenswert?

Gerd schrieb:
> Ich frage mich, ob es irgendwelche Bus-Protokolle gibt, die einem da
> Arbeit abnehmen können? Was ist z.B. mit USART im Modus Single Wire
> (Half Duplex)?

Es gibt AppNotes für 1-Wire per UART.

> Wenn es sein muss, mache ich das alles per Hand und mit Timern, aber
> wenn es einen Weg gibt sich nicht so lange mit Timing-Problemen
> herumzuschlagen, wäre das schön.

Es gibt Protokollkonverter zwischen I²C/SPI und 1-Wire.

Und es gibt fertigen Code im Internet.

: Bearbeitet durch User
von Rüdiger B. (rbruns)


Lesenswert?

(prx) A. K. schrieb:
> Es gibt Protokollkonverter zwischen I²C/SPI und 1-Wire.
>
> Und es gibt fertigen Code im Internet.

Und wenn du uns sagst welches System du hast bekommst du auch 
vernünftige Antworten.

von Falk B. (falk)


Lesenswert?

Gerd schrieb:
> ich beschäftige mich momentan mit Temperaturmessungen und da stolpert
> man ja sofort über den DS18B20. Ich hätte eine 3. Ader für VDD, also
> KEINE parasitäre Versorgung. Soweit ich das verstanden habe, könnte ich
> DQ an einen Port hängen der als Open-Drain konfiguriert ist und dann per
> Bit-Banging lesen und schreiben.

Ja.

> Ich frage mich, ob es irgendwelche Bus-Protokolle gibt, die einem da
> Arbeit abnehmen können?

Welche Arbeit?

> Was ist z.B. mit USART im Modus Single Wire
> (Half Duplex)?

Kann man machen, aber warum?

> Wenn es sein muss, mache ich das alles per Hand und mit Timern,

Es gibt mehrere, fertige OneWire Libs. Z.B. die hier.

Beitrag "Re: Onewire + DS18x20 Library"

Timer braucht man dafür nicht.

> aber
> wenn es einen Weg gibt sich nicht so lange mit Timing-Problemen
> herumzuschlagen, wäre das schön.

Was für ein Gejammer!

von Schlaumaier (Gast)


Lesenswert?

Immer die wichtigsten Daten vergessen.

1. Auf welcher MC soll das Laufen
2. Wie weit ist die Entfernung zwischen  MC + den Sensor.

Ich denke ohne die Antworten kann man nur besseres raten machen.

von admin (Gast)


Lesenswert?

Der Raspi Linux kennt einen 1-wire-Zugriff (unter /sys/bus/w1), evtl 
haben andere Linuxe das auch

von Wolfgang (Gast)


Lesenswert?

Gerd schrieb:
> Wenn es sein muss, mache ich das alles per Hand und mit Timern, aber
> wenn es einen Weg gibt sich nicht so lange mit Timing-Problemen
> herumzuschlagen, wäre das schön.

Millionen von DS18B20 laufen, ohne dass sich die Programmierer mit den 
Timing-Details rumgeschlagen haben. Das ist genau der Sinn von 
Bibliotheken.
Was ist bei dir die Motivation für eine Neuerfindung des Rades?

von Gerd (jacke1995)


Lesenswert?

Hallo zusammen,

vielen Dank für eure Hilfe. Momentan beschäftige ich mich mit einem 
Cortex M0, den ich mit STM32CubeIDE in C programmiere. Ich muss 
natürlich nicht das Rad neu erfinden und bin dankbar für gute Libs und 
sei es nur, um darin zu stöbern. Ich habe bei meinen Recherchen jedoch 
verschiedene Vorgehensweisen gesehen, wobei eben auch der USART vorkam. 
Ich fragte mich zwar, wie man mit dieser Schnittstelle einen speziellen 
Reset-Puls senden kann, aber da diese Interfaces im Grunde nur 
konfiguriert und mit Daten gefüttert werden und man sich anschließend um 
den ganzen Low-Level-Kram nicht kümmern muss, machte das bis auf die 
ungeklärten Fragen für mich durchaus Sinn.

von Εrnst B. (ernst)


Lesenswert?

admin schrieb:
> evtl haben andere Linuxe das auch

Ja. Notfalls über einen Umweg:
DS2482 an einen I²C-Bus hängen, schon gibt's einen 1w-Bus.

https://www.kernel.org/doc/html/latest/w1/masters/ds2482.html

Falls es an erreichbaren I²C-Bussen mangelt: Per I²C-Tiny-USB auch 
leicht nachrüstbar.

: Bearbeitet durch User
von my2ct (Gast)


Lesenswert?

Gerd schrieb:
> Ich fragte mich zwar, wie man mit dieser Schnittstelle einen speziellen
> Reset-Puls senden kann ...
Ein USART in der synchronen Betriebsart sollte doch nicht dauern mit 
Start-Stop dazwischen funken ...

von Zeno (Gast)


Lesenswert?

(prx) A. K. schrieb:
> Es gibt Protokollkonverter zwischen I²C/SPI und 1-Wire.
Was soll das für ein Baustein sein? Falls Du den DS2482 meinst, das ist 
aber kein wirklicher Konverter. Das Timingproblem nimmt er einem nicht 
wirklich ab. Einziger Unterschied ist, das man sich nicht mehr um die 
Serialisierung der Befehle und Daten für den DS18B20 kümmern muß. Dafür 
muß man halt den DS2482 zusätzlich ansprechen. Vorteile bringt der 
DS2482, wenn man die parasitäre Versorgung des DS18B20 vor hat.

Ansonsten gibt es genug Codebeispiele im Netz, wie man 1-Wire mit µC 
anspricht.

von Zeno (Gast)


Lesenswert?

Schlaumaier schrieb:
> 1. Auf welcher MC soll das Laufen
> 2. Wie weit ist die Entfernung zwischen  MC + den Sensor.

Es ist völlig wurscht auf welchem µC das laufen soll. Das ändert am Code 
nichts Relavantes. Die Leitungslänge ist für's erste auch erstmal so 
ziemlich egal, wenn man die Hinweise des Dabla beachtet.

Halt wieder mal ein Schlaumeierhinweis.

von Bauform B. (bauformb)


Lesenswert?

Zeno schrieb:
> Falls Du den DS2482 meinst, das ist aber kein wirklicher Konverter.
> Das Timingproblem nimmt er einem nicht wirklich ab.

Es gibt inzwischen drei Nachfolger für I2C, evt. sind die 
pflegeleichter:
- DS2483, inzwischen auch schon veraltet
- DS2484, inkl. Pegelwandler 3.3/5V
- DS2485, "1-Wire Command Scripting Capability", nur 3.3V, DFN-6

und natürlich den DS2480B mit UART <-> 1-Wire

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

Gerd schrieb:
> Moin,
>
> ich beschäftige mich momentan mit Temperaturmessungen und da stolpert
> man ja sofort über den DS18B20. Ich hätte eine 3. Ader für VDD, also
> KEINE parasitäre Versorgung. Soweit ich das verstanden habe, könnte ich
> DQ an einen Port hängen der als Open-Drain konfiguriert ist und dann per
> Bit-Banging lesen und schreiben.
>
Bit-Banging geht nur mit gesperrten Interrupts, da sonst das Timing 
gerne durcheinander kommt. Am einfachsten geht es mit der Ansteuerung 
ueber UART.

von (prx) A. K. (prx)


Lesenswert?

Zeno schrieb:
> Das Timingproblem nimmt er einem nicht wirklich ab.

Ich hätte gedacht, dass man da nur die Wartezeit der Messung 
berücksichtigen muss

von Zeno (Gast)


Lesenswert?

Bauform B. schrieb:
> - DS2485, "1-Wire Command Scripting Capability", nur 3.3V, DFN-6
Der macht am Ende auch nix anderes als der 2482. Du sagst dem Teil per 
i2c "sende den Befehl 0x44 (startet die Konvertierung beim DS1820) auf 
den 1-Wirebus". Daraufhin serialisiert er den Befehl 0x44 und gibt ihn 
über den 1-Wirebus aus. Das Ganze ist eigentlich sogar noch ein bischen 
aufwändiger als wen man den 1-Wirebus selbst ansprechen würde. Um diesen 
einen 1-Wire befehl senden zu können, muß man den Baustein erst mal 
ansprechen, gegebenenfalls initialisieren. Dann teilt man ihm mit das 
man einen 1-Wirebefehl senden möchte und schickt im anschließend diesen 
Befehl. Beim Datenlesen ist es ähnlich, erst teilt man ihm mit das man 
Datenaus dem Register lesen möchte und danach kann man die Daten lesen. 
Man ist also nach wie vor selbst für Einhaltung der Zeitabstände 
zwischen den Befehlen verantwortlich. Der Baustein nimmt einem also auch 
nur die richtige Serialisierung der Befehls-/Datensequenzen ab.
Was dieser IC gegenüber dem DS2482 besser ist, das er 
Standardbefehlssequenzen wie Reset-1-Wire, ReadByte, WriteByte in einem 
Rutsch ausführen kann. Ebenso scheint er 1-Wiresearch zu beherrschen. 
Wenn er letzteres komplett macht, dann ist das wirklich ein Gewinn.

Bauform B. schrieb:
> und natürlich den DS2480B mit UART <-> 1-Wire
Ja und auch dieser setzt am Ende nur die Befehlssequenzen um, d.h. ich 
sage ihm per RS2323 "sende über 1-Wire den Befehl xy". Die Behle in der 
richtigen Reihenfolge generieren muß ich auch hier selbst.

von Zeno (Gast)


Lesenswert?

(prx) A. K. schrieb:
> Ich hätte gedacht, dass man da nur die Wartezeit der Messung
> berücksichtigen muss
Das Timing der der Byteübertragung auf dem 1-Wirebus übernimmt er schon.
Aber wie Du bemerkt hast die Wartezeit zwischen den Messungen, oder auch 
die Zeit zwischen den einzelnen Befehlen und die komplette Belehssequenz 
ist immer noch Deine Sache. Du muß sogar prüfen ob auf dem 1-Wirebus 
noch irgendwelche Aktivitäten sind bevor Du die nächste Aktion 
durchführst oder die Daten abrufst. Ist zwar kein Hexenwerk, da Du dafür 
nur per i2c einen Befehl senden mußt und dann das Register lesen mußt.
Was die Bausteine übernehmen ist das Strongpullup bei parasitärer 
Speisung.
Wenn der µC i2c anbietet macht sich das mit den genannten IC schon ganz 
gut, da man die Sequenzen nicht selber serialisieren muß. Um den i2c 
Kram muß man sich ja meist auch nicht kümmern, da es hierfür 
entsprechende Bibliotheken gibt, die es vereinfachen.

von STK500-Besitzer (Gast)


Lesenswert?

Zeno schrieb:
> Das Ganze ist eigentlich sogar noch ein bischen
> aufwändiger als wenn man den 1-Wirebus selbst ansprechen würde.

Bis auf das "Problem", dass die I²C- / TWI-Schnittstelle bei vielen µC 
in Hardware vorhanden ist. One-Wire ist doch eher die Ausnahme.

von Zeno (Gast)


Lesenswert?

STK500-Besitzer schrieb:
> Zeno schrieb:
>> Das Ganze ist eigentlich sogar noch ein bischen
>> aufwändiger als wenn man den 1-Wirebus selbst ansprechen würde.
>
> Bis auf das "Problem", dass die I²C- / TWI-Schnittstelle bei vielen µC
> in Hardware vorhanden ist. One-Wire ist doch eher die Ausnahme.
Was ist an diesen 2 Sätzen so unverständlich?

Zeno schrieb:
> Wenn der µC i2c anbietet macht sich das mit den genannten IC schon ganz
> gut, da man die Sequenzen nicht selber serialisieren muß. Um den i2c
> Kram muß man sich ja meist auch nicht kümmern, da es hierfür
> entsprechende Bibliotheken gibt, die es vereinfachen.

von Falk B. (falk)


Lesenswert?

Uwe B. schrieb:
> Bit-Banging geht nur mit gesperrten Interrupts, da sonst das Timing
> gerne durcheinander kommt.

Korrekt, aber das trifft nur eine Bitzeit von ca. 60-100us. Zwischen den 
Bits dürfen Interrupts reinfunken, es gibt keine obere Grenze. Das ist 
für die Mehrzahl der Anwendungen akzeptabel, incl. dem Linuxkernel!

> Am einfachsten geht es mit der Ansteuerung
> ueber UART.

Nö, am einfachsten geht es definitionsgemäß mit einem beliebigen, 
digitalen IO-Pin. Das mit dem UART ist zwar nett, aber nicht zwingend. 
Und UNEINFACH, vulgo schwert oder schwierig ist One Wire wohl kaum! Das 
ist fast schon TRIVIAL! Erst recht, wenn man fertige Bibliotheken 
verwendet.

Ich hatte "damals" zwar auch 2-3 Tage an der Funktion zum Scannen aller 
IDs gebastelt, aber am Ende hat es nicht nur gut funktioniert, es war 
auch überaschend einfacher Code. Naja, ein geklöstes Problem ist immer 
"einfach".

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.