Autor Tema: Con 4,096 y sigue atrasando  (Leído 7926 veces)

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

Desconectado PabloFiscella

  • PIC16
  • ***
  • Mensajes: 154
Con 4,096 y sigue atrasando
« en: 11 de Diciembre de 2003, 09:41:00 »
Hola a todos:

Acabo de conseguie el cristal de 4,096 y sigue atrasando el reloj estoy usando con el cristal capacitores de 22p puede ser esto o el codigo.
Creo que el codigo esta bien
20 interrupciones
Recarga 56
Preescalar 256

No se que es lo que esta mal?
Adjunto el codigo para ver que esta mal.

Saludos.
Pablo

#include <16F84A.h>

#use delay (clock=4096000)
#fuses XT,NOWDT

byte CONST Display1[] = {0b00010000,0b00010001,0b00010010,0b00010011,0b00010100,0b00010101,0b00010110,0b00010111,0b00011000,0b00011001};
byte CONST Display2[] = {0b00100000,0b00100001,0b00100010,0b00100011,0b00100100,0b00100101,0b00100110,0b00100111,0b00101000,0b00101001};
byte CONST Display3[] = {0b01000000,0b01000001,0b01000010,0b01000011,0b01000100,0b01000101,0b01000110,0b01000111,0b01001000,0b01001001};
byte CONST Display4[] = {0b10000000,0b10000001,0b10000010,0b10000011,0b10000100,0b10000101,0b10000110,0b10000111,0b10001000,0b10001001};

byte segundos1;      // A running seconds counter
byte segundos2;      // A running seconds counter
byte minutos1;      // A running seconds counter
byte minutos2;      // A running seconds counter
byte int_count;    // Number of interrupts left before a second has elapsed

#int_rtcc                          // This function is called every time
clock_isr() {                      // the RTCC (timer0) overflows (255->0).
    if(int_count++==20) { // per milisecond.
      int_count=0;
         segundos1++;
         if(segundos1 == 10) {
            segundos1 = 0;
            segundos2++;
         }
         if(segundos2 == 6) {
            segundos2 = 0;
            minutos1++;
         }
         if(minutos1 == 10) {
            minutos1 = 0;
            minutos2++;
         }
    }
}

void main(void) {
   segundos1 = 0;
   segundos2 = 0;
   minutos1 = 0;
   minutos2 = 0;
   int_count=0;
   set_timer0(56);
   setup_counters( RTCC_INTERNAL, RTCC_DIV_256);
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);

//   set_tris_b(0x0);
   for(; {
      output_b(Display1[segundos1]);
      delay_ms(3);
      output_b(Display2[segundos2]);
      delay_ms(3);
      output_b(Display3[minutos1]);
      delay_ms(3);
      output_b(Display4[minutos2]);
      delay_ms(3);
   }
}


Desconectado cucaracha

  • PIC24H
  • ******
  • Mensajes: 1409
    • CUCAWEB
RE: Con 4,096 y sigue atrasando
« Respuesta #1 en: 11 de Diciembre de 2003, 10:14:00 »
Prueba a poner esto "set_timer0(56);" cada vez que entre en la rutina de servicio a la interrupción del timer, antes del primer if.

Saludos!
Saludos desde Huelva (ESPAÑA)

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Con 4,096 y sigue atrasando
« Respuesta #2 en: 11 de Diciembre de 2003, 13:53:00 »
Hola Cuca, ya estoy aquí para hacerte compañía.

Pablo como bien dice Cuca, te has olvidado recargar el TMR0 cada vez que se desborda.

La recarga debe hacerse al entrar en la rutina de atención a la interrupción (primera línea de esta), de esa forma el tiempo empieza a contar a partir de ahora.

Un saludo

Desconectado PabloFiscella

  • PIC16
  • ***
  • Mensajes: 154
RE: Con 4,096 y sigue atrasando
« Respuesta #3 en: 12 de Diciembre de 2003, 06:10:00 »
Excelente. Muchas gracias.
Habia otro error que era que estaba sumando despues y no antes y contaba 21 interrupciones.

Muchas gracias.
Pablo

Desconectado cucaracha

  • PIC24H
  • ******
  • Mensajes: 1409
    • CUCAWEB
RE: Con 4,096 y sigue atrasando
« Respuesta #4 en: 12 de Diciembre de 2003, 06:37:00 »
Funciona ya?? Consigues la precisión que querías...

Me alegro mucho, Pablo!!

Saludos!!
Saludos desde Huelva (ESPAÑA)

Desconectado pikman

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 682
RE: Con 4,096 y sigue atrasando
« Respuesta #5 en: 12 de Diciembre de 2003, 18:54:00 »
Bueno, puedo aportar una solucion mas al tema del tiempo real, lo que yo hice fue independizar el reloj de maquina con el de tiempo real, de manera muy sencilla y practica, ademas no carga la maquina.

