Voy a intentar explicarlo otra vez.
Mi programa lo que hace es leer el pin3 y el contador hace conteos para saber la frecuencia de esos pulsos. Una vez sabe la frecuencia entre dos pulsos, que seran X conteos. Con ese valor entra en una tabla, saca un valor a retardar y se inicia un bucle de retardo, cuando retarda ese tiempo de la tabla sale, y empieza otra vez con el valor del siguente pulso...
Bien, el problema viene, una vez que uso crystal 16Mhz, con prescaler 1:4. Y querer que el contador haga incrementos de 100us, ya que sino la tabla sería inmensa!. Bien, esto lo consigo fijando el PR2 a 100, y usando el timer2, hace 100 conteos y acarrea, esos 100 conteos son 100us Bien, ahora para tener un contador de esos incrementos de 100us, uso una interrupcion en la cual, me guardará el valor de acarreos del timer2 de 8bits, usando una segunda variable consigo poder contar 16bits dentro de la misma interrupcion, por tanto, una vez que cuenta 100, el programa abandona lo que esté haciendo y salta la interrupcion, incrementa la variable,... asi siempre.
Mi problema está en que cuando acaba de contar entre dos pulsos, digamos que tenemos variableLow = 50 y variableHigh=1. Entonces entra en una tabla con esos valores, el numero de conteos es el valor de entrada. Bien coge el valor de esa posicion, que será el valor a retardar para esa frecuencia ok?, bien... Ahora solo nos queda hacer un bucle para retardar el valor de la tabla para esa frecuencia. Antes de hacerlo le resto el tiempo gastado en hacer todos los calculos, y empiezo el retardo asi:
doRetard incf retardoL,F ; Fit to delay value of table.
incf retardoH,F ; to do the calculates
bucle nop ; each iteration 1us
decfsz retardoL,F
goto bucle
decfsz retardoH,F
goto bucle
Bien, este sistema funciona correctamente, va a ir decreciendo el valor de las variables hasta 0. Pero que pasa??, que en el momento que está haciendo este retardo el contador sigue contando, porque esta contando el siguiente pulso. Y como salta cada 100 conteos timer2, pues cada vez que salte el programa abandonará todo y se ira a la interrupcion para incrementar las variables (que me hacen de contador), el contador contando no me afecta para este bucle de retardo, pero la interrupción SI!!, ya que se olvida de el retardo, y se va a incrementar las variables, gasta 4us y vuelve donde lo dejó --> AL BUCLE este!!, y que pasa? pues que al final retardará el valor de la tabla + el numero de interrupciones *4 ok??.
Espero que lo entendieras ahora. Y esto no hay forma de ajustarlo. Por eso de pensar en usar otro timer para hacer el retardo, ya que es independiente...
Espero que puedas verlo ahora claramente.
Ahora estoy viendo la forma de usar otro timer (el 0 o el 1), para hacer esta tarea...
Saludos.