Perdonen por el asunto pero ya me tiene un poco loco, llebo toda la mñn con el y no se ni si quiera que puedo estar haciendo mal.
Segun el datasheet, el mapa de memoria de este es tal cual:

Con esto, para guardar/configurar en los registros, por ejemplo yo intentando para probar los segundos, hay que seguir esto:

Y luego para leerlo y tal, esto otro:

Teniendo en cuenta la direccion del periferico en el bus i2c, que cambia segun sea leer o escribir, ¡¡no quiere funcionar!! ![Llorica Llorica]()
Codigo:
#use i2c(master, sda=PIN_C4, scl=PIN_C3, FORCE_HW)
void main(void)
{
int segundos;
lcd_init();
printf(lcd_putc,"fRTC DS1307
"
;
i2c_start();
i2c_write(0xd0);
i2c_write(0);
i2c_write(30);
i2c_stop();
delay_ms(10);
i2c_start();
i2c_write(0xd1);
segundos = i2c_read(0);
i2c_stop();
delay_ms(10);
printf(lcd_putc,"segundos = %d", segundos);
}
Gracias j1m !!
He conseguido hacerlo andar antes de leer tu post
pero de todas formas muchisimas gracias por la colaboración
, en el codigo que he encontrado por los foros (uno de tantos, pero solo andaba este, otros ni compilaban) no convierte nada a BCD ni viceversa, es lo que no comprendo y funciona muy bien, lo tengo ahora mismo andando en la entrenadora y le corto la alimentacion y al encender continua bien con una pila de 3 V (no una tension de 3,5V que escuchado por el foro en Vbat).
Lo que hare es hacerme mi propia libreria con este codigo, ahi va ... y ademas ¡¡es veridico y aseguro que funciona!!
Codigo:
///////////////////////////////////////////////////////////////////////////
//// Práctica con el RTC DS1307 ////
//// Por Daniel G - by RaDoN (8/8/05) ////
///////////////////////////////////////////////////////////////////////////
#include <16f877.h>
#fuses NOLVP,XT,NOWDT,NOPROTECT,PUT
#use delay(clock=4000000)
#include "LCD.C"
//#include "24256.C"
//#include "MOV_BOT.C"
#include "DECO_RC5.C"
#include "BUZZER.C"
#ORG 0x1F00,0x1FFF {} //for the 8k 16F876/7 bootloader
//#use fast_io(A)
//#use fast_io(B)
//#use fast_io(C)
#byte port_a = 5
#byte port_b = 6
#byte port_c = 7
#byte port_d = 8
//#define bumper_izq PIN_B6 // pulsado = 0
//#define bumper_drcha PIN_B7 // pulsado = 0
#use i2c(master, sda=PIN_C4, scl=PIN_C3, FORCE_HW)
//Registros ds1307
#define ds_seconds 0x00
#define ds_minutes 0x01
#define ds_hours 0x02
#define ds_day 0x03
#define ds_date 0x04
#define ds_month 0x05
#define ds_year 0x06
#define ds_control 0x07
//ds1307
//Vbat a tierra
void main(void)
{
int16 retardo; //Cada cuando actualiza lectura en LCD
//Dato en registro ds, a mandar o leer
int seconds,minutes,hours,day,date,month,year,control;
retardo=250; //ms a tardar entre lectura y lectura
//Justo cuando prende circuito, la fecha que establece es la siguiente
seconds= 0x00;
minutes= 0x56;
hours = 0x15; //modo 24 hrs
day = 0x07; //1 es domingo
date = 0x13;
month = 0x08;
year = 0x05;
control= 0x00; //OUT=0 SQWE=0 RS0-1=0 no hay onda cuadrada
//Establece fecha y hora
i2c_start(); //Inicia I2C
i2c_write(0xd0); //Direcciona ds1307 write
i2c_write(ds_seconds); //Indica que empiece en registro ds_seconds
//Aquí establece fecha y hora respecto a la puesta arriba
i2c_write(seconds);
i2c_write(minutes);
i2c_write(hours);
i2c_write(day);
i2c_write(date);
i2c_write(month);
i2c_write(year);
i2c_write(control);
i2c_stop(); //Ya puso la hora y fecha
//El RTC ya está marcando el tiempo y fecha
//Rutina LCD
lcd_init(); //Inicia LCD
lcd_putc("f"
; //Limpia LCD
lcd_putc("Real Time Clock
"
; //rtc
lcd_putc(" ds1307"
;
delay_ms(3000);
while(1)
{
delay_ms(retardo); //Usuario lee
//Obtiene datos de ds1307
i2c_start(); //Inicia I2C
i2c_write(0xd0); //Direcciona ds1307 write
i2c_write(ds_seconds); //Indica que ponga registro en ds_seconds
i2c_stop();
i2c_start();
i2c_write(0xd1); //Lee ds1307
seconds = i2c_read();
minutes = i2c_read();
hours = i2c_read();
day = i2c_read();
date = i2c_read();
month = i2c_read();
year = i2c_read(0); //no ack
i2c_stop();
//Representa datos en la LCD
printf(lcd_putc,"f%2x-%2x-20%2x
",date,month,year); //dd-mm-year
printf(lcd_putc,"%2x:%2x:%2x",hours,minutes,seconds); //23:59:59
}
}
Lo he sincronizado con este reloj (creo que es atomico), http://www.time.gov/timezone.cgi?Eastern/d/-5/java