Escrito originalmente por radon
Ok, muchas gracias ... ya aprobecho :] ¿hay alguna libreria para este en C? ¿O lo usas con los comandos de i2c "normales"?
No necesitas cristal para el reloj.
Te dejo código que hice para el ds1307, espero que te sirva. Según sé, CCS no trae librería, pero puedes usar I2C normalmente para trabajarlo.
--------------
//Programa que usa protocolo I2C para
//escribir y leer tiempo del DS1307
//saca tiempo en LCD
//migsantiago
// Conexiones de la LCD:
// D0 enable
// D1 rs
// D2 rw
// D4 D4
// D5 D5
// D6 D6
// D7 D7
//
// LCD pins D0-D3 are not used and PIC D3 is not used.
#include <16f877a.h>
#fuses xt,nowdt,noput,nobrownout,nolvp,noprotect
#use delay(clock=4000000)
#include "lcd.c"
#use standard_io (D)
#use fast_io (b)
#use i2c(MASTER, SDA=PIN_b1, SCL=PIN_b0,slow)
//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= 0x38;
hours = 0x15; //modo 24 hrs
day = 0x05; //1 es domingo
date = 0x13;
month = 0x01;
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
}
}
-------------------