Forum: Mikrocontroller und Digitale Elektronik Probleme mit DS1820, DS18B20


von Pier S. (bigpier)


Lesenswert?

Guten Morgen!
Ich habe die Software von DS1820, DS18B20 in C 
(Beitrag "DS1820, DS18B20 in C")
ausprobiert und soweit funktioniert es auch!
Das Problem ist das sobald ich 2m Kabel an den Sensor hänge findet die 
Software den Sensor nicht mehr!
Beziehungsweise reicht es schon nur einen 2 m langen Draht an die 
Datenleitung zu halten und die Kommunikation bricht zu summen!
Was mache ich Falsch?
Habe mir mit dem Oszilloskop das Signal angesehen und interessanter 
weiße kommt das Signal manchmal nicht mehr ganz auf Null sobald der 
Draht an der Datenleitung hängt!
Die Flanken sind aber steil!

Wie könnte ich das Problem lösen?

Lg
Peter

von Heinz (Gast)


Lesenswert?

PullUp vergessen?

von Pier S. (bigpier)


Lesenswert?

Habe ich drauf4,7k Ohm
LG
Peter

von Martin L. (loidi)


Lesenswert?

Betreibst du den Sensor im parasitären Modus?

von Peter D. (peda)


Lesenswert?

Die 15µs bis zum Lesen können manchmal etwas lang sein, probier mal 
10µs.

von Pier S. (bigpier)


Lesenswert?

Also ich habe den Sensor direkt mit 5 Volt versorgt!
Die Software aber Original belassen!

Was sagt das aus?

LG
Danke
peter

von Martin L. (loidi)


Lesenswert?

Pier S. schrieb:
> Also ich habe den Sensor direkt mit 5 Volt versorgt!
> Die Software aber Original belassen!
>
> Was sagt das aus?
>
> LG
> Danke
> peter

Im parasitären Modus muss lt. Datenblatt sichergestellt sein, dass 
ausreichend Strom zur Verfügung steht, bzw. sichergestellt werden, dass 
die Spannung am Bus nicht einbricht. Weiters muss Vdd auf GND gelegt 
werden.

Nachdem du den Sensor aber nicht im parasitären Modus betreibst ist das 
hinfällig.

Lg Martin

von Pier S. (bigpier)


Lesenswert?

Martin Loidl schrieb:
> Nachdem du den Sensor aber nicht im parasitären Modus betreibst ist das
> hinfällig.

Wie kann ich dem Problem auf die schliche kommen?

LG
Peter

von Martin L. (loidi)


Lesenswert?

Pier S. schrieb:
> Martin Loidl schrieb:
>> Nachdem du den Sensor aber nicht im parasitären Modus betreibst ist das
>> hinfällig.
>
> Wie kann ich dem Problem auf die schliche kommen?
>
> LG
> Peter

Kannst du bitte den Schaltplan hochladen?

von chris (Gast)


Lesenswert?

Pullup verringern bzw welches Kabel wird genutzt??

von Pier S. (bigpier)


Angehängte Dateien:

Lesenswert?

Bitteschön hier der Plan!

Peter

von Pier S. (bigpier)


Lesenswert?

Ich verwende ein 3x0,5mm² Geschirmtes Kabel!
Aber auch ein einfache Litze an der Datenleitung zerschießt mir die 
Kommunikation!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Pier S. schrieb:
> Wie kann ich dem Problem auf die schliche kommen?

Hast Du den Beitrag von Peter um 08:38 Uhr überlesen?

von Pier S. (bigpier)


Lesenswert?

Frank M. schrieb:
> Hast Du den Beitrag von Peter um 08:38 Uhr überlesen?

