Autor Tema: Ayuda con interrupcion para el timer1!!.  (Leído 8799 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Ayuda con interrupcion para el timer1!!.
« Respuesta #30 en: 15 de Marzo de 2007, 00:57:48 »
Si entendí bien, tienes preocupación de que por cada ciclo de 100useg se te pasen 3 o 4 de más por las comparaciónes.   Si estoy en lo cierto y esta es tu preocupación, usar el PR2 a un valor fijo hace que el TMR2 vuelve a 0 solo independientemente de si atendiste o no a la interrupción.  Tus temporizaciónes serán exactas.  Esas instrucciones de más de las que hablas solo estarán en la última vuelta.

Si tienes que hacer 10 ciclos, solo estarán en el 10mo ciclo.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado josearrow

  • PIC10
  • *
  • Mensajes: 40
Re: Ayuda con interrupcion para el timer1!!.
« Respuesta #31 en: 16 de Marzo de 2007, 05:35:22 »
No no,

El problema es que mi programa llega un momento en que hace un delay, del tiempo que haya cogido de la tabla. Y como el timer2 solo cuenta hasta 100, que son 100us, y cada vez que llega salta la interrupcion para incrementar las variables de conteo de 16bits, pues cuando esta haciendo el delay y el valor es alto 1000 por ejemplo, pues salta varias veces la interrupcion, porque mientras hace ese delay el contador sigue contando y cada vez que salta la interrupcion, pues pierde un tiempo en el que no esta haciendo el delay, cuando vuelve a la instruccion de delay, sigue... Y por tanto retarda el valor de la tabla + las veces q haya saltado la interrupcion * el tiempo que gasta cada interrupcion. Y esto es dificil de controlar...
Asi que habrá que usar un timer para hacer el retardo.

Saludos.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Ayuda con interrupcion para el timer1!!.
« Respuesta #32 en: 16 de Marzo de 2007, 12:53:41 »
La verdad josé, he leído y releído tu post 4 veces y no entiendo tu problema  :?
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado josearrow

  • PIC10
  • *
  • Mensajes: 40
Re: Ayuda con interrupcion para el timer1!!.
« Respuesta #33 en: 16 de Marzo de 2007, 19:20:07 »
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.


Desconectado josearrow

  • PIC10
  • *
  • Mensajes: 40
Re: Ayuda con interrupcion para el timer1!!.
« Respuesta #34 en: 18 de Marzo de 2007, 14:10:28 »
Ya lo solucioné usando el timer1 como contador para hacer delay. Funciona bien Gracias.