Reloj con el DS1307

UN RELOJ CON EL DS1307

 

Actualmente, cuando realizamos proyectos que requieren cierto nivel de flexibilidad, pensar en utilizar un microcontrolador siempre es una buena idea y ya puestos en ‘harina’ (como decimos en España), siempre que el proyecto lo requiera, es interesante, la aplicación de un RTC, es decir, un reloj en tiempo real. Sin embargo, también es cierto que en estos proyectos, estamos limitados a cierto número de E/S que acaban por ser demasiado limitadas y es entonces, es cuando se hace necesario el uso del I2C bus, el cual debemos considerar ya que, nos dará un gran servicio, simplemente con el uso de dos hilos o patillas del proyecto. Más información sobre el I2C bus en este sitio.

Para estos casos, ©Dallas actualmente ©Maxim o ©Cypress, entre otros, como veremos, ponen a nuestra disposición un pequeño dispositivo, capaz de mostrarnos información sobre segundos, minutos, horas, día, fecha, mes y año, con una sola consulta. El DS1307 funciona como un dispositivo esclavo en el bus I2C.

EL DS1307.

Aunque de forma superficial, diré que el DS1307 es un reloj/calendario de baja potencia, completo con 56 bytes de SRAM no-volátil. Como ya se ha mencionado, el reloj/calendario del DS1307, provee información de segundos, minutos, horas, día, fecha, mes y año. La fecha al final del mes durante los meses con menos de 31 días, se ajusta automáticamente e incluye las correcciones para el año bisiesto. El reloj funciona en cualquiera de los formatos de hora 24 o 12 horas con indicador AM/PM. El DS1307 tiene un circuito integrado en el sensor de energía que detecta los fallos de alimentación y cambia automáticamente a la fuente de respaldo de seguridad.

El acceso a los datos, se obtiene mediante la aplicación de una condición de inicio (start) y la prestación de un código de identificación del dispositivo (0x68), seguido de una dirección de registro. Los registros posteriores se puede acceder de forma secuencial. El DS1307 viene en un paquete de 8-pines DIP, además de otros formatos. El DS1307 cuenta en formato BCD.

El DS1307 utiliza un cristal externo de 32.768kHz. El circuito oscilador no necesita resistencias o condensadores externos para funcionar. Puede encontrar más información sobre el DS1307 en la red y también en este sitio.

Para conocer la estructura básica de un programa de Arduino, véase a partir de la página 7 de: “Arduino Programming Notebook by Brian Evans

Usando Arduino con el Atmega168 y un DS1307 (real time clock), vamos a tratar de poner en funcionamiento el DS1307 por medio de dos cables (I²C) o pines digitales D4 y D5 de Arduino. Estos dos pines SDA y SCL en algunos Arduinos no necesitan de las típicas RPA (Resistencias de Polarización a Alto) ya que disponen de unos puentes (jumps) para su uso, revise su Arduino por si los dispone, lo propio es que tenga que conectar una resistencia (de entre 4k7 y 10k) entre el positivo y el pin SDA y otra al pin SCL, debido a que estos, se presentan con colector abierto o drenador abierto, revise el DS para más información.

Viendo la sencillez del circuito anterior, resulta evidente que no debe crearnos desasosiego poner en practica este proyecto, nos permitirá poner en marcha el reloj del DS1307 con la ayuda de un cristal, nuestro Arduino con un sencillo programa y una batería del tipo botón de 3.2V la cual mantendrá el oscilador interno cuando desconectemos la tensión de alimentación.

Esta es la foto (por ambos lados), que muestra el montaje que realice con los pocos componentes que lleva. Respecto del cristal de cuarzo, como se aprecia, estoy utilizando uno que desguacé, pertenecía a un reloj de pulsera, su precisión es realmente buena, por lo que llevo en pruebas, desvía menos de un segundo por mes, al menos eso es lo que muestra respecto del reloj de mi PC. Todos los componentes, por unas pocas monedas, alrededor de 4€ o poco más, no siempre es necesario adquirir materiales, es conveniente reciclar componentes de montajes anteriores.

En la imagen anterior, se puede apreciar los 5 espadines que he incluido para una conexión más rápida a los distintos anclajes, como un zócalo o al propio protoboard. El circuito impreso (PCB) que corresponde a este circuito se muestra en la siguiente imagen, se incluyen las RPA del esquema.

PRUEBAS CON CÓDIGOS.

Para ser sinceros, diré que he probado bastantes códigos que circulan por la red, si bien es cierto, todos funcionan, unos atrasan y otros adelantan su conteo, naturalmente he hecho ciertos ajustes en los tiempos de alguno de esos códigos, en especial en los que más se adaptaban a mi idea básica y con ello he adquirido cierta destreza en adaptar unos y otros a unas necesidades que me impuse a mi mismo, para lograr “mi reloj“.

Al principio, tuve problemas con el bus I²C, así que, tuve que consultar el foro, gracias a los inestimables consejos y ayudas de los “Maestros” que por ahí circulan, he ido superando los obstáculos que cada día se presentaban. Si me piden consejo; aconsejo que, no se pierda la calma, ni debe bajarse la guardia, hay que perseverar y siempre se puede lograr un resultado adecuado a nuestros esfuerzos, eso es lo que hay que hacer para superarse.

