lunes, 16 de enero de 2012

Usar la señal de reloj del DS1307

Hola querido lector,

esta entrada es pequeña, prometido.

Como sabrás, el integrado DS1307 es un reloj RTC (Real Time Clock) muy popular entre la comunidad arduino, dada la facilidad de manejo y el amplio soporte, y cuando digo amplio, es AMPLIO, porque hay librerías a carretadas, pero en todas echo algo en falta: poder usar la señal de reloj.
Si te has leído el datasheet del DS1307, sabrás que puede generar una onda cuadrada con un pulso de duración determinada (para más detalles mira la página 5).
En concreto, me voy a centrar en el pulso de 1hz: 1 segundo.
¿Por qué? Porque muchas veces hace falta un contador preciso.
El caso más común es implementar un reloj usando arduino, y cuando digo arduino, digo cualquier otro microcontrolador.
La gracia de usar este pulso de reloj es la estabilidad del mismo, asi como manejarlo en otra clase de circuitos digitales, sin necesidad de utilizar un microcontrolador.

Activar la señal de reloj es muy fácil desde arduino con este código:

Wire.beginTransmission(B1101000);
  Wire.write((byte)0x07);
  Wire.write((byte)B10010000);
Wire.endTransmission();


Sólo hace falta ejecutarlo una vez, salvo que se retire la pila de botón y se pierda toda la configuración, en cuyo caso, hay que volver a ejecutar el código.
¿Manejo? Fácil: el pin 7 del DS1307 tiene la salida de la señal.
En arduino, puedes conectarlo al pin 2 o 3 (interrupción 0 y 1 respectivamente), para manejarlo con una interrupción.
No voy a entrar en muchos detalles, porque está bien documentado, pero un código de ejemplo sería algo asi:


bool pulso_reloj;
void recibe_pulso() {
  // El código a ejecutar en una interrupción debe ser mínimo
  pulso_reloj = true;
}
void setup() {
  Serial.begin(9600);
  pulso_reloj = false;
  attachInterrupt(0, recibe_pulso, RISING);
}

void loop() {
  if (pulso_reloj) {

    Serial.println("Pulso de reloj");
    pulso_reloj = false;
  }
}

Espero que te resulte útil.
¡Hasta la próxima!