Forum: Mikrocontroller und Digitale Elektronik Probleme mit DS1820, DS18B20


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Pier S. (bigpier)


Bewertung
0 lesenswert
nicht 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)


Bewertung
2 lesenswert
nicht lesenswert
PullUp vergessen?

von Pier S. (bigpier)


Bewertung
0 lesenswert
nicht lesenswert
Habe ich drauf4,7k Ohm
LG
Peter

von Martin L. (loidi)


Bewertung
2 lesenswert
nicht lesenswert
Betreibst du den Sensor im parasitären Modus?

von Peter D. (peda)


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

von Pier S. (bigpier)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Pullup verringern bzw welches Kabel wird genutzt??

von Pier S. (bigpier)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Bitteschön hier der Plan!

Peter

von Pier S. (bigpier)


Bewertung
0 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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:(
uint8_t w1_bit_io( uint8_t b )
{
  cli();
  W1_DDR |= 1<<W1_PIN;
  DELAY( DELAY_US( 1 ));
  if( b )
    W1_DDR &= ~(1<<W1_PIN);
  DELAY( DELAY_US( 10 - 1 )); // von15µS auf 10µS
  if( (W1_IN & (1<<W1_PIN)) == 0 )
    b = 0;
  DELAY( DELAY_US( 60 - 15 ));
  W1_DDR &= ~(1<<W1_PIN);
  sei();
  return b;
}

Habe ich die änderung richtig gemacht?
LG
Peter

von spess53 (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Hi

Was macht eigentlich der Widerstand in der Datenleitung?

MfG Spess

von Pier S. (bigpier)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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:
  DELAY( DELAY_US( 60 - 10 ));

LG, Sebastian

von Pier S. (bigpier)


Bewertung
0 lesenswert
nicht 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) (Moderator)


Bewertung
0 lesenswert
nicht 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
   vorher   nachher

     15       10
   + 45     +  ?
   -----   ------
     60       60

Die 60 sind dir vorgegeben. Die sind einzuhalten.

Am besten schreibst du die Zahl nur einmalig hin
#define PULSTIME   10


....

    DELAY( DELAY_US( PULSTIME ) );

...

    DELAY( DELAY_US( 60 - PULSTIME ) );
...

Dann erledigt der Compiler die Anpassung bei Änderung.

: Bearbeitet durch Moderator
von Pier S. (bigpier)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.
uint8_t w1_bit_io( uint8_t b )
{
  cli();
  W1_DDR |= 1<<W1_PIN;
  DELAY( DELAY_US( 1 ));
  if( b )
    W1_DDR &= ~(1<<W1_PIN);
  DELAY( DELAY_US( 15 - 1 ));
  if( (W1_IN & (1<<W1_PIN)) == 0 )
    b = 0;
  DELAY( DELAY_US( 60 - 10 ));      // Hier geändert
  W1_DDR &= ~(1<<W1_PIN);
  DELAY( DELAY_US( 2 ));// Hier Hinzu gefügt!
  sei();
  return b;
}

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

LG
Peter

von Uwe K. (ukhl)


Bewertung
0 lesenswert
nicht 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:

uchar w1_bit_io( bit b )
{
  cli();
  W1_DDR |= 1<<W1_PIN;
  DELAY( DELAY_US( 1 ));
  if( b )
    W1_DDR &= ~(1<<W1_PIN);
  DELAY( DELAY_US( 10 - 1 ));   // <-- besser nur 10 us
  if( (W1_IN & (1<<W1_PIN)) == 0 )
    b = 0;
  DELAY( DELAY_US( 60 - 10 )); // <-- Gesammtzeit 60 us
  W1_DDR &= ~(1<<W1_PIN);
  DELAY( DELAY_US( 2 ));  // <-- Sehr gute Idee.
  sei();
  return b;
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.