-
ccp1 with 24 hr timer
Hello ,All
Can someone please help me to insert code for 24 hour timer in the following water level code using ccp1 to measure water consumption in 24 hours. I found Darrel Instant routine is very simple to use I used it before (Thanks to Darrel Talor) but I am not able to make it work with this code (pic16f628A):
Code:
define OSC 16
PAUSE 10000 'To allow use of in circuit programming
DEFINE LCD_DREG PORTB ' Set LCD Data port
DEFINE LCD_DBIT 4 ' Set starting Data bit (0 or 4) if 4-bit bus
DEFINE LCD_RSREG PORTB ' Set LCD Register Select port
DEFINE LCD_RSBIT 0 ' Set LCD Register Select bit
DEFINE LCD_EREG PORTB ' Set LCD Enable port
DEFINE LCD_EBIT 1 ' Set LCD Enable bit
DEFINE LCD_BITS 4 ' Set LCD bus size (4 or 8 bits)
DEFINE LCD_LINES 2 ' Set number of lines on LCD
DEFINE LCD_COMMANDUS 2000 ' Set command delay time in us
DEFINE LCD_DATAUS 50 ' Set data delay time in us
Pause 1000 ' WAIT FOR LCD TO COME UP
'OPTION_REG.7=0
' Software Defines
' ----------------
capture VAR PIR1.2
' CCP1 capture flag
overflow VAR PIR1.0
' Timer1 overflow flag
CalPeriod var word 'Caliberated Period.
temp var word 'pereiod storage
period VAR WORD
' Period value
TempA var word
TempB var Word
Zreading var word
cal var PORTB.2
barnum var byte
h var byte
level var word
barsiz var byte
CalValue var word
I VAR BYTE
hight var word
DIMswitch var PORTA.1 ' SET DIMENTION SWITCH
LENGTH VAR WORD
WIDTH VAR WORD
T VAR WORD
REMD VAR WORD
LVL VAR WORD
S VAR WORD
F VAR WORD
UPDATE VAR BIT
wl var word
wlrmndr var word
BarNum=2 'to prevent divide by 0
'SET DEFAULT DIMENTION
'FIRST, ON START UP DISPLAY HIGHT
READ 2,HIGHT.BYTE0
READ 3,HIGHT.BYTE1 'READ HIGHT FROM EEPROM AND DISPLAY IT.
READ 4,LENGTH.BYTE0
READ 5,LENGTH.BYTE1
READ 6,WIDTH.BYTE0
READ 7,WIDTH.BYTE1
Lcdout $fe,1,"HI,"," ","LEN,"," ","WID"
Lcdout $fe,$C0,#hight,",",#LENGTH,",",#WIDTH," ","cm"
PAUSE 6000 'WAIT 5S TO SEE DIMENTION DISPLAY.
' Initialise Hardware
' -------------------
UPDATE=0
'CALL ENTER HIGHT SUBROUTINE
GOSUB ENTERHIGHT
gosub ENTERLENGTH
GOSUB ENTERWIDTH
TRISA.0=1
TRISA.2=1
TRISA.3=0 'porta as input A0,A2,A4 input A3, output
TRISB.2=1 'reset swich input
TRISB.3=1
' prescale 1:1 AND Timer OFF
T1CON=%00000000
' Capture is OFF
CCP1CON=0
' Main Program Loop
' -----------------
Loop:
CMCON = %110 ' Set comparators mode
select case cal
CASE 0
'place error in CalValue nonvolitile memory (EEprom) storage
Calvalue=LVL
Write 0,calvalue.byte0
write 1,calvalue.byte1
LCDOut $FE,1,"Caliberations"
LCDOUT $FE,$C0,"ERROR= ",#LVL
Pause 2000
goto loop
end select
'INITALIZATION
' --------------
CMCON = %110 ' Set comparators mode
TMR1L=0 ' Reset Timer
TMR1H=0 ' Remember Timer is OFF
overflow=0
capture=0 ' Reset Capture Flag
CCP1CON = %00000111 ' Capture mode, capture on every 16 rising edge
While Capture=0
CMCON = %110 ' Set comparators mode
Wend
' Junk 1st Result
T1CON.0=1 ' Enable Timer
TMR1L=0 ' Reset Timer low byte
TMR1H=0 ' Reset Timer high byte
capture=0 ' Reset Capture Flag
' Wait for 2nd Result
While Capture=0
CMCON = %110 ' Set comparators mode
Wend
' Store the captured value in period variable
LEVEL.lowbyte = CCPR1L
LEVEL.highbyte = CCPR1H
LVL=LEVEL 'NON CALIBERATED LEVEL (ERROR).
T1CON.0=0 ' Timer is OFF
CCP1CON=0 ' Capture is OFF
' Display Section
' ---------------
If overflow=0 then 'converted to uS(Period/2 * 25/100 1tick=.25uS
If LEVEL<32768 then
'read stored caliberation value (ERROR) from EEprom
read 0,calvalue.byte0
read 1,calvalue.byte1
select case CalValue 'Zreading
case is > LEVEL
LEVEL=Calvalue
end select
READ 2,HIGHT.BYTE0
READ 3,HIGHT.BYTE1 'READ HIGHT FROM EEPROM AND DISPLAY IT.
READ 4,LENGTH.BYTE0 'READ LENGTH AND WIDTH TO DISPLAY VOLUME
READ 5,LENGTH.BYTE1
READ 6,WIDTH.BYTE0
READ 7,WIDTH.BYTE1
LEVEL=LEVEL-Calvalue
if level>0 then 'prevent divide by 0
level=(level*92)/100 'level=(level*43)/10 'WATER LEVEL In cm
Wl=level/100 'water level in meter
wlrmndr=level//100 ' remainder
S=LEVEL*LENGTH*WIDTH 'WATER VOLUME
F=DIV32 10000
T=F/100 'WATER VOLUME IN TONS
REMD=F//100 'remainder in decimal fraction
barsiz=HIGHT/16
barnum=level/barsiz
endif
'DISPLAY WATER LEVE IN CM WITH BAR GRAPH.
LCDOut $FE,1,#Wl,".",dec2 wlrmndr," ","M"," ",#T,".",dec2 REMD," ","T" '"LEVEL =",#level," ","cm"
LCDOUT $fe,$C0,rep%11111111\barnum
pause 500
goto DisplayErrorSkip
Endif
endif
'OUT OF RANGE
LCDOut $FE,1,"Out of Range"
PAUSE 1000
Overflow=0 ' Reset error flag
DisplayErrorSkip:
Pause 500 ' Allow Time for user to view
Goto Loop
'SUBROUTINE TO ENTER HIGHT IN CM
ENTERHIGHT:
CMCON=7 'COMPARATORS OFF TO ENABLE PORTA I/O.
TRISA.1=1 'PORTA.1 INPUT
'Pause 500 ' Wait for LCD to startup
'ENTER HIGHT NOW BY BUTTON PRESS
Lcdout $fe,1,"New Hight CM"
PAUSE 3000
HIGHT=0 'CLEAR HIGHT
InsertHight:
select case DIMswitch
case 0
if update=0 then
hight = hight+10
IF HIGHT>900 THEN
HIGHT=0
ENDIF
debounceH:
For i = 1 To 25
Pause 10 ' 10ms at a time so no interrupts are lost
Next i
UPDATE=1
GOTO DISPLAYH
DISPLAYH:
if UPDATE=1 THEN
Lcdout $fe,1," Hight "
Lcdout $fe,$C0," ",#hight," ","cm"
'WRITE HIGHT TO EEPROM
Write 2,HIGHT.BYTE0
WRITE 3,HIGHT.BYTE1
ENDIF
pause 500
UPDATE=0
Goto inserthight
endif
END SELECT
rETURN
'SUBROUTINE TO ENTER length IN CM
ENTERLENGTH:
CMCON=7 'COMPARATORS OFF TO ENABLE PORTA I/O.
TRISA.1=1 'PORTA.1 INPUT
'Pause 500 ' Wait for LCD to startup
'ENTER LENGTH NOW BY BUTTON PRESS
Lcdout $fe,1,"New Length cm"
PAUSE 3000
LENGTH=0 'CLEAR HIGHT
InsertLENGTH:
select case DIMswitch
case 0
if update=0 then
LENGTH = LENGTH+10
IF LENGTH>900 THEN
LENGTH=0
ENDIF
debounceL:
For i = 1 To 25
Pause 10 ' 10ms at a time so no interrupts are lost
Next i
UPDATE=1
GOTO DISPLAYL
DISPLAYL:
if UPDATE=1 THEN
Lcdout $fe,1," Length "
Lcdout $fe,$C0," ",#LENGTH," ","cm"
'WRITE LENGTH TO EEPROM
Write 4,LENGTH.BYTE0
WRITE 5,LENGTH.BYTE1
ENDIF
pause 500
UPDATE=0
Goto insertLENGTH
endif
END SELECT
rETURN
'SUBROUTINE TO ENTER WIDTH IN CM
ENTERWIDTH:
CMCON=7 'COMPARATORS OFF TO ENABLE PORTA I/O.
TRISA.1=1 'PORTA.1 INPUT
'ENTER WIDTH NOW BY BUTTON PRESS
Lcdout $fe,1,"New Width cm"
PAUSE 3000
WIDTH=0 'CLEAR HIGHT
InsertWIDTH:
select case DIMswitch
case 0
if update=0 then
WIDTH= WIDTH+10
IF WIDTH>900 THEN
WIDTH=0
ENDIF
debounceW:
For i = 1 To 25
Pause 10 ' 10ms at a time so no interrupts are lost
Next i
UPDATE=1
GOTO DISPLAYW
DISPLAYW:
if UPDATE=1 THEN
Lcdout $fe,1," Width "
Lcdout $fe,$C0," ",#WIDTH," ","cm"
'WRITE HIGHT TO EEPROM
Write 6,WIDTH.BYTE0
WRITE 7,WIDTH.BYTE1
ENDIF
pause 400
UPDATE=0
Goto insertWIDTH
endif
END SELECT
RETURN
End
Obaid