Well, for whomever will be using it in the end ...
Here's version 3. Hopefully the last one.
I think I covered all the bases.
Added another input. (see schematic above) GPIO.1 that determines if the output is inverted or not. It has a weak Pull-up, so you can just leave it disconnected for use with the NPN transistor.
You come up with some fun projects Malcolm. Trains, Automobiles, All we need are planes, and we're set.Code:'**************************************************************** '* Name : FREQx2.bas * '* Author : Darrel Taylor * '* Date : 3/2/2007 * '* Version : 3.0 * '* Notes : Doubles the frequency of input pulses, * '* : and maintains the same DutyCycle as the Input. * '* : Range = .1hz to 500 hz (0-40% max 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 VAR GPIO.0 ; State of input when sensor ; is not on a "Slot" Invert VAR GPIO.1 ; Inverts output if = 1 OPTION_REG.7 = 0 ; enable weak Pull-ups WPU = 3 ; weak Pull-up on GP0 and GP1 ;_____________________________________________________________________________ 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 = (IdleState ^ 1) 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 = ((IdleState ^ 1) ^ Invert) ; start First Output Pulse OutPulseCount = 0 endif else if SpeedX2Pin = ((IdleState ^ 1) ^ Invert) then if PulseWidth = 0 then ; countdown output time (24bit) if PulseWidth1 = 0 then if PulseWidth2 = 0 then SpeedX2Pin = (IdleState ^ Invert) ; 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 @ NOP endif if OutPulseCount = 0 then if CycleWidth = 0 then ; countdown to Midpoint of cycle if CycleWidth1 = 0 then if CycleWidth2 = 0 then SpeedX2Pin = ((IdleState ^ 1) ^ Invert) ; 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 @ NOP endif endif goto Main end
<br>





Bookmarks