You are on page 1of 4

'* '* '* '* '* '* '* '* '* '* '* '* '* '*

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Universal thermostat -25/+75 C. by R.T.G. van Steenis * Compiler : PicBasic Pro 2.45 * B0 = Mode switch in (In) A0 = LCD Enable (Out) * B1 = + switch in (In) A1 = LCD RS (Out) * B2 = - switch in (In) A2 = "Warm" Output (Out) * B3 = Not connected (Out) A3 = "Cold" Output (Out) * B4 = LCD Bit 4 (Out) A4 = DQ DS1820 (In) * B5 = LCD Bit 5 (Out) * B6 = LCD Bit 6 (Out) * B7 = LCD Bit 7 (Out PIC16F628 Code size = 1124 Words * * Oscillator XP (4 MHz.) - Power up timer enabled - MCR enable * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ' RA0..3=Outputs RA4=Input ' RB0..RB2=Inputs, RB3..RB7=Outputs ' Disable comparators ' ' ' ' ' ' ' ' Word Word Word Word Byte Byte Byte Byte Byte Byte PORTA.4 ' ' ' ' ' ' ' ' ' ' LCD on port B Data bits B4..B7 RS on PORTA RS on A1 E on PORTA E on A0 LCD 4 bit mode 2 line LCD display Temperature storage Desired Temperature Hystereris Var. for display Byte for TargetTemp calculation Byte for TargetTemp calculation Count remaining Count per degree C +/- sign 0=Temp. display, 1=Set Temp, 2=Set Hys

TRISA= %11110000 TRISB= %00000111 CMCON=7 DEFINE DEFINE DEFINE DEFINE DEFINE DEFINE DEFINE DEFINE LCD_DREG PORTB LCD_DBIT 4 LCD_RSREG PORTA LCD_RSBIT 1 LCD_EREG PORTA LCD_EBIT 0 LCD_BITS 4 LCD_LINES 2 Var Var Var Var Var Var Var Var Var Var Var

Temperature TargetTemp Hyst V B1 B2 Count_Remain Count_Per_C Sign Mode teresis DQ

' One-wire data pin ' Temp MSB, TEMP LSB, Hysteresis DIV 10 ' Warm Output Low ' Cold Output Low ' Temperature display mode ' Clear display, cursor off ' Read TargetTemp MSB ' Read TargetTemp LSB ' Calculate TargetTemp value (Default=20 ' Read Hysteresis ' Calculate Hysteresis value (Default= 2

DATA 46, 224, 20 PORTA.2=0 PORTA.3=0 Mode=0 LCDOUT $FE, 1, $FE, $0C Read 0, B1 Read 1, B2 TargetTemp=B1*256+B2 .0 C.) Read 2, B1 Hyst=10*B1 .0 C.) MainLoop: If PORTB.0=0 then Pause 50

' Mode switch pressed ' Debounce

LcdOut $FE, $8F, "*" If PORTB.0=0 then MainLoop Mode=Mode+1 If Mode=2 then 2) Write 0, Write 1, EndIf If Mode > Mode=0 Write 2, EndIf EndIf TargetTemp / 256 TargetTemp MOD 256 2 Then Hyst / 10

' ' ' '

Show that command is accepted Wait until button is released Increment mode Save Target Temperature (Mode1 -> Mode

' TargetTemp MSB ' TargetTemp LSB ' Save Hysteresis (Mode 2 -> Mode 0) ' Only 0, 1, 2 are valid ' Divide Hyst value to fit in Byte

If Mode =1 then LcdOut $FE, $80, "SET TEMPERATURE " V=TargetTemp Gosub SelectSign Gosub DisplayTemp If (PORTB.1=0) Or (PORTB.2=0) then If PORTB.2=0 then If TargetTemp > 7500 then 100) TargetTemp=TargetTemp-25 EndIf EndIf If PORTB.1=0 then If TargetTemp < 17500 then 100) TargetTemp=TargetTemp+25 EndIf EndIf GoSub SetTargetTemp EndIf EndIf If Mode=2 then LcdOut $FE, $80, "HYSTERESIS " Sign=" " V= 10000+Hyst Gosub DisplayTemp If (PORTB.1=0) Or (PORTB.2=0) then Sign=" " If PORTB.2=0 then If Hyst > 10 then Hyst=Hyst-10 EndIf If PORTB.1=0 then If Hyst < 1000 then Hyst=Hyst+10 EndIf V= 10000+Hyst Gosub DisplayTemp Pause 250 EndIf EndIf If Mode > 0 then Mainloop s LcdOut $FE, $80, "TEMPERATURE "

