Autor Tema: Ayuda con calculo Timer 1 Sincronico  (Leído 2323 veces)

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

Desconectado kaki

  • PIC18
  • ****
  • Mensajes: 260
Ayuda con calculo Timer 1 Sincronico
« en: 10 de Octubre de 2013, 01:01:54 »
Hola a todos... De vuelta aca intentando calcular el la interrupción para 1 segundo.

Bueno decidi usar el Timer 1 en su configuracion Sincronica con un cristal de 32,768kHz. Para que me desborde en un segundo.

Aca dejo la configuracion del Timer 1:

Código: [Seleccionar]
   
          setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1|T1_CLK_OUT);
         disable_interrupts(int_TIMER1);//Desahabilitar interutciones TM1
        enable_interrupts(GLOBAL);    //Habilita interutciones GLOBALES
        set_timer1(32760);        //

Aca dejo la Interupcion:

Código: [Seleccionar]
#int_TIMER1
         void TIMER1_isr(){
               if((segundos == 1) && (minutos == 0)){
               finalTiempo();
       }
           if((bandera == false)&&(--segundos < 1)){
   if(minutos > 0) --minutos;
   segundos=59;
       }
               set_timer1(32760);
        }

El problema que tengo es que en una hora mi cronometro se adelanta 1 minuto.
Calculo que puede ser un mal calculo del  set_timer1(32760);
Estoy utilizando un cristal de 20hz y un pic18f2550

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ayuda con calculo Timer 1 Sincronico
« Respuesta #1 en: 10 de Octubre de 2013, 01:12:07 »
Hola! Dejalo correr libre al Timer! No le cargues ningún valor! excepto el inicial y por única vez si estás haciendo un cronómetro/cuenta regresiva.

"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado kaki

  • PIC18
  • ****
  • Mensajes: 260
Re: Ayuda con calculo Timer 1 Sincronico
« Respuesta #2 en: 10 de Octubre de 2013, 01:22:26 »
Disculpa bruno pero no entendi lo que dices sobre que el Timer corra libre... Te refieres a q no ponga el set_timer1(32760); dentro de la interrupción??

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ayuda con calculo Timer 1 Sincronico
« Respuesta #3 en: 10 de Octubre de 2013, 01:24:04 »
Exactamente. Dejalo correr libre!

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado kaki

  • PIC18
  • ****
  • Mensajes: 260
Re: Ayuda con calculo Timer 1 Sincronico
« Respuesta #4 en: 10 de Octubre de 2013, 01:42:53 »
Si lo dejo correr libre como tu dices ahora se atrasa.... y bastante.. en 1 minuto se atrasa 30 segundos...

 :5]

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ayuda con calculo Timer 1 Sincronico
« Respuesta #5 en: 10 de Octubre de 2013, 01:50:41 »
Le pusiste los capacitores adecuados al cristal de 32kHz?

"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado kaki

  • PIC18
  • ****
  • Mensajes: 260
Re: Ayuda con calculo Timer 1 Sincronico
« Respuesta #6 en: 10 de Octubre de 2013, 01:52:12 »
Le puse de 27pF como dice la hoja de datos del pic!!

Como calcularis tu el set_timer1 ???

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Ayuda con calculo Timer 1 Sincronico
« Respuesta #7 en: 10 de Octubre de 2013, 09:03:13 »
Hola a todos... De vuelta aca intentando calcular el la interrupción para 1 segundo.

Bueno decidi usar el Timer 1 en su configuracion Sincronica con un cristal de 32,768kHz. Para que me desborde en un segundo.

Aca dejo la configuracion del Timer 1:

Código: [Seleccionar]
   
          setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1|T1_CLK_OUT);
         disable_interrupts(int_TIMER1);//Desahabilitar interutciones TM1
        enable_interrupts(GLOBAL);    //Habilita interutciones GLOBALES
        set_timer1(32760);        //

Aca dejo la Interupcion:

Código: [Seleccionar]
#int_TIMER1
         void TIMER1_isr(){
               if((segundos == 1) && (minutos == 0)){
               finalTiempo();
       }
           if((bandera == false)&&(--segundos < 1)){
   if(minutos > 0) --minutos;
   segundos=59;
       }
               set_timer1(32760);
        }

El problema que tengo es que en una hora mi cronometro se adelanta 1 minuto.
Calculo que puede ser un mal calculo del  set_timer1(32760);
Estoy utilizando un cristal de 20hz y un pic18f2550

  Yo cambiaría el como tratas la rutina de interrupción. Primero precargaría el timer y luego todas las evaluaciones correspondientes. De esa manera, los ciclos de clock consumido por las evaluaciones no cambiarían tanto el tiempo de la cuenta.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Ayuda con calculo Timer 1 Sincronico
« Respuesta #8 en: 10 de Octubre de 2013, 09:52:53 »
Coincido totalmente, debes precargar el timer inmediatamente al entrar a la interrupción, y reactivarla, ya que de otro modo solo se reactiva al salir de ella.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ayuda con calculo Timer 1 Sincronico
« Respuesta #9 en: 10 de Octubre de 2013, 12:54:10 »
Le puse de 27pF como dice la hoja de datos del pic!!

Como calcularis tu el set_timer1 ???

