Code:
'*****************************************************************************
'*****************************************************************************
' Thermostat F84 test sur EasyPic5
' Thermostat 16F877a + DS 18B20
'*****************************************************************************
'*****************************************************************************
'*****************************************************************************
'*****************************************************************************
@ __config _HS_OSC & _WDT_ON & _PWRTE_ON & _BODEN_ON & _LVP_OFF & _CP_OFF
'*****************************************************************************
'* LCD Defines for EasyPic5 *
'*****************************************************************************
DEFINE LCD_DREG PORTB ' I/O port where LCD is connected
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 4 ' Register select pin
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 5 ' Enable pin
DEFINE LCD_BITS 4 ' 4-bit data bus
DEFINE LCD_LINES 2 ' LCD has 2 character lines
DEFINE OSC 8
DEFINE BUTTON_PAUSE 100
'Define LCD_DREG PORTD
'Define LCD_DBIT 4
'Define LCD_RSREG PORTE
'Define LCD_RSBIT 0
'Define LCD_EREG PORTE
'Define LCD_EBIT 1
Temp_Down VAR PortA.0 'Temp down button input port
Temp_Up VAR PortA.1 'Temp up button input port
G_LED VAR PortC.0 ' Green LED output cold needed
Relay_Cold VAR PORTC.1
R_LED VAR PortC.6 ' Red LED output hot needed
Relay_hot VAR PortC.7
DQ VAR PortE.2 ' One-wire Data-Pin "DQ" on PortE.2
'Temp_Down VAR PortB.3 'Temp down button input port
'Temp_Up VAR PortB.2 'Temp up button input port
'R_LED VAR PortB.0 ' Red LED output
'G_LED VAR PortB.1 ' Green LED output
'DQ VAR PortC.0 ' One-wire Data-Pin "DQ" on PortC.0
'
Busy VAR BIT ' Busy Status-Bit
delay VAR BYTE 'Button working variable
Dummy VAR BYTE ' Dummy for Div32
Loscale VAR BYTE
Hiscale VAR BYTE
Decal VAR BYTE
Tempeff VAR WORD
Setpoint VAR WORD
R_Temp VAR WORD ' RAW Temperature readings
TempC VAR WORD ' Temp in deg C
Float VAR WORD ' Holds remainder for + temp C display
ColdStart VAR BIT
Sign VAR BIT
Cold_Bit VAR R_Temp.Bit11 ' Sign-Bit for +/- Temp. 1 = Below 0 deg C
ADCON1 = 7 ' Set PORTD and PORTE to digital
CMCON = 7 ' Comparators OFF
PORTA = %00000011
PORTB = 0
PORTC = 0
PORTD = 0
PORTE = 0
TRISA = %00000011
TRISB = 0
TRISC = 0
TRISD = 0
TRISE = %00000010
DS18B20_9bit CON %00011111 ' 93.75ms, 0.5°C
DS18B20_10bit CON %00111111 ' 187.5ms, 0.25°C <-- My favorite
DS18B20_11bit CON %01011111 ' 375ms, 0.125°C
DS18B20_12bit CON %01111111 ' 750ms, 0.0625°C (default)
Setpoint = 200 'Default setpoint on start up
ColdStart = 1
LCDOut $FE,1 'Clear LCD
PAUSE 750
'Chargement motifs en CGRAM
LCDOUT $FE,$40,$00,$00,$00,$00,$00,$04,$04,$04 ' Cust Char #0
LCDOUT $FE,$48,$00,$00,$00,$04,$04,$04,$04,$04 ' Cust Char #1
LCDOUT $FE,$50,$04,$04,$04,$04,$04,$04,$04,$04 ' Cust Char #2
LCDOUT $FE,$58,$04,$04,$0E,$0E,$0E,$1F,$1B,$11 ' Cust Char #3
LCDOUT $FE,$60,$11,$1B,$1F,$0E,$0E,$0E,$04,$04 ' Cust Char #4
OWOUT DQ, 1, [$CC, $4E, 0, 0, DS18B20_10bit] 'Skip ROM search and write 10bit resolution to scratch pad
Start_Convert:
OWOUT DQ, 1, [$CC, $44] ' Skip ROM search & do temp conversion
delay = 0
Button Temp_Up, 0, 255, 0, delay, 1, Up_Loop
button Temp_Down, 0, 255, 0, delay, 1, Down_Loop
'*****************************************************************************
' Check for still busy converting ( ~ 4500 fois ... )
'*****************************************************************************
waitloop:
INPUT DQ
If NOT DQ Then waitloop
OWOUT DQ, 1, [$CC, $BE ] ' Skip ROM search & read scratchpad memory
OWIN DQ, 2, [R_Temp.Lowbyte, R_Temp.Highbyte]' Read two bytes / end comms
Convert_Temp:
IF R_Temp.15 THEN
R_Temp = ~R_Temp + 1
Sign = 1 'Signe -
ELSE
Sign = 0 'Sign = "+"
ENDIF
TempC = ( R_Temp & $7FF ) >> 4 ' Partie Entière
Float = ((R_Temp.Lowbyte & $0F ) * 25 )>> 2 ' Partie décimale 100èmes
Tempeff = TempC*10 + Float/10 'Préparation 1/10 degrés
gosub Aff
GOTO Start_Convert
Up_Loop:
If Temp_Up = 0 Then
Setpoint = Setpoint + 5
lcdout $fe, $C0, "Setpoint = ", DEC2 (Setpoint/10),".",DEC1(SetPoint // 10)," "
Gosub Show
Pause 500
Else
Goto Start_Convert
Endif
Goto Up_Loop
Down_Loop:
If Temp_Down = 0 Then
Setpoint = Setpoint - 5
lcdout $fe, $C0, "Setpoint = ", DEC2 (Setpoint/10),".",DEC1(SetPoint // 10)," "
Pause 500
Gosub Show
Else
Goto Start_Convert
Endif
Goto Down_Loop
'*****************************************************************************
'*****************************************************************************
' AFFICHAGE
'*****************************************************************************
'*****************************************************************************
'Motifs
'Small bar LCDOUT $FE,$40,$00,$00,$00,$00,$00,$04,$04,$04 ' Cust Char #0
'Mid bar LCDOUT $FE,$48,$00,$00,$00,$04,$04,$04,$04,$04 ' Cust Char #1
'Big bar LCDOUT $FE,$50,$04,$04,$04,$04,$04,$04,$04,$04 ' Cust Char #2
'Arrow LCDOUT $FE,$58,$04,$04,$0E,$0E,$0E,$1F,$1B,$11 ' Cust Char #3
'Inv Arrow LCDOUT $FE,$60,$11,$1B,$1F,$0E,$0E,$0E,$04,$04 ' Cust Char #4
'*****************************************************************************
Aff:'Affichage temp
'*****************************************************************************
'préparation chiffre : sign = 1 = valeur négative
Loscale = ( TempC /5 + Sign ) * 5 + Sign << 7
Decal = 0
Decal = ( TempC // 5 ) << 1
IF Sign THEN
IF Float > 25 AND Float <= 75 then Decal = Decal - 1
IF Float > 75 Then Decal = Decal - 2
ELSE
IF Float > 25 AND Float <= 75 then Decal = Decal + 1
IF Float > 75 Then Decal = Decal + 2
ENDIF
Hiscale = (TempC /5 + ( Sign ^1)) * 5 + Sign << 7
'Impression valeurs 1ère ligne
LCDOUT $FE, $81 ,SDEC2 Loscale,178,"C"," ",SDEC TempC,".",dec2 Float,$FE,$80 + 12,SDEC2 Hiscale,178,"C"
'Impression échelle 2ème ligne
LCDOUT $FE,$C0,$01,$00,$02,$00,$01,$00,$01,$00,$01,$00,$01,$00,$02,$00,$01,$00
'Impression index
IF Tempeff < Setpoint THEN
LCDOUT $FE, $C2 + Decal,$03 'Index Chauffage
ELSE
LCDOUT $FE, $C2 + Decal,$04 ' Index Refroidissement
ENDIF
Show:
IF Tempeff < Setpoint THEN
high R_LED ' Turn on Red LED C0 and turn off Green LED C6
low G_LED
IF Coldstart THEN Relay_hot = 1 : Relay_cold = 0 : Coldstart = 0
ELSE
High G_LED ' Turn on Green LED C6 and turn off Red LED C0
low R_LED
IF Coldstart THEN Relay_hot = 0 : Relay_cold = 1 : coldstart = 0
ENDIF
'*****************************************************************************
Drive:
'*****************************************************************************
IF Tempeff < (Setpoint - 5) AND Relay_hot = 0 THEN Relay_hot = 1 : Relay_cold = 0 'C7
IF Tempeff > (Setpoint + 5) AND Relay_cold = 0 THEN Relay_hot = 0 : Relay_cold = 1 'C1
RETURN
END
Some little improvements to work further on for the drive section ...
Bookmarks