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)