It was easier than I thought, just more of the same stuff. 
<table><tr><td>IdleState CON 0
</td><td>IdleState CON 1
</td></tr></table>
Code:
'****************************************************************
'* Name : FREQx2.bas *
'* Author : Darrel Taylor *
'* Date : 3/1/2007 *
'* Version : 2.0 *
'* Notes : Doubles the frequency of input pulses, *
'* : and maintains the same DutyCycle as the Input. *
'* : Range = .1hz to 500 hz (0-40% DutyCyle) *
'* : Target = PIC12F629/675 *
'****************************************************************
@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _CP_OFF
DEFINE NO_CLRWDT 1
Clear
SpeedPin VAR GPIO.2 ; Input from speed sensor
SpeedX2Pin VAR GPIO.4 ; Output to Speedometer
IdleState CON 0 ; State of input when sensor
; is not on a "Slot"
NotIdle CON IdleState ^ 1
LastState VAR BIT ; Last state the Input changed to
LoopCount VAR byte ; Counts the loops of each pulse
LoopCount1 VAR byte
LoopCount2 VAR byte
PulseWidth VAR byte BANK0 ; Counts the loops of output pulse
PulseWidth1 VAR byte BANK0
PulseWidth2 VAR byte BANK0
LastPulseWidth VAR byte ; saved width of last pulse
LastPulseWidth1 VAR byte ; so it can duplicate it
LastPulseWidth2 VAR byte
CycleWidth VAR byte BANK0 ; Counts the loops of output cycle
CycleWidth1 VAR byte BANK0
CycleWidth2 VAR byte BANK0
OutPulseCount VAR BIT
CMCON = 7
'ANSEL = 0 ; for 12F675
SpeedX2Pin = IdleState
OUTPUT SpeedX2Pin
Main:
LoopCount = LoopCount + 1 ; 24-bit counter
If LoopCount = 0 Then
LoopCount1 = LoopCount1 + 1
if LoopCount1 = 0 then
LoopCount2 = LoopCount2 + 1
endif
endif
IF SpeedPin <> LastState then ; If Input State Changed?
LastState = SpeedPin
if LastState = NotIdle then ; Start of Input Pulse
CycleWidth = LoopCount
CycleWidth1 = LoopCount1
CycleWidth2 = LoopCount2
ASM
bcf STATUS,C ; CycleWidth = LoopCount / 2
rrf _CycleWidth2, F ; Output Cycle is half of Input
rrf _CycleWidth1, F
rrf _CycleWidth, F
ENDASM
LoopCount = 0 ; reset LoopCount
LoopCount1 = 0
LoopCount2 = 0
else ; End of Input Pulse
PulseWidth = LoopCount
PulseWidth1 = LoopCount1
PulseWidth2 = LoopCount2
ASM
bcf STATUS,C ; PulseWidth = PulseWidth / 2
rrf _PulseWidth2, F ; Output Pulse is half of Input
rrf _PulseWidth1, F
rrf _PulseWidth, F
ENDASM
LastPulseWidth = PulseWidth
LastPulseWidth1 = PulseWidth1
LastPulseWidth2 = PulseWidth2
SpeedX2Pin = NotIdle ; start First Output Pulse
OutPulseCount = 0
endif
else
if SpeedX2Pin = NotIdle then
if PulseWidth = 0 then ; countdown output time (24bit)
if PulseWidth1 = 0 then
if PulseWidth2 = 0 then
SpeedX2Pin = IdleState ; end of pulse,
else ; wait for next transition
PulseWidth2 = PulseWidth2 - 1
PulseWidth1 = 255
PulseWidth = 255
endif
else
PulseWidth1 = PulseWidth1 - 1
PulseWidth = 255
endif
else
PulseWidth = PulseWidth - 1
endif
else
@ NOP ; Keep the loop symmetrical
@ NOP
@ NOP
@ NOP
@ NOP
endif
if OutPulseCount = 0 then
if CycleWidth = 0 then ; countdown to Midpoint of cycle
if CycleWidth1 = 0 then
if CycleWidth2 = 0 then
SpeedX2Pin = NotIdle ; Start second pulse
OutPulseCount = 1
PulseWidth = LastPulseWidth
PulseWidth1 = LastPulseWidth1
PulseWidth2 = LastPulseWidth2
else
CycleWidth2 = CycleWidth2 - 1
CycleWidth1 = 255
CycleWidth = 255
endif
else
CycleWidth1 = CycleWidth1 - 1
CycleWidth = 255
endif
else
CycleWidth = CycleWidth - 1
endif
else
@ NOP ; Keep the loop symmetrical
@ NOP
@ NOP
@ NOP
endif
endif
goto Main
end
HTH,
Bookmarks