Lo que hice fue hacer un oscilador de 32.768 Khz, este cristal es comun de cualquier reloj electronico,  para conseguir la señal cuadrada use un 74hc06 que es un esquema muy popular para construir un oscilador, bien la salida de este oscilador la conectamos a ra4 y programar el timr0 para que se imcremente con esta señal, programar el prescalador del tmr0 en 128 con esto conseguiran una interrupcion del timer cada 1 segundo exacto, y la mauina puede correr a 20 mhz si asi lo desean, el tiempo que puede consumir esta operacion puede ser sin importancia es una solucion economica y de facil adquisicion, bueno espero que les sirva mi experiencia.

saludos

Ariel
saludos
PikMan

Desconectado pacalaconcurso

  • PIC24F
  • *****
  • Mensajes: 718
RE: Con 4,096 y sigue atrasando
« Respuesta #6 en: 13 de Diciembre de 2003, 04:37:00 »
Ummmhhh... una solucion elegante Ariel

Desconectado PabloFiscella

  • PIC16
  • ***
  • Mensajes: 154
RE: Con 4,096 y sigue atrasando
« Respuesta #7 en: 17 de Diciembre de 2003, 07:58:00 »
Hola a todos:

He probado con el cristal de 4 y con el de 4,096 y sigue atrasando.
En este momento estoy probando con el de 4,096 y atrasa aprox 1 segundo por hora.
Pero los displays parpadean cada algunos de seg. y creo que esto puede estar retrasandolo.
El circuito es con 4 displays de 8 segmentos con un 4511 y accionados mediante transistores 3904 con unos resistencias de 4,7k en las bases.
El cristal tiene dos cap. de 22pf.
La alimentacion al circuito es de 5v.

Si alguien sabe porque se puede producir este parpadeo y posterior retraso comentenmelo.

Muchas gracias.
Pablo.

Desconectado PabloFiscella

  • PIC16
  • ***
  • Mensajes: 154
RE: Con 4,096 y sigue atrasando
« Respuesta #8 en: 17 de Diciembre de 2003, 08:18:00 »
Escrito originalmente por PabloFiscella
Hola a todos:

He probado con el cristal de 4 y con el de 4,096 y sigue atrasando.
En este momento estoy probando con el de 4,096 y atrasa aprox 1 segundo por hora.
Pero los displays parpadean cada algunos de seg. y creo que esto puede estar retrasandolo.
El circuito es con 4 displays de 8 segmentos con un 4511 y accionados mediante transistores 3904 con unos resistencias de 4,7k en las bases.
El cristal tiene dos cap. de 22pf.
La alimentacion al circuito es de 5v.

Si alguien sabe porque se puede producir este parpadeo y posterior retraso comentenmelo.

Muchas gracias.
Pablo.



Lo probe con y sin los capacitores del cristal.
Resultado:
con capacitores de 22pf retrasa 1 seg en 15 minutos
sin capacitores solo con el cristal retrasa 1 seg en aprox 1 hora
Ahora entiendo menos. En ambos casos sigue parpadeando.

Desconectado cucaracha

  • PIC24H
  • ******
  • Mensajes: 1409
    • CUCAWEB
RE: Con 4,096 y sigue atrasando
« Respuesta #9 en: 17 de Diciembre de 2003, 08:32:00 »
No se si en el código que tienes ahora desactivas la interrupción global al entrar en la rutina de servicio de la interrupción del timer. Se debe de hacer, así que prueba con eso.
Y pon los condensadores de 22pF!!

Saludos!!
Saludos desde Huelva (ESPAÑA)

Desconectado PabloFiscella

  • PIC16
  • ***
  • Mensajes: 154
RE: Con 4,096 y sigue atrasando
« Respuesta #10 en: 17 de Diciembre de 2003, 08:59:00 »
Al entrar desabilito la interrupcion global y antes de salir la vuelvo a habilitar.

Desconectado cucaracha

  • PIC24H
  • ******
  • Mensajes: 1409
    • CUCAWEB
RE: Con 4,096 y sigue atrasando
« Respuesta #11 en: 17 de Diciembre de 2003, 09:40:00 »
Creo que lo mejor es que dejes el programa y así lo podemos ver todos y será más fácil descubrir donde puede estar el fallo.

Saludos!!
Saludos desde Huelva (ESPAÑA)

Desconectado PabloFiscella

  • PIC16
  • ***
  • Mensajes: 154
RE: Con 4,096 y sigue atrasando
« Respuesta #12 en: 17 de Diciembre de 2003, 10:03:00 »
#include <16F84A.h>