También, tuve que leer muchas hojas de datos de los fabricantes, alguna, con el DS1307, hasta me atreví a hacer una traducción libre al español, ya que encontré muy poco al respecto, en nuestro idioma. El leer estas hojas de características es una fuente de información muy aconsejable para poder sacar sus conclusiones y poner en acción nuestras ideas.

Puesta en práctica.

Y así, empecé con los códigos, con este que sigue y otros, saque conclusiones de cómo proceder para extraer ciertos datos y sobre todo la forma de cómo hacerlo y presentarlo a mi manera.

He modificado un poco el código, tratando de adaptarlo a mi idea de lo que quiero, si lo compara con el original, se aprecia que he alterado la forma de presentación de los registros del DS1307 y además he añadido la presentación del día de la semana, me gusta más de esta forma, es algo personal.

Este código, no me acaba de convencer, no digo que no funcione, sólo que, quiero otra cosa. El sistema de conversión de decimal a binario y viceversa no es todo lo exacto que debe ser para un reloj que se parezca a un reloj, o yo no lo he entendido, lo siento, pero lo he probado y es lo que hay. Pero, usted debe probarlo y sacar sus conclusiones, no se fie de mis pruebas, usted puede tener más virtudes que yo.

Así que, yo probaré otro código. Bueno, el circuito que estoy utilizando para estas pruebas se puede ver en esta foto:

 

Vale, es cierto que la foto pertenece a la prueba de otro código, ya lo comentaré en su momento, pero, el montaje es el mismo, como se verá. De hecho, los pulsadores que se ven en la foto, no son necesarios y por lo tanto aunque no los quite de sus respectivos anclajes, no perturban el funcionamiento de los códigos que uso en cada momento y de esta forma, cuando el código lo requiere los utilizo y nada más que objetar.

Este que sigue, es otro código, con el cual se puede leer la información del registro de datos del reloj, recuerde las hojas de datos (DS data sheet), este registro es para no entorpecer el normal funcionamiento del cronómetro del DS1307 y poder extraer los datos.

De nuevo mi impronta, la presentación y el día de la semana. El siguiente paso, es de esperar, buscar y revisar hojas de datos y ejemplos de la red.

He encontrado un código con el que puedo interactuar, es decir, puedo poner la hora en cualquier momento sin necesidad de codificar y cargar el código cada vez, se trata de usar tres pulsadores para cargar los minutos y hora del momento actual. Vaya que más puedo pedir. Revise este código y trate de comprender que hace cada subrutina y hagas sus modificaciones a su gusto. Aquí está:

Como es de costumbre, mi aporte al código, en cuanto a adaptar el día de la semana, cosa que no viene en el original, no es mucho, pero ahí está. “Un grano de arena no es una playa, pero por algo se empieza”.

Después de varias discusiones en foros, unos en inglés y otros en español, el intercambio de ideas me lleva a poner un poco más de mi parte, creo. El código original, se puede descargar de este enlace, si usted lo desea puede compararlo con el siguiente código tiene “calado”.

Sin duda, hay algunos aportes que mejoran ostensiblemente el código final, también hay que destacar la presentación de los datos extraídos. Es cierto que el código es bastante extenso, sin embargo, considero que queda compensado con el resultado.

No creo necesario reproducir aquí lo que se ha descrito en el sitio del wiki, si bien es cierto que está en inglés.

En atención a las reiteradas llamadas para que se especifique con detalle la PCB usada en el reloj, se ha ampliado la parte que corresponde al montaje del mismo.

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

 

Post Tagged with , ,

4 Responsesso far.

  1. wilmer morillo dice:

    muy bueno gracias, pero por casualidad no tengras el programa para unirlo con un lcd

  2. Gracias por tus palabras.

    En cuanto a dotarlo de un LCD, no es muy complicado, en principio en la Red hay muchos códigos al respecto que te pueden servir.

    Los tienes para LiquidCrystal, con 16×2 o 20×4 y también para GLCD de 84×46, depende de lo que desees.

    Estoy preparando unos ejercicios con este tipo de GLCD, espero no demorarme mucho, ya sabes con el verano por medias…

    Saludos.

  3. Jesús dice:

    Hola Vicente. Muy bueno el proyecto.

    Yo utilicé en un principio el módulo comercial del DS1307 con Arduino pero me arrojaba un desfase de 1 minuto a la semana, si no recuerdo mal, y al cabo de unos meses era muy significativa la variación. Opté por el hermano mayor, el DS3231 y la precisión es envidiable. Comentaban en algún foro que al no tener compensacion de temperatura (TCXO) podía haber variación en el reloj. No sé si se debe a que el modulo era de China y el cristal que trae no es todo lo preciso que debería.

    Gracias de nuevo y saludos.

    • No sabría que decirte de los productos de china, pues como siempre hay fabricantes de todo tipo y los honestos siempre se dejan ver con productos de calidad.
      He tenido experiencias que satisfacen al exigente como al que más y en alguna excepción uno se topa con un desaliñado, ya sabes, hay de todo.
      Los DS3231 son muy fiables y disponen de más opciones, memoria y posibilidad de dos alarmas. Que disfrutes con él.

      Un saludo

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *