PDA

View Full Version : onewire.bas & DS18B20 - reading shows 10x greater temperature!



CuriousOne
- 11th March 2014, 14:31
Hello.

I've taken the code from onewire.bas and modified only LCD port assignment code:



' Name : ONEWIRE.pbp
' Compiler : PICBASIC PRO Compiler 2.6
' Assembler : PM or MPASM
' Target PIC : 40-pin 16F877A or similar
' Hardware : Lab-X1
' Oscillator : 4MHz external
' Keywords : LCDOUT, OWIN, OWOUT
' Description : PICBASIC PRO program to demonstrate 1-wire temperature
' display with LAB-X1 and DS1820 1-wire temp sensor.
'

temperature Var Word ' Temperature storage
count_remain Var Byte ' Count remaining
count_per_c Var Byte ' Count per degree C

DQ Var PORTC.0 ' One-wire data pin

' Define LCD registers and bits
Include "modedefs.bas" ' Include serial modes
ADCON1=%00000110 'CONFIGURE PORT A AS DIGITAL
'DEFINES FOR LCD PORTS
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 0
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 1
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
DEFINE LCD_COMMANDUS 1500
DEFINE LCD_DATAUS 44

' ADCON1 = 7 ' Set PORTA and PORTE to digital
'Low PORTE.2 ' LCD R/W line low (W)

mainloop:
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, [temperature.LOWBYTE, temperature.HIGHBYTE, Skip 4, count_remain, count_per_c]

' Calculate temperature in degrees C to 2 decimal places (not valid for negative temperature)
temperature = (((temperature >> 1) * 100) - 25) + (((count_per_c - count_remain) * 100) / count_per_c)
Lcdout $fe, 1, DEC (temperature / 100), ".", DEC2 temperature, " C"

' Calculate temperature in degrees F to 2 decimal places (not valid for negative temperature)
temperature = (temperature */ 461) + 3200
Lcdout $fe, $c0, DEC (temperature / 100), ".", DEC2 temperature, " F"

Pause 1000 ' Display about once a second
Goto mainloop ' Do it forever

End


The problem is, that code works, but displays 10x larger temperature, and temperature is also incorrect - the error rate increases as temperature increases and for 70C error is 10C, it displays 60C (for 35C error is 5C, displays 30C and so on).

What might be the reason?

I've tried different DS18B20's, in TO or SOIC package, everyone has the same problem!

CuriousOne
- 11th March 2014, 14:57
Silly me.

Code is for 1820, I have 18B20, had to use different code.