' ' ' ' ' ' ' '

Set Target Temperature Show function TargetTemp in V Select +/blank/Display Target Temperature Up or Down button pushed Down button Not lower than -25 C. (10000-MinTemp *

' Decrease temperuture with 0.25 C. ' Up button ' Not higher than 75 C. (10000+MaxTemp * ' Increase temperature with 0.25 C. ' Display TargetTemp and delay 0.25 Sec.

' ' ' ' ' ' ' ' '

Set Hysteresis Show function No sign Set value for V Display Hysteresis Up or down button pushed No sign for Hysteresis Down button Not less than 0.1 C.

' Up button ' Not more than 10.0 C. ' Set value for V ' Display Hysteresis ' Delay 0.25 Sec.

' Setting TargetTemperature or Hysteresi ' Show function

Output DQ DQ=0 PauseUs 480 Input DQ PauseUs 70 If DQ=1 then LcdOut $FE, $1, "** No sensor! **" Pause 500 Goto MainLoop EndIf

' ' ' ' ' ' ' ' '

Make Pin Output OneWire line Low Keep down for 480 S Make Pin Input Wait 70 S No presence pulse from DS1820 Show message Wait 0.5 Sec. Check again

OWOut DQ, 1, [$CC, $44] ' Start temperature conversion WaitLoop: OWIn DQ, 4, [Count_Remain] ' Check for still busy converting If Count_Remain = 0 Then WaitLoop ' Busy OWOut DQ, 1, [$CC, $BE] ' Read the temperature OWIn DQ, 0, [Temperature.LowByte, Temperature.HighByte, Skip 4, Count_Remain, C ount_Per_C] Temperature = (((Temperature >> 1) * 100) - 25) + (((Count_Per_C - Count_Remain ) * 100) / Count_Per_C) if Temperature > 32767 then Temperature= ~Temperature V= 10000 - Temperature ' 25 C=12500 0 C=10000 -10 C=9000 else V= 10000 + Temperature EndIf If V < TargetTemp - Hyst then PORTA.2=1 PORTA.3=0 EndIf If V > TargetTemp + Hyst then PORTA.2=0 PORTA.3=1 EndIf GoSub SelectSign GoSub DisplayTemp Goto MainLoop ' Below Target temperature - Hysteresis ' Activate Warm Output ' Deactivate Cold Output ' Above Target temperature + Hysteresis ' Deactivate Warm output ' Activate Cold Output ' +/blank/- Sign ' Temperature to LCD ' Do it forever

' SUBROUTINES: '---------------------------------------SelectSign: If v = 10000 then ' Sign=" " ' Else If v < 10000 then ' Sign="-" ' Else Sign="+" ' EndIf EndIf Return

Temperature = 0 C. No sign <> 0 Temperature below 0 C. Temperature above 0 C.

'---------------------------------------DisplayTemp: If V >= 10000 then ' Above 0 C. Temperature=V-10000 Else

Temperature=10000-V ' Below 0 C. EndIf LcdOut $FE, $C0, Sign, DEC (Temperature / 100), ".", DEC2 Temperature, " ",223, "C " Return '----------------------------------------SetTargetTemp: V=TargetTemp Gosub SelectSign Gosub DisplayTemp Pause 250 Return '-----------------------------------------

You might also like