Hallo allemaal,
ik ben bezig met een digitale thermometer op basis van een PIC16f628 en de Dallas DS1820 1-wire thermometer.
Op zich werkt het goed, ware het niet dat het geheel nogal onnauwkeurig is. Afgaande op de digitale thermostaat van de CV-ketel, welke 20 graden aangeeft, geeft de DS1820 zo'n 3,5 graden meer aan, 23,5 dus.
Ook op een andere thermometer, in de schuur, klopt het voor geen meter. Hier gaf hij zelfs 9,5 graden aan terwijl het er maar 1,5 graden was!
Het geheel is geprogrammeerd in PICBasic. Dit is de code:
Eerlijkheidshalve moet ik zeggen dat het niet compleet mijn code is. Het komt van deze site. Ik heb hier de pins van de lcd en de DS1820 in aangepast, alsmede wat output naar het scherm. Ook is het een en ander aangepast aan Proton PicBasic.
De DS1820 is wel op dezelfde manier aangesloten als op de site hierboven, maar dan op B.0 i.p.v. C.0
Maar ergens komt dus een onnauwkeurigheid vandaan. Ik heb de datasheet van de DS1820 eens goed nagelezen, maar volgens mij haal ik de temperatuur er op de juiste manier uit.
Ziet iemand wat ik fout doe?
ik ben bezig met een digitale thermometer op basis van een PIC16f628 en de Dallas DS1820 1-wire thermometer.
Op zich werkt het goed, ware het niet dat het geheel nogal onnauwkeurig is. Afgaande op de digitale thermostaat van de CV-ketel, welke 20 graden aangeeft, geeft de DS1820 zo'n 3,5 graden meer aan, 23,5 dus.
Ook op een andere thermometer, in de schuur, klopt het voor geen meter. Hier gaf hij zelfs 9,5 graden aan terwijl het er maar 1,5 graden was!
Het geheel is geprogrammeerd in PICBasic. Dit is de code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
| DEVICE 16F628 ;Gebruik een 16F628 type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
'Data-pin van de DS1820
Dim command as byte ' Storage for command
Dim i as byte ' Storage for loop counter
Dim temp as word ' Storage for temperature
Dim DQ as PORTB.0 ' Alias DS1820 data pin
Dim DQDIR as TRISB.0 ' Alias DS1820 data direction pin
delayms 500
print "Temp in ", 223, "C "
mainloop:
Gosub init1820 ' Init the DS1820
command = $cc ' Issue Skip ROM command
Gosub write1820
command = $44 ' Start temperature conversion
Gosub write1820
delayms 2000 ' Wait 2 seconds for conversion to complete
Gosub init1820 ' Do another init
command = $cc ' Issue Skip ROM command
Gosub write1820
command = $be ' Read the temperature
Gosub write1820
Gosub read1820
print at 2, 1, dec (temp * 0.5), 223, "C"
goto mainloop
' Initialize DS1820 and check for presence
init1820:
Low DQ ' Set the data pin low to init
delayus 500 ' Wait > 480us
DQDIR = 1 ' Release data pin (set to input for high)
delayus 100 ' Wait > 60us
If DQ = 1 Then
print at 2, $fe, 1, "DS1820 not present"
delayms 500
Goto mainloop ' Try again
Endif
delayus 400 ' Wait for end of presence pulse
Return
' Read temperature from the DS1820
read1820:
For i = 1 to 16 ' 16 bits to a word
temp = temp >> 1 ' Shift down bits
Gosub readbit ' Get the bit to the top of temp
Next i
Return
' Read a bit from the DS1820
readbit:
temp.15 = 1 ' Preset read bit to 1
Low DQ ' Start the time slot
@ nop ' Delay 1us at 4MHz
DQDIR = 1 ' Release data pin (set to input for high)
If DQ = 0 Then
temp.15 = 0 ' Set bit to 0
Endif
delayus 60 ' Wait out rest of time slot
Return
' Write "command" byte to the DS1820
write1820:
For i = 1 to 8 ' 8 bits to a byte
If command.0 = 0 Then
Gosub write0 ' Write a 0 bit
Else
Gosub write1 ' Write a 1 bit
Endif
command = command >> 1 ' Shift to next bit
Next i
Return
' Write a 0 bit to the DS1820
write0:
Low DQ
delayus 60 ' Low for > 60us for 0
DQDIR = 1 ' Release data pin (set to input for high)
Return
' Write a 1 bit to the DS1820
write1:
Low DQ ' Low for < 15us for 1
@ nop ' Delay 1us at 4MHz
DQDIR = 1 ' Release data pin (set to input for high)
delayus 60 ' Use up rest of time slot
Return
End |
Eerlijkheidshalve moet ik zeggen dat het niet compleet mijn code is. Het komt van deze site. Ik heb hier de pins van de lcd en de DS1820 in aangepast, alsmede wat output naar het scherm. Ook is het een en ander aangepast aan Proton PicBasic.
De DS1820 is wel op dezelfde manier aangesloten als op de site hierboven, maar dan op B.0 i.p.v. C.0
Maar ergens komt dus een onnauwkeurigheid vandaan. Ik heb de datasheet van de DS1820 eens goed nagelezen, maar volgens mij haal ik de temperatuur er op de juiste manier uit.
Ziet iemand wat ik fout doe?
Liefde maakt een smal bed breed!
Nu de dekens nog...