Das hab ich überlesen! Asch auf mein Haupt:(
Werde es später probieren!!

von Pier S. (bigpier)


Lesenswert?

Peter Dannegger schrieb:
> Die 15µs bis zum Lesen können manchmal etwas lang sein, probier
> mal
> 10µs.

Guten Morgen habe es mit 10µS Probiert, leider das selbe:(
1
uint8_t w1_bit_io( uint8_t b )
2
{
3
  cli();
4
  W1_DDR |= 1<<W1_PIN;
5
  DELAY( DELAY_US( 1 ));
6
  if( b )
7
    W1_DDR &= ~(1<<W1_PIN);
8
  DELAY( DELAY_US( 10 - 1 )); // von15µS auf 10µS
9
  if( (W1_IN & (1<<W1_PIN)) == 0 )
10
    b = 0;
11
  DELAY( DELAY_US( 60 - 15 ));
12
  W1_DDR &= ~(1<<W1_PIN);
13
  sei();
14
  return b;
15
}

Habe ich die änderung richtig gemacht?
LG
Peter

von spess53 (Gast)


Lesenswert?

Hi

Was macht eigentlich der Widerstand in der Datenleitung?

MfG Spess

von Pier S. (bigpier)


Lesenswert?

spess53 schrieb:
> Hi
>
> Was macht eigentlich der Widerstand in der Datenleitung?
>
> MfG Spess

War als Entstörung gedacht! Habe irgendwo im Forum gelesen das die 
modernen Avr mit den starken Port Treibern ohne Serien Widerstand 
Probleme verursachen können!
Habe den widerstand auch überbrückt bringt aber auch nix:((

Danke bin für jeden Vorschlag Dankbar

LG
Peter

von Sebastian W. (wangnick)


Lesenswert?

Wo im Schaltplan ist das Kabel? M.a.W., sind Stützkondensator und Pullup 
auf der uC-Seite oder der DS-Seite ...

Zeig auch mal die Oszi-Bilder von beiden Seiten.

LG, Sebastian

von Peter D. (peda)


Lesenswert?

Welchen CPU-Takt hast Du?
1MHz könnte knapp werden, nimm besser 8MHz.

Probier mal 47 .. 220R als Serienwiderstand und 1 .. 2,2k als Pullup.

von Pier S. (bigpier)


Lesenswert?

Sebastian Wangnick schrieb:
> Wo im Schaltplan ist das Kabel? M.a.W., sind Stützkondensator und Pullup
> auf der uC-Seite oder der DS-Seite ...

Der Stützkondensator ist am DS und der Pullup auf der µC Seite!

Peter Dannegger schrieb:
> Welchen CPU-Takt hast Du?

Ich verwende 14745600HZ als Takt die Oszibilder kann ich später 
nachreichen!

Danke

LG
Peter

von grundschüler (Gast)


Lesenswert?

mal messen, wie lange 60 x _delay_ms(1000) dauert. Kann eigentlich nur 
ein Zeitproblem sein. Bei mir funktionieren ca. 20 Sensoren in einem 
kreuz und quer durchs ganze Haus verlegten Netzwerk ohne sc1 und sr1 
völlig problemlos.

von Pier S. (bigpier)


Lesenswert?

grundschüler schrieb:
> ohne sc1 und sr1
> völlig problemlos.

Was meinst Du damit?
Verwendest du den Original Code?

Vielen Dank
LG
Peter

von Sebastian W. (wangnick)


Lesenswert?

Pier S. schrieb:
> Habe ich die änderung richtig gemacht?

Nein, die Slotzeit ist jetzt nur noch 55uS (1+9+45). Die dritte 
Delay-Zeile muss lauten:
1
  DELAY( DELAY_US( 60 - 10 ));

LG, Sebastian

von Pier S. (bigpier)


Lesenswert?

Sebastian Wangnick schrieb:
> Nein, die Slotzeit ist jetzt nur noch 55uS (1+9+45). Die dritte
> Delay-Zeile muss lauten:  DELAY( DELAY_US( 60 - 10 ));
>
> LG, Sebastian

OK Danke
Kannst du mir das erklären?
LG
Peter

von Karl H. (kbuchegg)


Lesenswert?

Pier S. schrieb:
> Sebastian Wangnick schrieb:
>> Nein, die Slotzeit ist jetzt nur noch 55uS (1+9+45). Die dritte
>> Delay-Zeile muss lauten:  DELAY( DELAY_US( 60 - 10 ));
>>
>> LG, Sebastian
>
> OK Danke
> Kannst du mir das erklären?


Wenn ein Vorgang 60 Minuten dauern soll und aus 2 Teilen besteht, von 
denen der erste 15 Minuten dauert und daher der 2. Teil 45 Minuten 
braucht, wie lange muss dann der 2. Teil dauern, wenn du den ersten Teil 
auf 10 Minuten verkürzt
1
   vorher   nachher
2
3
     15       10
4
   + 45     +  ?
5
   -----   ------
6
     60       60

Die 60 sind dir vorgegeben. Die sind einzuhalten.

Am besten schreibst du die Zahl nur einmalig hin
1
#define PULSTIME   10
2
3
4
....
5
6
    DELAY( DELAY_US( PULSTIME ) );
7
8
...
9
10
    DELAY( DELAY_US( 60 - PULSTIME ) );
11
...

Dann erledigt der Compiler die Anpassung bei Änderung.

: Bearbeitet durch User
von Pier S. (bigpier)


Angehängte Dateien:

Lesenswert?

So hier die versprochenen Bilder vom Oszilloskop!

Habe jetzt den Pullup auf 1k und den Serienwiederstand auf 220Ohm!

Sobald an der Datenleitung 2 m Kabel hängen ist Schluss mit der 
Kommunikation!

Vielen Dank für Eure Hilfe

LG
Peter

von Sebastian W. (wangnick)


Lesenswert?

Hallo Peter,

Pier S. schrieb:
> So hier die versprochenen Bilder vom Oszilloskop!
> Habe jetzt den Pullup auf 1k und den Serienwiederstand auf 220Ohm!

Entweder ich bin blöd oder ich verstehe dich nicht. Bei der 
Konfiguration (1k, 220) und deinem Schaltplan würde bei Low an PG0 die 
Spannung an OW2 nur bis ca. 1V fallen. Auf den Oszibildern scheint sie 
aber bis auf fast 0V zu fallen.

Meine Vermutung ist, dass du die Oszibilder VOR der Veränderung der 
Widerstände gemacht hast ...

LG, Sebastian

von Pier S. (bigpier)


Lesenswert?

Sebastian Wangnick schrieb:
> Entweder ich bin blöd oder ich verstehe dich nicht. Bei der
> Konfiguration (1k, 220) und deinem Schaltplan würde bei Low an PG0 die
> Spannung an OW2 nur bis ca. 1V fallen. Auf den Oszibildern scheint sie
> aber bis auf fast 0V zu fallen.
>
> Meine Vermutung ist, dass du die Oszibilder VOR der Veränderung der
> Widerstände gemacht hast ...
>
> LG, Sebastian

Nein die Bilder sind nach der Änderung der Werte gemacht!
Was meinst du damit kann dir nicht folgen!

Danke LG
Peter

von Sebastian W. (wangnick)


Lesenswert?

Pier S. schrieb:
> Was meinst du damit kann dir nicht folgen!

Je nun, R2 und R1 bilden ja einen Spannungsteiler.

+5V - R2(1kΩ) - OW2 - R1(220Ω) - PG0

Wenn nun PG0 aktiv auf Low 0V zieht, und OW2 hochohmig ist, dann muss 
die Spannung an OW2 ... 5V/1220Ω*220Ω = 0.9V sein.

LG, Sebastian

von Pier S. (bigpier)


Lesenswert?

Sebastian Wangnick schrieb:
> Pier S. schrieb:
>> Was meinst du damit kann dir nicht folgen!
>
> Je nun, R2 und R1 bilden ja einen Spannungsteiler.
>
> +5V - R2(1kΩ) - OW2 - R1(220Ω) - PG0
>
> Wenn nun PG0 aktiv auf Low 0V zieht, und OW2 hochohmig ist, dann muss
> die Spannung an OW2 ... 5V/1220Ω*220Ω = 0.9V sein.
>
> LG, Sebastian

Ich habe direkt am Sensor nach dem Kabel gemessen! (Oszi Masse an Pin 1 
des Ds)

Lg
Peter

von grundschüler (Gast)


Lesenswert?

Pier S. schrieb:
>> ohne sc1 und sr1
> Was meinst Du damit?

kein C1 und kein R1 auf deinem Schaltplan.

Wo kommen denn die Einbrüche auf deinem Oszi-bild her? Sind die 
reproduzierbar? Wackelkontakt? Kabel wechseln? Sensor wechseln? Wenn der 
uc richtig messen soll muss das Signal des Sensors sehr regelmäßig sein.

von Pier S. (bigpier)


Lesenswert?

So habe jetzt 8 Sensoren in einer Stern Verkabelung mit ca. je 8m
und ich bekomme die Messwerte regelmäßig!

Habe dazu folgendes getrieben:

Serien Widerstand entfernt!
Pullup Widerstand auf 560Ohm verringert!
Und in der Original Software die Funktion "w1_bit_io "wie folgt 
abgeändert.
1
uint8_t w1_bit_io( uint8_t b )
2
{
3
  cli();
4
  W1_DDR |= 1<<W1_PIN;
5
  DELAY( DELAY_US( 1 ));
6
  if( b )
7
    W1_DDR &= ~(1<<W1_PIN);
8
  DELAY( DELAY_US( 15 - 1 ));
9
  if( (W1_IN & (1<<W1_PIN)) == 0 )
10
    b = 0;
11
  DELAY( DELAY_US( 60 - 10 ));      // Hier geändert
12
  W1_DDR &= ~(1<<W1_PIN);
13
  DELAY( DELAY_US( 2 ));// Hier Hinzu gefügt!
14
  sei();
15
  return b;
16
}

Möchte mich bei Allen die mich unterstützt haben herzlich bedanken!

LG
Peter

von Uwe K. (ukhl)


Lesenswert?

Prima das es jetzt läuft.

Als ich mich intensiv mit 1-Wire auseinandergesetzt habe, bin ich auch 
auf die Library von Peter D. gestoßen. Speziell die "w1_bit_io" Funktion 
hat mir nicht gefallen. Ich würde empfehlen das Lesen und Schreiben der 
Bits mit getrennten Routinen zu machen. Das Timing ist bei Lesen anders 
als beim Schreiben.

Senden:
-  1-2 µs Leitung auf 0 ziehen.
-  Bei 1: Leitung wieder freigeben (Eingang) und auf min. 60 µs Gesamt 
Zeit füllen.
-  Bei 0: Auf min. 60 µs füllen und dann freigeben.

Es ist nicht notwendig, und auch nicht gewollt, die Leitung bei "1" 15 
µs auf 0 zu ziehen.

Lesen:
- 1-2 µs Leitung auf 0 ziehen.
- Leitung wird freigeben zum Lesen.
- Nach 8µs kann man schon Lesen. Es muss innerhalb von 15 µs passieren 
und nicht bei 15 µs. Das Datenblatt scheibt sogar "so schnell wie 
möglich".

Bei der "w1_bit_io" wird relativ genau bei 15 µs gelesen und auch 
geschrieben. Das ist hart an der Grenze und kann bei leichten Tackt 
Abweichung zu Problemen führen.

Eine Timing Anpassung auf 10 µs sollte deutlich zuverlässiger sein. Aber 
nicht den letzten Delay vergessen wie es oben zu sehen ist. So sollte es 
auch gehen:

1
uchar w1_bit_io( bit b )
2
{
3
  cli();
4
  W1_DDR |= 1<<W1_PIN;
5
  DELAY( DELAY_US( 1 ));
6
  if( b )
7
    W1_DDR &= ~(1<<W1_PIN);
8
  DELAY( DELAY_US( 10 - 1 ));   // <-- besser nur 10 us
9
  if( (W1_IN & (1<<W1_PIN)) == 0 )
10
    b = 0;
11
  DELAY( DELAY_US( 60 - 10 )); // <-- Gesammtzeit 60 us
12
  W1_DDR &= ~(1<<W1_PIN);
13
  DELAY( DELAY_US( 2 ));  // <-- Sehr gute Idee.
14
  sei();
15
  return b;
16
}

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.