Práctico reloj DS1307

PRACTICO RELOJ.

En el tutorial ds1307reloj ya puse de manifiesto las características y algunas capacidades de este pequeño y práctico dispositivo, en el que documenté el código que permitía poner en hora el reloj que soporta el dispositivo DS1307.

Ahora, trataré de llevar a cabo un proyecto en el que podamos dar cierta utilidad a las posibilidades que ofrece esta pequeña maravilla (es cierto que el mismo fabricante, dispone de productos más especializados con los que, se puede disponer de más opciones de lectura de los registros que pone a nuestro servicio, alarmas, cronómetros y más), sin embargo como el único que tengo a mano es el DS1307A (*), es con el que voy a realzar esta práctica.

Partiendo del montaje que se desarrolló en el mencionado ds1307reloj, voy a introducir unas variables y rutinas en el código descrito allí para mejorar las prestaciones que nos proporciona y podemos aprovechar a nuestra voluntad.

Como se desprende de la foto, realicé este montaje sobre una pequeña porción de placa preformada, para dar una más rápida solución al proyecto. A pesar de todo, la exactitud del reloj obtenido, es digna de tener en cuenta, vengo observando que, la deriva después de tres meses es de 1 segundo, aunque no puedo ‘afinar’ más dado que la referencia que utilizo es el reloj de mi PC.

Este montaje está basado en el esquema del propio ©Dallas, actualmente ©Maxim, que es el siguiente:

Como se aprecia es muy sencillo, el dispositivo más critico, como siempre es el cristal de cuarzo, la exactitud del reloj depende casi exclusivamente de este dispositivo. Personalmente recomiendo siempre que sea posible uno de los que llevan los relojes de pulsera que tengamos en desuso, estará bien por que aprovecharemos un producto probado y nos resulta económico, por otra parte cumple los requisitos básicos, tiene una frecuencia fundamental de oscilación perfectamente calibrada a los 32.768 kHz, en cuanto a la estabilidad, es conveniente soldar la cápsula a masa de forma que no adquiera una alta temperatura al soldarla, para no producir alteraciones en la pastilla de cuarzo.

Características.

Las características del proyecto que emprendemos, pueden ser mejoradas tantas veces como le parezca necesario al interesado, sin embargo por el momento son las siguientes:

El código.

En principio, vamos a utilizar el mismo código mencionado del ejemplo anterior, ds1307reloj, al que iremos ampliando en cada nuevo parámetro. Respecto al código, le doy la versión 2, debido a las mejoras introducidas por mi, si bien es cierto que me apoyo en rutinas que extraigo de distintas partes (vamos que, como dice aquel «no fabrico los ladrillos, ni las ventanas, ni los utensilios de baño, para construir el edificio, y sin embargo, el mérito es del arquitecto»).

Que hace el código.

A pesar de que está muy comentado el código, conviene describir un poco, algunas rutinas del código, para recalcar su importancia. La siguiente línea, se hace la llamada a las librerías implicadas en el desarrollo del proyecto, este paso no siempre es necesario, sin embargo, es conveniente acostumbrarse a utilizarlo para evitar sorpresas al interpretar los mensajes de error que puedan producirse al procesar el código.

La siguiente línea (en este caso), le indica al compilador la dirección donde debe empezar la lectura de datos del DS1307A que es, 104 en decimal, en hex 68h y en binario b1101000. El lector, debe tener muy en cuenta, lo que recomienda el fabricante en sus Hojas de Datos, evitando así quebraderos de cabeza.

A partir de aquí se presentan las declaraciones de variables generales

Es una buena práctica, distribuir las rutinas, después de las declaraciones de variables, antes de la configuración de estados o setup();.

Se deben resaltar, las subrutinas de conversión de decimal a binario y viceversa, ambas las podemos ver en:

No menos importante es la subrutina matemática de (byte) tipo de conversión ASCII (que interpretará los datos leídos a dígitos característicos de presentación de la fecha), presente en el código como:

Por cierto, observemos que, para leer de un dispositivo, se inicia con un comando como:

Wire.beginTransmission(DS1307_I2C_ADDRESS)

y debe terminar con el correspondiente:

Wire.endTransmission(); para cerrar la transmisión. Esto es muy importante.

Otra rutina interesante en este proyecto es la que se encarga de extraer la fecha y el tiempo del registro interno del ds1307 y que nos permite imprimir el resultado, se trata de la rutina siguiente:

