Forum: Mikrocontroller und Digitale Elektronik DS1820 / 1-wire ohne delay


von Mike (Gast)


Lesenswert?

Hallo,
Ich habe den DS1820 Temperatur Sensor mit einem SMT32 zum Laufen 
bekommen. Für das Bit Timing benötigt man ja delays. Dafür kann man 
delay_us() benutzen oder mit Interrupts die Wartezeiten realisieren.

Meine Frage ist, ob man da prinzipiell drauf verzichten kann? Also dass 
ich eine Funktion "start_temp_conversion()" aufrufe, die an sich fast 
keine Zeit benötigt und nur den ganzen Ablauf antriggert. Das Senden und 
Empfangen kann ja im "Hintergrund" über Interrupts ablaufen. So habe ich 
den Vorteil, dass ich im Code was anderes machen kann und später - nach 
der erfolgreichen Konversion - einfach die Temperatur aus eine Art 
Buffer lesen kann.

Leider weiß ich nicht, wie man da am geschicktesten vorgeht. Gibt es da 
Beispiele zu? Oder hat jemand Quellen, wo ich mich dazu schlau machen 
kann? Ist das überhaupt eine übliche Vorgehensweise oder gibt es da noch 
einen besseren Weg?

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

vom Prinzip geht das schon, du musst halt mal prüfen/ausrechnen ob sich 
das Timing des 1W mit Timerinterrupts einhalten lässt (max. Verzögerung 
zw. auslösen des INT und Ausführung der entsprechenden Routine).
Wenn das geht musst du in Variablen den Zustand festhalten wo du beim 
letzten INT warst damit du beim nächsten weißt wo's weitergeht und wann 
du fertig bist.

Sascha

von nuk (Gast)


Lesenswert?

Da bei onewire die Zeiten recht kritisch sind, wird es wahrscheinlich 
schwierig das auf Interrupt umzustellen. Hast Du ein Oszilloskop zur 
Hand?

Wie oft fragst Du denn Deine Tempeartur ab?
Und von welchen Delays reden wir? Von den 'Bitdelays' oder den 
Verzögerungen zwischen zwei Tranfers.
Letztere lassen sich mit einem Scheduler oder einem RTOS ganz gut 
anderweitig nutzen...

von 1N 4. (1n4148)


Lesenswert?

Nimm doch einen UART. Dann brauchst du nicht auf das Timing achten.

von (prx) A. K. (prx)


Lesenswert?

Per Interrupt gesteuertes Timing von wenigen µs dürfte zwar machbar 
sein, aber da muss man dann schon ein wenig drauf achten, wann man 
Interrupts wie lange sperrt. Der betreffende Interrupt sollte höchste 
Priorität haben und Interrupts sperrt man besser nicht global, sondern 
per Priorität (siehe BASEPRI_MAX).

Allerdings kann man Kompromisse eingehen. So kann man die kritische Zeit 
eines 1-Wire Bits mit aktiven Delays abwickeln, also im 1-16µs Bereich, 
und den Rest per Interrupt. Ich habe das bei einem AVR so gemacht, auf 
dem ein RTOS mit 10 kHz getaktet wird. Zwischenbit- und Reset-Delays 
erledigt das RTOS. Der Bitabstand liegt dann bei mindestens 100µs, aber 
das stört weder mich noch 1-Wire.

: Bearbeitet durch User
von 1N 4. (1n4148)


Lesenswert?

Nochmal: UART. Kostet halt 2 Pins, dafür kann aber alles im Hintergrund 
durch Interrupts erfolgen ohne dass man sich um das Timing sorgen machen 
müsste.

Ich gehe mal davon aus, dass der STM32 sich in dieser Hinsicht nicht 
negativ von den PIC(16..32) unterscheidet.

https://www.maximintegrated.com/en/app-notes/index.mvp/id/214

: Bearbeitet durch User
von Mike (Gast)


Lesenswert?

1N 4. schrieb:
> Nochmal: UART. Kostet halt 2 Pins, dafür kann aber alles im Hintergrund
> durch Interrupts erfolgen ohne dass man sich um das Timing sorgen machen
> müsste.

