Archiv verlassen und diese Seite im Standarddesign anzeigen : von einem auf zwei(oder mehr) DS18S20 ???
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?
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, 14: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
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
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.
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
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...)
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, 22: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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.