Thanks for the help on getting the RPM working right.
Next question, when I want to incorporate this into other code how do I keep it from taking up as much time as just measuring the pulse width with Pulsin? I can't have it in the little CaptureLoop routine waiting for the next rpm pulse.
Looking through the spec sheet on the 4620, I see CCP1IE (PIE1.2). If I enable that bit, will I get an interrupt on each cylinder fire? I know there is a way to start and stop timer1 based on the cylinder firing and not just looping for the cylinder firing.
Here is what I am working on assuming that is the right path to take. I haven't worked with interrupts much so I am sure I need more work.
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
Counter var word
Detect var bit
LCD VAR PortC.6 'LCD output
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 = %00000110 ; Capture mode, every rising edge 0101 , Fourth 0110
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
PIE1.2=1 'Enables the CCP1 interrupt
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
Detect = 0
ON Interrupt goto Measure_Time
Loop:
Counter = Counter + 1
SEROUT2 LCD,84, [Prefix,CursorPS,0,dec5 Counter]
SEROUT2 LCD,84, [Prefix,CursorPS,20,"RPM ",dec5 RPM, " ", #Detect]
goto loop
Disable
Measure_Time:
SEROUT2 LCD,84, [Prefix,CursorPS,40,"Int ",dec5 RPM]
If Detect = 0 then
T1CON.0=1
detect = 1
capture = 0
endif
If Detect = 1 then
T1CON.0=0
detect = 0
period.LowByte=CCPR1L
period.HighByte=CCPR1H
capture = 0
TMR1H = 0
TMR1L = 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)
endif
Enable
return
[HTML][/HTML]
Bookmarks