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
Die 15µs bis zum Lesen können manchmal etwas lang sein, probier mal 10µs.
Also ich habe den Sensor direkt mit 5 Volt versorgt! Die Software aber Original belassen! Was sagt das aus? LG Danke peter
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
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
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?
Ich verwende ein 3x0,5mm² Geschirmtes Kabel! Aber auch ein einfache Litze an der Datenleitung zerschießt mir die Kommunikation!
Pier S. schrieb: > Wie kann ich dem Problem auf die schliche kommen? Hast Du den Beitrag von Peter um 08:38 Uhr überlesen?
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!!
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
Hi Was macht eigentlich der Widerstand in der Datenleitung? MfG Spess
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
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
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.
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
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.
grundschüler schrieb: > ohne sc1 und sr1 > völlig problemlos. Was meinst Du damit? Verwendest du den Original Code? Vielen Dank LG Peter
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
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
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
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
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
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
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
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.