PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DALLAS Sensor



H.Brill
10.04.2010, 07:56
Hallo,
Hab mir ein kleines Windowsprogramm erstellt,
das die Temperaturen von zwei 1Wire Sensoren
ausliest, die über RS232 vom AVR geschickt werden.

Wenn ich nun die Sensoren berühre, kommen die
Daten nicht mehr richtig an. Könnt ihr mal auf meinen
Code schauen, ob das so richtig ist bzw. ob man was
optimieren/ändern muß.


' Beispiel für das myAVR Board 1 & 2 mit LCD und 1wire Temperatursensoren an Pin 5 von Port C
' Zwei 1wire Temperatursensoren DS1820
$regfile = "m8def.dat"
$crystal = 3686400
$baud = 9600

' Pin für 1wire Schnittstelle festlegen, Schnittstelle wird von BASCOM durch Software realisiert
Config 1wire = Portc.5

Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim I As Byte
Dim Nr As Byte
Dim Sc(9) As Byte
Dim T As Integer
Dim T1 As Integer
Dim T2 As String * 7
Dim Ts As Integer
Dim T3 As String * 17

' Ersten angeschlossenen DS1820 finden und Adresse auslesen
Dsid1(1) = 1wsearchfirst()
Waitms 100
' Zweiten DS1820 suchen und Adresse auslesen
Dsid2(1) = 1wsearchnext()
Waitms 100

'Thermostat - Ts = Schalttemperatur x 10
Ts = 2500

Do
' Alle angeschlossenen DS1820 zum Messen veranlassen
1wreset
1wwrite &HCC
1wwrite &H44
Waitus 200
' Den ersten Sensor auswählen
1wverify Dsid1(1)
' Kommando READ SCRATCHPAD
1wwrite &HBE
Sc(1) = 1wread(9)
If Sc(9) = Crc8(sc(1) , 8) Then
' Genauere Temperaturberechnung auf 0,1 °C
I = Sc(1) And 1
If I = 1 Then Decr Sc(1)
T = Makeint(sc(1) , Sc(2))
T = T * 50
T = T - 25
T1 = Sc(8) - Sc(7)
T1 = T1 * 100
T1 = T1 / Sc(8)
T = T + T1
T = T / 10
T2 = Str(t)
' Temperatur in 0,1 Grad Schritten ausgeben
T3 = Format(t2 , "+00.0") + " C" + "|"
End If
'Waitms 500
' Ausgabe alle 0,5 Sekunden
' Den zweiten Sensor auswählen
1wverify Dsid2(1)
' Kommando READ SCRATCHPAD
1wwrite &HBE
Sc(1) = 1wread(9)
If Sc(9) = Crc8(sc(1) , 8) Then
' Genauere Temperaturberechnung auf 0,1 °C
I = Sc(1) And 1
If I = 1 Then Decr Sc(1)
T = Makeint(sc(1) , Sc(2))
T = T * 50
T = T - 25
T1 = Sc(8) - Sc(7)
T1 = T1 * 100
T1 = T1 / Sc(8)
T = T + T1
T = T / 10
T2 = Str(t)
' Temperatur in 0,1 Grad Schritten ausgeben
T3 = T3 + Format(t2 , "+00.0") + " C"
Print T3
T3 = Space(17)
End If
' Ausgabe alle 0,5 Sekunden
Waitms 100
Loop
End


Das ist die Debug-ausgabe in meinem Windows-
programm. Wie man sieht, kommt zwischendurch
auch mal Daten - Salat :



+24.0 C|+24.0 C

+24.0 C|+24.0 C

+24.0 C|+24.1 C

+24.0 C|+24.1 C

+24.0 C|+24.1 C

+24.0 C|+24.1 C

+24.0 C|+24.0 C

+24.0 C|+24.0 C

+24.0 C|+24.0 C

+24.0 C|+24.0 C

+24.0 C|+24.1 C

+24.0 C|+24.1 C

+85.0 C|+24.1 C

+85.0 C|+24.1 C

+85.0 C|+24.3 C

+85.0 C|+24.3 C

+24.3 C|+24.3 C

+24.3 C|+24.3 C

+24.3 C|+25.2 C

+24.3 C|+25.2 C

+25.3 C|+25.2 C

+25.3 C|+25.2 C

+25.3 C|+26.3 C

+25.3 C|+26.3 C

+26.3 C|+26.3 C

+26.3 C|+26.3 C

+26.3 C|+27.0 C

+26.3 C|+27.0 C

+27.1 C|+27.0 C

+27.1 C|+27.0 C

+27.1 C|+27.7 C

+27.1 C|+27.7 C

+27.7 C|+27.7 C

+27.7 C|+27.7 C

+27.7 C|+28.2 C

+27.7 C|+28.2 C

+28.2 C|+28.2 C

+28.2 C|+28.2 C

+28.2 C|+28.6 C

+28.2 C|+28.6 C

+28.6 C|+28.6 C

+28.6 C|+28.6 C

+28.6 C|+29.0 C

+28.6 C|+29.0 C

+28.8 C|+29.0 C

+28.8 C|+29.0 C

+28.8 C|+29.3 C

+28.8 C|+29.3 C

