Forum: Mikrocontroller und Digitale Elektronik DS18S20 returned nur 255


von Daniel J. (Gast)


Lesenswert?

Hallo!

Ich habe einen DS18S20 der leider irgendwie nur 255 returned (bei allen 
Werten, also jedes Byte), egal ob V++ / GND angeschlossen sind, ob im 
Parasite-Mode und erst recht ganz egal wieviele Sleeps ich einbaue.

Programmiere in Bascom.

Wäre für Ideen und Vorschläge dankbar!

von Achim (Gast)


Lesenswert?

Ohne weitere Details wird dir keiner helfen können.
Was für einen Controller nutzt du? Wie sehen Schaltung und Quelltext 
aus?

von Uwe (Gast)


Lesenswert?

Hallo Daniel,

255 ist in Bascom das Ergebniss wenn es kein Ergebniss gibt. Also auch 
wenn er nicht angeschlossen ist, gibt 1wread() 255 aus.
Mein Funktionierender Code auf AVR, die beiden routinen werden im 
Abstand von einer Sekunde aufgerufen:

Messen:
Config 1wire = Porta.1
1wreset
Disable Interrupts           'wirklich noetig(?)
1wwrite &HCC                 'Adresse ueberspringen da nur ein Sensor
Waitms 1
1wwrite &H44                 'Temp messen
Enable Interrupts
Read_state = 1
Return

Auslesen:
Config 1wire = Porta.temp2
Disable Interrupts
1wreset
1wwrite &HCC
1wwrite &HBE                 'Temperatur soll ausgelesen werden
Scratch_1(1) = 1wread(8)     'Auslesen von 8 Byte
1wreset
Enable Interrupts
Temperatur = Scratch_1(1)    'Positiver Tempwert
Read_state = 0
Return

Es haengt nur ein Sensor dran, am Pin, also keine Adressierung.
HTH, bye Uwe

von Stephan B. (s_bronco)


Lesenswert?

meiner funktioniert garantiert auch, werden im Abstand von 500ms 
aufgerufen, erst reset um die Messung auszulösen, dann 500ms später, 
Daten abholen und umrechnen, so ergibt zB. 32°C den Wert 320.
Es werden 3 Leitungen abgefragt, kann auch auf eine begrenzt werden.
Der Grund für 3 war, kein Mensch kann bei 6 Sensoren (2x3) wissen, 
welcher jetzt diese ganz spezielle 64Bit SerNr hat, bei 3 Leitungen/ 
Pins weiß ichs.

Der Ursprüngliche Code stammt nicht von mir, sondern ist von hier ausm 
Forum.


Sub 1wire_reset                                             '  1Wire 
RESET
   For Ch = 1 To 3
      A = Ch - 1
      1wreset PinD , Ch
      1wwrite &HCC , 1 , PinD , A
      1wwrite &H44 , 1 , PinD , A
   Next
End Sub

'******************************************************
Sub 1wire_read                                              ' DS1820 
readout
   For Ch = 1 To 3
      A = Ch - 1
      1wreset PinD , A
      1wwrite &HCC , 1 , PinD , A
      1wwrite &HBE , 1 , PinD , A
      Ds_read(1) = 1wread(9 , PinD , A )
      1wreset PinD , A
      If Flag.2 = 1 Then                                    ' nur beim 
Regeln alte Werte speichern
         Lasttemp(ch) = Currenttemp(ch)
      End If
      Ds_temp1 = Ds_read(1) And 1
      If Ds_temp1 = 1 Then Decr Ds_read(1)
      Ds_temp1 = Makeint(ds_read(1) , Ds_read(2))
      Ds_temp1 = Ds_temp1 * 50
      Ds_temp1 = Ds_temp1 - 25
         Ds_temp2 = Ds_read(8) - Ds_read(7)
         Ds_temp2 = Ds_temp2 * 100
         Ds_temp2 = Ds_temp2 / Ds_read(8)
            Ds_temp1 = Ds_temp1 + Ds_temp2
            Currenttemp(ch) = Ds_temp1 / 10
   Next
End Sub
'******************************************************

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.