Bueno, comento lo que he estado probando y los resultados, a ver si me aclaráis un poco lo que puede estar pasando.
Alternativa 1:
Configuro el contador rápido para que cuente en modo anillo, y así evito resetearlo. En el programa principal configuro un temporizador para que se autoresetee, cuando su salida está a 1 leo el valor del contador con PRV y lo guardo en un canal de memoria, cuando el PV del temporizador es cero leo el valor del contador con PRV y lo almaceno en otro canal, cuando la salida del temporizador está a 1 resto las dos posiciones y divido por el tiempo al que he configurado el temporizador y obtengo la velocidad del eje. Colocando las instrucciones de manera que siempre haga el cálculo con los valores del contador correspondientes al mismo ciclo del temporizador.
Esta versión me funciona quitando una parte de código que se encargaba del caso en que un ciclo del temporizador ocupaba dos ciclos del contador rápido, es decir que el valor en t=0 es mayor que en t=T porque el contador vuelve a 0 durante ese tiempo (me acabo de dar cuenta de que puede pasar que el contador se resetee durante el temporizado pero que aún así el valor de t=0 sea menor que el de t=T y no lo he tenido en cuenta).
Alternativa 2:
Configuro el contador rápido para que cuente en modo lineal. En el programa principal tengo el mismo temporizador anterior con autoreset y uso CTBL para crear una tabla de comparación para el contador rápido de manera que cuando alcance el valor 800 me lance una interrupción. En la subrutina de interrupción divido 800 por el valor que tiene en ese momento el temporizador y obtengo la velocidad. A continuación en la misma subrutina activo el bit de reset del contador rápido y un bit que también resetea el temporizador. La primera vez no va a dar un valor correcto porque el temporizador y el contador no tienen por qué arrancar al mismo tiempo, pero una vez que se ejecuta una vez la rutina de interrupción se resetean los dos a la vez y ya se obtiene un valor coherente.
Esta versión funciona bien al principio pero llega un momento en que el contador rápido no se resetea y el PV sigue subiendo por encima de 800. Lo que se me ocurre es que como la rutina de interrupción se ejecuta en cualquier momento, puede pasar que yo active el bit de reseteo de contador y en el programa principal lo vuelva a poner a cero antes de que realmente se resetee el contador.
Lamento el rollazo pero espero haberme explicado con suficiente claridad y que alguno me pueda dar alguna pista de lo que ocurre.
Alternativa 1:
Configuro el contador rápido para que cuente en modo anillo, y así evito resetearlo. En el programa principal configuro un temporizador para que se autoresetee, cuando su salida está a 1 leo el valor del contador con PRV y lo guardo en un canal de memoria, cuando el PV del temporizador es cero leo el valor del contador con PRV y lo almaceno en otro canal, cuando la salida del temporizador está a 1 resto las dos posiciones y divido por el tiempo al que he configurado el temporizador y obtengo la velocidad del eje. Colocando las instrucciones de manera que siempre haga el cálculo con los valores del contador correspondientes al mismo ciclo del temporizador.
Esta versión me funciona quitando una parte de código que se encargaba del caso en que un ciclo del temporizador ocupaba dos ciclos del contador rápido, es decir que el valor en t=0 es mayor que en t=T porque el contador vuelve a 0 durante ese tiempo (me acabo de dar cuenta de que puede pasar que el contador se resetee durante el temporizado pero que aún así el valor de t=0 sea menor que el de t=T y no lo he tenido en cuenta).
Alternativa 2:
Configuro el contador rápido para que cuente en modo lineal. En el programa principal tengo el mismo temporizador anterior con autoreset y uso CTBL para crear una tabla de comparación para el contador rápido de manera que cuando alcance el valor 800 me lance una interrupción. En la subrutina de interrupción divido 800 por el valor que tiene en ese momento el temporizador y obtengo la velocidad. A continuación en la misma subrutina activo el bit de reset del contador rápido y un bit que también resetea el temporizador. La primera vez no va a dar un valor correcto porque el temporizador y el contador no tienen por qué arrancar al mismo tiempo, pero una vez que se ejecuta una vez la rutina de interrupción se resetean los dos a la vez y ya se obtiene un valor coherente.
Esta versión funciona bien al principio pero llega un momento en que el contador rápido no se resetea y el PV sigue subiendo por encima de 800. Lo que se me ocurre es que como la rutina de interrupción se ejecuta en cualquier momento, puede pasar que yo active el bit de reseteo de contador y en el programa principal lo vuelva a poner a cero antes de que realmente se resetee el contador.
Lamento el rollazo pero espero haberme explicado con suficiente claridad y que alguno me pueda dar alguna pista de lo que ocurre.