Autor Tema: Duda/problema con el Timer2 del PIC 16F870  (Leído 3047 veces)

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

Desconectado northeix

  • PIC10
  • *
  • Mensajes: 5
Duda/problema con el Timer2 del PIC 16F870
« en: 29 de Julio de 2012, 19:35:33 »
Hola buenas, hace un tiempo que vengo siguiendo el foro y tras mucho leer y muchos ejemplos vistos he decidido por fin a arrancarme he intentar hacer un reloj, el caso es que no me sale (o mejor dicho no se calcular los valores a poner en el "setup_timer_2()" ni el valor del contador que tengo que poner para que pase un segundo, encontré una formula por el foro, pero no me sale y creo que la que vi en un ejemplo para el Timer0, bueno este el código en CCS:

Esto escrito antes del main, las variables ms y segundo han sido declaradas como int al principio del codigo

Código: [Seleccionar]
#int_TIMER2
void temporizador()
{
   ++ms;
   if(ms<100)
   {
    ++segundo;
    ms=0;
    }
}

y esto dentro del main()

Código: [Seleccionar]
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
setup_timer_2(T2_DIV_BY_16,250,10);  

muchas gracias de antemano, se me olvidaba, uso un cristal de 4 MHz
« Última modificación: 29 de Julio de 2012, 20:21:52 por northeix »

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re: Duda/problema con el Timer2 del PIC 16F870
« Respuesta #1 en: 29 de Julio de 2012, 22:17:31 »
Esa rutina no puede funcionar. Cada vez que se produce la interrupcion, incrementas los milisegundos, si son menor de 100 ¿¿??, incrementas los segundos y pones a cero los milisegundos. Resultado en cada interrupcion aumentas los segundos y logicamente eso no es correcto.

Saludos.

Desconectado northeix

  • PIC10
  • *
  • Mensajes: 5
Re: Duda/problema con el Timer2 del PIC 16F870
« Respuesta #2 en: 29 de Julio de 2012, 22:35:23 »
Vale, gracias por la respuesta y tan rápida, ya lo he arreglado eso ya se muestran bien, pero me queda la otra parte de calcular cada cuanto se hace la interrupcioón, ya que con lo valores que tengo puesto en el setup_timer_2 debería ser cada 0,01 es decir que cada 100 hacen un segundo, no? pues en el proteus me va demasiado rápido, es cosa de la emulación??

Al final he dejado el codigo de la interupción así

Código: [Seleccionar]
#int_TIMER2
void temporizador()
{
   ++ms;
   if(ms==100)
   {
    ++segundo;
    ms=0;
    }
}


Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Duda/problema con el Timer2 del PIC 16F870
« Respuesta #3 en: 30 de Julio de 2012, 09:55:46 »
  Para saber qué valores poner en el timer2, debes saber a qué frecuencia va a trabajar tu PIC. A su vez, en Proteus también debes especificar la velocidad de trabajo del PIC
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado northeix

  • PIC10
  • *
  • Mensajes: 5
Re: Duda/problema con el Timer2 del PIC 16F870
« Respuesta #4 en: 02 de Agosto de 2012, 01:40:09 »
En principio todo lo hice para 4mhz utilizando un xtal y lo configure tb en el proteus a 4 mhz pero nada, jugando con los valores del modulo he conseguido que más o menos ande, pero se atrasa o se adelanta con bastante rapidez  como unos 2 segundos por minuto, según he leído por aquí, es el timer 2 el que se usaba para hacer relojes precisos no? Debería usar otro timer o es cuestión de afinar con este??? Gracias de nuevo

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Duda/problema con el Timer2 del PIC 16F870
« Respuesta #5 en: 02 de Agosto de 2012, 14:16:52 »
  Un posible inconveniente puede ser que al programar en C no se tiene un control muy preciso del tiempo ya que cuando ingresa a una interrupción hay operaciones que hace el propio compilador y no las estamos viendo, con lo cual se lleva sus ciclos de instrucción.
  También pueda ser que sea conveniente utilizar otros valores para el prescaler y postescaler.

  ¿Tenés en claro como es el camino de la cuenta del timer2 hasta generar la interrupción?

  Es decir...
  pulso de entrada --> se divide por el prescaler --> incrementa TMR2 --> TMR = PR2 --> se divide por postescaler --> interrupción

  En tu caso el prescaler es 16, PR2 250 y postescaler 10.

  Teniendo en cuenta que a 4MHz el ciclo de instrucción es de 1us, esto generara una interrupción cada 1uS *16*250*10 --> 40mS.

  Suponiendo que no te dé el tiempo y hagas el ajuste modificando el valor de PR2 en 1, estarías variando la cuenta en 160uS ya que el prescaler está en 16 y el postescaler en 10. Por lo tanto el ajuste no es tan fino.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Duda/problema con el Timer2 del PIC 16F870
« Respuesta #6 en: 02 de Agosto de 2012, 19:09:10 »
  Hice un programa en HiTech y configuré el timer2 con los siguientes parámetros, PR2 = 226, postescaler = 10, sin prescaler.

  Lo simulé en proteus, dejé correr el programa 2 horas 10 segundos y se me adelantó mi reloj 9 segundos tomando como referencia el tiempo de ejecución indicado por el propio proteus.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado northeix

  • PIC10
  • *
  • Mensajes: 5
Re: Duda/problema con el Timer2 del PIC 16F870
« Respuesta #7 en: 02 de Agosto de 2012, 21:02:52 »
Muchísimas gracias ahora me ha quedado muy claro como funciona el timer2, tenía algunos conceptos equivocados, ya voy haciendo las cuentas correctamente y he conseguido afinarlo con un fallo bastante razonable, ya que no necesito una precisión muy alta creo que no lo voy a tocar más por ahora. Muchísimas gracias de nuevo