Code:
;
; http://www.picbasic.co.uk/forum/showthread.php?t=7182&highlight=gioppy
; Volt-termometru cu 16F676
;
@ DEVICE pic16F684, intrc_osc_noclkout, WDT_OFF, PWRT_OFF, BOD_OFF, MCLR_ON
define osc 4
TRISA= %00010000
TRISC= %00110000
CMCON0 = %00000111 'Disable analog comparators.
DEFINE ADC_BITS 10 ' 10 bit A/D Conversion
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 50 ' 50 uS A/D sample time
VRCON = %00000000 ' Disable Comparator Voltage Reference
ANSEL = %00000100 ' Set pin (AN2) to analog input, the rest to digital
ADCON0 = %10001001 ' Set up A/D converter - Right Just., VDD REF., CH 2, ON
ADCON1 = %00110000 ' Set up A/D Converter clock source to internal RC
DEFINE LCD_DREG PORTC ' LCD on port B
DEFINE LCD_DBIT 0 ' Data bits B4..B7
DEFINE LCD_RSREG PORTA ' RS on PORTA
DEFINE LCD_RSBIT 1 ' RS on A1
DEFINE LCD_EREG PORTA ' E on PORTA
DEFINE LCD_EBIT 0 ' E on A0
DEFINE LCD_BITS 4 ' LCD 4 bit mode
DEFINE LCD_LINES 2 ' 2 line LCD display
Define LCD_COMMANDUS 2000 ' Command Delay (uS)
Define LCD_DATAUS 50 ' Data Delay (uS)
Temperature1 Var Word ' Temperature storage
Temperature2 Var Word ' Temperature storage
TempC1 Var Word
TempC2 Var Word
Float1 Var Word
Float2 Var Word
Sign1 Var Byte ' +/- sign
Sign2 Var Byte ' +/- sign
DQ1 Var PORTC.5 ' One-wire data pin
DQ2 Var PORTC.4 ' One-wire data pin
Twist1 Var Bit
Dummy1 Var Byte
V1 Var Word
Twist2 Var Bit
Dummy2 Var Byte
V2 Var Word
Vfs con 20480 '20,480v
K16 con 61441 'coefficiente filtro 15/16
Vbatt var word 'Vbatt filtrato
TmpW var word
Acc_Vbatt var word 'accumulatore Vbatt filtrato * 16
DS18B20_1_12bit CON %01111111 ' 750ms, 0.0625°C (default)
DS18B20_2_12bit CON %01111111 ' 750ms, 0.0625°C (default)
Twist1 = 0
Twist2 = 0
Pause 500
LCDOUT $FE, 1, $FE, $0C ' Clear display, cursor off
Pause 500
' Init Sensor 1
OWOUT DQ1, 1, [$CC, $4E, 0, 0, DS18B20_1_12bit]
OWOut DQ1, 1, [$CC, $48] ' Start temperature conversion
OWOut DQ1, 1, [$CC, $B8]
OWOut DQ1, 1, [$CC, $BE]
Pause 50
OWIn DQ1, 2, [temperature1.byte0, temperature1.byte1]
Pause 50
' Init Sensor 2
OWOUT DQ2, 1, [$CC, $4E, 0, 0, DS18B20_2_12bit]
OWOut DQ2, 1, [$CC, $48] ' Start temperature conversion
OWOut DQ2, 1, [$CC, $B8]
OWOut DQ2, 1, [$CC, $BE]
Pause 50
OWIn DQ2, 2, [temperature2.byte0, temperature2.byte1]
Pause 50
'==================================================================================================================
Main :
Part1:
' Start temp.conv.Sensor1
OWOut DQ1, 1, [$CC, $44]
WaitLoop1:
While not DQ1
Wend
OWOut DQ1, 1, [$CC, $BE]
OWIn DQ1, 2, [temperature1.byte0, temperature1.byte1]
If Temperature1.15 then
Temperature1= ~Temperature1 +1
Twist1 = 1
Endif
Dummy1 = 625 * Temperature1
TempC1 = DIV32 10
TempC1 = (Temperature1 & $7FF) >> 4
Float1 = ((Temperature1.Lowbyte & $0F ) * 25 )>>2
Temperature1 = TempC1*100 + Float1
If Twist1 then
V1= 10000 - Temperature1
Twist1 = 0
else
V1= 10000 + Temperature1
EndIf
If V1 >= 10000 then
Temperature1=V1-10000
else
Temperature1=10000-V1
EndIf
'===================================================================================================================
Part2 :
' Start temp.conv.Sensor1
OWOut DQ2, 1, [$CC, $44]
WaitLoop2:
While not DQ2
Wend
OWOut DQ2, 1, [$CC, $BE]
OWIn DQ2, 2, [temperature2.byte0, temperature2.byte1]
If Temperature2.15 then
Temperature2= ~Temperature2 +1
Twist2 = 1
Endif
Dummy2 = 625 * Temperature2
TempC2 = DIV32 10
TempC2 = (Temperature2 & $7FF) >> 4
Float2 = ((Temperature2.Lowbyte & $0F ) * 25 )>>2
Temperature2 = TempC2*100 + Float2
If Twist2 then
V2= 10000 - Temperature2
Twist2 = 0
else
V2= 10000 + Temperature2
EndIf
If V2 >= 10000 then
Temperature2=V2-10000
else
Temperature2=10000-V2
EndIf
'==========================================================================================================================
GoSub SelectSign
Gosub Get_Vbatt ' make a new measure
TmpW = Vbatt * Vfs ' AD * 20480
TmpW = Div32 1024 '(AD * 20480) / 1024
if (temperature1/100) =>10 then
LcdOut $FE, $80, "I:", Sign1, DEC (Temperature1 / 100), ".", DEC Temperature1 dig 1, 223
else
LcdOut $FE, $80, "I:", Sign1, $14, DEC (Temperature1 / 100), ".", DEC Temperature1 dig 1, 223
endif
if (temperature2/100) =>10 then
LcdOut $FE, $c0, "O:", Sign2, DEC (Temperature2 / 100), ".", DEC Temperature2 dig 1, 223, " ", "V:",dec TmpW dig 4,dec TmpW dig 3,",",dec TmpW dig 2
LcdOut $FE, $C0, "O:", Sign2, $14, DEC (Temperature2 / 100), ".", DEC Temperature2 dig 1, 223, " ", "V:", dec TmpW dig 4,dec TmpW dig 3,",",dec TmpW dig 2
endif
Goto Main
'==========================================================================================================================
SelectSign:
If v1 = 10000 then
Sign1=" "
else
If v1 < 10000 then
Sign1="-"
else
Sign1="+"
EndIf
EndIf
If v2 = 10000 then
Sign2=" "
else
If v2 < 10000 then
Sign2="-"
else
Sign2="+"
EndIf
EndIf
Return
'==========================================================================================================================
Get_Vbatt:
ADCON0.1 = 1 'start A/D
while ADCON0.1 = 1
wend
TmpW.byte1 = ADRESH 'get A/D value
TmpW.byte0 = ADRESL
Acc_Vbatt = Acc_Vbatt ** K16 + TmpW 'filtro 15/16
Vbatt = Acc_Vbatt / 16 ' / 16 valore normalizzato
Acc_Vbatt = TmpW * 16 'filter preload Vbatt * 16
return
Bookmarks