Tal como lo miro tu problema radica en que necesitas gran precision pero al mismo tiempo necesitas periodos de muestreo cortos. No es asi Alberth?
De entrada se me ocurre que lo que puedes hacer es un pequeño analisis estadistico de las lecturas de frecuencia. La idea seria tomar lecturas de frecuencias individuales a intervalos cortos, pero en vez de descartar cada lectura medida la envias por el puerto, te quedas con digamos, las ultimas 5 lecturas. Asi, la salida del frecuencimetro podria ser el promedio de las 5 ultimas lecturas, lo que te daria gran precision y al mismo tiempo te permitiria agilizar la tasa de actualizacion.
Con tomar varias lecturas y promediarlas estarias elevando indirectamente el tiempo de muestreo, pero al enviar el promedio de las ultimas lecturas a medida que se generan elevas la tasa de actualizacion. Adicionalmente la tecnica estadistica de promediado tiende a elevar la precision al minimizar el error por desviacion de cada lectura. Esta tecnica te funcionaria muy bien siempre y cuando la frecuencia medida sea MUY estable, es decir, que varie muy poco con el tiempo.
Otra tecnica que puedes utilizar es la de medicion del periodo de cada pulso y luego calcular el reciproco. Con esto tendrias lecturas tan rapidas como lo que dura cada ciclo de la señal medida, y si usas una fuente precisa de referencia (como un cristal) puedes tener lecturas bastante aceptables. Lo malo de este metodo es que para altas frecuencias (y con altas me refiero a "comparables a las de tu contador de referencia") el error simplemente se elevaria mucho. Necesitaras un contador de referencia de gran velocidad para compensar, y junto con ello una precision numerica bastante elevada, que podria provocar que el PIC se tome su pequeño tiempo para hacer los calculos de reciproco.
Imagino que con respecto a este ultimo metodo (sugerido por _Eduardo_ por cierto), el mayor problema seria el de "sincronizarte" a la señal de entrada, es decir, iniciar la cuenta de tiempo del periodo tan rapidamente como sea posible en cuanto el flanco inicial se presente. Usualmente los microcontroladores tienen un tiempo de retardo para reaccionar a eventos externos (una interrupcion por ejemplo), pero esa problematica puede arreglarse con un pequeño truco:
Digamos que al generarse el flanco se interrumpe el MCU, digamos ademas que el MCU tarda 20 clocks (por inventarme un numero) desde que se genera la interrupcion hasta que el mismo hecha a andar el contador. Esto te pondria en plena desventaja, puesto que has perdido parte del periodo de la señal al iniciar la lectura y naturalmente te generara un error sustancial. Que hacer? La solucion es simple: La siguiente interrupcion determinara que el ciclo de la señal se ha terminado, por lo que simplemente se vuelve a interrumpir al MCU y hace un proceso similar con la leve diferencia que ahora detiene el contador en vez de iniciarlo... pero para ajustar las cosas, deliberadamente provocamos que se tarde EXACTAMENTE la misma cantidad de tiempo que al principio (es decir, los 20 clocks). Lo que ocurriria es mas o menos algo asi:
Señal -----|Inicio----------------------------------------------|Fin--------------------------
MCU ----------|Contador arranca-------------------------------|Contador para-----
Espero que el diagrama simplificado no se deforme con tu fuente. La idea basica es que aunque el MCU se atrasa, el periodo medido es siempre el mismo, porque se atrasa la misma cantidad de tiempo con cada interrupcion.
Yo use este metodo alguna vez cuando hice un proyecto muy similar al tuyo, y debo agregar que produjo una precision impresionante (+/- 1 LSB de 4 digitos que habia disponibles). Sin embargo usaba la tecnica de medidion de pulsos a un intervalo fijo, pero el concepto es el mismo.
En cuanto al "baile" de +/- un conteo en las lecturas sucesivas, creo que se puede hacer algo al respecto. Pero primero que nada, a que se debe? Bueno, ese mas o menos 1 con cada lectura se origina precisamente porque cuando se interrumpe la "medicion" para enviar el dato, inevitablemente parte del ciclo en curso de la señal de entrada queda inconcluso, y cuando se inicia la lectura nuevamente, el resto del ciclo inconcluso se mete a la siguiente medicion y agrega uno mas a la cuenta cuando no ha ocurrido en su totalidad desde el inicio de la medicon... digamos que es una especie de residuo (o puedes verlo tambien como un corrimiento de fase entre tu periodo de medicion y la señal de entrada al no ser de frecuencias con multiplos exactos). Lo mismo podria ocurrir en un siguiente ciclo de medicion pero en sentido inverso, con lo que ahora perderiamos una cuenta de la señal de entrada.
Se puede solventar? Claro que si: Eliminando los "residuos variables" por medio de esperar a que ocurra el siguiente flanco de la señal de entrada (positivo o negativo, no importa), y a continuacion echa a andar el contador. Uno pensaria que eso podria agregar cierto error en la lectura ya que el MCU tiene que responder a un evento externo... pero en realidad, eso no importa, ya que aunque existe retardo, el corrimiento de fase sera constante asi como el periodo de medicion, y tus lecturas seran casi tan estables como la frecuencia de entrada.
Eso seria todo, espero mis comentarios te sean utiles ^_^
Suerte con tu proyecto.