Here are the numbers from an 877A and 4620 both configured to use HS 20 MHZ.
I will say I am not too sure with the T1Con flags if its set exactly as the 877A
Code:RPM 877A 4620 5000 Low Byte 202 243 High Byte 175 58 6000 Low Byte 125 31 High Byte 146 497 7000 Low Byte 141 26 High Byte 167 421 8000 Low Byte 125 215 High Byte 146 36Code:'877A 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 Overflow VAR PIR1.0 ' Timer1 overflow flag 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 ADCON1.3=1 ADCON1.2=1 ADCON1.1=1 ADCON1.0=1 TRISE.0=1 TRISE.1=1 CCP1CON = %00000110 ' Enable the CCP1 capture, every 4th rising edge pause 100 SEROUT2 LCD,84, [Prefix, LcdCls] low Gate1 Low Gate2 Low Gate3 Low Gate4 Low Gate5 Low Gate6 Low Gate7 Low Gate8 Include "modedefs.bas" ' Mode definitions for Serout T1CON=%00100000 Loop: TMR1H = 0 TMR1L = 0 capture = 0 Start: IF capture = 0 Then goto Start ' Wait here for the first capture endif T1CON.0 = 1 ' Start the Timer capture = 0 ' Reset the capture flag CaptureLoop: IF capture = 0 Then goto CaptureLoop ' Wait here until captured endif period.lowbyte = CCPR1L ' Store the captured value in period.highbyte = CCPR1H ' period variable RPM = 10000 RPM = RPM * RPM ' 100,000,000 RPM = DIV32 period ' 100,000,000 / RevCount RPM = RPM * 60 ' Per minute RPM = DIV32 400 '400 RPM = (RPM*5) pause 10 SEROUT2 LCD,84, [Prefix,CursorPS,20,"RPM ",dec5 RPM, " ", DEC CCPR1L, " ", dec CCPR1H] T1CON.0=0 gosub cleartimer1 GoTo loop ' Do it forever ClearTimer1: IF (capture = 0) Then goto cleartimer1 ' Wait for beginning of next period endif TMR1L = 0 ' Clear Timer1 low register TMR1H = 0 ' Clear Timer1 high register capture = 0 ' Clear capture flag overflow = 0 ' Clear overflow flagReturn returnCode:'4620 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 = %00000110 ; Capture mode, every 4th rising edge 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 pause 10 SEROUT2 LCD,84, [Prefix, LcdCls] Include "modedefs.bas" ' Mode definitions for Serout SEROUT2 LCD,84, [Prefix,CursorPS,0,"RPM test"] pause 500 Loop: TMR1H = 0 'Clear 8-bit register TMR1L = 0 'Clear 8-bit register capture = 0 'Clear Timer Start: If Capture = 0 then Goto Start endif T1CON.0=1 Capture = 0 CaptureLoop: If Capture = 0 then Goto CaptureLoop endif T1Con.0=0 period.LowByte=CCPR1L period.HighByte=CCPR1H RPM = 10000 RPM = RPM * RPM ' 100,000,000 RPM = DIV32 period ' 100,000,000 / RevCount RPM = RPM * 60 ' Per minute RPM = DIV32 400 RPM = (RPM*5) SEROUT2 LCD,84, [Prefix,CursorPS,20,"RPM ",dec5 RPM, " ", DEC CCPR1L, " ", dec CCPR1H] Gosub ClearTimer1 Goto Loop ClearTimer1: If Capture = 0 then goto ClearTimer1 endif TMR1H = 00 TMR1L = 0 Capture = 0 Overflow = 0 return




Bookmarks