Hi Brandon
Had a look at your program, and was getting a bit confused by the results.
Have written my own version, differences from yours are:
- uses 16f877a
the timer enable and disable are in macros
LCD update is in a macro
uses timer1 as counter
main is used to initialize and has an empty loop
not using variables to control count etc
has an output on A0 for calibration (1sec)
As I thought that there could be a problem with using multiple interrupts, I decided to try something different

. So after a look at the datasheet I saw that it was possible to use a timer as a counter with an external input. In the Timer_Enable and Timer_Disable macros the C code is used to enable and disable the counter. Also in these macros is an output to port A for timing measurements/calibration.
The macro Frequency is used to read the counter and reset it with the C code, and then display the result.
Using the output on port A I have got the following results, freq is the timer2 int and time is measured on port A
- freq time
10000 0.9986
1000 0.9986
500 0.9975
250 0.9954
By changing the target value of tick you should be able to calibrate the unit, plus you could use it to change the frequency range if so desired.
If a higher accuracy is required then use the highest frequency possible, as this will allow finer calibration.
So for the above reading, target should be
Still cannot explain the difference in reading
Gary