PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : von einem auf zwei(oder mehr) DS18S20 ???



Papsi
08.11.2007, 13:31
Hallo,

ich probiere zur Zeit mit den Tempsensoren DS18S20 rum und habe auch schon einen am laufen.

Nun möchte ich noch einen 2.Sensor mit einbinden, aber es wird mir immer bei beiden Sensoren das gleiche angezeigt.

Hier mal mein Codebeispiel:

$regfile = "m16def.dat"
$crystal = 8000000

Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.4 , Db7 = Portd.3 , E = Portb.7 , Rs = Portb.6
Config Lcd = 16 * 2
Config Lcdbus = 4
Cursor Off
Cls

Config 1wire = Portb.1

Declare Sub Messung1
Declare Sub Messung2


Dim Sensor1(9) As Byte
Dim Sensor2(9) As Byte
Dim T As Integer
Dim Temp As Single
Dim T1 As Integer
Dim Temp1 As Single

Deflcdchar 0 , 14 , 10 , 14 , 32 , 32 , 32 , 32 , 32

Locate 1 , 1 : Lcd "Sensor 1: "
Locate 2 , 1 : Lcd "Sensor 2: "

Do
Messung1
Messung2
Loop

End

Sub Messung1
1wwrite &HCC
1wwrite &H44
Waitms 300
1wreset
1wwrite &HCC
1wwrite &HBE
Sensor1(1) = 1wread(9)
1wreset
Decr Sensor1(1)
T = Makeint(sensor1(1) , Sensor1(2))
T = T / 2
Temp = Sensor1(8) - Sensor1(7)
Temp = Temp / Sensor1(8)
Temp = T + Temp
Temp = Temp - 2.3
Locate 1 , 11 : Lcd Fusing(temp , "#.##") ; Chr(0)
End Sub

Sub Messung2
1wwrite &HCC
1wwrite &H44
Waitms 300
1wreset
1wwrite &HCC
1wwrite &HBE
Sensor2(1) = 1wread(9)
1wreset
Decr Sensor2(1)
T1 = Makeint(sensor2(1) , Sensor2(2))
T1 = T1 / 2
Temp1 = Sensor2(8) - Sensor2(7)
Temp1 = Temp1 / Sensor2(8)
Temp1 = T1 + Temp1
Temp1 = Temp1 - 2.3
Locate 2 , 11 : Lcd Fusing(temp1 , "#.##") ; Chr(0)
End Sub

Warum läuft das nicht so? Was muß ich ändern?

Jaecko
08.11.2007, 13:54
Soweit ich des seh, werden da anscheinend beide Sensoren mit der gleichen Adresse aufgerufen, d.h. der 2. Sensor wird garnicht abgefragt; der erste dafür 2x...

MeckPommER
08.11.2007, 13:54
Ich hab, ehrlich gesagt nicht viel Ahnung von 1wire. Aber könnte es sein, das unterschiedliche Geräte unterschiedliche Geräteadressen haben müssen?
Deine Subs Messung1 und Messung2 schicken beide die selben Daten raus, warum sollte jedes Mal ein anderer Sensor abgefragt werden?

Vielleicht hilft dir diese Seite weiter

http://www.pirnaer.de/bascom_fuer_myavr_temperatur_ds1820.html

Gruß MeckPommER

for_ro
08.11.2007, 13:59
Hallo,
du musst jetzt den Sensor identifizieren, der antworten soll.
Dies geht über die eingebrannte Nr.
Schau dir mal die 1wsearchfirst und 1wsearchnext Befehle an.
Wenn du die Nummern hast, dann gibst du anstelle des skip_rom Befehls ein Match_rom aus und anschließend überträgst du die Nummer (8byte).
Dann kommt der read_scratchpad Befehl wie gewohnt.

Gruß

Rolf

Papsi
08.11.2007, 14:52
Könnte mal bitte einer so nett sein und mir das an meinen Code oben anpassen.

Irgendwie bekomme ich nichtmal die Adressen ausgefragt(immer 0000...), so wie oben im Link beschrieben, aber die Sensoren funktionieren alleine schon in einem anderen Codebeispiel.

Snecx
08.11.2007, 15:40
Hallo