#use delay (clock=4096000)
#fuses XT,NOWDT

byte CONST Display1[] = {0b00010000,0b00010001,0b00010010,0b00010011,0b00010100,0b00010101,0b00010110,0b00010111,0b00011000,0b00011001};
byte CONST Display2[] = {0b00100000,0b00100001,0b00100010,0b00100011,0b00100100,0b00100101,0b00100110,0b00100111,0b00101000,0b00101001};
byte CONST Display3[] = {0b01000000,0b01000001,0b01000010,0b01000011,0b01000100,0b01000101,0b01000110,0b01000111,0b01001000,0b01001001};
byte CONST Display4[] = {0b10000000,0b10000001,0b10000010,0b10000011,0b10000100,0b10000101,0b10000110,0b10000111,0b10001000,0b10001001};
byte Digito[8];

byte segundos;      // A running seconds counter
byte minutos;      // A running seconds counter
byte horas;      // A running seconds counter
byte int_count;    // Number of interrupts left before a second has elapsed
int l_digit, h_digit;

bin2bcd(int valor)                              //rutina para convertir a BCD
{
   h_digit=0;

   if (valor>=10)
      {  do
         {  valor-=10;
            h_digit++; }
       while (valor>=10);   }

   l_digit=valor;
}


#int_rtcc                          // This function is called every time
clock_isr() {
   disable_interrupts(GLOBAL);                     // the RTCC (timer0) overflows (255->0).
    set_rtcc(56);
    int_count--;
    if(int_count==0) { // per milisecond.
      int_count=20;
      segundos++;
      if(segundos == 60) {
         segundos = 0;
         minutos++;
      }
      if(minutos == 60) {
         minutos = 0;
         horas++;
      }
      if (horas>=24) horas=0;

//         bin2bcd(horas);
//         digito[0]=display[h_digit];                  //decena de la hora
//         digito[1]=display[l_digit];                  //unidad de la hora

         bin2bcd(minutos);
//         digito[2]=display4[h_digit];                  //decena de los minutos
         digito[3]=display4[l_digit];                  //unidad de los minutos

         bin2bcd(segundos);
         digito[4]=display3[h_digit];                  //decena de los segundos
         digito[5]=display2[l_digit];                  //unidad de los segundos

    }
    enable_interrupts(GLOBAL);
}

void main(void) {
   segundos = 0;
   minutos = 0;
   horas = 0;
   int_count=20;
   setup_counters( RTCC_INTERNAL, RTCC_DIV_256);
   set_rtcc(56);
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);

   set_tris_a(0x00);                            //port a y port b como salidas
   set_tris_b(0x00);
//   Digito[2] = Display5;
   Digito[3] = Display4[0];
   Digito[4] = Display3[0];
   Digito[5] = Display2[0];
   for(; {
      output_b(Digito[2]);
      delay_ms(1);
      output_low(PIN_B4);
      output_low(PIN_B5);
      output_low(PIN_B6);
      output_low(PIN_B7);

      output_b(Digito[3]);
      delay_ms(1);
      output_low(PIN_B4);
      output_low(PIN_B5);
      output_low(PIN_B6);
      output_low(PIN_B7);

      output_b(Digito[4]);
      delay_ms(1);
      output_low(PIN_B4);
      output_low(PIN_B5);
      output_low(PIN_B6);
      output_low(PIN_B7);

      output_b(Digito[5]);
      delay_ms(1);
      output_low(PIN_B4);
      output_low(PIN_B5);
      output_low(PIN_B6);
      output_low(PIN_B7);
   }
}

Desconectado PabloFiscella

  • PIC16
  • ***
  • Mensajes: 154
RE: Con 4,096 y sigue atrasando
« Respuesta #13 en: 17 de Diciembre de 2003, 11:24:00 »
Lo del parpadeo lo solucione bajando los tiempos entre los displays. Pero sigue atrasando.

Saludos.
Pablo

Desconectado cucaracha

  • PIC24H
  • ******
  • Mensajes: 1409
    • CUCAWEB
RE: Con 4,096 y sigue atrasando
« Respuesta #14 en: 17 de Diciembre de 2003, 13:33:00 »
Aunque no tiene nada que ver con lo que dices...
Cuando pones al final del programa:

output_low(PIN_B4);
output_low(PIN_B5);
output_low(PIN_B6);
output_low(PIN_B7);


Esto lo repites 4 veces. Donde está la multiplexación. En cada uno de las cuatro veces que se repite esto tendría que estar a nivel alto uno, que sería el que se enciende. No?
Es este el programa que estás probando probado??
Dices que se te encienden los displays???

Saludos!
Saludos desde Huelva (ESPAÑA)