Autor Tema: Timer2 - interrupciones sucesivas  (Leído 4187 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado rafaelrg06

  • PIC12
  • **
  • Mensajes: 54
Timer2 - interrupciones sucesivas
« en: 25 de Marzo de 2015, 18:26:10 »
Hola amigos del foro:
Antes que nada les anuncio que me he tomado algunas horas revisando con el buscador del foro la respuesta, pero no la he encontrado.
Estoy haciendo un display POV, y tengo 2 tiempos que necesito controlar, los tiempos lo almaceno en las variables Ton y Toff respectivamente, siempre demorando Ton y luego Toff (y se repite Ton nuevamente...) ,  cada variable tiene un valor distinto.
Para resolver lo anterior hice una función que configura el timer2. Esta función se ejecuta dentro de la propia interrupción, y el problema es que a partir de ahí se ejecuta contínuamente la interrupción por timer2. El ejemplo lo estoy simulado con proteus.
Uso CCS 5.007 y Proteus 7.8 SP2
El código de la función que uso es el siguiente:

void conf_timer2(int x)
{
/*Esta función configura el timer 2
x es la variable que indica la carga del timer2 (Ton o Toff)
dependiendo del modo en que se esté operando

*/

 if (modo == 2)
{
   set_timer2(x);
   setup_timer_2(T2_DIV_BY_1,x,1);
   
}//Cierre del if (modo == 2)

}


Necesito eliminar el problema de la interrupción sucesiva del timer2, y configurarlo correctamente (pienso que es un problema de configuración). He configurado el timer2 de varias maneras y nada, incluso traté de escribir el valor de carga (Ton o Toff) directamente en el registro PR2 y comprobé que se escribe, pero aún así se interrupe sucesivemente.
Por favor, cualquier ayuda será bien recibida.

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re: Timer2 - interrupciones sucesivas
« Respuesta #1 en: 25 de Marzo de 2015, 19:05:59 »
Yo también hice hace tiempo un pov en ccs y fue el ultimo proyecto k hice con ccs jeje. Esta colgado en el foro por si lo kieres ver.


http://www.todopic.com.ar/foros/index.php?topic=44114.0

Ahora referente a tu problema no recuerdo casi nada de CCS pero tiene toda la pinta de k no se esta limpiando el flag de interrupción de tu timer 2 prueba a limpiar el flag manualmente dentro de tu interrupción. Si no se limpia este flag(algunos micros lo limpian por hardware y otros los tienes k limpiar por software) cada vez k sale de la interrupción vuelve a entrar por tener el flag en alto.

Un saludo
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Timer2 - interrupciones sucesivas
« Respuesta #2 en: 25 de Marzo de 2015, 19:09:45 »
Y ya que lo estas simulanod podes observar si se limpia el flag o no xD

Desconectado rafaelrg06

  • PIC12
  • **
  • Mensajes: 54
Re: Timer2 - interrupciones sucesivas
« Respuesta #3 en: 26 de Marzo de 2015, 14:36:24 »
Hola amigos:
Bueno, la verdad es que no he podido limpiar la bandera. En esencia lo que pienso que me dicen es que limpie la bandera TMR2IF que es la que se debe poner en 1 cuando se activa la interrupción por timer2, está bandera es el bit 1 del registro PIR1 que se encuentra en la dirección 0xC.
El método que he usado para limpiar la bandera es declarar:
#BIT TMR2IF = 0x0C.1 //BIT bandera que indica si se habilitó una interrupcion por timer2 (hay que borrarla por software)

y luego, la primera línea de código dentro de la interrupción es:
TMR2IF = 0; //Deshabilitar la bandera de interrupción externa

pero aún así, en la simulación en proteus no se deshabilita el bit TMR2IF, también probé declarando:
#BYTE PIR1 = 0xC
 y luego, de manera similar porner el registro en 0 y nada, no se deshabilita el registro TMR2IF (permanece activado en 1, es decir, el registro PIR con el número 2).
Quizás es que no lo he implementado adecuadamente. No tengo experiencia alguna usando Assembler (que pienso es una vía de manipular adecuadamente estos registros) y menos desde CCS.
¿Alguien me podría ayudar a evitar que el timer2 se interrumpa sucesivamente?

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re: Timer2 - interrupciones sucesivas
« Respuesta #4 en: 26 de Marzo de 2015, 15:33:22 »
En tu interrupcion del timer2, prueba a poner esto al final o al principio

set_TIMER2("el valor de la cuenta");

pruebalo, quiza esa funcion limpie el flag.

POSDATA: te recomiendo te pases a mplab XC, no te arrepentiras, y no tendras este tipo de problemas
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Timer2 - interrupciones sucesivas
« Respuesta #5 en: 26 de Marzo de 2015, 17:22:08 »
Esa funcion no limpia el flag.

El flag esta bien limpiado.

Lo unico que veo distinto a los demas timers ( suponiendo que tiene un modulo CCP y es un PIC16F887 ) es que el timer 2 se compara con PR2 para generar la interrupcion. (y no por overflow como los demas)
Y al generarse la interrupcion el mismo se resetea a 0

Citar
When a match occurs, two things happen:
• TMR2 is reset to 00h on the next increment cycle
• The Timer2 postscaler is incremented

Entonces al ser 0 el PR2 y entrar a la interrupcion, el timer se resetea a 0 esta continuamente generando una condicion de match (igualdad) con PR2 y por lo tanto es imposible limpiar la condicion de interrupcion.
En ves de usar la logica de cargar el complemento a 2 de un numero en el TMR2 , directamente carga el numero que quieras llegar en PR2 y poner el time2 a 0 por unica vez al comienzo.

Ejemplo
TMR0/1: si yo quisiera contar 100 (0x64) ,en los demas timers deberia cargar el complemento a 2 de ese numero (0x9C), asi comienza de ese numero y cuando se produce el overflow ahi activa la interrupcion.

TMR2: Con el timer 2 si quisieras contar 100, directamente cargas 100 en PR2 y pones el timer2 a 0, esto lo tenes que hacer solo 1 ves. ya que solo el timer se va a poner a 0 cuando entre en la interrupcion. Y estaria contando 100 siempre, la unica forma de desactivarlo es desactivando la interrupcion del mismo.
(Aunque no recuerdo creo que es 99, por que utiliza 1 ciclo para el borrado, pero por por las dudas usa 100)

Lamentablemente no puedo decir mucho ya que no se que micro es.
« Última modificación: 26 de Marzo de 2015, 18:16:30 por KILLERJC »

Desconectado rafaelrg06

  • PIC12
  • **
  • Mensajes: 54
Re: Timer2 - interrupciones sucesivas
« Respuesta #6 en: 26 de Marzo de 2015, 18:51:29 »
Es real lo que me escribes KILLERJC, el byte PR2 (0x92) está en 00 todo el tiempo; antes de continuar, estoy trabajando con un 16f628a, discúlpa porque olvidé ese importante detalle.
Voy a hacer algunas pruebas más y comentaré, pienso que estaré online mañana con los resultados, pero en líneas generales creo que esta es la solución al problema, solo intentaré cambiar el registro PR2 directamente y comentaré los resultados.


Muchísimas gracias a todos

Desconectado rafaelrg06

  • PIC12
  • **
  • Mensajes: 54
Re: Timer2 - interrupciones sucesivas [solucionado]
« Respuesta #7 en: 27 de Marzo de 2015, 09:15:47 »
Hola amigos:
Definitivamente el error era que la función cargaba el valor 00 en PR2 y esto provocaba interrupciones sucesivas del timer2.

Muchas gracias a todos!!!!!!!!!!!! :-/ :-) ;-)

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Timer2 - interrupciones sucesivas
« Respuesta #8 en: 27 de Marzo de 2015, 09:18:16 »
Entonces carga tu valor al PR2 (una sola ves cuando lo configuras) y no el timer2 y se soluciono xD
« Última modificación: 27 de Marzo de 2015, 09:20:59 por KILLERJC »

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re: Timer2 - interrupciones sucesivas
« Respuesta #9 en: 27 de Marzo de 2019, 10:35:21 »

