Autor Tema: El reloj se atrasa... como lo acelero? Modifico los condensadores de 22pf?  (Leído 6522 veces)

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

Desconectado unoquepasa

  • PIC12
  • **
  • Mensajes: 65

     Buenas, estoy usando el dspic3f4013, tengo hecho un "reloj/cuenta atrás" que usa el timer 2/3 de 32 bits, para contar minutos y segundos, el problema es que se me retrasa un poco. Así a bote pronto no veo dónde podría haber fallo en el programa, ya que nada más entrar a la interrupción vuelvo a poner los timers a 0, y por otra parte no hay otras interrupciones que puedan tropezarse con ella. Yo creo que debe de ser cosa del cristal que estoy usando... no?
     Estoy usando un cristal de 6MHz con la PLL a x16, y el retraso es de unos 4-3 minutos en una hora, he probado con condensadores de 22pf y 33pf y nada, en ambos se me retrasa... podéis darme algún consejo para cómo "cuadrar" el reloj? Me gustaría saber si para "acelerarlo" podría cambiar los condensadores o algo así. Por otra parte no tengo un osciloscopio muy a mano, así que me resulta complicado chequear como de adecuada es la frecuencia de ascilación.

     Cualquier idea será bienvenida , un saludo

Pdta: otra opción podría ser bajar la PLL x8 y quizá el reloj sustituirlo por uno de 4 (realmente no me hace falta tanta velocidad) pero el problema es que estaría el error aún ahí, solo que dividido por 2, no? Con lo cual estoy en las mismas. No necesito mucha precisión, pero si al menos que no se retrase ni un minuto en digamos 4 horas.

Desconectado Jorge_

  • PIC10
  • *
  • Mensajes: 30
Re: El reloj se atrasa... como lo acelero? Modifico los condensadores de 22pf?
« Respuesta #1 en: 12 de Febrero de 2008, 00:54:03 »
No conozco ese micro, pero de seguro tiene un timer en donde puedes conectar un cristal externo de 31kHz para obtener más precisión.

Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: El reloj se atrasa... como lo acelero? Modifico los condensadores de 22pf?
« Respuesta #2 en: 12 de Febrero de 2008, 01:01:11 »
mirá nunca lo hice, pero ví que le agregan un condensadorcito variable (trimer) en serie con uno del oscilador, con eso le varían un poco la frecuencia del oscilador.
Otra cosa que puedes hacer es modificar la rutina de tiempo en la interrupción, quizás optimizando un poco el código, pero acá ya no te puedo decir más porque nunca hice nada con dspic y no creo que sea muy simple el asembler de estos.
saludos!!
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: El reloj se atrasa... como lo acelero? Modifico los condensadores de 22pf?
« Respuesta #3 en: 12 de Febrero de 2008, 05:46:44 »
Quiza sea el cristal .. por lo general los cristales tienen tolerancia ... esta se mide en PPM o partes por millon, eso significa que si tu cristal tiene 50ppm:

             deriva
ppm = --------------- x 1e6
              frec

deriva = 300Hz

es decir tu oscilador anda en 6MHz +- 300 Hz

aunque 300Hz una cantidad ridicula respecto a 6MHz, un cristal se deteriora con el tiempo o la temperatura, con estos factores las PPM aumentan, además entre mas PPM tenga tu cristal por supuesto es mas barato...

Te recomendaria que buscaras un cristal mas preciso, o usar un pic que tenga oscilador secundario para 32kHz ... la serie 24F creo que tiene un timer especial para relojes

Si tu aplicación es un reloj de hora, minutos y segundos ... tambien puedes usar el PCF8593 que es un reloj calendario, con este chip podes programar alarmas por segundo, minutos, horas, dias, hasta meses y ademas podes hacerle un circuito externo con bateria de respaldo para que no pierdas la hora mientras el resto del circuito esta apagado ... es genial y muy preciso..



 
Control Automático, DSP & Microcontroladores

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: El reloj se atrasa... como lo acelero? Modifico los condensadores de 22pf?
« Respuesta #4 en: 12 de Febrero de 2008, 06:51:56 »
Ese error es muy grande. Yo apuesto a que tú programa hasta más ciclos de los que crees. Puedes hacer la prueba simulandolo en MPLAB utilizando el stopwatch para averiguarlo con total precisión.