A este código, le sigue una forma de presentación de los datos extraídos y que cada cual puede mostrar como mejor le parezca, siempre respetando las reglas de código. Entre los datos se pueden mostrar los segundos, minutos, horas, día de la semana y la forma de fecha tradicional de cada zona horaria. A este respecto, debo indicar que aunque en principio no se aprecie, el modo que se deberá utilizar, por sus ventajas es el de AA-MM-DD, en lugar de dd-mm-aa. A la hora de ordenar una lista de fechas, viene a demostrar su importancia.

Quiero resaltar que he dado nombre a los meses y los días de la semana en español y otra particularidad es el hecho de mostrar el mensaje de la festividad del día o la atención recordatoria de la onomástica de alguna persona afín, cuando pongo:

Observar la variante de la orden Serial.print(» «); que muestra el contenido que hay entre las comillas y/o el valor de la variable y sigue en la misma línea, en cambio la orden Serial.println(» «); que muestra el contenido que hay entre las comillas y/o el valor de la variable y sigue con un fin de línea y un salto de línea (CR/CL).

Por Ej. de Serial.print():

int b = 79;

Serial.print(b, DEC) // muestra o envía el valor de b como un número decimal en  caracteres ASCII. Mostrará la cadena «79»

Serial.print(b, HEX) // muestra o envía el valor de b como un número número (79) decimal, en valor hexadecimal «4F».

Serial.print(b, OCT) // muestra o envía el valor de b como un número número (79) decimal, en valor octal «117».

Serial.print(b, BIN) // muestra o envía el valor de b como un número número (79) decimal, en valor binario «1001111».

Sentencia SWITCH / case.

El principiante, debe fijarse en la estructura de la sentencia SWITCH / case y en la forma que aquí se ha empleado. SWITCH, puede tomarse como interruptor o mejor, conmutador, ya que depende de la entrada, optará por dar una única salida para esa entrada, si cambia el valor de la entrada así hará la salida. Aquí, se aplica dos veces sucesivas, una para determinar el nombre del mes que corresponde y en segundo lugar para el nombre del día de la semana. En al primer caso el valor que adquiera la variable «month», determinará el nombre del mes, así mismo el valor que tome «dayOfWeek» determinará a su vez el nombre del día de la semana, parece fácil.

La novedad.

Hasta este punto, podemos decir que ya estaba claro el listado del código, la «novedad», reside en este punto que, hasta ahora, no podíamos consultar la fecha y hora actuales, salvo que aplicáramos un nuevo tiempo T en la entrada (que, por otra parte se antoja compleja). Aquí empieza la parte más amigable de este reloj en tiempo real, ya que cada vez que deseemos conocer la hora actual, bastará con introducir el carácter «L» o en minúsculas «l» de lectura y el programa responderá mostrando en el monitor la fecha, hora y si lo hemos previsto la fiesta que le corresponde, ahí esta la novedad.

De esto se encarga la subrutina lectura();, el interesado puede revisar el código para comprender los pasos que se siguen para lograr este resultado.

Aunque, para ser exactos, debe realizar unos pequeños ‘retoques’ al código, para lograr el mismo resultado o incluso mejorarlo. En un próximo artículo, veremos cómo mejorar el código. ¿Se atreve alguien?.

A tener en cuenta (nota del fabricante).

Cuando el sistema se enciende, la posición de RAM 0x3f será comparada con el valor 0x20. Si éste existe, entonces, esto quiere decir que la batería de reserva ha salvado el contenido de la RAM y todos los registros, por lo tanto, han sido inicializados. Entonces el software se salta la secuencia inicialización.

Si no se encuentra el valor 0x20 en dicha dirección, entonces el dispositivo Real Time Clock es inicializado a los valores siguientes:

Address Valor Inicialización
0 Seconds 0x59 (bit 7 cleared).
1 Minutes 0x59
2 Hours 0x24 (bit 6 cleared).
3 Day 0x07
4 Date 0x31
5 Month 0x12
6 Year 0x99

Estos son todos los números de código binario decimal con que trabaja el dispositivo reloj de tiempo real. Tenga en cuenta que los valores de inicialización se han elegido para que pueda entender lo que la pantalla está mostrando.

Como siempre, comentarios, criticas y sugerencias para mejorar este artículo, son bienvenidos y apreciados.

3 comentarios sobre «Práctico reloj DS1307»

  1. Por favor nos puedes decir como accceder para cambiar el bit 6 del rtc para que me quede la hora en formato 12. No hemos podido hacerlo , ya nos funciona todo pero en formato 24 horas, estamos utilizando un arduino uno y un rtc ds1307 atravez del programa arduino.estamos haciendo un reloj de 4 digitos con display de siete segmentos.muchisimas gracias

Deja una respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.