Hi Dag,
Here's something that might get you started. It's based on 1m distance and 4MHz oscillator for the PIC. It compiles for 16F877 but it's not tested.
It gives you 0.1km/h resolution but due to rounding errors the accuraqcy will be +/-0.1km/h. It's likely possible to improve that though but lets start with this and see if works at all.
See if it makes any sense:/Henrik.Code:'**************************************************************** '* Name : Speedometer.pbp * '* Author : Henrik Olsson * '* Notice : Copyright (c) 2013 * '* : All Rights Reserved * '* Date : 2013-08-01 * '* Version : 1.0 * '* Notes : * '* : * '**************************************************************** DEFINE OSC 4 ' If the PIC is running at 4MHz and we run TMR2 with a prescaler of ' 1:4 it'll "tick" every 4us. Setting PR2 to 225 will make it overflow ' every 225*4=900us. T2CON = %00000001 ' 1:4 Prescale, timer is off PR2 = 225 ' Overflow every 225*4=900us StartSignal VAR PortB.0 StopSignal VAR PortB.1 TMR2ON VAR T2CON.2 ' Alias to TMR2ON bit T2INT VAR PIR1.1 ' Alias to TMR2 Interrupt flag Time VAR WORD ' This is the measured velocity in units on 0.1km/h Velocity VAR WORD ' Calculated velocity Main: TMR2ON = 0 ' Timer is OFF TMR2 = 0 ' Reset timer Time = 0 Velocity = 0 WaitForStartSignal: While NOT StartSignal : WEND ' Wait for start input. TMR2ON = 1 ' Start the timer WaitForStopSignal: WHILE NOT StopSignal IF T2INT = 1 THEN ' 900us has passed T2INT = 0 ' Clear flag Time = Time + 1 ' Count up, units of 900us IF Time = 4500 THEN ABORT ' ~4 seconds has passed, lets stop. ENDIF WEND TMR2ON = 0 ' Stop the timer ' At this point the variable Time contains the time from start signal ' to stop signal in units of 900us. ' Velocity in km/h = 3.6 / time in seconds ' If Time is 200 it took 200 * 900us = 180ms which equals 20km/h. ' If Time is 745 it took 745 * 900us = 670ms which eqauls 5.4km/h. ' IF Time is 2000 it took 2000 * 900us = 1800ms which equals 2km/h. ' If Time is 4000 it took 4000 * 900us = 3600ms which eqauls 1km/h. ' If we do 40000/200 we get 200 = 20.0km/h ' If we do 40000/745 we get 53 = 5.3km/h ' If we do 40000/2000 we get 20 = 2.0km/h ' If we do 40000/4000 we get 10 = 1.0km/h Velocity = 40000 / Time LCDOUT $FE, 1, "Velocity: ", DEC Velocity/10, ".", DEC Velocity // 10, "km/h." Goto Main Abort: LCDOUT $FE, 1, "Timing aborted after ~4s" Goto Main




Bookmarks