Desconectado unoquepasa

  • PIC12
  • **
  • Mensajes: 65
Re: El reloj se atrasa... como lo acelero? Modifico los condensadores de 22pf?
« Respuesta #5 en: 12 de Febrero de 2008, 11:36:21 »

       Sobre cambiar el cristal por el de 32.1khz, preferiría usar el mismo que tengo, además que como dice nocturno el error es muy grande.
       Mi cristal tiene 50ppm como dice blackcat,pero aún así me sigue pareciendo exagerado el error.

Código: [Seleccionar]
void __attribute__((__interrupt__, __shadow__)) _T3Interrupt(void)
{
TMR2=0x0000;
TMR3=0x0000;
PR2=0xFFFF;
PR3=0x017F;

IFS0bits.T3IF=0;

;;;;;;;;;;;;;;;;;;;;;;;

if (tiempo_useg!=0)
tiempo_useg--;
else
{
if (tiempo_dseg!=0)
{tiempo_useg=9;
tiempo_dseg--;}
else
   {

if (tiempo_umin!=0)
{
tiempo_umin--;
tiempo_useg=9;
tiempo_dseg=5;
  }
else
  {
tiempo_dmin--;
tiempo_umin=9;
tiempo_useg=9;
tiempo_dseg=5;
  }

   
             }
  }

;;;;;;;;;;;;;
LCD_Linea2();
LCD_Caracter(tiempo_dmin+48);
LCD_Caracter(tiempo_umin+48);
        LCD_Caracter(58);
LCD_Caracter(tiempo_dseg+48);
LCD_Caracter(tiempo_useg+48);


IEC0=0x8080;


PORTD=~PORTD;



}
          Esa es la rutina de interrupción, tampoco me parece muy complicado. De todas maneras, también hice una prueba de quitar todo ese codigo y dejar un "portd=~portd" y contaba los parpadeos, en un minuto ya se retrasaba un segundo o dos...
         Ni idea de que hacer....

Saludos

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: El reloj se atrasa... como lo acelero? Modifico los condensadores de 22pf?
« Respuesta #6 en: 12 de Febrero de 2008, 13:32:32 »
Dejame ver .... entiendo que el timer genera una interrupcion cuando llega al valor de 0x017F FFFFh ... por supuesto en 32 bits .... ahora si tu reloj es de 6MHz y 16x en el PLL quiere decir que el ciclo de instruccion es de 41.667ns .... ahora con esa cuenta y ese ciclo de instruccion ... la interrupcion se genera:

 41.667ns * 25165823 = 1.0486s

eso por 60 veces, segun representa un minuto: 62.91s ... es decir se te atraso 2.91 segundos

ahora en una hora ese retraso  se incrementa a 174.6 segundos ... lo que son casi 3 minutos
 

Estoy suponiendo que no usar ningun preescaler porque veo solo la rutina de interrupcion y no la configuracion del timer; sin preescaler debiste ajustar los PR2 y 3 en:

 0x16E3600  lo que es igual a  PR2 = 0x3600h y PR3 = 0x016E


Respecto al cristal de 32KHz ... este cristal es secundario, es decir, este cristal solo se utiliza para el timer de tiempo real y no para la ejecución de instrucciones esto lo hace el cristal primario que es como el que vos utilizas, este timer de tiempo real solo lo incluyen algunos dspic y 24F como opcion para generar aplicaciones como estas haciendo .... 

Lo curioso es porque este cristal es de 32.768kHz, si ves, una la cuenta de un segundo es hasta 32768 lo que en valores hexadecimales es 0x8000h ... osea el generador de 1s se puede implementar con logica discreta (contadores y flipflops) eso simplifica montones en vez de usar comparadores ...

NOTA: no me refiero a montar el reloj con contadores!! ... jajajaja  :D :D

 

 
« Última modificación: 12 de Febrero de 2008, 13:44:53 por blackcat »
Control Automático, DSP & Microcontroladores

Desconectado unoquepasa

  • PIC12
  • **
  • Mensajes: 65
