Autor Tema: Ayuda con PIC16f877a y ds1307  (Leído 2259 veces)

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

Desconectado Ucevista

  • PIC10
  • *
  • Mensajes: 4
Ayuda con PIC16f877a y ds1307
« en: 30 de Agosto de 2010, 16:50:41 »
Buenas tardes! Soy nuevo en el foro y pues primeramente felicito a las personas que hacen posible la existencia de este foro pues, gracias a todos cada día existen más personas que se inician en el amplio mundo de la electrónica y más en lo fabuloso que son los PIC's, sigan trabajando así!

Ahora bien les explico: me encuentro desarrollando mi trabajo de grado y una de las cosas que pretendo anexar al mismo es un reloj basado en un ds1307, cuya hora y fecha la puedo modificar por medio de tres pulsadores, uno de selección, el otro de menú y el ultimo para edición de los números, valores que muestro en una pantalla lcd 16x2 conectada al puerto B del pic (claro este luego lo pasaré al puerto D); que sucede? bueno pasa que luego de cierto tiempo el reloj comienza a mostrar valores ilógicos y no tengo idea del por que sucederá eso.

Si alguien por favor podría decirme por que sucede esto???  :shock: se lo agradecería muchísimo!

Aquí dejo mi código:

#include <16f877a.h>
#use delay (clock=4000000)
#fuses xt,noput,nolvp,noprotect,nowdt
#use i2c (master, sda=pin_c4, scl=pin_c3)
#include <ds1307.c>
#define use_portb_lcd
#include <lcd.c>
#use fast_io(A)
#use fast_io(B)
#use standard_io(C)
/**************************************************************************
* Variables Globales
**************************************************************************/
int dia, mes, a_o, hor, min, seg, m, j=0;
/**************************************************************************
* Inicializa el bus i2c
**************************************************************************/
void init_i2c_bus(void)
{output_float(PIN_C3);
 output_float(PIN_C4);
}

 enum funciones{cal,ini};
 
