Forum: Mikrocontroller und Digitale Elektronik Problem mit 1wire und DS18S20


von Christian B. (chris001)


Angehängte Dateien:

Lesenswert?

Hallo Leute!

Ich weiß das es zu diesem Thema jede menge infos zu im Internet gibt, wo 
man sich alles raus erlesen kann. Ich stehe hier aber im Moment echt auf 
m Schlauch. Ich seh wahrscheinlich den Wald vor lauter Bäumen nicht.

Das Problem. Habe hier ne kleine Schaltung aufgebaut mit einem Atmega32 
nem Display und drei Temperatursensoren von Typ DS18S20.
Die Sensoren möchte ich jetzt auslesen und die Werte dann mal im Display 
ausgeben. Leider Funktioniert das nicht. Der code im Anhang ist in 
Bascom geschrieben. Die ausgegebenen Variable "T1" bleibt auf 0. Die 
Variable sc(1) hat den Wert 90 und sc(2) 171.

Ich hoffe das mir hier einer weiterhelfen kann.

Tschau

Chris001

von ich da (Gast)


Lesenswert?

Die Funktion 1wverify wählt zwar den entsprechenden Sensor an, dient 
aber nur zur statischen Kontrolle ob der Sensor noch vorhanden ist, sich 
meldet.
Die Funktion kann per Err ausgewertet werden.

Zum gezielten auswerten eines Messwertes eines von vielen Sensoren muss 
der entsprechende 1wire-Befehl ausgewählt werden der speziell diesen 
Sensor anspricht. Unmittelbar danach kommt der Lesebefehl &HBE.

Bin momentan nicht in meiner Hobbystube, deswegen ist dies hier nur aus 
dem Kopf und ohne genauere Hinweise. Kommen etwas später.

von ich da (Gast)


Lesenswert?

So hier die bessere Sequenz zum ansprechen eines gezielten Sensors.
Ich benutzte anstelle deiner AR1(1) hier Idb(1) was Sensor-ID von Sensor 
B bedeutet. Anstatt verwirrende zahlen zu benutzen benutzte ich ID von 
Sensor A oder B oder C usw. Ebenso verwende ich Mwb als Synonym für 
Messwert Sensor B.

1wreset
1wwrite &H55
1wwrite Idb(1) , 8
1wwrite &HBE
Mwb(1) = 1wread(9)

Dein ermitteln vom Temperaturwert auf deine Art habe ich auch dort wo es 
auf keine Kommastellen ankommt. Allerdings ist der Wert abgerundet.

Hier noch ein Ausschnitt bezüglich meiner Sensorüberwachung per 
1wverify.

1wverify Idb(1)               'überprüfe ob Sensor funktioniert
If Err = 1 Then               'wenn nein setze Fehlerflag
Set Fehler.2
Else
Reset Fehler.2
End If

Fehler wird als Byte definiert und solange es kleiner 8 bzw bis max 8 
Sensoren sind, passen die fehlerbits beqquem in die Variable Fehler.
Mit entsprechend richtiger Behandlung der Variable Fehler.stelle kann 
ersehen werden ob ein oder mehrere Sensoren Probleme machen und welche 
es sind.

von ich da (Gast)


Lesenswert?

Ach so, du solltest die Wartezeit zwischen alle Sensoren sollen die 
temperaturermittlung starten und dem Auslesen eine längere Wartezeit als 
200 mS anwenden. Ich nutze sicherheitshalber 700 mS.

von Christian B. (chris001)


Lesenswert?

Hallo ich da!

Hab den Code in dem Sub jetzt mal so abgeändert:

Messen:

Disable Interrupts

' Alle angeschlossenen DS1820 zum Messen veranlassen

1wreset

1wwrite &HCC

1wwrite &H44

Waitms 700



1wreset

1wwrite &H55

1wwrite Ar2(1) , 8

1wwrite &HBE

Sc(1) = 1wread(9)

If Sc(9) = Crc8(sc(1) , 8) Then

T1 = Makeint(sc(1) , Sc(2))

T1 = T1 / 2

End If



Locate 1 , 1

Lcd Sc(1) ; " " ; Sc(2);



Locate 2 , 1

Lcd T1 ; " Grad Celsius"

Enable Interrupts

Return

Leider funktioniert es nicht.
In der Variable T1 steht 0.
In sc(1) steht 190 und
in sc(2) steht 174

Hab k.a. warum das nicht funktioniert.

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.