+29.2 C|+29.3 C

+29.2 C|+29.3 C

+29.2 C|+29.2 C

+29.2 C|+29.2 C

+28.8 C|+29.2 C

+28.8 C|+29.2 C

+28.8 C|+29.0 C

+28.8 C|+29.0 C

+28.6 C|+29.0 C

+28.6 C|+29.0 C

+28.6 C|+28.8 C

+28.6 C|+28.8 C

+28.4 C|+28.8 C

+28.4 C|+28.8 C

+27.0 C|+27.1 C

+27.0 C|+27.1 C

+26.9 C|+27.1 C

+26.9 C|+27.1 C

+26.9 C|+27.0 C

+26.9 C|+27.0 C

+26.8 C|+27.0 C

+26.8 C|+27.0 C

+26.8 C|+26.9 C

+26.8 C|+26.9 C

+85.0 C|+26.9 C

+85.0 C|+26.9 C

+26.8 C|+26.8 C


+26.8 C
+85.0 C|
+26.8 C
+85.0 C|
+26.8 C
+85.0 C|
+27.0 C
+85.0 C|
+27.0 C
+26.8 C|
+27.0 C
+26.8 C|
+27.0 C
+26.8 C|
+27.5 C
+26.8 C|
+27.5 C
+27.6 C|
+27.5 C
+27.6 C|
+27.5 C
+27.6 C|
+28.2 C
+27.6 C|
+28.2 C
+28.3 C|
+28.2 C
+28.3 C|
+28.2 C
+28.3 C|
+28.8 C
+28.3 C|
+28.8 C
+28.8 C|
+28.8 C
+28.8 C|
+28.8 C
+28.8 C|
+29.3 C

+29.3 C
+85.0 C|+29.3 C
+85.0 C|+29.3 C
+85.0 C|+29.6 C
+29.3 C|+29.6 C
+29.3 C|+29.6 C
+29.3 C|+29.6 C
+29.3 C|+29.5 C
+29.2 C|+29.5 C
+29.2 C|+29.5 C
+29.2 C|+29.5 C
+29.2 C|+29.3 C
+29.0 C|+29.3 C

RoboHolIC
10.04.2010, 11:03
Hallo H.Brill.

Wenn die Lesefehler durch das Berühren des Sensors ausgelöst werden, dann solltest du das Problem auch beim Sensor suchen. Eine zuverlässige Signalübertragung ist das A und O der Elektronik.
Also: Wackelkontakte suchen, Versorgungsspannung prüfen, ggf. besser Filtern/puffern. Wenn das Problem dann noch immer besteht, kann man sich mal über Timing-Fragen der Software Gedanken machen - vielleicht läuft da was "auf Kante". Aber wie schon gesagt: Das riecht nach einem Hardwareproblem deiner Meßmimik.

Gruß
Christian.

H.Brill
10.04.2010, 15:17
Hat sich erledigt.
Anscheinend war das Meßinterval
zu kurz. Habs jetzt auf 1000 MS
erhöht und schon funktioniert es.

Alle Sekunde ist für mich mehr
als ausreichend.

RoboHolIC
10.04.2010, 17:15
Hat sich erledigt.
Ganz sicher? Was bedeutet dein Meßintervall? Wird jetzt seltener abgefragt oder ist das Timing verlangsamt (war es vorher außerhalb der Spezifikation?) oder verschwinden die Fehlübertragungen in der Mittelung über alle Werte aus 1000ms?
Kann deine Maßnahme tatsächlich das Problem "springende Meßwerte bei Berührung mit der Hand" gelöst haben? Eine Mittelwertbildung zur Entrauschung des Meßwertes bei digitalisierten Analogsignalen ist ja durchaus legitim, aber bei einem digital übertragenen Signal würde ich derart große Abweichungen nicht hinnehmen wollen.
Mir ist noch aufgefallen, daß der Müll immer auf 85,0°C lautet; das sieht nach Meßbereichsgrenze aus und damit nach Hardwarefehler.

H.Brill
10.04.2010, 18:25
Ist ja schon eigenartig.
Habe nach jedem Print 1 Sekunde eingefügt.
Hat also mit dem Timing des Sensors nichts
zu tun, sondern nur mit der RS232 bzw. meinem
Programm.

Die 85.0 C kommen bei Temperaturerhöhung
immer noch. Mein Bruder hat auch 2 solcher
Sensoren und hatte mir letzte Woche schon
gesagt, daß dies normal wäre. Ich denke doch,
daß er das Datenblatt, das ich nicht habe, gelesen
hat. Der ist auch der Elektroniker bei uns im Hause,
der mir auch manche Sachen lötet.

Wenns micht stört, kann ichs ja noch rausfiltern.
Anbei auch mal das Programm.

peterfido
10.04.2010, 19:37
Zwischen Meßwert anfordern und Messwert abholen sollte bei 1 Draht Betrieb die Zeit nicht zu kurz sein. 700mS laufen bei mir zuverlässig.

H.Brill
11.04.2010, 08:09
Hab die 700ms mal zwischen Anfordern
und Abholen gesetzt und in der Tat, die
85.0 C kommen nicht mehr.

Danke nochmals für die Unterstützung.