Code:
'*******************************************************************************
'* Name : Two Ds1820 18F452.bas *
'* Author : Jessey Montgomery *
'* Includes : STRINGS.PBP By Darrel Taylor *
'* Notice : Copyright (c) 2004 *
'* : All Rights Reserved *
'* Date : 22/10/2005 *
'* Version : Using PicBasic Pro Ver 2.50, MPASM Ver 5.20, Using MicroCode *
'* : Studio 3.0.0.5, PICkit 2 programmer - Application Version *
'* : 2.50.02 - Device File Version 1.5100 - OS Firmware Version *
'* : 2.30.01. Using a PIC18f452-20/P *
'*******************************************************************************
' --------------
' | 18F452 |
' MCLR/Vpp ------> |1 40| <-----> RB7/PGD
' RA0/AN0 <-----> |2 39| <-----> RB6/PGC
' RA1/AN1 <-----> |3 38| <-----> RB5/PGM
' RA2/AN2/Vref- <-----> |4 37| <-----> RB4
' RA3/AN3/Vref+ <-----> |5 36| <-----> RB3/CCP2*
' RA4/TOCK1 <-----> |6 35| <-----> RB2/INT2
' RA5/AN5/SS/LVDIN <-----> |7 34| <-----> RB1/INT1
' RE0/RD/AN5 <-----> |8 33| <-----> RB0/INT0
' RE1/WR/AN6 <-----> |9 32| <----- Vdd
' RE2/CS/AN7 <-----> |10 31| <----- Vss
' Vdd -----> |11 30| <-----> RD7/PSP7
' VSS -----> |12 29| <-----> RD6/PSP6
' OSC1/CLK1 -----> |13 28| <-----> RD5/PSP5
' OSC2/CLKO/RA6 <------ |14 27| <-----> RD4/PSP4
' RC0/T1OSO/TICK1 <-----> |15 26| <-----> RC7/RX/DT
' RC1/T1OSI/CCP2* <-----> |16 25| <-----> RC6/TX/CK
' RC2/CPP1 <-----> |17 24| <-----> RC5/SDO
' RC3/SCK/SCL <-----> |18 23| <-----> RC4/SD1/SDA
' RD0/PSP0 <-----> |19 22| <-----> RD3/PSP3
' RD1/PSP1 <-----> |20 21| <-----> RD2/PSP2
' --------------
'------------------------------------------------------------------------------'
'-- Clear All The Variables And Each Port Before Setting The TRIS Registers ---'
'------------------------------------------------------------------------------'
Clear 'Set all ram registers to zero
PORTA = 0
PORTB = 0
PORTC = 0
PORTD = 0
PORTE = 0
'--------------------------- VSS VDD MCLR Ect. Pins ---------------------------'
'MCLR (Pin 1)
'VDD (Pin 11)
'VSS (Pin 12)
'OSC/CLKIN (Pin 13)
'OSC2/CLKOUT (Pin 14)
'VSS (Pin 31)
'Vdd (Pin 32)
'((OPTION_REG=127 ' ENABLE WEAK PULL UP RESISTORS ON PORTB))
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
'XXXXXXXXXXXXXXXXXXXXXXXXXX Set The TRIS In/Out Pins XXXXXXXXXXXXXXXXXXXXXXXXXX'
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX BELOW XXX'
'-------------------- PORTA PINS --------------------'
TRISA.0 = 1 '(pin 2) ........................Adj_Dn_Button VAR PORTA.0 ' pin 2
TRISA.1 = 1 '(pin 3) ........................Adj_Up_Button VAR PORTA.1 ' pin 3
TRISA.2 = 1 '(pin 4) .......................Adj_Dn_Button2 VAR PORTA.2 ' pin 4
TRISA.3 = 1 '(pin 5) .......................Adj_Up_Button2 VAR PORTA.3 ' pin 5
TRISA.4 = 1 '(pin 6) NOT USED
TRISA.5 = 1 '(pin 7) NOT USED
'-------------------- PORTB PINS --------------------'
TRISB.0 = 1 '(pin 33) ........................................DS1820 Rad_Sensor
TRISB.1 = 1 '(pin 34) NOT USED VAR PORTB.1 'pin 34
TRISB.2 = 1 '(pin 35) NOT USED VAR PORTB.2 'pin 35
TRISB.3 = 0 '(pin 36) ..............................The_Led VAR PORTB.3 'pin 36
TRISB.4 = 1 '(pin 37) NOT USED VAR PORTB.4 'pin 37
TRISB.5 = 1 '(pin 38) NOT USED VAR PORTB.5 'pin 38
TRISB.6 = 1 '(pin 39) NOT USED VAR PORTB.6 'pin 39
TRISB.7 = 1 '(pin 40) NOT USED VAR PORTB.7 'pin 40
'-------------------- PORTC PINS --------------------'
TRISC.0 = 1 '(pin 15) ......................................DS1820 Block_Sensor
TRISC.1 = 1 '(pin 16) ...................Change_Mode_Button VAR PORTC.1 'pin 16
TRISC.2 = 1 '(pin 17) ....................Block_Code_Button VAR PORTC.2 'pin 17
TRISC.3 = 1 '(pin 18) NOT USED VAR PORTC.3 'pin 18
TRISC.4 = 1 '(pin 23) NOT USED VAR PORTC.4 'pin 23
TRISC.5 = 1 '(pin 24) NOT USED VAR PORTC.5 'pin 24
TRISC.6 = 1 '(pin 25) NOT USED VAR PORTC.6 'pin 25
TRISC.7 = 1 '(pin 26) NOT USED VAR PORTC.7 'pin 26
'-------------------- PORTD PINS --------------------'
TRISD.0 = 1 '(pin 19) NOT USED VAR PORTD.0 'pin 19
TRISD.1 = 0 '(pin 20) ................................Buzzer VAR PORTD.1 'pin 15
TRISD.2 = 0 '(pin 21) ...............................The_Fan VAR PORTD.2 'pin 21
TRISD.3 = 1 '(pin 22) NOT USED VAR PORTD.3 'pin 22
TRISD.4 = 0 '(pin 27) ...........................Lcd out for Data bit 4
TRISD.5 = 0 '(pin 28) ...........................Lcd out for Data bit 5
TRISD.6 = 0 '(pin 29) ...........................Lcd out for Data bit 6
TRISD.7 = 0 '(pin 30) ...........................Lcd out for Data bit 7
'-------------------- PORTE PINS --------------------'
TRISE.0 = 0 '(pin 8) ...........................LCD Register/Select
TRISE.1 = 0 '(pin 9) ...........................LCD Enable
TRISE.2 = 1 '(pin 10) NOT USED PORTE.2
;==========================================================================
;@ __CONFIG _CONFIG1H, _OSCS_ON_1H & _XT_OSC_1H ' use this one for 4 mhz and
' also declare the osc as 4mhz
@ __CONFIG _CONFIG1H, _OSCS_OFF_1H & _HSPLL_OSC_1H ; use this one for 16 mhz
@ __CONFIG _CONFIG2L, _BOR_OFF_2L & _BORV_20_2L & _PWRT_ON_2L
@ __CONFIG _CONFIG2H, _WDT_ON_2H & _WDTPS_128_2H
@ __CONFIG _CONFIG3H, _CCP2MX_OFF_3H
@ __CONFIG _CONFIG4L, _STVR_OFF_4L & _LVP_OFF_4L & _DEBUG_OFF_4L
@ __CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L
@ __CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
@ __CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
@ __CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
@ __CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
@ __CONFIG _CONFIG7H, _EBTRB_OFF_7H
DEFINE OSC 16 ' using HSPLL X 4 gives us OSC 16
@ errorlevel -306 ; turn off the Crossing page boundary warnings
Define LCD_DREG PORTD
Define LCD_DBIT 4
Define LCD_RSREG PORTE
Define LCD_RSBIT 0
Define LCD_EREG PORTE
Define LCD_EBIT 1
ADCON1 = 7 ' Set to Digital
'used for temperature'
'--------------------'
count_remain VAR BYTE ' Count remaining
count_per_c VAR BYTE ' Count per degree C
Sensor_Select VAR Byte ' this var allows 2 sensors to be read
Radiator_Sensor con 8 ' Sensor on PortC.0 One-wire data pin (pin 15)
Block_Sensor con 0 ' Sensor on PortB.0 One-wire data pin (pin 33)
temp Var Word ' temporary storage for Block_temp & Radiator_temp
Block_temp Var Word ' Temperature storage
Radiator_temp Var Word ' Temperature storage
INCLUDE "EE_Vars.PBP"
'Declare The EE Variable' 'Load A Default Setting For The EE Variable'
'=======================' '=========================================='
Temp_Mode VAR BYTE : @ EE_var _Temp_Mode, BYTE,1
' Allocate variables '
' ================== '
a var byte ' Enables if..then statements to execute without
a = 0 ' using GOTO's, a always equals 0
b Var Word ' counter to detect a sensor malfunction
I Var Byte ' This variable speeds up button presses by only
I = 0 ' reading one sensor at a time then displaying.
'Pushbuttons Variables '
'===================== '
Block_Code_Button VAR PORTC.2 ' pin 17
'Port pins Variables '
'=================== '
Buzzer VAR PORTD.1 ' pin 20
The_Fan VAR PORTD.2 ' pin 21
Fahrenheit con 1
Celsius CON 0
Is_On CON 1
Is_Off CON 0
Is_Pressed CON 0
Is_Not_Pressed CON 1
LCDOUT 254,64,28,20,28,0,0,0,0,0 ' Cust Char #0, Temp degree sign
Pause 1000' wait for Lcd to initialize
LCDOut $fe, 1, "Taurus Controler"
LCDOut $fe, $c0, "Jessy Montgomery"
PAUSE 2000
If a = 0 Then mainloop' Skip subroutines
Check_Temperature:
OWOut Sensor_Select, 1, [$CC, $44] ' Start the Temp conversion
waitloop:
If count_remain = 0 Then b = b + 1''''''''
If b >= 20000 then '
Loop_5: '
If Sensor_Select = Block_Sensor then '
LCDOut $fe, 1, "Block Sensor Has" '
Else ' If it's Radiator_Sensor ' This detects a sensor malfunction
LCDOut $fe, 1, " Rad Sensor Has " ' in 2.5 seconds.
Endif '
LCDOut $fe, $c0, "!Malfunctioned! " ' Rad sensor will sound the alarm if
PWM Buzzer,255,100 ' the positive or the 4.7K resistor
The_Fan = Is_On ' is dissconnected from the DS1820
Pause 100 '
IF Block_Code_Button = Is_Pressed THEN' Block sensor will only sound the
While Block_Code_Button = Is_Pressed' alarm if the 4.7K resistor is
Wend ' dissconnected?
Pause 150 '
If a = 0 then Return '
Endif '
If a = 0 then Loop_5 '
Endif'''''''''''''''''''''''''''''''''''''
OWIn Sensor_Select, 4, [count_remain]' Check for still busy converting
IF count_remain = 0 THEN waitloop
OWOut Sensor_Select, 1, [$CC, $BE] ' Read the Temp
OWIn Sensor_Select, 0, [temp.LOWBYTE, temp.HIGHBYTE, _
Skip 4, count_remain, count_per_c]
' Calculate temp in degrees Celsius to 2 decimal places
temp = ((ABS(temp) >> 1) * 100)
temp = temp - 25 + (((count_per_c - count_remain) * 100) / count_per_c)
IF Temp_Mode = Celsius then RETURN' If Mode is Fahrenheit then continue
' Convert Celsius to Fahrenheit before returning
temp = (ABS(temp) */ 461)
temp = temp + 3200
RETURN
Select_A_Sensor_To_Read:
If I = 0 then'' This code here speeds up button presses
I = 1 ' by only reading one sensor then displaying
else ' the results instead of reading two sensors
I = 0 ' before displaying the results.
Endif''''''''''
If I = 0 Then''''''''''''''''''''
Sensor_Select = Radiator_Sensor' This is a little convoluted to say the
'SWAP temp, Radiator_temp ' least but it works, how and why I have no
'Radiator_temp = temp ' idea. If I uncomment the commented out code
Block_temp = temp ' lines and use them the way you would think
GOSUB Check_Temperature ' it should work then the program switches
Endif ' sensors around i.e. instead of reading the
' Radiator_Sensor on pin 15 it then reads
If I = 1 Then ' the sensor on 33 even though it's declared
Sensor_Select = Block_Sensor ' on pin 15 and vice versa for the
'SWAP temp, Block_temp ' DS1820 Block_Sensor. So it switches the
'Block_temp = temp ' two sensors, very confusing! It must be in
Radiator_temp = temp ' way I'm swaping Rad & Block_temp into the
GOSUB Check_Temperature ' temp variable but I also tried SWAP with
Endif ' the same results.
Return''''''''''''''''''''''''''''''
mainloop:
Gosub Select_A_Sensor_To_Read
b = 0
If Temp_Mode = Fahrenheit Then
LCDOut $FE, 1, "Radiator = ", DEC Radiator_temp / 100,0,"F"
LCDOut $fe, $c0, " Block = ", DEC Block_temp / 100,0,"F"
Else ' If Temp_Mode = Celsius
LCDOut $FE, 1, "Rad Temp = ", DEC Radiator_temp / 100,0,"C"
LCDOut $fe, $c0, " Block = ", DEC Block_temp / 100,0,"C"
Endif
Pause 100
If a = 0 then mainloop
End
Bookmarks