slash819
- 28th February 2012, 11:21
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
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