hier ist ein code der Dir weiterhelfen sollte. Dieser funktioniert bei mir ohne Probleme. Das sind Teile eines Programs von mir. Nicht grad schoen aber es geht.




Dim Dsid1(8) As Byte 'Dallas ID 64 bits incl CRC
Dim Dsid2(8) As Byte
Dim Dsid3(8) As Byte
Dim Dsid4(8) As Byte


Dim Sc(9) As Byte 'Scratchpad 0-8 72 bits incl CRC, explanations for DS18b20


Cls
Setfont Font8x8

W = 1wirecount()
Dsid1(1) = 1wsearchfirst()
Dsid2(1) = 1wsearchnext()
Dsid3(1) = 1wsearchnext()
Dsid4(1) = 1wsearchnext()

If Dsid1(8) = Crc8(dsid1(1) , 7) Then ' Control that the received CRC match the calculated
Lcdat 1 , 1 , "CRC OK Sensor 1"
Wait 1
Lcdat 2 , 1 , Hex(dsid1(1))
For B = 2 To 8
Lcd Hex(dsid1(b))
Next
End If


If Dsid2(8) = Crc8(dsid2(1) , 7) Then
Lcdat 3 , 1 , "CRC OK Sensor 2"
Wait 1
Lcdat 4 , 1 , Hex(dsid2(1))
For B = 2 To 8
Lcd Hex(dsid2(b))
Next
End If

If Dsid3(8) = Crc8(dsid3(1) , 7) Then
Lcdat 5 , 1 , "CRC OK Sensor 3"
Wait 1
Lcdat 6 , 1 , Hex(dsid3(1))
For B = 2 To 8
Lcd Hex(dsid3(b))
Next
End If

If Dsid4(8) = Crc8(dsid4(1) , 7) Then
Lcdat 7 , 1 , "CRC OK Sensor 4"
Wait 1
Lcdat 8 , 1 , Hex(dsid4(1))
For B = 2 To 8
Lcd Hex(dsid4(b))
Next
End If


Wait 5

Cls

Call Init

' Main loop
Do
Call Convallt ' "Convert ALL T on the 1w-bus"
'Waitus 100 :

1wverify Dsid1(1) 'Issues the "Match ROM "
Locate 1 , 1
If Err = 1 Then
Lcdat 9 , 1 , "Err " , 0 'Err = 1 if something is wrong,
Elseif Err = 0 Then 'lcd " Sensor found"
1wwrite &HBE
Sc(1) = 1wread(9) 'read bytes into array
If Sc(9) = Crc8(sc(1) , 8) Then
Dg = Decigrades(sc(9))

If Min1 > Dg Then
Min1 = Dg
Emin1 = Min1
End If

If Max1 < Dg Then
Max1 = Dg
Emax1 = Max1
End If


Lcdat 1 , 1 , Dg , 0 : Lcd " " : Lcd Min1 : Lcd " " : Lcd Max1
Print Date$ ; "-" ; Time$ ; "-" ; "S1" ; Dg
End If
End If


1wverify Dsid2(1)
Locate 2 , 1
If Err = 1 Then
Lcd "DsId2 not on bus "
Elseif Err = 0 Then
1wwrite &HBE
Sc(1) = 1wread(9)
If Sc(9) = Crc8(sc(1) , 8) Then
Dg = Decigrades(sc(9))
Dg = Dg - 3

If Min2 > Dg Then
Min2 = Dg
Emin2 = Min2
End If

If Max2 < Dg Then
Max2 = Dg
Emax2 = Max2
End If


Lcdat 2 , 1 , Dg , 0 : Lcd " " : Lcd Min2 : Lcd " " : Lcd Max2
Print Date$ ; "-" ; Time$ ; "-" ; "S2" ; Dg
End If
End If




1wverify Dsid3(1)
Locate 3 , 1
If Err = 1 Then
Lcd "DsId3 not on bus "
Elseif Err = 0 Then
1wwrite &HBE
Sc(1) = 1wread(9)
If Sc(9) = Crc8(sc(1) , 8) Then
Dg = Decigrades(sc(9))
Dg = Dg - 2

If Min3 > Dg Then
Min3 = Dg
Emin3 = Min3
End If

