I do not give the fish any more ...
Hi, Jcleaver
The thermostat program was for you to verify what you had to find ... and show you a different Bargraph view.
NOT to copy / paste it ...
You can find any parts of it on this forum, The DS18x20 subject has been widely explored during the past months.
but that need some little efforts ... is it the problem ?
Alain
Re: ds18s20 reads incorectly
I am trying to follow your code in an effort to better understand it, but I don't understand
SignC = Positive
Code:
ReadDS18S20:
owout sensor,1,[$CC, $44] ' Send Start Temperature Conversion command
owout sensor,1,[$CC, $BE] ' Send Read Temperature command
owin sensor,0,[STR dq\9] ' Retrieve all 9 bytes of data
RawTemp.Byte0 = dq[0]
RawTemp.byte1 = dq[1]
if RawTemp.8 = 1 then ' Check if temperature is a negative reading
SignC = Negative
RawTemp.lowbyte = RawTemp.lowbyte ^ 255 ' Invert data
else
SignC = Positive
endif
dummy = RawTemp.0 ' Store the half degree indicator bit
TempC = ((RawTemp.lowbyte) >> 1) * 100 ' Divide raw data by 2 to give real temperature
TempC = TempC + (dummy * 50) ' Add the half degree is present
if SignC = Negative then ' Only proceed if temperature is negative
if TempC => 1770 then
SignF = Negative
TempF = (TempC + 5000) * 900
TempF = div32 500
TempF = TempF - 12200
return
else
SignF = Positive
TempF = (TempC + 5000) * 900
TempF = div32 500
TempF = 12200 - TempF
return
endif
endif
SignF = Positive
TempF = TempC * 18 / 10 + 3200
return
It would help if you shared the declarations of the variables used.
sensor equates to the hardware pin connected to the sensor?
RawTemp is a word?
dq is an array of 9?
dummy is a byte?
TempC is a byte?
TempF is a byte?
I don't get SignC or SignF and how you can equate to 'Positive' or 'Negative', I couldn't find a reference in the PBP manual.
Explanation would be appreciated.
Regards,
Steve
Re: ds18s20 reads incorectly
Quote:
I don't get SignC or SignF and how you can equate to 'Positive' or 'Negative', I couldn't find a reference in the PBP manual.
Explanation would be appreciated
For positive temperatures the output increases from 0000h as the temperature increases from 0 deg C.
For negative temperatures the output decreases from FFFFh as the temperature falls below -0.5 deg C.
To check for negative any output bit can be checked for 1, when that bit is outside the temperature range of the sensor. The data sheet says
The sign bit (S) indicates if the value is positive or negative: for positive numbers S = 0 and for negative numbers S = 1.
In the program RawTemp.8 is chosen as the sign bit.
Re: ds18s20 reads incorectly
Thanks EarlyBird2, I did figure that part out. In the code that the 'Kid' supplied, I could not get it to work until I remarked the SignC=Negative portion.
The code below works, but I have not tried for negative numbers yet..... Could you explain why?
Thanks and Regards,
Steve
Code:
ReadDS18S20:' Works, mostly.....------------------------------------------------
owout Tsensor,1,[$CC, $44] 'Send Start Temperature Conversion command
owout Tsensor,1,[$CC, $BE] 'Send Read Temperature command
owin Tsensor,0,[STR dq\9] 'Retrieve all 9 bytes of data
RawTemp.Byte0 = dq[0]
RawTemp.byte1 = dq[1]
if RawTemp.8 = 1 then 'Check if temperature is a negative reading
SignC = Negative
RawTemp.lowbyte = RawTemp.lowbyte ^ 255 'Invert data
else
SignC = Positive
endif
dummy = RawTemp.0 'Store the half degree indicator bit
TempC = ((RawTemp.lowbyte) >> 1) * 100 'Divide raw data by 2 to give real temperature
TempC = TempC + (dummy * 50) 'Add the half degree is present
' if SignC = Negative then 'Only proceed if temperature is negative - doesnt work for F, fine for C
' if TempC => 1770 then
' SignF = Negative
' TempF = (TempC + 5000) * 900
' TempF = div32 500
' TempF = TempF - 12200
' return
' else
' SignF = Positive
' TempF = (TempC + 5000) * 900
' TempF = div32 500
' TempF = 12200 - TempF
' return
' endif
' endif
SignF = Positive 'Sign is +
TempF = ((TempC * 18) / 10) + 3200 'Convert from C to F
return
Re: ds18s20 reads incorectly
Negative and Positive are declared variables or constants. In your code should be
Negative CON 1
Positive CON 0
Does this help?
Could be SYMBOL or ALIAS of course.
Re: ds18s20 reads incorectly
EarlyBird2-
Thanks! I just tried it (I did NOT have them as CONstants), compiles fine but still gives me 0.00F.
Code is below for clarification.
Regards,
Steve
Code:
Positive con 0 'Bit used for + in the DS18S20
Negative con 1 'Bit used for - in the DS18S20
rawtemp var word 'Raw temp var
tempC var word 'Temp var for degrees C
tempF var word 'Temp var for degrees F
dq var byte[9] 'String of data from DS18S20
SignC var bit 'Bit for + or - for degrees C
SignF var bit 'Bit for + or - for degrees F
dummy var bit 'Temp var
ReadDS18S20:' Works, mostly.....--Thanks 'Kid' from Forum-----------------------
owout Tsensor,1,[$CC, $44] 'Send Start Temperature Conversion command
owout Tsensor,1,[$CC, $BE] 'Send Read Temperature command
owin Tsensor,0,[STR dq\9] 'Retrieve all 9 bytes of data
RawTemp.Byte0 = dq[0]
RawTemp.byte1 = dq[1]
if RawTemp.8 = 1 then 'Check if temperature is a negative reading
SignC = Negative
RawTemp.lowbyte = RawTemp.lowbyte ^ 255 'Invert data
else
SignC = Positive
endif
dummy = RawTemp.0 'Store the half degree indicator bit
TempC = ((RawTemp.lowbyte) >> 1) * 100 'Divide raw data by 2 to give real temperature
TempC = TempC + (dummy * 50) 'Add the half degree is present
if SignC = Negative then 'Only proceed if temperature is negative - doesnt work for F, fine for C
if TempC => 1770 then
SignF = Negative
TempF = (TempC + 5000) * 900
TempF = div32 500
TempF = TempF - 12200
return
else
SignF = Positive
TempF = (TempC + 5000) * 900
TempF = div32 500
TempF = 12200 - TempF
return
endif
endif
' SignF = Positive 'Sign is +
' TempF = ((TempC * 18) / 10) + 3200 'Convert from C to F
return
This what I have that does work, just not for negatives.....
Code:
ReadDS18S20:' Works, mostly.....--Thanks 'Kid' from Forum-----------------------
owout Tsensor,1,[$CC, $44] 'Send Start Temperature Conversion command
owout Tsensor,1,[$CC, $BE] 'Send Read Temperature command
owin Tsensor,0,[STR dq\9] 'Retrieve all 9 bytes of data
RawTemp.Byte0 = dq[0]
RawTemp.byte1 = dq[1]
if RawTemp.8 = 1 then 'Check if temperature is a negative reading
SignC = Negative
RawTemp.lowbyte = RawTemp.lowbyte ^ 255 'Invert data
else
SignC = Positive
endif
dummy = RawTemp.0 'Store the half degree indicator bit
TempC = ((RawTemp.lowbyte) >> 1) * 100 'Divide raw data by 2 to give real temperature
TempC = TempC + (dummy * 50) 'Add the half degree is present
' if SignC = Negative then 'Only proceed if temperature is negative - doesnt work for F, fine for C
' if TempC => 1770 then
' SignF = Negative
' TempF = (TempC + 5000) * 900
' TempF = div32 500
' TempF = TempF - 12200
' return
' else
' SignF = Positive
' TempF = (TempC + 5000) * 900
' TempF = div32 500
' TempF = 12200 - TempF
' return
' endif
' endif
SignF = Positive 'Sign is +
TempF = ((TempC * 18) / 10) + 3200 'Convert from C to F
return
Regards,
Steve