Ja genau deswegen ist mir auch die Idee gekommen, dieses Prinzip bei dem 
1-wire Protokoll anzuwenden. Da ich jetzt aber die DS1820 Sensoren 
verwenden möchte, fällt die Lösung leider weg.

von (prx) A. K. (prx)


Lesenswert?

Mike schrieb:
> Ja genau deswegen ist mir auch die Idee gekommen, dieses Prinzip bei dem
> 1-wire Protokoll anzuwenden. Da ich jetzt aber die DS1820 Sensoren
> verwenden möchte, fällt die Lösung leider weg.

Wohl Missverständnis. Man kann mit einer UART das 1-Wire Protokoll 
implementieren. 0xFF ausgeben ist ein kurzes Bit, 0x00 ausgeben ein 
langes, oder so in der Art. Gegenrichtung ähnlich.

: Bearbeitet durch User
von 1N 4. (1n4148)


Lesenswert?

Ein PIC18 klappert hier per UART ~40 DS18B20 Sensoren ab und langweilt 
sich.
2 Pins, 1 Diode, 1 Pullup. Wenn man einen Strong Pull Up für Parasite 
Power will, brauchts halt noch einen GPIO.

von Falk B. (falk)


Lesenswert?

@Mike (Gast)

>> Nochmal: UART. Kostet halt 2 Pins, dafür kann aber alles im Hintergrund
>> durch Interrupts erfolgen ohne dass man sich um das Timing sorgen machen
>> müsste.

>Ja genau deswegen ist mir auch die Idee gekommen, dieses Prinzip bei dem
>1-wire Protokoll anzuwenden. Da ich jetzt aber die DS1820 Sensoren
>verwenden möchte, fällt die Lösung leider weg.

Er meint, den UART über Tricks als Hardwaremodul für Onewire zu nutzen, 
so wie es auch echte Hardwaremodule für UART, SPI, I2C, CAN etc. gibt. 
Ich würde SPI nehmen, denn dort kann man einen Transfer starten, der ein 
Datensignal zum rechten Zeitpunkt abtasten kann, ganz ohne CPU Arbeit 
und delays. Aber auch dann wird man um kleine Delays im 2stelligen us 
Bereich nicht herum kommen, dazu braucht man ein echten OneWire 
Hardwaremodul.

von 1N 4. (1n4148)


Lesenswert?

Wenn der UART das Timing erledigen kann, weshalb dann SPI nehmen? In der 
App-Note von Maxim ist das wunderbar erklärt...

von Falk B. (falk)


Lesenswert?

@1N 4148 (1n4148)

>Wenn der UART das Timing erledigen kann, weshalb dann SPI nehmen? In der
>App-Note von Maxim ist das wunderbar erklärt...

Hast recht, hab ich aber erst jetzt gelesen ;-)

von Mike (Gast)


Lesenswert?

A. K. schrieb:
> Wohl Missverständnis. Man kann mit einer UART das 1-Wire Protokoll
> implementieren. 0xFF ausgeben ist ein kurzes Bit, 0x00 ausgeben ein
> langes, oder so in der Art. Gegenrichtung ähnlich.

Daran habe ich garnicht gedacht. Danke Dir! Ich habe dazu gerade ein 
Application Note von maxim gefunden. Sieht sehr vielversprechend aus. 
Für die, die es interessiert:
https://www.maximintegrated.com/en/app-notes/index.mvp/id/214

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


Lesenswert?

Stm32 Uart kann Half-Duplex und Open-Drain. Damit langt der eine UART TX 
Pin fuer OWI. Ebenso kann man auch einen der 2-Kanal Timer nehmen und 
braucht auch nur einen Pin. Beispiele in Ethernut SVN 
http://www.ethernut.de/en/download/index.html und dann nut/app/owibus

von Peter D. (peda)


Lesenswert?

Eine Möglichkeit ist auch, das 1-wire als Statemaschine zu 
programmieren.
D.h. je State macht man nur Reset bzw. ein Bit.
Dann hat man max 480µs/60µs Delay je Mainloop-Durchlauf.
Und die kritischen 15µs macht man unter Interruptsperre.

: 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.