Code:
Main:
IF T1CON.0 <> 0 And I = 0 THEN
LCDOUT $FE,1
LCDOUT $FE,$C0," MEASURING"
I = 1
GOTO LCDEND
ENDIF
IF T1CON.0 <> 0 THEN LCDEND
IF T1CON.0 = 0 AND J = 0 THEN
'********** CONVERT COUNTS, OVERFLOWS to SECONDS **********
@ MOVE?LP _OVRFLO, _OVFLS64
@ MATH_MUL _OVFLS64, _BITS1664, _OVFLS64M
COUNTS32 = (COUNTS-10)*2 ' 10 TICS START CORRECTION, 200 nS PER COUNT
@ MOVE?LP _COUNTS32, _COUNTS64
@ MATH_ADD _OVFLS64M, _COUNTS64, _TSEC64
' ********** CONVERT SECONDS TO MINUTES **********
@ MATH_DIV _TSEC64, _CONVSEC64, _TMIN64
@ MOVE?PL _TMIN64, _TMIN
' ********** GET INTEGER SECONDS **********
CC32 = 10000000
@ MOVE?LP _CC32, _CC64
@ MATH_MUL _TMIN64, _CONVSEC64, _AA64
@ MATH_SUB _TSEC64, _AA64, _BB64
@ MATH_DIV _BB64, _CC64, _TSECINT64
@ MOVE?PL _TSECINT64, _TSECINT
' ********** GET DECIMAL SECONDS **********
@ MATH_MUL _TSECINT64, _CC64, _AA64
@ MATH_SUB _BB64, _AA64, _TSECDEC64
@ MOVE?PL _TSECDEC64, _TSECDEC
' ********** CALCULATE SPEED (FPS) **********
@ MATH_DIV _DISTFT64M, _TSEC64, _FPS64
' ********** GET INTEGER FPS **********
CC32 = 1000000
@ MOVE?LP _CC32, _CC64
@ MATH_DIV _FPS64, _CC64, _FPSINT64
@ MOVE?PL _FPSINT64, _FPSINT
' ********** GET DECIMAL FPS **********
@ MATH_MUL _FPSINT64, _CC64, _BB64
@ MATH_SUB _FPS64, _BB64, _FPSDEC64
@ MOVE?PL _FPSDEC64, _FPSDEC
' ********** CONVERT FPS to MPH **********
AA32 = 15
@ MOVE?LP _AA32, _AA64
BB32 = 22
@ MOVE?LP _BB32, _BB64
@ MATH_MUL _AA64, _FPS64, _CC64
@ MATH_DIV _CC64, _BB64, _MPH64
' ********** GET INTEGER MPH **********
AA32 = 1000000
@ MOVE?LP _AA32, _AA64
@ MATH_DIV _MPH64, _AA64, _MPHINT64
@ MOVE?PL _MPHINT64, _MPHINT
' ********** GET DECIMAL MPH **********
@ MATH_MUL _MPHINT64, _AA64, _BB64
@ MATH_SUB _MPH64, _BB64, _MPHDEC64
@ MOVE?PL _MPHDEC64, _MPHDEC
' ********** DISPLAY RESULTS **********
LCDOUT $FE,1
LCDOUT $FE,$80," ",DEC2 TMIN,":",DEC2 TSECINT,".",DEC7 TSECDEC
LCDOUT $FE,$90, DEC4 FPSINT,".",DEC6 FPSDEC," FPS"
LCDOUT $FE,$D0, DEC4 MPHINT,".",DEC6 MPHDEC," MPH"
DEBUG "OVRFLO: ",DEC10 OVRFLO,13,10
DEBUG "COUNTS: ",DEC10 COUNTS,13,10,13,10
DEBUG "TIME: ",DEC2 TMIN,":", DEC2 TSECINT,".",DEC7 TSECDEC,13,10
DEBUG "SPEED: ",DEC4 FPSINT,".",DEC6 FPSDEC," FPS",13,10
DEBUG "SPEED: ",DEC4 MPHINT,".",DEC6 MPHDEC," MPH",13,10,13,10
J = 1
ENDIF
GOTO LCDEND
LCDEND:
PAUSE 25
@ INT_ENABLE CCP1_INT ; Start new capture
GOTO Main
'---[CCP1 - interrupt handler]------------------------------------------
Capture:
IF CCP1CON = %00000101 THEN ' If rising edge capture then
HIGH LED ' Turn on LED to Indicate Measuring
TMR1L = PRESET ' Clear Timer1 counts with Preset (High)
TMR1H = 0 ' Clear Timer1 counts (LOW)
T1CON.0 = 1 ' Turn Timer1 on at rising edge capture
OVRFLO = 0 ' Zero Over flow counts
COUNTS = 0 ' Zero remainder
CCP1CON = %00000100 ' Switch to falling edge capture
PIR1.0 = 0 ' Clear Timer1 overflow flag before enable
I = 0 : J = 0
@ INT_ENABLE TMR1_INT ; Enable Timer 1 Interrupts
GOTO OVER_CCP ' Done, exit
ENDIF
IF CCP1CON = %00000100 THEN ' If falling edge capture then
T1CON.0 = 0 ' Stop Timer1
CCP1CON = %00000101 ' Switch back to rising edge capture
@ INT_DISABLE TMR1_INT ; Disable Timer 1 Interrupts
@ INT_DISABLE CCP1_INT ; Disable CCP1 Interrupts
COUNTS.LowByte = TMR1L ' Get remaining Timer1 counts on falling edge (Low Byte)
COUNTS.HighByte = TMR1H ' Get remaining Timer1 counts on falling edge (High Byte)
LOW LED ' Turn off LED
ENDIF
OVER_CCP:
@ INT_RETURN
'---[TMR1 - interrupt handler]---------------------------------------------
Timer1:
OVRFLO = OVRFLO + 1
@ INT_RETURN
END
It wouldn't all fit in a single post
Bookmarks