El Timer del RTC NO DEBERÍA PRECARGARSE. Intento explicar el por qué:

Primero: Es mucho más sencillo contar de a dos segundos en la interrupción, y si necesitas mostrar los segundos, puedes leer el valor actual del timer y con una regla de 3 simple lograr obtener no sólo los segundos sino también las décimas y centécimas.

Tiempo transcurrido = minutos : segundos + TMR1 / 32768

Si aún así, estás si o si necesitando que la interrupción suceda cada un segundo, el datasheet da la manera recomendada de precargar al Timer1: seteando el bit 7 del registro TIMER1H. Esa es una de las pocas formas de pre-cargar el Timer sin adulterar la cuenta. Hacer una pre-carga del Timer completa (como el set_timer_1(valor)) genera que se pierda la posible cuenta actual de ticks acumulada durante la ISR. Recordemos que el Timer sigue contando aún dentro de la ISR, volviendo a acumular pulsos y escribir el valor del Timer completo puede generar que se pierda la cuenta precisa que lleva el Timer en ese momento. La forma segura es entonces: BSF TMR1H,7. Eso equivaldría a hacer: TMR1 = TMR1 OR 32768, lo que hace que desborde e interrumpa al cumplirse un segundo de tiempo transcurrido.

Siguiendo el datasheet, también menciona que para utilizar el Timer uno como RTC:

Citar
For this method to be accurate, Timer1 must operate in Asynchronous mode

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado kaki

  • PIC18
  • ****
  • Mensajes: 260
Re: Ayuda con calculo Timer 1 Sincronico
« Respuesta #10 en: 10 de Octubre de 2013, 14:28:40 »
Ahora me perdi!! veremos que saco como concluir de todo lo que me explicaste y leyendo la hoja de datos!! Saludos!!

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Ayuda con calculo Timer 1 Sincronico
« Respuesta #11 en: 11 de Octubre de 2013, 09:23:05 »
Le puse de 27pF como dice la hoja de datos del pic!!

Como calcularis tu el set_timer1 ???

El Timer del RTC NO DEBERÍA PRECARGARSE. Intento explicar el por qué:

Primero: Es mucho más sencillo contar de a dos segundos en la interrupción, y si necesitas mostrar los segundos, puedes leer el valor actual del timer y con una regla de 3 simple lograr obtener no sólo los segundos sino también las décimas y centécimas.

Tiempo transcurrido = minutos : segundos + TMR1 / 32768

Si aún así, estás si o si necesitando que la interrupción suceda cada un segundo, el datasheet da la manera recomendada de precargar al Timer1: seteando el bit 7 del registro TIMER1H. Esa es una de las pocas formas de pre-cargar el Timer sin adulterar la cuenta. Hacer una pre-carga del Timer completa (como el set_timer_1(valor)) genera que se pierda la posible cuenta actual de ticks acumulada durante la ISR. Recordemos que el Timer sigue contando aún dentro de la ISR, volviendo a acumular pulsos y escribir el valor del Timer completo puede generar que se pierda la cuenta precisa que lleva el Timer en ese momento. La forma segura es entonces: BSF TMR1H,7. Eso equivaldría a hacer: TMR1 = TMR1 OR 32768, lo que hace que desborde e interrumpa al cumplirse un segundo de tiempo transcurrido.

Siguiendo el datasheet, también menciona que para utilizar el Timer uno como RTC:

Citar
For this method to be accurate, Timer1 must operate in Asynchronous mode

Saludos.

  Muy buena idea Bruno.
  De todas maneras supongo que también dependerá de la precisión que se requiera. Una vez intente un reloj sin oscilador para el timer1 (es decir que contaba pulsos del clock principal creo que a 20MHz) y utilizando la técnica de la precarga apenas ingresado en la interrupción se me retrasaba 1 segundo cada 3 horas.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado kaki

  • PIC18
  • ****
  • Mensajes: 260
Re: Ayuda con calculo Timer 1 Sincronico
« Respuesta #12 en: 17 de Octubre de 2013, 13:10:47 »
Hola a todos despues de pruevas encontre el error!! La configuracion del Timer 1 con el cristal esta perfecto... en la imagen dejo una prueva con el osciloscopio y van a ver q la onda cuadra es justo de 1 segundo...

El probelma lo tenia en q cada 0 no espero un segundo.. osea de uno salto a 59... y es logico el tiempo que se me adelante 1 minuto en una hora.. ya q en cada minuto se adelanta un segundo...


Saludos.. espero que esto le sirva a otro para que no cometa los mismo errores !!! saludoss a todos y gracias por la ayuda...

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ayuda con calculo Timer 1 Sincronico
« Respuesta #13 en: 17 de Octubre de 2013, 13:18:33 »
Me alegro que hayas encontrado el error. Nos concentramos en el Timer y no vimos el resto del código. Cuando algo falla y no encontramos el error, hay que desconfiar hasta de las cosas más asumidas.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Ayuda con calculo Timer 1 Sincronico ( RESUELTO)
« Respuesta #14 en: 17 de Octubre de 2013, 15:19:04 »
Le puse RESUELTO al titulo, para que quienes vean el hilo se enteren como se resolvió !! ((:-)) ((:-))
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.


 

anything