mehrere DS18S20 an einem 1 wire Bus
Hallo Ich habe mal wieder eine Frage :-)...
Vielleicht hat von Euch ja schon jemand Erfahrungen mit mehreren Dallas Temperatursensoren an einem Bus. Bisher habe ich mich mal anhand des Datenblatts und einem Beispiel von der MCS Site reingearbeitet.
Das Beispiel habe ich für 0.1 Grad genauigkeit und Ausgabe auf einem LCD modifiziert. Funktioniert wunderbar.
Code:
' ----------------------------------------------------------------
' Example measuring temperature using Dallas DS1820,
' with calculated for 0.1 C resolution and with 8-bit CRC!
' BASCOM 8051 AN
' ----------------------------------------------------------------
'-------------------------------------------------------------------------------
'Anschluß der iButtons an Portd.3 am AT90S8515 Board
'GND Schirm
'DQ Weiß
'Vdd braun
'-------------------------------------------------------------------------------
$regfile = "8515DEF.DAT"
$crystal = 4000000
Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.4 , Db6 = Porta.5 , Db7 = Porta.6 , E = Porta.2 , Rs = Porta.0
'*******************************************************************************
Config Lcd = 16 * 2 'configure lcd screen
Config 1wire = Portd.3 ' DS1820 on pin 12 (pull up)
Declare Sub Read1820
Declare Sub Crcit
Declare Sub Temperature
Dim Bd(9) As Byte
Dim I As Byte , Tmp As Byte
Dim Crc As Byte
Dim T As Integer , Temp As Single
Dim V As Byte
Cls 'clear the LCD display
Lcd " ITG 2005" 'display this at the top line
Waitms 5
Lowerline 'select the lower line
Waitms 5
Lcd " Temp. Messung " 'display this at the lower line
Wait 5
Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32 ' replace ? with number (0-7)
Cursor Off Noblink
Cls
Locate 1 , 1 : Lcd "DEMO f" ; Chr(245) ; "r DS1820"
Locate 2 , 1 : Lcd "Temp.="
Do
Temperature
Waitms 250
Loop
End
'//////////////////////////////////////////////////////////////////////////////
Sub Temperature ' actual measuring
1wwrite &HCC : 1wwrite &H44 ' start measure
Waitms 300 ' wait for end of conversion
Read1820 ' read 9 bytes
If Err = 1 Then ' if there is no sensor
Locate 2 , 8 : Lcd " -- " ' we put "-- " on LCD
Else
If Crc = 0 Then ' sensor present, check CRC
Locate 2 , 8 : Lcd Fusing(temp , "#.##") ; Chr(0) ; "C" ' CRC OK, print T*10 on LCD
Else
Locate 2 , 8 : Lcd " ** " ' CRC NOT OK, "** " on LCD
End If
End If
End Sub
'//////////////////////////////////////////////////////////////////////////////
Sub Read1820 ' reads sensor ans calculate
' T for 0.1 C
1wreset ' reset the bus
1wwrite &HCC ' read internal RAM
1wwrite &HBE ' read 9 data bytest
Bd(1) = 1wread(9) ' read bytes in array
1wreset ' reset the bus
Crcit ' ckeck CRC
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
End Sub
'//////////////////////////////////////////////////////////////////////////////
Sub Crcit ' calculate 8 bit CRC
' bigger but faster
Crc = 0 ' needs a 256 elements table
For I = 1 To 9
Tmp = Crc Xor Bd(i)
Crc = Lookup(tmp , 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 , 247 , 182 , 232
Data 10 , 84 , 215 , 137 , 107 , 53
Dies ist für einen Sensor. Nur würde ich gerne mehrere Sensoren auswerten und jedem in sein eeprom eine Nummer für die Messstelle zuordnen um den jeweiligen angesprochen zu identifizieren. Momentan stehe ich da noch etwas ratlos da, wie das gehen soll.
Bin auf Eure Ideen und Tipps gespannt.
Gruß
Sven
edit: Schreibfehler in Titel korrigiert
edit: Bitte verwende die Code-Tokens (übersichtlicher)
0,1°C statt 0,5°C Schritte?
Hallo,
hier wurde lange nicht mehr geschrieben aber ich versuchs mal ;-)
Das Programm läuft soweit, aber die Temperatur springt in 0,5°C Schritten - warum nicht in 0,1°C Schritten?
Und das zweite Problem ist ein Anzeige Problem:
Ôeíðåòáôõò 1: 27.0°Ã
Ôåíðåòáôõr 2: 26.5°Ã
Ja was ist denn da falsch? Temperatur 1: wäre besser als Ôeíðåòáôõò
Hat jemand eine Idee?
Tobias
Code:
$regfile = "m8def.dat"
$crystal = 1000000
$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
DS1820 mit 0,1 Grad Auflösung
Zitat:
Zitat von TobiasBlome
@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
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.
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