DS18S20 displays wrong temperatures
I am a newbie to this forum.
I have DS18S20 displaying problem. My system uses LCD (16x2, Hitachi 44780 controller-based SC1602BSLB), PBP v.2.45 and 16F877 with 4MHz ceralock. At a room temp. of 19 degrees C (by mercury thermometer), for example, I get 155.18 degrees C on LCD. If I touch DS18S20 chip with my fingers, it gradually rises up to about 220.xx degrees C. If the chip is heated by soldering iron, when the display reaches to somewhere around 650.xx degrees C, it suddenly drops to 0.xx degrees C and begins to rise again. I cannot solve this wrong-temperature displaying problem. I need your help. Pin connections and the codes I used are as follows. Thank you.
'Pin 1 - Vdd (+5V)
'Pin 2 - Vss (GND)
'Pin 3 - Vo
'Pin 4 - RS to RD2 (PIC)
'Pin 5 - R/W (GND)
'Pin 6 - E to RD3 (PIC)
'Pin 11 - RD4 (PIC)
'Pin 12 - RD5 (PIC)
'Pin 13 - RD6 (PIC)
'Pin 14 - RD7 (PIC)
'DS18S20 - DQ pin to RC2(PIC), DQ pin to Vdd pin via 4.7 k r, GND pin to GND
Define LCD_DREG PORTD
Define LCD_DBIT 4
Define LCD_RSREG PORTD
Define LCD_RSBIT 2
Define LCD_EREG PORTD
Define LCD_EBIT 3
Define LCD_BITS 4
Define LCD_LINES 2
DQ var PORTC.2
temperature Var Word
count_remain Var Byte
count_per_c Var Byte
ADCON1 = 7
pause 100
Main: OWOut DQ,1,[$CC,$44]
Waitloop: OWIn DQ,4,[count_remain]
If count_remain = 0 Then Waitloop
OWOut DQ,1,[$CC,$BE]
OWIn DQ,0,[temperature.LOWBYTE,temperature.HIGHBYTE,Skip 4,count_remain,count_per_c]
temperature = (((temperature >> 1) * 100) - 25) + (((count_per_c - count_remain) * 100)/count_per_c)
Lcdout $fe,1,DEC (temperature/100),".",DEC2 temperature," C"
Pause 1000
Goto Main
End
'Shozo Kanamori (Tokyo)
Program for DS18B20 looks good!
Hi Lotondo,
The article you introduced me seems to be very helpful. I have browsed a lot of webpages but never come across this article before. I will soon start my experiment using DS18B20.
Thank you.
Shozo Kanamori
DS1820 apsolute working with negative temperature
I will post code and you will see where is (I will note it) added change which resolve problem and working 100%
This example was coded for PIC16F84A for my job.
Code:
Define LCD_DREG PORTB
Define LCD_DBIT 4
Define LCD_RSREG PORTB
Define LCD_RSBIT 2
Define LCD_EREG PORTB
Define LCD_EBIT 3
TempR var word 'DS1820 read Temperature
TempNeg var byte 'temperature sign -/+
'*****DS1820 VARS AND SETTINGS*******
count_remain var byte 'DS1820 coumter of remain bits
count_per_c var byte 'DS1820 counter per C bits
symbol DQ = PortA.3 'OneWire data pin
'**********************************
TrisA = %11111
PortA = 0
TrisB = %00000000
PortB = 0
Main:
gosub Read_Temp
if TempR=$FFFF then Error
gosub Disp_Temp
pause 100
goto Main
'******DS1820 READING******
Read_Temp:
OWOut DQ, 1, [$CC, $44] ' Start temperature conversion
waitloop:
OWIn DQ, 4, [count_remain] ' Check for still busy converting
If count_remain = 0 Then waitloop
OWOut DQ, 1, [$CC, $BE] ' Read the temperature
OWIn DQ, 0, [TempR.LowByte, TempR.HighByte, Skip 4, count_remain, count_per_c]
if TempR = $FFFF then return
if (TempR.HighByte = $FF) and (TempR.LowByte <> 0) then
TempNeg = "-"
TempR = TempR ^ $FFFF
TempR = ((TempR >> 1)*100) - 25 + ((count_per_c + count_remain) * 100) / count_per_c
else
if (TempR.HighByte < $FF) and (TempR.LowByte <> 0) then
TempNeg = "+"
TempR = ((TempR >> 1)*100) - 25 + ((count_per_c - count_remain) * 100) / count_per_c
else
'************************************************
TempR=$0000 ' THIS IS ONLY NEED TO DEFINE !!!
'************************************************
endif
endif
return
Disp_Temp:
Lcdout $fe, 1, "Temperature: " TempNeg, DEC (TempR / 100),".", DEC2 TempR, 223, "C "
return
Error:
Lcdout $fe, 1, "!!!ERROR!!!", $fe, $C0, "Reading Temp."
goto Main
end
Now I think that this thread (I am not find any fresh thread with solved problem) was solved :)
This code measure temperature with extended resolution (DEC2).
Regards.