If Max3 < Dg Then
Max3 = Dg
Emax3 = Max3
End If



Lcdat 3 , 1 , Dg , 0 : Lcd " " : Lcd Min3 : Lcd " " : Lcd Max3
Print Date$ ; "-" ; Time$ ; "-" ; "S3" ; Dg
End If
End If


1wverify Dsid4(1)
Locate 4 , 1
If Err = 1 Then
Lcd "DsId4 not on bus "
Elseif Err = 0 Then
1wwrite &HBE
Sc(1) = 1wread(9)
If Sc(9) = Crc8(sc(1) , 8) Then
Dg = Decigrades(sc(9))

If Min4 > Dg Then
Min4 = Dg
Emin4 = Min4
End If

If Max4 < Dg Then
Max4 = Dg
Emax4 = Max4
End If

Lcdat 4 , 1 , Dg , 0 : Lcd " " : Lcd Min4 : Lcd " " : Lcd Max4
Print Date$ ; "-" ; Time$ ; "-" ; "S4" ; Dg
End If
End If



For I = 1 To 10
Test = 11 - I
If Test < 10 Then
Lcdat 6 , 1 , "0" , 0
Lcd Test

Else
Lcdat 6 , 1 , Test , 0

End If

Wait 1
Next I

Loop
End

Sub Init
Cls

Min1 = Emin1 ' to get a real value from start
Min2 = Emin2
Max1 = Emax1
Max2 = Emax2
Min3 = Emin3 ' to get a real value from start
Min4 = Emin4
Max3 = Emax3
Max4 = Emax4


End Sub




Sub Convallt
1wreset ' reset the bus
1wwrite &HCC ' skip rom
1wwrite &H44
Set Portb.3
Waitms 800
Reset Portb.3 ' Convert T
End Sub


Function Decigrades(byval Sc(9) As Byte)
Dim Tmp As Byte , T As Integer , T1 As Integer

Tmp = Sc(1) And 1 ' 0.1C precision
If Tmp = 1 Then Decr Sc(1)
T = Makeint(sc(1) , Sc(2))

T = T * 50 'here we calculate the 1/10 precision like
T = T - 25 'DS18S20 data sheet
T1 = Sc(8) - Sc(7)
T1 = T1 * 100
T1 = T1 / Sc(8)
T = T + T1
Decigrades = T / 10
End Function

Papsi
08.11.2007, 15:52
Danke fürs Beispiel, das ist mir aber ehrlich gesagt zuviel, da ich noch nicht mal richtig durch meinen Code durchblicke.
Dieses Ganze 1wirezeugs ist neu für mich, den Rest habe ich scho fertig(Menüsteuerung, DCF usw.) Mir fehlt nur noch die Temp auf 0.1° genau...

PS
Gibt es noch Alternativen zum DS18S20 (Preislich gesehen, weil ich mehre brauche...)

Snecx
08.11.2007, 20:17
Hei

mir sind keine anderen Senoren bekannt. Zmindest nicht Preislich. Ich habe bis jetzt immer die DS18S20 genommen. Mit der 0,1° nimm das nicht zu eng. Ich habe 8 Senosren am Bus und alle zum testen auf ein Stueck Metall geklebt. Alle 8 Sensoren schwanken ein wenig. Die max. differenz die ich zwischen 2 Sensoren hab sind 0,8° Damit ich zumindest von einem "Startpunkt" ausgehen kann hab ich das Mittel der Temperaturen genommen und alle Senoren durch addition oder subtraktion auf einen Wert gebracht. Aber die Sensoren sind sehr einfach zu nutzen deswegen probier ich auch nicht mit was neuem rum. Probier einfach mal meinen code aus und spiele damit herum.

mat-sche
08.11.2007, 21:48
Hi Papsi,

schau mal hier rein: https://www.roboternetz.de/phpBB2/viewtopic.php?t=35075

Ich habe mich lange damit rumgeschlagen und jetzt läuft es gut! (1x DS1820 und DCF)

für einen zweiten.... dritten Sensor musst Du dann nur noch folgendes einfügen und schau mal in diesen Trade:

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=8555&highlight=ds1820

Wenns dann noch nicht klappt dann meld Dich einfach!

Gruß MAT