Probleme mit DS1820, DS18B20

OP #4058025
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
#4058078
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
OP #4059730
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
OP #4059763
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
Gast #4060021
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.
#4060322
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.
#4060443
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
OP #4060565
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
OP #4060778
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
Gast #4060787
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.
OP #4061046
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
#4065566
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren