Autor Tema: Problema al Calcular TMR0. Se atrasa  (Leído 8517 veces)

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

Desconectado kaki

  • PIC18
  • ****
  • Mensajes: 260
Problema al Calcular TMR0. Se atrasa
« en: 25 de Septiembre de 2013, 12:49:01 »
Hola a todos. Le escribo por que tengo un pequeño problema.

Estoy haciendo un cronometro con un pic, calcule el timer0 para que desborde cada 10ms, dentro de la interucion porgrame un contador que cuando llego a 100 cuente 1 segundo.

Hasta aca todo fenomal.. el problema que tengo es que cuando lo controlo con un cronometro, el pic va mucho pero mucho mas lento. Estos problemas ya lo tube una ves con Dimer donde el pic hiba mas lento que lo calculado.

Estoy usando un Cristal de 20Mhz. Abajo dejo como lo tengo configurado.
Pic18f2550 TMR0 16bits

Código: [Seleccionar]
   setup_timer_0(RTCC_DIV_8|RTCC_INTERNAL); //Configuracion TMR0
   disable_interrupts(INT_RTCC);                         //Desahabilitar interutciones TM0
   enable_interrupts(GLOBAL);                             //Habilita interutciones GLOBALES
   set_timer0(59286);                                         //Precarga el TMR0
 

Código: [Seleccionar]
//Interutcion TMR0
#INT_RTCC                 // Interrupción por desbordamiento
RTCC_ISR() {              // del TIMER0 RTCC
  if(++nRTCC==100){
    nRTCC=0;
    if((bandera == false)&&(--segundos < 1)){
if(minutos > 0) --minutos;
segundos=59;
}
  }

Calcule 10ms pero tambien puede ser 33.3  , 25 ,etc.

¿lo que quiero saber si en verdad esta bien calculado el tiempo?

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Problema al Calcular TMR0. Se atrasa
« Respuesta #1 en: 25 de Septiembre de 2013, 13:29:46 »
Hola kaki, tienes en cuenta que al programar en C se genera mas codigo que si programaras en ASM por ejemplo, no es lo mismo el valor que te da la formula para calcular el tiempo que el que debes cargar en el Timer0.

Saludos!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado kaki

  • PIC18
  • ****
  • Mensajes: 260
Re: Problema al Calcular TMR0. Se atrasa
« Respuesta #2 en: 25 de Septiembre de 2013, 14:01:25 »
y entonces como lo calculo??? no hay forma de hacerlo exacto??

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Problema al Calcular TMR0. Se atrasa
« Respuesta #3 en: 25 de Septiembre de 2013, 14:48:28 »
Una interrupcion es una interrupcion, en cualquier lenguaje!!

Si no calculas correctamente cada cuanto se ejecuta, los tiempos son mas cortos o largos y adios con el calculo. Ese es el Quid de la cuestion...

De ahi a que en el lenguaje C una misma instruccion ocupe mas lugar hay un largo trecho, si bien no es del todo falso, tampoco es del todo cierto, y dependera mucho de tus habilidades al programar.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado kaki

  • PIC18
  • ****
  • Mensajes: 260
Re: Problema al Calcular TMR0. Se atrasa
« Respuesta #4 en: 25 de Septiembre de 2013, 15:22:00 »
Conclusiones .. si yo calculo que interrumpa cada 10ms va a interrumpir en ese tiempo programa en el lenguaje que programe  y haga lo que haga dentro del programa.

Ahora vamos... Cual seria el valor de Precarga con un DIV_8 y un cristal de 20Mhz....

 A mi me dio 
Código: [Seleccionar]
set_timer0(59286);

a ustedes?? a ver si estamos en los mismo valores... y si no lo estamos el por que..

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problema al Calcular TMR0. Se atrasa
« Respuesta #5 en: 25 de Septiembre de 2013, 16:06:05 »
Hola,

el Cristal de 20Mhz no nos da ninguna certeza en un 18F2550, ya que el cristal puede ser sometido a distintos divisores y pll que hacen que la frecuencia de trabajo del CPU (y por lo tanto del timer cuando se asocia a dicha velocidad) no tengan necesariamente la mísma frecuencia que el cristal. Estás seguro que la velocidad de trabajo del CPU es de 20Mhz? Estás usando USB? Si estás usando el USB Full Speed entonces deberías estar a 48Mhz.

La precarga (teórica) para que un Timer de 16 bits desborde a los 10mS con un prescaler de 1:8 y corriendo a 20Mhz es:
            
valor carga timer = 2^16 - (FOSC[Mhz] / 4 / prescaler * t[uS] ) = 2^16 - (20 / 4 / 8 * 10000 ) = 2^16 - 6250 = 59286

Parecería ser que si se te atrasa evidentemente el circuito oscilador no está trabajando a 20Mhz como supones.

Por otro lado, parecería ser que estás programando una cuenta regresiva. Te recomiendo que hagas esto:

if(minutos > 0){
   --minutos;
   segundos=59;
}

ya que sino cuando llegue a 00:00 volverá a 00:59, 00:58... EXCEPTO bandera se ponga a TRUE cuando la cuenta llegue a cero en alguna otra parte del código que no nos has mostrado.

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: Problema al Calcular TMR0. Se atrasa
« Respuesta #6 en: 25 de Septiembre de 2013, 16:23:10 »
No estoy usando USB es un aplicacion simple... un par de pulsadores y un par de displat 7segmento con un MAX7219.


#include <18F2550.h>
#use delay(clock=20000000)  //Configuracion Ocilador
#fuses HS,NOWDT,NOPROTECT,NOLVP,NODEBUG //Configuracion Fusibles

Como se si el oscilador esta funcionado a 20Mhz??? No entiendo por que si calculas una interrupción para que desborde en un tiempo se atrase tanto... osea es mucha la diferencia...

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Problema al Calcular TMR0. Se atrasa
« Respuesta #7 en: 25 de Septiembre de 2013, 16:37:29 »
YHola

Como ya te mencionaron al trabajar en C hay mas código por ejecutar.

Veras que al entrar y salir de la interrupción consume bastante(si quieres algo muy preciso),esto en lo que guarda y restaura registros.
Prueba simulando tu código para revisar cuanto tiempo tarda y ajustar ese tiempo con la carga del timer,es decir , compensa las perdidas.

Saludos!

Desconectado kaki

  • PIC18
  • ****
  • Mensajes: 260
Re: Problema al Calcular TMR0. Se atrasa
« Respuesta #8 en: 25 de Septiembre de 2013, 16:53:29 »
Pero mira q no es poco el tiempo que pierdo.. hay diferencias de de casi 10 s con respecto al cronometro verdadero... es mucho para pensar que es por que programo en C

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problema al Calcular TMR0. Se atrasa
« Respuesta #9 en: 25 de Septiembre de 2013, 16:56:13 »
Puede ser por una configuración insuficiente de los fuses, o puede ser porque hay un problema eléctrico con el circuito oscilador externo, y si tenés habilitado el FUSE FCMEN automáticamente el uC cambia a un oscilador interno que oscila a una frecuencia menor a 20Mhz. Proba deshabilitando el FCMEN y fijate si sigue oscilando lento o si deja de oscilar por completo. Si deja de oscilar es poque efectivamente debe haber un problema relacionado al oscilador externo, si sigue oscilando debería ser entonces que por algún motivo el CPU está corriendo a una frecuencia menor a la del cristal externo.
"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: Problema al Calcular TMR0. Se atrasa
« Respuesta #10 en: 25 de Septiembre de 2013, 17:22:42 »
Desabilite como me dijiste el NOFCMEN.... pero sigue haciendo lo mismo!!

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problema al Calcular TMR0. Se atrasa
« Respuesta #11 en: 25 de Septiembre de 2013, 17:47:54 »
Si aún sin el FCMEN sigue oscilando, entonces es un problema de configuración del circuito oscilador interno, o hardware defectuoso.

Con tu problema, me ponés en duda sobre la configuración del 18F4550. Como generalmente quien elige este uC es porque utiliza el módulo USB, nunca tuve que configurarlo sin pensar en la configuración del módulo USB.

Por lo que estoy leyendo en el datasheet, estás obligado a pasar por la PLL del USB, y a elegir un modo de CPUDIV mínimamente, ya que afecta a todos los periféricos el circuito de adaptación del USB.

En tu caso (20Mhz de cristal y modo HS elegido), deberías agregar los Fuses PLLDIV5 y CPUDIV1. Eso debería darte los 20Mhz en el CPU.

Fuente: Tabla página 30, Datasheet familia 18F2550
« Última modificación: 25 de Septiembre de 2013, 17:51:03 por BrunoF »
"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: Problema al Calcular TMR0. Se atrasa
« Respuesta #12 en: 25 de Septiembre de 2013, 17:55:23 »
Gracias por la Info. ahora me estoy llendo a la facu.. a la vuelta lo pruevo y te cuento!! saludos!!

Desconectado kaki

  • PIC18
  • ****
  • Mensajes: 260
Re: Problema al Calcular TMR0. Se atrasa
« Respuesta #13 en: 25 de Septiembre de 2013, 23:13:49 »
Bueno ya hice las pruebas con PLL5 y CPUDIV1 y poniendo ++nRTCC==100 no anda ni para atrás... esta re lento.. pero si le pongo ++nRTCC==10 la cosa mejora.. y mejora tanto que casi estaría.. esta un poco mas lenta.. osea en 1 minuto se atrasa 2 segundo..

No se entiendo.. me parece que lo mejor va a ser poner un cristal de 32,768 kHz en la Timer 1.

Otra solucion no le encuentro veo todo negro ya...

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problema al Calcular TMR0. Se atrasa
« Respuesta #14 en: 25 de Septiembre de 2013, 23:31:22 »
Qué raro...

Podrías probar poniendo:
    #fuses HSPLL,USBDIV,PLL5,CPUDIV1
    #use delay(clock=48000000)

?

Eso debería darte 48Mhz en el CPU. Recalculando la precarga del Timer0 por ahi elimines el problema que surge a 20Mhz.

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.


 

anything