pq no usas una libreria??? prueba con esta, comparando veras el fallo
void escribir_ds1307(unsigned int8 direccion, unsigned int8 val);
void leer_ds1307(void);
unsigned int8 bin2bcd(unsigned int8 valor_binario);
unsigned int8 bcd2bin(unsigned int8 valor_bcd);
// direcciones para leer/escribir al reloj
#define escribir_ds1307_cmd 0xd0
#define leer_ds1307_cmd 0xd1
// registros del ds1307
#define segundos 0
#define minutos 1
#define horas 2
#define dia_semana 3
#define dias 4
#define meses 5
#define anios 6
#define registro_de_control 7
// indice del array global que contiene los registros del reloj
#define DS1307_DATE_TIME_BYTE_COUNT 7
//para escribir en la memoria del reloj
#define DS1307_NVRAM_START_ADDR 8
// Con este valor desactivamos la señal de salida por el pin SQW
// porque consume mucha bateria si está activada.
#define DS1307_CONTROL_REG_INIT_VALUE 0x80
// 32.768 KHz para activar esta frecuencia de salida
//#define DS1307_CONTROL_REG_INIT_VALUE 0x13
//--------------------------------------------------------------------------
// GLOBAL VARIABLES
// Esta es la variable global donde irán almacenados los registros del reloj
//char registros_ds1307[DS1307_DATE_TIME_BYTE_COUNT];
unsigned int8 registros_ds1307[registro_de_control];
void escribir_ds1307(unsigned int8 direccion, unsigned int8 val)
{
disable_interrupts(GLOBAL);
val = bin2bcd(val);
i2c_start();
i2c_write(escribir_ds1307_cmd);
i2c_write(direccion);
i2c_write(val);
// i2c_write(DS1307_CONTROL_REG_INIT_VALUE);
i2c_stop();
enable_interrupts(GLOBAL);
}
//----------------------------------------------------------------------
// Leer fecha y hora
// los registros del reloj están en este orden...
// y en bcd
// DS1307_SECONDS_REG_ADDR 0
// DS1307_MINUTES_REG_ADDR 1
// DS1307_HOURS_REG_ADDR 2
// DS1307_DAY_OF_WEEK_REG_ADDR 3
// DS1307_DATE_REG_ADDR 4
// DS1307_MONTH_REG_ADDR 5
// DS1307_YEAR_REG_ADDR 6
// seconds // 0-59 seconds
// minutes // 0-59 minutes
// hours // 0-23 hours
// day_of_week // 1-7
// date // 1-31 date
// month // 1-12 month
// year // 00-99 year (based on year 2000)
void leer_ds1307(void)
{
// char i;
unsigned int8 i;
// disable_interrupts(GLOBAL);
i2c_start();
i2c_write(escribir_ds1307_cmd);
// empezamos leyendo los segundos
i2c_write(segundos);
i2c_start();
i2c_write(leer_ds1307_cmd);
// leemos los 7 bytes restantes. hacemos mascaras para los bits que no usamos
registros_ds1307[segundos] = i2c_read() & 0x7f;
registros_ds1307[minutos] = i2c_read() & 0x7f;
registros_ds1307[horas] = i2c_read() & 0x3f;
registros_ds1307[dia_semana] = i2c_read() & 0x07;
registros_ds1307[dias] = i2c_read() & 0x3f;
registros_ds1307[meses] = i2c_read() & 0x1f;
registros_ds1307[anios] = i2c_read(0);
i2c_stop();
// enable_interrupts(GLOBAL);
// convertimos de bcd a binario
for(i = 0; i < 7; i++)
{
registros_ds1307
= bcd2bin(registros_ds1307);
}
}
/*
//------------------------------------------------------------------------
// funcion para leer en un registro de la memoria que trae incorporada el reloj
//char leer_byte_ds1307(char direccion)
unsigned int8 leer_byte_ds1307(unsigned int8 direccion)
{
// char retval;
unsigned int8 retval;
disable_interrupts(GLOBAL);
i2c_start();
i2c_write(escribir_ds1307_cmd);
i2c_write(direccion);
i2c_start();
i2c_write(leer_ds1307);
retval = i2c_read(0); // no esperamos por ack
i2c_stop();
enable_interrupts(GLOBAL);
return(retval);
}
*/
//-------------------------------------------------------------
// Esta función convierte de binario a bcd
// Solo de 0 a 99
unsigned int8 bin2bcd(unsigned int8 valor_binario)
{
unsigned int8 temp;
unsigned int8 retval;
temp = valor_binario;
retval = 0;
while(1)
{
// coge las decenas y les resta 10
// para obtener unidades
if(temp >= 10)
{
temp -= 10;
retval += 0x10;
}
else
{
retval += temp;
break;
}
}
return(retval);
}
//--------------------------------------------------------------
// convierte de bcd a binario (0/99)
//char bcd2bin(char valor_bcd)
unsigned int8 bcd2bin(unsigned int8 valor_bcd)
{
unsigned int8 valor_bin;
valor_bin = valor_bcd;
valor_bin >>= 1;
valor_bin &= 0x78;
return(valor_bin + (valor_bin >> 2) + (valor_bcd & 0x0f));
}
main.c
#include <18F2520.h>
#fuses NOWDT, WDT128, XT, NOPROTECT, BROWNOUT, BORV45, NOPUT, NOCPD
#fuses NOSTVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, NOIESO, NOFCMEN, NOPBADEN
#fuses NOWRTC, NOWRTB, NOEBTR, NOEBTRB, NOCPB, NOLPT1OSC, MCLR, NOXINST
#use delay(clock=4000000)
#use i2c(Master, SDA=PIN_A0, SCL=PIN_A1)
#include <lcd.h>
#include <ds1307.h>
void main()
{
port_b_pullups(true);
setup_adc_ports(NO_ANALOGS);
lcd_init();
while(true)
{
leer_ds1307();
delay_ms(1000);
lcd_gotoxy(4,1);
printf(lcd_putc,"%02u:%02u %02u/%02u/%02u",registros_ds1307[horas],registros_ds1307[minutos],registros_ds1307[dias],registros_ds1307[meses],registros_ds1307[anios]);
}
}
con esto deberia fucionar ok
saludos!