Re: El reloj se atrasa... como lo acelero? Modifico los condensadores de 22pf?
« Respuesta #7 en: 12 de Febrero de 2008, 13:34:32 »
       Señores... soy ESTUPIDO. Pero estupido así con mayúsculas... resulta que se me fue la cabeza y no se porque me puse a calcular los Mhz como si fueran Megabits o algo así.... es decir que calcule que 24Mhz eran 24*2^20... en vez de 24*10^6... ya perdonarán la torpeza  :lol: :lol: :lol: :lol:
       Ahora estoy haciendo pruebas y parece que va bastante bien.

Muchas gracias y un saludo


EDITO: efectivamente blackcat, la cuenta está mal hecha... no son 17f ffff lo que tengo que cargar sino 16E 3600... ¬¬ sorry por haberos hecho perder tiempo ^^
« Última modificación: 12 de Febrero de 2008, 13:37:35 por unoquepasa »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: El reloj se atrasa... como lo acelero? Modifico los condensadores de 22pf?
« Respuesta #8 en: 12 de Febrero de 2008, 13:34:48 »
Además de ajustar lo que te recomienda Blackcat, haz la prueba que te digo del Stopwatch, te vas a sorprender el montón de ciclos que transcurren en estas líneas:
Código: [Seleccionar]
void __attribute__((__interrupt__, __shadow__)) _T3Interrupt(void)
{
TMR2=0x0000;
TMR3=0x0000;
Amigo, el C30 mete basura por todas partes. Si puedes, mira el código ASM de este trozo de código y verás lo que hace.

Desconectado unoquepasa

  • PIC12
  • **
  • Mensajes: 65
Re: El reloj se atrasa... como lo acelero? Modifico los condensadores de 22pf?
« Respuesta #9 en: 12 de Febrero de 2008, 13:41:51 »
Además de ajustar lo que te recomienda Blackcat, haz la prueba que te digo del Stopwatch, te vas a sorprender el montón de ciclos que transcurren en estas líneas:
Código: [Seleccionar]
void __attribute__((__interrupt__, __shadow__)) _T3Interrupt(void)
{
TMR2=0x0000;
TMR3=0x0000;
Amigo, el C30 mete basura por todas partes. Si puedes, mira el código ASM de este trozo de código y verás lo que hace.

    Me interesa saber calcular eso de cuantos ciclos transcurren pero no se como mirarlo exáctamente. Para empezar pongo el cursor en la primera linea de la rutina de interrupción y le digo que ejecute hasta ahí... pero nunca llega a entrar, me sale el running pero no se llega a parar ¿?. No sé si debería programar alguna cosa con el stimulus... pero en realidad no tendría que hacer falta, no? Por otra parte, como puedo mirar en que ciclo de reloj estoy ¿? En la ventana de watch solo me deja ver SFR y variables.

Un saludo

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: El reloj se atrasa... como lo acelero? Modifico los condensadores de 22pf?
« Respuesta #10 en: 12 de Febrero de 2008, 13:48:31 »
 :-/ :-/ :-/ :-/  Que bien .....  :mrgreen: :mrgreen: :mrgreen:

Tranquilidad .. a todos nos pasa ... no hay porque tener verguenza de eso !!
Control Automático, DSP & Microcontroladores

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: El reloj se atrasa... como lo acelero? Modifico los condensadores de 22pf?
« Respuesta #11 en: 12 de Febrero de 2008, 13:56:24 »
Configura MPLAB para utilizar como debugger el MPLAB SIM.
Pon un breakpoint en la línea TMR2=0x0000; y ejecuta tu programa. Cuando llegue ahí debe pararse.
Abre la ventana Stopwatch (ojo, que no es Watch, sino Stopwatch, dentro del menú Debugger).
Especifica los megaherzios en la casilla inferior.
Pulsa el botón Zero para reiniciar los contadores.
Vuelve a darle al play a tu programa. En el siguiente ciclo volverá a pararse en el mismo breakpoint y verás en la casilla uSecs el tiempo transcurrido totalmente exacto.

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
Re: El reloj se atrasa... como lo acelero? Modifico los condensadores de 22pf?
« Respuesta #12 en: 12 de Marzo de 2008, 20:05:31 »
Estoy con nocturno xD el c30 es de todo menos optimo, incluso compilando con optimizacion 3.

Nose, aunque no tengo mucha idea de asm, esta claro que si se ha de aspirar a algo exacto, hay que mirar bien el refmanual sobre la dinamica de las interrupciones, para saber cuantos ciclos exactos malgastamos,y por otra parte muy importante ASM PURO.

un saludo