Autor Tema: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(  (Leído 7181 veces)

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

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(
« Respuesta #30 en: 15 de Octubre de 2009, 11:15:28 »
 :shock: El cristal es de 32768 Hz, osea que el timer contará 32768 pulsos por segundo, y como es de 16bits, el desbordamiento ocurre a 216=65536, osea que deben pasar 2 segundos  :mrgreen:

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(
« Respuesta #31 en: 15 de Octubre de 2009, 11:31:47 »
Si Suki, tienes razón, es evidente que hoy ando confundi'o

Desconectado Trev

  • PIC16
  • ***
  • Mensajes: 115
Re: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(
« Respuesta #32 en: 15 de Octubre de 2009, 13:56:24 »
Ya esta amigos no se peleen mas por el timer1 que no da para mas el asunto no pude eliminar el adelantamiento es mejor pasar al timer2 y asi no depender de un cristal que evidentemente no son de confianza,hoy si puedo subo el ejemplo terminado,nos vemos  :)

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(
« Respuesta #33 en: 15 de Octubre de 2009, 14:32:07 »
Nunca nos peleamos! Todo es para ir aprendiendo un poquito cada día. Es lo bueno del foro que todos aportan sin ningún interés tratando de resolver el problema  ;-)

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Trev

  • PIC16
  • ***
  • Mensajes: 115
Re: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(
« Respuesta #34 en: 15 de Octubre de 2009, 14:39:34 »
Me confundí parece que Nocturno habla como si el timer 2 fuera un contador con cristal externo ¿pero como se configura? la ayuda no dice nada o estamos los dos confundidos?  :?

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(
« Respuesta #35 en: 15 de Octubre de 2009, 14:45:10 »
Yo hice un reloj con TIMER1 que funcionó durante dos meses sin interrupción y no se adelantó ni atrasó (al menos sisiblemente). Claro, utilicé TIMER1+CCP. Si quieres me das un correo y mañana cuando pase por la casa te mando el proyecto completo. Está en hecho C de CCS y hay simulación para Proteus.

saludos
Reinier

Desconectado fidodido18

  • PIC18
  • ****
  • Mensajes: 312
Re: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(
« Respuesta #36 en: 17 de Octubre de 2009, 02:12:02 »
Yo hice un reloj con TIMER1 que funcionó durante dos meses sin interrupción y no se adelantó ni atrasó (al menos sisiblemente). Claro, utilicé TIMER1+CCP. Si quieres me das un correo y mañana cuando pase por la casa te mando el proyecto completo. Está en hecho C de CCS y hay simulación para Proteus.

saludos
Reinier

Hola amigo mejor subelo al foro, para que cuando alguien presente este mismo problema sepa como solucionarlo! y asi no te tenga que mandar un MP para que tambien le reenvies el documento....

Respecto al tema siempre me he dado cuenta que proteus es una cosa muy distinta simulando en C, a veces coincide pero cuando el tiempo es muy importante casi nunca es exacta, y lo he comprobado! los erros son en msegundos, con osciloscopio de laboratorios especializados de la U y computador core 2 duo 2 gigas de ram y un pwm.

Conclusion si tienes un osciloscopio a la mano trata de ver ese pulso y sales de duda.

Otra es volver a ASM  :? (ya hasta se me olvido pasar de banco :mrgreen:) y controlar esas instrucciones al maximo.

pero estoy casi completamente seguro que el error esta en codigo..

Desconectado Trev

  • PIC16
  • ***
  • Mensajes: 115
Re: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(
« Respuesta #37 en: 12 de Noviembre de 2009, 20:02:56 »
Hola,despues de un tiempo se pudo solucionar el problema no habia ningún error en el programa ni en el proteus,era el maldito cristal y la protoboard,cambié todo de lugar y pasado 1 dia de prueba no adelanta ni atrasa ni un minuto,tambien modifique el programa para eliminar la precarga del timer1 con el módulo CCP en modo captura,en fin solucionado  :-/

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(
« Respuesta #38 en: 12 de Noviembre de 2009, 22:38:56 »
jeje no pude ver el cristal!!

La idea es que el cristal de 32k768Hz este lo mas cerca posible a los pines correspondientes a T1OSO y T1OSI y que de ellos salgan los condensadores de 33pF a GND. Otra recomendación es el anillo de GND al rededor de los pines del oscilador. Hay veces que las proto nos juegan malas pasadas con los cristales -a mi también me ha pasado-

Me lo imaginaba ... es que las protoboard a veces dan malas pasadas.

Que bueno que ya este bien.

Saludos
El papel lo aguanta todo

Desconectado Trev

  • PIC16
  • ***
  • Mensajes: 115
Re: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(
« Respuesta #39 en: 13 de Noviembre de 2009, 00:16:45 »
Citar
Y respecto a que en Proteus no se vea ese efecto puede ser por dos razones:
- sólo tienes precisión de 4 decimales. Si hubiera un error de 99 microsegundos no lo verías
- no es la primera vez que Proteus falla


Si MLO yo confiaba en el proteus y no me falló eso es lo mejor de esto es bueno poder confiar en el sino todo se vuelve muy entropico,hay q dudar primero del harware antes del proteus,nos vemos y ahora me gustaría agregarle una función de alarma cuando tenga tiempo,nos vemos  :-/ aca dejo el código definitivo

Código: [Seleccionar]


#use delay(clock=20000000)
#fuses HS,PUT,NOPROTECT,NOWDT,NOLVP
#byte portb= 6
#byte portc= 7
#byte portd= 8
#include <flex_lcd.c>
#use standard_io(b,c)
//#use fast_io(b)

#define SEGUNDOS_EN_UNA_HORA 3600
#define SEGUNDOS_EN_UN_MINUTO 60


int32 Conta_Segundos=0,MomentoActual=0;
int32 Horas=0,Minutos=0,Segundos=0;
int set,flag_timer1;
byte last_b;

void Mi_Hora(void);
void Cambiar_Hora(int32 *Horas,int32 *Minutos);
void reset(void)
{
Conta_Segundos=0;
Momentoactual=0;
}

#INT_CCP1
CCP1_rsi()
{
Conta_Segundos+=1;
Mi_Hora();
lcd_gotoxy(6,1);
printf(lcd_putc,"%02ld:%02ld:%02ld    ",Horas,Minutos,Segundos);
}


#INT_RB
rb_isr()
{
    byte changes;
    changes=last_b^portb;       //XOR.
    last_b=portb;
    if (bit_test(changes,5) && !bit_test(last_b,5))
    {                                                     
         lcd_gotoxy(6,2);
         lcd_putc("..              ");    //Indica que se va a incrementar las horas.
         delay_ms(200);
         lcd_gotoxy(6,2);
         lcd_putc("                ");
         delay_ms(200);
         lcd_gotoxy(6,2);
         lcd_putc("..              ");
         if(set==1)
         {
         lcd_gotoxy(1,2);
         lcd_putc("        ..      ");   // Indica que se van a incrementar los minutos
         delay_ms(250);
         lcd_gotoxy(1,2);
         lcd_putc("                ");
         delay_ms(250);
         lcd_gotoxy(1,2);
         lcd_putc("        ..      ");
         }
         set+=1;
         if (set==2)
         set=0;   
    }
    if (bit_test(changes,6) && !bit_test (last_b,6))   //INCREMENTAR.
    {
    Cambiar_hora(&Horas,&Minutos);
    }
    if (bit_test(changes,7) && !bit_test (last_b,7))   //DECREMENTAR.
    {
    Cambiar_hora(&Horas,&Minutos);       
    }
    Conta_Segundos=(Minutos*60)+(Horas*3600)+Segundos;
    portb=0x00;
    lcd_gotoxy(6,1);
    printf(lcd_putc,"%02ld:%02ld:%02ld    ",Horas,Minutos,Segundos);
    delay_ms(10);
    set_timer1(0);
}


// Programa Principal /////////////////////////////////////////////////////////
   
void  Mi_Hora()
      {
      MomentoActual=Conta_Segundos;
      Horas=MomentoActual/SEGUNDOS_EN_UNA_HORA;
      MomentoActual%=SEGUNDOS_EN_UNA_HORA;               //Guarda el resto de la división entera.
      Minutos=MomentoActual/SEGUNDOS_EN_UN_MINUTO; 
      MomentoActual%=SEGUNDOS_EN_UN_MINUTO;   
      Segundos=MomentoActual;
      if(Horas==24 && Minutos==0 && Segundos==0)
      {
      Horas=0;
      Minutos=0;
      Segundos=0;
      reset();
      }
      }
     
void Cambiar_hora(int32 *Horas,int32 *Minutos)
{
if(set==0)
   {
      if(portb==0b10110000)
      {
      ++*Minutos;
      if(*Minutos==60){*Minutos=0;}
      }
   }
if(set==1)
   {
      if(portb==0b10110000)
      {
      ++*Horas;
      if(*Horas==24){*Horas=0;}
      }
   }
if(set==0)
   {
      if(portb==0b01110000)
      {
      if(*Minutos==0){*Minutos=60;}
      --*Minutos;
      }
   }   
if(set==1)
   {
      if(portb==0b01110000)
      {
      if(*Horas==0){*Horas=24;}
      --*Horas;
      }
   }   
}     
       
void  main(void)
      {
      lcd_init();
      set_tris_b(0xf0);
      port_b_pullups(TRUE);
      portb=0xf0;
      enable_interrupts(INT_RB);
      enable_interrupts(GLOBAL);
      set_tris_c(0b00000011);
      set_tris_d(0x00);
      lcd_gotoxy(1,1);
      lcd_putc("Reloj Digital");
      delay_ms(1500);
      lcd_putc("\fHora 00:00:00 ");
      lcd_gotoxy(1,2);
      lcd_putc("        ..      ");
      delay_ms(250);
      lcd_gotoxy(1,2);
      lcd_putc("                ");
      delay_ms(250);
      lcd_gotoxy(1,2);
      lcd_putc("        ..      ");
      delay_ms(250);
      setup_timer_1(T1_EXTERNAL |T1_DIV_BY_1 |T1_CLK_OUT);
      enable_interrupts(INT_CCP1);
      setup_ccp1(CCP_COMPARE_RESET_TIMER);
      CCP_1=32768;
         while(1)
         {
         
         }
       }
       
       
       
       
       
       

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(
« Respuesta #40 en: 13 de Noviembre de 2009, 02:33:57 »
Me alegro que lo hayas resuelto.
Pero no confíes en Proteus 100% aunque en esta ocasión te haya dado la razón, falla mucho.

Desconectado Trev

  • PIC16
  • ***
  • Mensajes: 115
Re: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(
« Respuesta #41 en: 13 de Noviembre de 2009, 15:43:59 »
Ok Nocturno seria bueno q abras un hilo sobre eso asi nos prevenimos,gracias por tu aporte ahh y los otros dias q nos quedamos sin este foro andube chusmeando por tu pagina esta buena, Salu2   ;-)

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(
« Respuesta #42 en: 13 de Noviembre de 2009, 18:29:36 »
Juraría que había un hilo abierto en el que se publicaron los principales errores detectados, pero lo he estado buscando y no lo encuentro.
Gracias por lo de la página.

Desconectado Trev

  • PIC16
  • ***
  • Mensajes: 115
Re: Reloj maldito:adelanta,adelanta y vuelve a adelantar :(
« Respuesta #43 en: 23 de Noviembre de 2009, 19:42:14 »
Y que tal es el HT1380?me lo acabo de comprar tenia intenciones de usar un DS3232 pero fue imposible conseguirlo  :5] alguien ha usado este chip estaria piola q me contaran sus experiencias mientras estoy aprendiendo i2c q no se nada pero si alguno lo ha usado me gustaria saber q onda,bye