Forum: Mikrocontroller und Digitale Elektronik genaue Temperaturmessung mit ds1820


von Christian M. (cooool39)


Lesenswert?

was muss ich ändern damit ich eine genauere temperaturmessung bekomme 
(in 0,1 Grad Schritten)??
1
$regfile = "m8def.dat"
2
$crystal = 3686400
3
4
5
Config 1wire = Portb.0
6
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
7
Config Lcd = 16 * 2
8
9
10
11
12
Dim T1 As Single
13
Dim T2 As Single
14
Dim I As Byte
15
Dim Id1(8) As Byte
16
Dim Id2(8) As Byte
17
Dim Ar1(2) As Byte
18
Dim Ar2(2) As Byte
19
20
21
22
23
24
Id1(1) = 1wsearchfirst()
25
Id2(1) = 1wsearchnext()
26
27
28
Do
29
Print " "
30
1wreset                                                     'reset
31
1wwrite &H55                                                'Match Rom command
32
1wwrite Id1(1) , 8                                          'Id von Sensor 1
33
1wwrite &H44                                                'Convert T
34
35
Waitms 300                                                  'warten bis convert T fertig ist
36
1wreset                                                     'reset
37
1wwrite &H55                                                'match rom command
38
1wwrite Id1(1) , 8                                          'id von sensor 1
39
1wwrite &HBE                                                'scratchpad lesen
40
Ar1(1) = 1wread(1)                                          'erstes byte auslesen, da steht Temp drin
41
Ar1(2) = 1wread(1)                                          'zweites Byte auslesen, wenn 00000000 dann pos vorzeichen, wenn 11111111 dann neg vorzeichen
42
43
44
Waitms 500
45
1wreset                                                     'reset
46
1wwrite &H55                                                'Match Rom command
47
1wwrite Id2(1) , 8                                          'Id von Sensor 2
48
1wwrite &H44                                                'Convert T
49
50
Waitms 300                                                  'warten bis convert T fertig ist
51
1wreset                                                     'reset
52
1wwrite &H55                                                'match rom command
53
1wwrite Id2(1) , 8                                          'id von sensor 2
54
1wwrite &HBE                                                'scratchpad lesen
55
Ar2(1) = 1wread(1)                                          'erstes byte auslesen, da steht Temp drin
56
Ar2(2) = 1wread(1)                                          'zweites Byte auslesen, wenn 00000000 dann pos vorzeichen, wenn 11111111 dann neg vorzeichen
57
58
T1 = Ar1(1) / 2
59
T2 = Ar2(1) / 2
60
61
62
63
64
      Cls                                                   'wenn byte 2 aus dem sensor = 0 dann temp pos, sonst neg
65
      Lcd T1 ; "°C"
66
67
      Lowerline
68
                                                  'wenn byte 2 aus dem sensor = 0 dann temp pos, sonst neg
69
      Lcd T2 ; "°C"
70
71
Waitms 500
72
73
Loop

von Andreas K. (a-k)


Lesenswert?

Genauer als 0,5° wird es nicht. Du kannst zwar die Messung feiner 
auflösen, nämlich bis runter auf 1/16°, aber dadurch wird es nicht 
genauer.

Und in der Frage wie das geht, liegt der wichtigste Unterschied zwischen 
den beiden verfügbaren Varianten: DS18S20 und DS18B20. Da letzterer das 
Ergebnis sowieso schon in 1/16°C abliefert, ist es da trivial. Wie man 
es beim DS18S20 hinbekommt steht im Datasheet. Da ist etwas rechnen mit 
dem Restwert angesagt.

von Dallas (Gast)


Lesenswert?

$sim
$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
Dim W As Byte

Declare Sub Crcit
Declare Sub Crcit2

W = 1wirecount()
Id1(1) = 1wsearchfirst() 
'ID des 1. auslesen
Id2(1) = 1wsearchnext() 
'ID des nächstenauslesen


Do
Print "Gefundene Bausteine "
Print "Anzahl " ; W ; 
'Anzahl der Bausteine ausgeben
Print ""
Print "ID des ersten Bausteins"
For I = 1 To 8 
'erstes bis 8tes Bit
Print "" ; Hex(id1(i)); 
'Ausgabe des RomCode auf UART
Next

1wreset
1wwrite &H55 
'Match Rom
1wwrite Id1(1) , 8 
'64Bit senden (DS1820 adresse)
1wwrite &H44 
'Convert temp
Waitms 800 
'wenn parasite powered, ansonsten kann man auch den idle-state abfragen. 
Dieser geht auf low, wenn die Wandlung fertig ist (aber nur bei externer 
Stromversorgung, nicht im parasite modus).

'usw... kommentieren
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

1wreset
1wwrite &H55
1wwrite Id2(1) , 8
1wwrite &H44

Waitms 800
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

von Christian M. (cooool39)


Lesenswert?

mit diesem quellcode findet er garkeine sensoren! (bei mir)

von Falk (Gast)


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.