Autor Tema: Cronometro con pic siempre atrasa  (Leído 5757 veces)

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

Desconectado villamany

  • PIC12
  • **
  • Mensajes: 63
Cronometro con pic siempre atrasa
« en: 15 de Julio de 2012, 14:31:31 »
Hola, estoy usando un PIC18F2550 en un proyecto, el tema es que debo disponer de un cronometro para llevar un conteo de tiempo, para actualizar el conteo aprovecho una interrupcion que genero cada 20ms exactos, incrementando un contador y luego realizando los calculos para obtener H:M:S. El tema es que el cronometro atrasa 2 o 3 segundos cada 20min. No se si he realizado los calculos mal. Dejo la rutina empleada a ver si alguien me arroja un poco de luz. Gracias por anticipado.

Utilizo oscilador externo con un cristal de 8mhz.



//variables utilizadas
   int32 tiempo=0;//Tiempo de vuelo incrementa en cada interrupcion de tmr3
   int32 tiempoS;// conteo de segundos
   int32 tiempoH;// conteo de minutos
   int32 tiempoM;// conteo de horas

//Control de interrupcion cada 20ms
#INT_TIMER3
void tmr3_isr()
{
 output_toggle(BUZZER);//chivato
 set_timer3(25536);
 if (tiempo < 17999999)tiempo ++; else tiempo=0;// aumenta cada 20ms, para llevar
 //el tiempo de vuelo, al llegar a las 100h resetea)
}

Este es el bucle infinito dentro del main por el que muestro el cronometro en un LCD:

bucle:
   lcd_gotoxy(1,1);
   tiempoS=((tiempo*20)/1000);//pasar de numero de instrucciones a segundos
   tiempoH=tiempoS /3600;//saco horas
   tiempoS=tiempoS-(tiempoH*3600);//resto horas de los segundos
   tiempoM=tiempoS/60;//saco minutos
   tiempoS=tiempoS - (tiempoM*60);//resto minutos de los segundos
   printf(lcd_putc,"%02lu:%02lu:%02lu",tiempoH,tiempoM,tiempoS);
   goto bucle;

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Cronometro con pic siempre atrasa
« Respuesta #1 en: 15 de Julio de 2012, 14:58:18 »
a mi me sale calculando con un reloj de 8mhz que la interrupcion la haces cada +12ms, no se si tienes preescaler o algo puesto

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Cronometro con pic siempre atrasa
« Respuesta #2 en: 15 de Julio de 2012, 15:40:47 »
Ademas deberias sacar el output toggle o por lo menos dejarlo despues de la recarga del timer, ya que de otro modo te genera un retraso de 3 o 4 ciclos de intruccion, ya que esa instruccion primero testea el estado del puerto, para saber cual es el actual y recien despues lo cambia.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado villamany

  • PIC12
  • **
  • Mensajes: 63
Re: Cronometro con pic siempre atrasa
« Respuesta #3 en: 15 de Julio de 2012, 16:20:33 »
Gracias. Precargando el tmr a ese valor me da una interrupción cada 40000 instrucciones, a 0,5 us son 20ms sin prescaler. Lo de recargar el tmr antes de nada llevas razón. Además creo que debería ver el codigo en asm para ver cuantas instrucciones emplea css en recargar el tmr y restarlas al valor de recarga, estoy en lo cierto?

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Cronometro con pic siempre atrasa
« Respuesta #4 en: 15 de Julio de 2012, 17:07:52 »
vale tenias razon, es que estoy acostumbrado a los dspic que pones el tiempo de desborde.

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Cronometro con pic siempre atrasa
« Respuesta #5 en: 15 de Julio de 2012, 17:57:32 »
Además creo que debería ver el codigo en asm para ver cuantas instrucciones emplea css en recargar el tmr y restarlas al valor de recarga, estoy en lo cierto?

Seria lo mejor, asi te queda una rutina bien ajustada en sus tiempos.

Lo del toggle, ademas, deberias marcar un flag dentro de la interrupcion y despues en el loop del Main(), si esta el flag en 1, ejecutas el output_togle de la salida y pones el flag en 0.
Especialmente porque creo que esa instruccion tiene tiempos distintos de procesamiento si esta la salida en 1 a que si esta en 0...

Son minimos detalles que hay que tenerlos en cuenta, es lindo programar en C, pero para optimizar tu codigo estas obligado a saber de assembler.. :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado villamany

  • PIC12
  • **
  • Mensajes: 63
