Quería utilizar un reloj de tiempo real para ni circuito, pero el DS1307 no me valía porque necesito que también contemple por lo menos centésimas de segundo.
Buscando encontré el PCF8583, aunque no me parece el ideal, porque no tiene la entrada específica para la batería, con lo que la vida de esta será mas corta, al ser la que se utiliza durante las lecturas y escrituras. Si conoceis alguno que tenga interface i2c y centésimas de segundo con entrada de alimentación de batería adicional, os agradecería que me lo dijerais.
He realizado pruebas con el PCF8583 y he tenido algún problema para hacerlo funcionar, aunque al final los he resuelto.
Aquí os dejo la información.
Aunque en el datasheet está bastante identificado como conectarle, en esta web hay un circuito muy apañado:
http://www.avrprojects.net/index.php?option=com_content&view=article&id=74:real-time-clock-pcf8583&catid=37:avr-projects&Itemid=57
La librería que he utilizado la encontré gracias a este foro en este hilo.
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1253330998
Me apaño bastante mal con el inglés, pero algo saco.
El caso es que tras varias horas de no entender porqué los saltos entre segundos, minutos y demás no eran coherentes, pensé que no tenía mucho sentido parar el reloj como lo hace la librería al realizar consulta de la hora. Si tiene sentido al escribir, para evitar accesos simultaneos de escritura en el buffer de memoria entre el propio reloj y el programa.
Comenté las tres primeras líneas de get_time() en PCF8583.cpp y empezó a funcionar todo a las mil maravillas.
void PCF8583::get_time(){
// Estas líneas sobran
/*
Wire.beginTransmission(address);
Wire.send(0xC0); // stop counting, don't mask
Wire.endTransmission();
*/
Wire.beginTransmission(address);
Wire.send(0x02);
Wire.endTransmission();
Wire.requestFrom(address, 5);
second = bcd_to_byte(Wire.receive());
minute = bcd_to_byte(Wire.receive());
hour = bcd_to_byte(Wire.receive());
byte incoming = Wire.receive(); // year/date counter
day = bcd_to_byte(incoming & 0x3f);
year = (int)((incoming >> 6) & 0x03); // it will only hold 4 years...
month = bcd_to_byte(Wire.receive() & 0x1f); // 0 out the weekdays part
// but that's not all - we need to find out what the base year is
// so we can add the 2 bits we got above and find the real year
Wire.beginTransmission(address);
Wire.send(0x10);
Wire.endTransmission();
Wire.requestFrom(address, 2);
year_base = 0;
year_base = Wire.receive();
year_base = year_base << 8;
year_base = year_base | Wire.receive();
year = year + year_base;
}
Espero que a alguien le sea de utilidad.
Con el tiempo modificaré la librería para programar las alarmas. Cuando lo haga lo pondré aquí.
Un saludo,
Johnny