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???
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);
}
}
}