srob - try going through the following program. It worked for me.
Code:
'Program: TsensDS18B20.bas
'Notes: Temperature sensing with DS18B20 chip.
'Hardware Used: PIC18F2620 and DS18B20 Temp sensor
'Connections:
'Using default pin connections between LCD and PIC
'D4 -> RA0, D5 -> RA1, D6 -> RA2, D7 ->RA3
'E -> RB3, RS -> RA4, Vee (Pin 3) to GND
'****************************************************************
'DS18B20 connected to RB4 (pin 25) and Vcc with a 4.7k pull-up resistor.
'PIC18F2620 programmed with the "INTRC" switch for clock setting.
'MUST SET OSCCON to %01100000 to set the internal clock to 4-MHz
'****************************************************************
Comm_Pin VAR PortB.4 ' One-wire Data-Pin on PortB.4
SignC VAR BYTE ' +/- sign for Celcius temp display
SignF VAR BYTE ' +/- sign for F temp display
RAWTEMP VAR WORD 'Read raw temperature from DS18B20
SignBit VAR RAWTEMP.Bit11 'Read sign bit. 0=positive, 1=negative
TempC VAR WORD 'Converted temp in C
TempF var word 'Converted temp in F
Busy VAR BIT 'Busy bit
dummy var word
OSCCON = %01100000 'Internal clock set to 4-MHz (MUST DO THIS!!!)
CMCON = 7 ' RA0-RA3 are digital I/O. Turn off camparators
TRISA = 0 'PORTA is output
TRISB = 0 'PORTB is output
ADCON1 = 15 'All PORTB pins are digital
PAUSE 500 ' Wait 0.5 second to initialize LCD
LCDOUT $FE,1 ' Clear LCD
Loop:
gosub ReadDS18B20 'Initiate talk with & read DS18B20
gosub CalcC 'Calculate Celsius from RAWTEMP
gosub CalcF 'Calculate Fahrenheit from Celsius
LCDOUT $FE,2 'Home cursor
LCDOUT "Temp=",SignC,dec TempC/100,".",DEC2 TempC," C"
LCDOUT $FE,$C0 'Go to beginning of 2nd row
lcdout "Temp=",SignF,dec TempF/100,".",DEC2 TempF," F"
goto Loop
ReadDS18B20:
OWOUT Comm_Pin, 1, [$CC, $44] ' Skip ROM search & do temp conversion
ReadBusy:
OWIN Comm_Pin, 4, [Busy] ' Read busy-bit
IF Busy = 0 THEN ReadBusy ' Loop until Busy=1 (Temp conversion complete)
OWOUT Comm_Pin, 1, [$CC, $BE] ' Skip ROM search & read scratchpad memory
OWIN Comm_Pin, 2, [RAWTEMP.LowByte, RAWTEMP.HighByte] ' Read the raw temperature from DS18B20
return
CalcC:
if SignBit=0 then
SignC="+"
else
SignC="-"
rawtemp = ~rawtemp+1 'Negative temp stored in 2's complement format
endif
dummy = rawtemp*625 'DS18B20's resolution is 0.0625 C
TempC=DIV32 100
return
CalcF:
If SignC="-" then
If TempC>1777 then 'When Tc is <(-17.77), Tf is finally negative
SignF="-"
Dummy=TempC*18
TempF= DIV32 10
TempF=TempF-3200
Else
SignF="+" 'Tf is still positive when Tc>= (-17.77)
Dummy=TempC*18
TempF=DIV32 10
TempF=3200-TempF
Endif
Else
SignF="+" 'Positive Tc always gives positive Tf
Dummy=TempC*18
TempF=DIV32 10
TempF=TempF+3200
Endif
return
END
Bookmarks