void calibrar(void){
  m=1;
  
  while (m==1){
   while (input(PIN_A2)==1)
   {  delay_ms(300);
      output_high(PIN_C0);
      delay_ms(100);
      output_low(PIN_C0);
      j++;
   }
       if(j>=60){j=0;}                      
          seg = gca_ds1307_regs[0] = j;
          printf(lcd_putc,"\fFecha:%02d/%02d/20%02d" dia,mes,a_o );
          printf(lcd_putc,"\nHora: %02d:%02d:%02d "hor,min,seg);
          delay_ms(200);
    
       if (input(PIN_A0)==1)
       { delay_ms(300);
         m++; j=0;
         output_high(PIN_C1);
         delay_ms(100);
         output_low(PIN_C1);
       }
              }
  
  
  while (m==2){
   while (input(PIN_A2)==1)
     {delay_ms(300);
      output_high(PIN_C0);
      delay_ms(100);
      output_low(PIN_C0);
      j++;
     }
    
     if(j>=60){j=0;}

       min = gca_ds1307_regs[1] = j;
       printf(lcd_putc,"\fFecha:%02d/%02d/20%02d" dia,mes,a_o );
       printf(lcd_putc,"\nHora: %02d:%02d:%02d "hor,min,seg);
       delay_ms(200);

    if (input(PIN_A0)==1)
       { delay_ms(300);
         m++;  j=0;
         output_high(PIN_C1);
         delay_ms(100);
         output_low(PIN_C1);
       }
               }
            
            
  while (m==3){
   while (input(PIN_A2)==1)
     {delay_ms(300);
      output_high(PIN_C0);
      delay_ms(100);
      output_low(PIN_C0);
      j++;
     }
    
    if(j>23){j=0;}
    
      hor = gca_ds1307_regs[2] = j;
      printf(lcd_putc,"\fFecha:%02d/%02d/20%02d" dia,mes,a_o );
      printf(lcd_putc,"\nHora: %02d:%02d:%02d" hor,min,seg);
      delay_ms(200);

    if (input(PIN_A0)==1)
       {delay_ms(300);
        m++;  j=0;
        output_high(PIN_C1);
        delay_ms(100);
        output_low(PIN_C1);
       }
              }
        

  while (m==4){
   while (input(PIN_A2)==1)
     {delay_ms(300);
      output_high(PIN_C0);
      delay_ms(100);
      output_low(PIN_C0);
      j++;
     }
      
      a_o = gca_ds1307_regs[6] = j;
      printf(lcd_putc,"\fFecha:%02d/%02d/20%02d" dia,mes,a_o);
      printf(lcd_putc,"\nHora: %02d:%02d:%02d "hor,min,seg);
      delay_ms(200);

    if (input(PIN_A0)==1)
       {delay_ms(300);
        m++; j=1;
        output_high(PIN_C1);
        delay_ms(100);
        output_low(PIN_C1);
       }
              }
              

  while (m==5){
   while (input(PIN_A2)==1)
     {delay_ms(300);
      output_high(PIN_C0);
      delay_ms(100);
      output_low(PIN_C0);
      j++;
     }
     if(j>12){j=1;}

      mes = gca_ds1307_regs[5] = j;
      printf(lcd_putc,"\fFecha:%02d/%02d/20%02d" dia,mes,a_o );
      printf(lcd_putc,"\nHora: %02d:%02d:%02d "hor,min,seg);
      delay_ms(200);

    if (input(PIN_A0)==1)
       {delay_ms(300);
        m++;  j=1;
        output_high(PIN_C1);
        delay_ms(100);
        output_low(PIN_C1);
        }
       }
      
      
  while (m==6){
   while (input(PIN_A2)==1)
       {delay_ms(300);
        output_high(PIN_C0);
        delay_ms(100);
        output_low(PIN_C0);
        j++;
       }
     if (((mes == 2) && (j>28) && ((a_o%4!=0))) || ((mes == 2) && (j>29) && (a_o%4==0))){j=1;} else
      if ((mes==4||mes==6||mes==9||mes==11) && (j>30)){j=1;} else
       if(j>31){j=1;}

        dia = gca_ds1307_regs[4] = j;
        printf(lcd_putc,"\fFecha:%02d/%02d/20%02d" dia,mes,a_o );
        printf(lcd_putc,"\nHora: %02d:%02d:%02d" hor,min,seg);
        delay_ms(200);
  
    if (input(PIN_A0)==1)
       {delay_ms(300);
        m++;  j=0;
        ds1307_set_date_time();
        lcd_putc('\f');
       }
             }      
}


void inicializar(void){
   while (true)
   {delay_ms(1000);
    ds1307_read_date_time();
    seg = gca_ds1307_regs[0];
    min = gca_ds1307_regs[1];
    hor = gca_ds1307_regs[2];
    dia = gca_ds1307_regs[4];
    mes = gca_ds1307_regs[5];
    a_o = gca_ds1307_regs[6];
    printf(lcd_putc,"\fFecha:%02d/%02d/20%02d" dia,mes,a_o );
    printf(lcd_putc,"\nHora: %02d:%02d:%02d "hor,min,seg);
   }
}


void run_func(int numfunc)
{
  switch(numfunc){
    case cal:
       calibrar();
       break;
    case ini:
       inicializar();
       break;
                 }
}


