Here is what I have now. I have set it up for every rising pulse and changed the math because when I incorporate this into my other code, waiting for four pulses delays alot of events.
Its still off with the output RPM numbers by the same percentage.
Code:
DEFINE OSC 20
Prefix con $FE ' needed before each command
LcdCls CON $51 ' clear LCD (use PAUSE 5 after)
CursorPS con $45 'Cursor Position
Capture VAR PIR1.2 ' CCP1 capture flag CCP1IF
Overflow VAR PIR1.0 ' Timer1 overflow flag TMR1IF:
RPM var word
period var Word
TotalTime var word 'Holds seconds and tics
LCD VAR PortC.6 'LCD output
Gate1 Var PortC.1
Gate2 var PortD.1
Gate3 var PortD.2
Gate4 var PortD.3
Gate5 var PortD.6
Gate6 var PortD.7
Gate7 var PortD.5
Gate8 var PortD.4
WOT var PortB.0
ADCON0 =0 'A/D Off
ADCON1.3=1 'All AN channels digital
ADCON1.2=1 '''
ADCON1.1=1 '''
ADCON1.0=1 '''
TRISE.0=1 'EO input
TRISE.1=1 'E1 input
CCP1CON = %00000101 ; Capture mode, every rising edge 0101
T1CON.7=1 'enable timer 16 bit `
T1CON.6=1 'Timer1 OSC
T1CON.5=1 '1:4 prescaler
T1CON.4=0 '1:4 prescaler
T1CON.3=0 'Timer1 OSC off
T1CON.2=0 'sychro clock
T1CON.1=0 'internal clock
T1CON.0=0 'stop timer
pause 10
SEROUT2 LCD,84, [Prefix, LcdCls]
Include "modedefs.bas" ' Mode definitions for Serout
SEROUT2 LCD,84, [Prefix,CursorPS,0,"RPM test"]
pause 500
TMR1H = 0 'Clear 8-bit register
TMR1L = 0 'Clear 8-bit register
capture = 0 'Clear Timer
Calc_RPM_Timer:
TMR1H = 0 'Clear 8-bit register
TMR1L = 0 'Clear 8-bit register
capture = 0 'Clear Timer
StartRPM:
If Capture = 0 then
Goto StartRPM
endif
T1CON.0=1
Capture = 0
CaptureLoop:
If Capture = 0 then
Goto CaptureLoop
endif
T1Con.0=0
period.LowByte=CCPR1L
period.HighByte=CCPR1H
TMR1H = 0
TMR1L = 0
Capture = 0
Overflow = 0
RPM = 10000
RPM = RPM * RPM ' 100,000,000
RPM = DIV32 period ' 100,000,000 / RevCount
RPM = RPM * 60 ' Per minute
RPM = DIV32 1600
RPM = (RPM*5)
SEROUT2 LCD,84, [Prefix,CursorPS,20,"RPM ",dec5 RPM]
goto Calc_RPM_Timer
return
Bookmarks