Hi Malcolm,

Here's one for your friend.
It doubles input pulses from somewhere around .1 hz to 750hz. (output = .2 to 1500hz)
Should be good enough for a speedometer.

I did it on a 12F629 and it's internal oscillator. But, you should be able to run it on just about any 14bit core. (94 words)
If the sensor's dutycycle isn't around 50% (40-60% max), I may need to make a couple changes.

Here's what it looks like on the scope. Top is the input, bottom is the output.



Code:
'****************************************************************
'*  Name    : FREQx2.bas                                        *
'*  Author  : Darrel Taylor                                     *
'*  Date    : 2/27/2007                                         *
'*  Version : 1.0                                               *
'*  Notes   : Doubles the frequency of input pulses             *
'*          : Range = .1hz to 750 hz (40-60% DutyCycle)         *
'*          : Target = PIC12F629                                *
'****************************************************************
@  __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 1                            ; State of input when sensor
                                            ;    is not on a "Slot"
LastState  VAR BIT                          ; Last state the Input changed to
LoopCount  VAR byte                         ; Counts the loops of each pulse
LoopCount1 VAR byte
LoopCount2 VAR byte

X2Count    VAR byte                         ; Counts the loops of output pulse
X2Count1   VAR byte
X2Count2   VAR byte

CMCON = 7
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
        X2Count = LoopCount
        X2Count1 = LoopCount1
        X2Count2 = LoopCount2
        ASM
            bcf   STATUS,C                     ; X2Count = LoopCount / 2
            rrf   _X2Count2, F                 ; Output Pulse is half of Input
            rrf   _X2Count1, F
            rrf   _X2Count, F
        ENDASM
        LoopCount = 0                          ; reset LoopCount
        LoopCount1 = 0
        LoopCount2 = 0
        SpeedX2Pin = !IdleState                ; start Output Pulse
    else
        if SpeedX2Pin != IdleState then
            if X2Count = 0 then                ; countdown output time (24bit)
                if X2Count1 = 0 then
                    if X2Count2 = 0 then
                        SpeedX2Pin = IdleState ; end of pulse, 
                    else                       ; wait for next transition
                        X2Count2 = X2Count2 - 1
                        X2Count1 = 255
                        X2Count  = 255
                    endif
                else
                    X2Count1 = X2Count1 - 1
                    X2Count    = 255
                endif
            else
                X2Count = X2Count - 1
            endif
        else
          @ NOP                                ; Keep the loop symmetrical
          @ NOP
          @ NOP
          @ NOP
        endif
    endif
goto Main
end
HTH,