void main() {
   char item;
   char n_menus=2;
   lcd_init();
   delay_ms(2000);
   init_i2c_bus();
   ds1307_init();

    while (true){
      if (input(PIN_A0)==1)
        {item++;
         delay_ms(300);
         lcd_putc('\f');
        }
      if (item > (n_menus-1))
        {item=0;
        }
        
      switch (item){
        
        case 0:
          lcd_gotoxy(5,1);
          printf(lcd_putc, "CALIBRAR");
          lcd_gotoxy(5,1);
          break;
          
        case 1:
          lcd_gotoxy(3,1);
          printf(lcd_putc, "INICIALIZAR");
          lcd_gotoxy(3,1);
          break;
                   }
                  
        if (input(PIN_A1)==1)
          {delay_ms(200);
           run_func(item);
          }
                     }
}
« Última modificación: 30 de Agosto de 2010, 17:08:07 por Ucevista »

Desconectado pigma

  • PIC10
  • *
  • Mensajes: 19
Re: Ayuda con PIC16f877a y ds1307
« Respuesta #1 en: 30 de Agosto de 2010, 17:14:51 »
Hola, yo tambien estoy aprendiendo pero al parecer puede ser problema de "ruido" si trabaja bien y de pronto se pone "loco".
Verifica que el microcontrolador tenga todos los componentes basico y que tu fuente de alimentacion este debidamente regulada. Tambien verifica si es que falla asi nada mas o si es al apretar un boton, ya que a veces si no tiene un circuito antirrebote, produce muchas fallas.

Desconectado Ucevista

  • PIC10
  • *
  • Mensajes: 4
Re: Ayuda con PIC16f877a y ds1307
« Respuesta #2 en: 01 de Septiembre de 2010, 11:22:55 »
Hola! gracias por responderme y pues la verdad aun no lo he montado físicamente (cosa que debería hacer para verificar bien eso), pero al presionar los pulsadores no me arroja error alguno, el problema se da luego de algunos minutos de iniciado el reloj, verifique bien las conexiones y pues quizá sea algún error del proteus, seguiré tratando para ver cual será el problema y luego ver el siguiente problema que tengo al colocarlo junto a la otra parte de programación que tengo... pero bue... ahí voy, tan fácil no podía ser no!  :mrgreen:

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Ayuda con PIC16f877a y ds1307
« Respuesta #3 en: 01 de Septiembre de 2010, 12:12:46 »
Hola amigos, acá les dejo este ejemplo, espero les aporte en algo.

saludos.

Desconectado Ucevista

  • PIC10
  • *
  • Mensajes: 4
Re: Ayuda con PIC16f877a y ds1307
« Respuesta #4 en: 01 de Septiembre de 2010, 13:39:42 »
Oye muy bueno tu código Diego, solo que uso ccs para que así el código no se vea tan extenso a la hora de colocarlo en el tomo de la tesis; mi código presenta el problema minutos después de iniciado pero no se si el error es por programación o si bien es por error del proteus... eh ahí mi problema, aquí adjunto esa parte del proyecto para quienes me quieran ayudar a dar con el error. De igual manera gracias Diego, aprecio la ayuda.

Desconectado Ucevista

  • PIC10
  • *
  • Mensajes: 4
Re: Ayuda con PIC16f877a y ds1307
« Respuesta #5 en: 21 de Octubre de 2010, 15:09:24 »
Buenas tardes!

Aquí se me ha presentado una nueva duda respecto a las cosas que quiero agregarle a mi proyecto, explico lo que quiero hacer:

Estar inicialmente en un menú que al seleccionar "CODIGO" este muestre en la lcd un nuevo menú en el cual el usuario ingrese primeramente un piso, y que posteriormente ingrese un código para el acceso de ese piso; dicho código quiero que sea almacenado en la memoria interna del pic para que de esta manera pueda ingresarse a este menú más adelante.

Seguidamente entrar en el menú para inicio el cual sólo pedirá (por el momento) el piso y el respectivo código para su acceso, que lo que realmente realiza es leer y comparar la data de entrada con la que previamente fue almacenada en la memoria del pic.

Realice este programa buscando que realizara lo descrito previamente pero no me funciona... si alguien podría revisarlo y pues brindarme ayuda se lo agradecería mucho.

Aquí les dejo el código y la simulación en proteus.


 

anything