Ejemplo
TMR0/1: si yo quisiera contar 100 (0x64) ,en los demas timers deberia cargar el complemento a 2 de ese numero (0x9C), asi comienza de ese numero y cuando se produce el overflow ahi activa la interrupcion.

TMR2: Con el timer 2 si quisieras contar 100, directamente cargas 100 en PR2 y pones el timer2 a 0, esto lo tenes que hacer solo 1 ves. ya que solo el timer se va a poner a 0 cuando entre en la interrupcion. Y estaria contando 100 siempre, la unica forma de desactivarlo es desactivando la interrupcion del mismo.
(Aunque no recuerdo creo que es 99, por que utiliza 1 ciclo para el borrado, pero por por las dudas usa 100)

Lamentablemente no puedo decir mucho ya que no se que micro es.

Tuve el mismo problema que se comenta en este hilo, y lo solucioné, pero me queda esa duda, de si se debería de cargar 99 o 100.

El micro que uso es un PIC16F1847. En el datasheet dice esto:

Código: [Seleccionar]
This signal also resets the value of TMRx to 00h
on the next cycle and drives the output
counter/postscaler

Saludos!!!
« Última modificación: 27 de Marzo de 2019, 10:43:15 por micro_pepe »
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Timer2 - interrupciones sucesivas
« Respuesta #10 en: 27 de Marzo de 2019, 14:37:00 »
Si queres 100 cuentas, entonces necesitas cargar 100...


Si comenzas de 0, al llegar a 100 pasaron 100 cuentas (pulsos)... Apenas llega a 100 y producirse la igualdad, segun el datasheet esta constantemente comparandose, se produce el reset del Timer. Esto implica que sea asincrono. Por lo tanto si necesitas 100, cargas 100 :P

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re:Timer2 - interrupciones sucesivas
« Respuesta #11 en: 28 de Marzo de 2019, 19:56:01 »
Si queres 100 cuentas, entonces necesitas cargar 100...


Si comenzas de 0, al llegar a 100 pasaron 100 cuentas (pulsos)... Apenas llega a 100 y producirse la igualdad, segun el datasheet esta constantemente comparandose, se produce el reset del Timer. Esto implica que sea asincrono. Por lo tanto si necesitas 100, cargas 100 :P

OK, gracias así lo haré.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡


 

anything