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.
HTH,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



) 

Bookmarks