da fällt mir auf, das da keine Zeiten drinn sind...
Druckbare Version
da fällt mir auf, das da keine Zeiten drinn sind...
sorry Rofo88,
habe deine Antwort irgendwie übersehen! ABER es war / ist die Lösung!
@Eisbaeeer
also wenn ich die Zeit auf 800ms erhöhe, dann ließt er immer beide Sensoren gleich aus also beide haben die gleiche Temperatur:-(
Tobias
So, nun noch mal zu den Kommastellen 0,5°C bzw 0,1°C - kann mir noch mal einer zeigen wie man das umrechnet bzw wo das hier im Forum steht?
hier noch mal mein Code, der nun mit 2 Sensoren funktioniert :-)
Code:$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600
Config 1wire = Portb.0
Dim T1 As single
Dim T2 As Single
Dim I As Byte
Dim Id1(8) As Byte
Dim Id2(8) As Byte
Dim Ar1(2) As Byte
Dim Ar2(2) As Byte
Id1(1) = 1wsearchfirst()
Id2(1) = 1wsearchnext()
Do
Print " "
1wreset 'reset
1wwrite &H55 'Match Rom command
1wwrite Id1(1) , 8 'Id von Sensor 1
1wwrite &H44 'Convert T
Waitms 300 'warten bis convert T fertig ist
1wreset 'reset
1wwrite &H55 'match rom command
1wwrite Id1(1) , 8 'id von sensor 1
1wwrite &HBE 'scratchpad lesen
Ar1(1) = 1wread(1) 'erstes byte auslesen, da steht Temp drin
Ar1(2) = 1wread(1) 'zweites Byte auslesen, wenn 00000000 dann pos vorzeichen, wenn 11111111 dann neg vorzeichen
Waitms 500
1wreset 'reset
1wwrite &H55 'Match Rom command
1wwrite Id2(1) , 8 'Id von Sensor 2
1wwrite &H44 'Convert T
Waitms 300 'warten bis convert T fertig ist
1wreset 'reset
1wwrite &H55 'match rom command
1wwrite Id2(1) , 8 'id von sensor 2
1wwrite &HBE 'scratchpad lesen
Ar2(1) = 1wread(1) 'erstes byte auslesen, da steht Temp drin
Ar2(2) = 1wread(1) 'zweites Byte auslesen, wenn 00000000 dann pos vorzeichen, wenn 11111111 dann neg vorzeichen
T1 = Ar1(1) / 2
T2 = Ar2(1) / 2
If Ar1(2) = 0 Then 'wenn byte 2 aus dem sensor = 0 dann temp pos, sonst neg
Print "Temperatur 1: " ; T1 ; "°C"
Else
Print "Temperatur 1: " "-" ; T1 ; "°C"
End If
If Ar2(2) = 0 Then 'wenn byte 2 aus dem sensor = 0 dann temp pos, sonst neg
Print "Temperatur 2: " ; T2 ; "°C"
Else
Print "Temperatur 2: " "-" ; T2 ; "°C"
End If
Waitms 500
Loop
Dann stimmt noch was im Zeitlichen Ablauf nicht. Ich kann dir, wenn ich wieder zuhause bin, mein Script hier Posten. Wichtig ist das Timing. Das muss genau wie im Datenblatt ablaufen.Zitat:
Zitat von TobiasBlome
Wie hast du die Sensoren angeschlossen?
Als Parasite oder mit 3 Adern?
4,7K Pullupwiederstände?
Hier noch der Link für die 0,1 Grad Auflösung:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=8555
Viele Grüße Eisbaeeer
Also ich habe 2 sensoren paralell - 3 Adern mit 4,7k Widerstand
die 0,1Gradlösung ist für nur einen Sensor...aber da muss er ja auch irgendwo umrechnen :-) ich guck mir das mal an.
Tobias
Also der erste Unterschied ist schon mal, dass ich nur die ersten beiden Bytes auslese und nicht 9!
ich glaube das ist diese Rechnung
If Crc = 0 Then ' if is OK, calculate for
Tmp = Bd(1) And 1 ' 0.1C precision
If Tmp = 1 Then Decr Bd(1)
T = Makeint(bd(1) , Bd(2))
T = T / 2
Temp = Bd(8) - Bd(7)
Temp = Temp / Bd(8)
Temp = T + Temp
Temp = Temp - 0.25
End If
toll diese Smilys :-)
Code:If Crc = 0 Then ' if is OK, calculate for
Tmp = Bd(1) And 1 ' 0.1C precision
If Tmp = 1 Then Decr Bd(1)
T = Makeint(bd(1) , Bd(2))
T = T / 2
Temp = Bd(8) - Bd(7)
Temp = Temp / Bd(8)
Temp = T + Temp
Temp = Temp - 0.25
End If
Du kommst der Sache näher. Ich empfehle dir dringend, das Datenblatt zu studieren. Es ist z.B. möglich, an alle Sensoren den Befehl zu schicken, eine Temperaturmessung durchzuführen. Anschließend kannst du dann einen nach dem anderen auslesen. Damit sparst du dir schon mal 750ms pro Sensor.Zitat:
Zitat von TobiasBlome
Weiterhin ist ein "parasite" Modus möglich. 2 Drähte reichen aus. Und einiges mehr.
Grüße Eisbaeeer
klingt gut - aber erst mal langsam an die Messung, und dann die Optimierung ;-)
Also ich habe 2 Sensoren und die kann ich mit 0,5°C Genauigkeit auslesen - aber das mit der Umrechnung auf 0,1°C macht mir echt zu schaffen :-k
kann mir da vielleicht jemand unter die Arme greifen?
Tobias
so, also ich hbe jetzt mal das zusammen kopierte programm von der 1. Seite benutzt. Leider bekomme ich keine Werte...
Ich bekomme erst einen Wert sobald ich eine Temperaturänderung habe. Also einmal gegenpusten und schon wird die Temperatur angezeigt. Warum ist das so?
ich habe nur einen anderen µC statt mega 32 einen mega 8 und statt 16MHz 4 MHz oder bringe ich ihn damit durcheinander?
Tobias
Code:$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600
Config 1wire = Portb.0
Dim T As Integer
Dim T1 As Integer
Dim T2 As Integer
Dim T3 As Integer
Dim T4 As String * 10
Dim T5 As String * 10
Dim T6 As Single
Dim T7 As Single
Dim Id1(8) As Byte
Dim Id2(8) As Byte
Dim Ar1(9) As Byte
Dim Ar2(9) As Byte
Dim I As Byte , Tmp As Byte , Tmp2 As Byte
Dim Crc As Byte
Declare Sub Crcit
Declare Sub Crcit2
Id1(1) = 1wsearchfirst()
Id2(1) = 1wsearchnext()
Do
Print " "
1wreset
1wwrite &H55
1wwrite Id1(1) , 8
1wwrite &H44
Waitms 300
1wreset
1wwrite &H55
1wwrite Id1(1) , 8
1wwrite &HBE
Ar1(1) = 1wread(9)
1wreset
Crcit
If Crc = 0 Then
Tmp = Ar1(1) And 1
If Tmp = 1 Then Decr Ar1(1)
T = Makeint(ar1(1) , Ar1(2))
T = T * 50
T = T - 25
T1 = Ar1(8) - Ar1(7)
T1 = T1 * 100
T1 = T1 / Ar1(8)
T = T + T1
T = T / 10
T6 = T / 10
T4 = Fusing(t6 , "#.#")
End If
Waitms 500
1wreset
1wwrite &H55
1wwrite Id2(1) , 8
1wwrite &H44
Waitms 300
1wreset
1wwrite &H55
1wwrite Id2(1) , 8
1wwrite &HBE
Ar2(1) = 1wread(9)
1wreset
Crcit2
If Crc = 0 Then
Tmp2 = Ar2(1) And 1
If Tmp2 = 1 Then Decr Ar2(1)
T2 = Makeint(ar2(1) , Ar2(2))
T2 = T2 * 50
T2 = T2 - 25
T3 = Ar2(8) - Ar2(7)
T3 = T3 * 100
T3 = T3 / Ar2(8)
T2 = T2 + T3
T2 = T2 / 10
T7 = T2 / 10
T5 = Fusing(t7 , "#.#")
End If
Print "Temperatur T4: " ; T4 ; "°C"
Print "Temperatur T5: " ; T5 ; "°C"
Waitms 500
Loop
Sub Crcit
Crc = 0
For I = 1 To 9
Tmp = Crc Xor Ar1(i)
Crc = Lookup(tmp , Crc8)
Next
End Sub
Sub Crcit2
Crc = 0
For I = 1 To 9
Tmp2 = Crc Xor Ar2(i)
Crc = Lookup(tmp2 , Crc8)
Next
End Sub
'//////////////////////////////////////////////////////////////////////////////
Crc8:
Data 0 , 94 , 188 , 226 , 97 , 63 , 221 , 131 , 194 , 156
Data 126 , 32 , 163 , 253 , 31 , 65 , 157 , 195 , 33 , 127
Data 252 , 162 , 64 , 30 , 95 , 1 , 227 , 189 , 62 , 96
Data 130 , 220 , 35 , 125 , 159 , 193 , 66 , 28 , 254 , 160
Data 225 , 191 , 93 , 3 , 128 , 222 , 60 , 98 , 190 , 224
Data 2 , 92 , 223 , 129 , 99 , 61 , 124 , 34 , 192 , 158
Data 29 , 67 , 161 , 255 , 70 , 24 , 250 , 164 , 39 , 121
Data 155 , 197 , 132 , 218 , 56 , 102 , 229 , 187 , 89 , 7
Data 219 , 133 , 103 , 57 , 186 , 228 , 6 , 88 , 25 , 71
Data 165 , 251 , 120 , 38 , 196 , 154 , 101 , 59 , 217 , 135
Data 4 , 90 , 184 , 230 , 167 , 249 , 27 , 69 , 198 , 152
Data 122 , 36 , 248 , 166 , 68 , 26 , 153 , 199 , 37 , 123
Data 58 , 100 , 134 , 216 , 91 , 5 , 231 , 185 , 140 , 210
Data 48 , 110 , 237 , 179 , 81 , 15 , 78 , 16 , 242 , 172
Data 47 , 113 , 147 , 205 , 17 , 79 , 173 , 243 , 112 , 46
Data 204 , 146 , 211 , 141 , 111 , 49 , 178 , 236 , 14 , 80
Data 175 , 241 , 19 , 77 , 206 , 144 , 114 , 44 , 109 , 51
Data 209 , 143 , 12 , 82 , 176 , 238 , 50 , 108 , 142 , 208
Data 83 , 13 , 239 , 177 , 240 , 174 , 76 , 18 , 145 , 207
Data 45 , 115 , 202 , 148 , 118 , 40 , 171 , 245 , 23 , 73
Data 8 , 86 , 180 , 234 , 105 , 55 , 213 , 139 , 87 , 9
Data 235 , 181 , 54 , 104 , 138 , 212 , 149 , 203 , 41 , 119
Data 244 , 170 , 72 , 22 , 233 , 183 , 85 , 11 , 136 , 214
Data 52 , 106 , 43 , 117 , 151 , 201 , 74 , 20 , 246 , 168
Data 116 , 42 , 200 , 150 , 21 , 75 , 169 , 21 , 75 , 169