Hi everyone,

I'm trying to obtain the temperature using four DS18B20s and transfer the result to my PC using serial port. My code is below, but I couldn't obtain the result I wanted, when I simulated using Proteus. I used SEROUT command instead of HSEROUT, because this PIC model doesn't have built in USART. Maybe I did a mistake using this command. I'd be glad, if you can help. (BTW i'm using MicroCode studio and MPASM).

Code :

'************************************************* ***************
'* Name : UNTITLED.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 27.02.2012 *
'* Version : 1.0 *
'* Notes : *
'* : *
'************************************************* ***************
@ __CONFIG _WDT_OFF & _MCLRE_ON & _CP_OFF & _PWRTE_ON & _CPD_OFF & _BOD_OFF & _FCMEN_ON & _IESO_OFF & _INTRC_OSC_NOCLKOUT


OSCCON = %01100001
DEFINE XTAL = 4


PortA=0




Busy VAR BIT
HAM VAR WORD
HEAT VAR WORD
FLOAT VAR WORD
SIGN_BIT VAR HAM.Bit11
NEG_HEAT CON 1
DEGREE CON 223
SIGN VAR BYTE
TEMP VAR BYTE
COMM_PIN VAR PORTA.0
COMM_PIN1 VAR PORTA.1
COMM_PIN2 VAR PORTA.2
COMM_PIN3 VAR PORTA.3
CLEAR


START:
GOSUB READSENSOR
GOSUB READSENSOR1
GOSUB READSENSOR2
GOSUB READSENSOR3
GOTO START


READSENSOR:
OWOUT Comm_Pin,1,[$CC,$44]


WAT :
OWIN COMM_PIN,4,[Busy]
IF Busy=0 THEN WAT
OWOUT COMM_PIN,1,[$CC,$BE]
OWIN COMM_PIN,2,[HAM.Lowbyte,ham.highbyte]
GOSUB CALC
RETURN


CALC:
SIGN = "+"
IF SIGN_BIT = NEG_HEAT THEN
SIGN = "-"
TEMP = ($FFFF - HAM + 1)*625
HEAT = DIV32 10
GOTO SUB
ENDIF
TEMP = 625*HAM
HEAT = DIV32 10


SUB:
FLOAT = (HEAT//1000)/100
HEAT = (HEAT/1000)


SEROUT PORTA.0,2,[HEAT,10]
RETURN


READSENSOR1:
OWOUT Comm_Pin1,1,[$CC,$44]


WAT1 :
OWIN COMM_PIN1,4,[Busy]
IF Busy=0 THEN WAT1
OWOUT COMM_PIN1,1,[$CC,$BE]
OWIN COMM_PIN1,2,[HAM.Lowbyte,ham.highbyte]
GOSUB CALC1
RETURN


CALC1:
SIGN = "+"
IF SIGN_BIT = NEG_HEAT THEN
SIGN = "-"
TEMP = ($FFFF - HAM + 1)*625
HEAT = DIV32 10
GOTO SUB1
ENDIF
TEMP = 625*HAM
HEAT = DIV32 10


SUB1:
FLOAT = (HEAT//1000)/100
HEAT = (HEAT/1000)


SEROUT PORTA.1,2,[hEAT,10]
RETURN


READSENSOR2:
OWOUT Comm_Pin2,1,[$CC,$44]


WAT2 :
OWIN COMM_PIN2,4,[Busy]
IF Busy=0 THEN WAT2
OWOUT COMM_PIN2,1,[$CC,$BE]
OWIN COMM_PIN2,2,[HAM.Lowbyte,ham.highbyte]
GOSUB CALC2
RETURN


CALC2:
SIGN = "+"
IF SIGN_BIT = NEG_HEAT THEN
SIGN = "-"
TEMP = ($FFFF - HAM + 1)*625
HEAT = DIV32 10
GOTO SUB2
ENDIF
TEMP = 625*HAM
HEAT = DIV32 10


SUB2:
FLOAT = (HEAT//1000)/100
HEAT = (HEAT/1000)


SEROUT PORTA.2,2,[HEAT,10]
RETURN


READSENSOR3:
OWOUT Comm_Pin3,1,[$CC,$44]


WAT3 :
OWIN COMM_PIN3,4,[Busy]
IF Busy=0 THEN WAT3
OWOUT COMM_PIN3,1,[$CC,$BE]
OWIN COMM_PIN3,2,[HAM.Lowbyte,ham.highbyte]
GOSUB CALC3
RETURN


CALC3:
SIGN = "+"
IF SIGN_BIT = NEG_HEAT THEN
SIGN = "-"
TEMP = ($FFFF - HAM + 1)*625
HEAT = DIV32 10
GOTO SUB3
ENDIF
TEMP = 625*HAM
HEAT = DIV32 10


SUB3:
FLOAT = (HEAT//1000)/100
HEAT = (HEAT/1000)


SEROUT PORTA.3,2,[HEAT,10]
RETURN
END