Re: Cronometro con pic siempre atrasa
« Respuesta #6 en: 15 de Julio de 2012, 19:26:10 »
Gracias, acabo de probarlo y pese a que ha mejorado aun atrasa algo, debo repasar bien el valor de recarga del tmr (la recarga del tmr lleva 4 instrucciones en el asm que genera css).

A lo del toggle, creo que no tiene importancia siempre que lo haga despues de recargar el tmr3, o no?
Creo que el tmr3 seguira contando aunque el programa continue dentro de la rutina de interrupcion y el toggle tardara bastante menos de los 20ms que toma el tmr3 en volver a desbordarse y no deberia interferir???

Edito: Tras examinar el asm generado nuevamente veo que hay bastantes mas instrucciones que se ejecutan entre el vector de interrupcion y la recarga del tmr3. La solucion es, una vez tenga el programa listo, examinar el asm y contar todas las instrucciones que se ejecutan desde el vector de interrupcion 0x08 hasta que el tmr3 queda recargado teniendo en cuenta que algunas instrucciones tardan 2 ciclos. Finalmente sumar este valor al valor de recarga del tmr3.
En la prueba que he realizado ha sido la friolera de 41 ciclos de reloj que estaba contando de mas cada 20ms.
« Última modificación: 15 de Julio de 2012, 20:00:05 por villamany »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re: Cronometro con pic siempre atrasa
« Respuesta #7 en: 15 de Julio de 2012, 19:58:12 »
Súmale el tiempo de saltar a la interrupción.

Creo que sería más preciso utilizar TIMER2 con autorrecarga por hardware.

Cuando llegues a una precisión de 100ppm (9 segundos al día) necesitarás ajustar el oscilador de cristal o compensarle por software.

Saludos.

Desconectado villamany

  • PIC12
  • **
  • Mensajes: 63
Re: Cronometro con pic siempre atrasa
« Respuesta #8 en: 15 de Julio de 2012, 20:04:46 »
Acabo de editar el post anterior. El tmr2 lo estoy usando para generar PWM variable.
Solucionado. Gracias por las respuestas!!

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Cronometro con pic siempre atrasa
« Respuesta #9 en: 15 de Julio de 2012, 23:14:39 »
Por supuesto que debe haber varias instrucciones antes de ejecutar el codigo de la insterrupcion, son para salvar el contexto y despues al salir restaurarlo.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado callecuatro1976

  • PIC12
  • **
  • Mensajes: 85
Re: Cronometro con pic siempre atrasa
« Respuesta #10 en: 02 de Enero de 2015, 12:35:13 »
como es el programa completo me inteza para aprender a hacer un cronometro

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Cronometro con pic siempre atrasa
« Respuesta #11 en: 02 de Enero de 2015, 13:26:41 »
Sin contar que es un tema del 2012.

Lo dijo claramente, usa una interrupcion cada 20ms, el valor que carga depende de la frecuencia del oscilador.
Cuando se produzcan 50 (50 * 20mS = 1seg ), paso un segundo. Ahi podes tener 3 variables, segundos , minutos y horas para almacenarlo. Y tambien podes usar los milisegundos.

De todas formas si quisiera tener un horario utilizaria un RTCC de un PIC o RTCC externo.
« Última modificación: 02 de Enero de 2015, 13:32:19 por KILLERJC »

Desconectado callecuatro1976

  • PIC12
  • **
  • Mensajes: 85
Re: Cronometro con pic siempre atrasa
« Respuesta #12 en: 02 de Enero de 2015, 13:59:34 »
que quiere decir BUZZER ?????

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Cronometro con pic siempre atrasa
« Respuesta #13 en: 02 de Enero de 2015, 18:40:36 »
Seguro que le llamo buzzer a una salida, de esa forma tenia una referencia sonora



El tema es que uno deberia de tener en cuenta cada uno de los ciclos que el micro ejecuta, contando que los saltos son 2 ciclos etc etc etc, encima C suele introducir algunas lineas y no te das cuenta si no miras el ASM, entonces si lo haces y no tenes cuenta tenes el mismo problema que el, a no ser como le indicaron que tenga un timer que se rellene solo con un valor definido en un registro, de esa forma el cargar el valor no depende del programa y no hay errores por que se introdujo una linea de ASM mas. (Aunque es colpicado encontrar un timer asi en micros de gama baja)

Desconectado callecuatro1976

  • PIC12
  • **
  • Mensajes: 85
Re: Cronometro con pic siempre atrasa
« Respuesta #14 en: 02 de Enero de 2015, 19:49:30 »
si estoy mirando como hacelo pero no me muestra nada en el lcd lo modifique al programa pero no veo como llama a que empieze a contar


 

anything