Quantcast
Channel: MEL PICBASIC Forum
Viewing all articles
Browse latest Browse all 4745

onewire.bas & DS18B20 - reading shows 10x greater temperature!

$
0
0
Hello.

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

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!

Viewing all articles
Browse latest Browse all 4745

Trending Articles