Menu
in

DS1307: Reloj en tiempo real con 18F2550

El DS1307 de Dallas Semiconductor (Maxim) es una solución muy interesante cuando necesitamos trabajar con eventos que requieren puntualidad y exactitud a lo largo del tiempo. Este pequeño circuito integrado es uno de los más populares relojes RTC (Real Time Clock) del mercado por su sencillez de uso y por su confiabilidad a largo plazo. Preparado para ofrecerte la hora hasta el año 2100, esta semana agregamos a la entrenadora NeoTeo esta útil aplicación con la explicación en detalle de su construcción, características y ajustes. El DS1307 a fondo en este artículo.

La flexibilidad de trabajo que nos ofrece el bus I2C hoy nos trae una aplicación muy útil e importante para los momentos en que necesitamos controlar dispositivos o aplicaciones en las que la exactitud horaria es un factor fundamental. El DS1307 de Dallas Semiconductor (Maxim) es un dispositivo que se conoce como “Reloj de Tiempo Real” (Real Time Clock – RTC) que opera a través del bus I2C y que, además de brindarnos la hora con minutos y segundos, posee un calendario que contempla los años bisiestos hasta fin de siglo, es decir, hasta el año 2100.

Entre las características destacadas, posee una salida (configurable por software) que, en nuestro caso, la utilizamos como “segundero luminoso”, y la posibilidad de trabajar con una pequeña batería para almacenar los datos mientras el sistema se encuentra desconectado de la alimentación. Además, esta pequeña alimentación de respaldo permite mantener funcionando el oscilador maestro del reloj con un consumo ínfimo de 300nA, según su hoja de datos. Una simple batería de Litio CR2032 puede brindarnos un funcionamiento satisfactorio durante 10 años. ¿Te parece poco? Conectar un artefacto que construimos hace tres años y que siga estando siempre ajustado en fecha y hora es algo muy interesante de experimentar.

Este curioso circuito integrado es mucho más que un simple segundero o un contador de minutos: es un reloj que podemos incorporar a nuestros desarrollos para que, además de informar la hora en un visor, sea capaz de activar periféricos o recordar actividades con absoluta precisión. Un ejemplo: que nos recuerde que cada día a determinada hora se ponga en marcha un motor, una luz o cualquier dispositivo externo que realice un trabajo por nosotros, o también que el día 15 de agosto de cada año nos recuerde el cumpleaños de algún amigo. Por supuesto que para el desarrollo de este artículo y la explicación paso a paso de cómo aprender a utilizar este genial reloj utilizaremos la placa entrenadora NeoTeo y el súper-cómodo sistema de carga de archivos por USB con el método de BootLoader desarrollado en el artículo anterior. No más palabras, observa este video. Esto haremos hoy:

Lo primero que haremos entonces es construir el hardware. Habrás notado en las imágenes una memoria EEPROM 24C04, compartiendo la placa con el DS1307. Por el momento no utilizaremos este dispositivo, pero tuvimos la idea de colocarlo en la placa para futuras aplicaciones gracias a que este tipo de memorias también trabajan con el protocolo de comunicaciones I2C. En próximos montajes combinaremos el uso del reloj con eventos grabados en la memoria, como pueden ser alarmas múltiples seleccionadas por el mismo PIC o para utilizarla como banco de datos generales que pueda conservar información a pesar de que el equipo conectado pierda el suministro de energía. Por ejemplo, podemos citar el caso de un sistema de semáforos sincronizados que deben manejar un tráfico variable, es decir, variar sus tiempos de operación de acuerdo a las horas de mayor tránsito. A esto podemos sumarle la posibilidad de dejar liberada la circulación vehicular a partir de un horario determinado durante la noche hasta las primeras horas del día siguiente, y todos estos datos deben ser almacenados en un lugar seguro, a prueba de cortes energéticos y con la seguridad de inicializar su funcionamiento en perfecta sincronía horaria. Para eso, nada mejor que una EEPROM 24Cxx.

El circuito es muy sencillo de organizar y comprender. Tanto el DS1307 como la memoria 24C04 comparten las conexiones SDA y SCL, respectivamente, mientras que la tensión de alimentación es filtrada C2 – L1 – C1 para eliminar ruidos extraños en el circuito que pudieran llegar a corromper las tramas de datos. Esta prevención la incrementamos con el diseño de un circuito impreso generoso en planos de tierra. La salida SQW/OUT necesita una resistencia “Pull-Up” para su funcionamiento y a la vez se encarga de excitar a T1 para que el LED nos sirva de “segundero luminoso”. Recordemos que esta salida del DS1307 es programable y pueden obtenerse allí otros submúltiplos de 32768Khz para otras aplicaciones específicas. Por su parte, en el pin 3 conectaremos una batería de Litio tipo CR2032 que nos permitirá el funcionamiento del DS1307 cuando la tensión de alimentación Vcc no esté presente. No dejes de colocar un receptáculo apropiado para permitir una remoción cómoda de la batería cuando sea necesario cambiarla. Además, si te decides soldarle pequeños terminales para conectarla a la placa, debes tener mucho cuidado de no pasarte de temperatura para no provocar un accidente y la rotura de la batería.

Una consideración especial se debe tener a la hora de montar el cristal de 32768Khz. Primero debes saber que será muy difícil lograr un circuito impreso óptimo para obtener una precisión ideal en el funcionamiento del reloj. Luego, debes comprender también que es de suma rareza encontrar cristales que resuenen a la frecuencia exacta que indica su nomenclatura. Es decir, lo normal será encontrar cristales con una “tolerancia” de error que a lo largo de los días (o meses) se haga notable en algunos segundos de atraso o adelanto de la hora grabada. Si las variaciones son de muchos minutos en pocas semanas, sin dudas debemos cambiar el cristal por otro de mejor calidad. Pero si optas por un cristal común (sin demasiada selección especial), con un lazo de alambre conectado a GND (como ves en la imagen superior), con un buen plano de tierra en los alrededores de su conexión (tal como indica la hoja de datos del DS1307) y con un largo adecuado de los pines de conexión, debes lograr una pequeña variación de pocos segundos en uno o dos meses. NUNCA obtendrás una precisión absoluta pero al menos puedes aproximarte mucho a un excelente funcionamiento. Observa los planos de tierra en el circuito impreso.

En el párrafo anterior mencionamos que entre los puntos destacados para obtener un correcto funcionamiento del DS1307 está el largo de los pines de conexión desde el cristal hasta el IC. Esto significa dos cosas: en primer lugar, que las vías de cobre del impreso entre un dispositivo y el otro DEBEN ser lo más cortas posibles y, en segundo lugar, que los pines del cristal NO DEBEN ser tan cortos como sea posible (en su conexión hacia el impreso). Parece una contradicción, pero la explicación está en que al acercar o alejar los pines del cristal entre sí, estamos provocando variaciones de capacidad parásita entre ambos conductores. En la práctica y en los instrumentos de medición de frecuencia, esto puede ser despreciable y no afectar en nada al oscilador maestro. Pero en los meses de funcionamiento de nuestro reloj, unos pocos Hertz de variación pueden significar varios segundos (o minutos) de desfasaje horario. Observa la imagen anterior para apreciar el largo aconsejado para los pines del cristal. No hay que exagerar, ya que con un milímetro de variación podemos resolver todo nuestro problema. De lo que puedes estar seguro es que conocerás la posición exacta de estos pines luego de algunas semanas de funcionamiento del equipo.

El resto del montaje no merece mayores comentarios. En nuestro ejemplo utilizado para la entrenadora NeoTeo con el PIC 18F2550, hemos empleado el conector específico que dejamos reservado para las conexiones dedicadas a dispositivos que trabajen por bus I2C. La imagen superior (como el video mostrado al inicio del artículo) nos muestra que la placa se puede insertar de manera muy fácil, quedando en una posición cómoda de trabajo y visualización sobre el display LCD que utilizaremos para obtener los resultados de este trabajo. Si eres un fiel seguidor de nuestros proyectos y vienes realizando las placas de la manera que mostramos en los artículos relacionados a esta entrenadora, al final encontrarás el PDF para descargar que contiene el dibujo propuesto para realizar el circuito impreso de este interesante accesorio.

Hasta aquí hemos visto el circuito necesario para poner a funcionar un DS1307. En la próxima página veremos como es la programación de sus registros y su funcionamiento en detalle. ¡Avanza a la siguiente página!

Comprendiendo de manera correcta el funcionamiento y el orden de trabajo de los bytes de registro del DS1307, podremos lograr una construcción rápida y eficaz. Al momento de grabar o escribir sobre el dispositivo, debemos hacerlo sobre ocho registros que tienen el tamaño de un byte. En cambio, al leer la información horaria, sólo lo haremos con siete registros. Los registros se distribuyen en el mapa de memoria del DS1307 del siguiente modo:

El primer registro (posición 0) corresponde a los segundos durante la cuenta del tiempo. El segundo registro corresponde a los minutos, el tercero a las horas, luego los días, los meses, los años y por último, en el octavo registro (posición 7), encontramos el registro de control. Escribiendo y leyendo de manera correcta estos registros, tendremos el funcionamiento adecuado del DS1307. El primer registro (el de los segundos) nos servirá de ejemplo para comprender el resto. El bit 7 de este registro determina el funcionamiento del oscilador maestro o su detención. Esta función puede ser muy útil en ciertas aplicaciones donde haya que detener una cuenta de tiempo por motivos de operación. Pero en nuestro caso, como utilizaremos este circuito integrado como un reloj común, lo mantendremos siempre en funcionamiento, y esto se logra escribiendo un cero en este bit.

Este procedimiento de escritura se realiza una única vez al programar la hora de arranque del DS1307. Luego, esta configuración se mantendrá mientras la batería de respaldo conectada al pin 3 se encuentre conectada. Pasando a los bits menos significativos, descubrimos la siguiente regla fundamental: en los primeros cuatro bits (B0, B1, B2 y B3) la cuenta se incrementará en forma binaria pero sólo llegará hasta 9. Es decir, si hacemos una pequeña tabla mostrando los valores que adopta este registro (el de los segundos), obtendremos una vista como la que te mostramos en esta imagen:

Si observas con detenimiento, se produce el cambio durante el incremento de 9 a 10. En lugar de ser una cuenta binaria convencional y pasar de 0001001 a 0001010, pasa de 0001001 a 0010000, es decir, en la parte baja del byte cuenta hasta un máximo de 9 (las unidades) y en la parte alta cuenta las decenas (del 10 al 50). Uniendo los máximos de ambas partes (nibbles), llegamos al 59 para incrementar en una unidad el registro siguiente y reiniciar la cuenta en este registro desde cero. Esto puede tomarse como una notación hexadecimal, por lo tanto, para visualizarla en el LCD debemos manejarla como tal. Al leer el registro, el DS1307 nos devuelve sólo un número cuando no llegamos a la decena, pero utilizando la instrucción HEX2 en BASIC el LCD nos muestra un cero en adelanto cuando esta situación se produce. Del mismo modo se registran los minutos, las horas, los números de los días, los meses y los años.

Para el caso de las horas, el DS1307 nos brinda la posibilidad de seleccionar una vista de 12 o 24 horas con sólo variar el bit 6 del registro que corresponde a las horas. El cuarto registro cuenta los días y los enumera comenzando por el domingo, al que le asigna el número 0. Luego viene el lunes con el 1, el martes con el 2 y así sucesivamente, hasta el sábado con el 7. Utilizando estos números podemos mostrar en pantalla el nombre del día en el que estamos a partir del número que devuelve este registro. Por último, el Byte de control habilitará o no la salida SQWE desde el pin 7 del DS1307. Nosotros escribimos este registro con el valor binario [10010000] y obtenemos una onda cuadrada de 1 Hertz a la salida. Esto se visualiza en el LED montado en la placa.

Como todo dispositivo I2C, el DS1307 posee una dirección dentro del bus, es decir, un nombre propio y un bit (el último) que le indicará al dispositivo si vamos a escribir sobre él o si vamos a leer datos únicamente. La dirección (Address) es 1101 en el nibble superior, terminando en cero para escritura y en uno para lectura. Esto significa que al momento de escribir sobre el DS1307 lo llamaremos con un Byte igual a 11010000, mientras que para leer lo haremos con un Byte igual a 11010001. El código fuente que te dejamos al final del artículo está muy bien comentado. Para que sea sencillo comprender las instrucciones utilizadas, te explicamos el significado que tiene cada línea de programa y la función que cumplirá. Por ejemplo, si utilizas CCS o C18 no será muy difícil descubrir que SYMBOL (en BASIC) equivale al #DEFINE en C o C18. Lo mismo ocurre para las declaraciones de las variables y para los procedimientos de lectura/escritura en el bus I2C y para la visualización de los resultados en el LCD. Leyendo los comentarios y comprendiendo el orden del programa, todo se hace muy sencillo tanto para un lenguaje como para el otro.

Resumiendo
No olvides tener mucho cuidado en la faz constructiva alrededor del cristal de 32768Khz. No te recomendamos este proyecto para una placa de pruebas o un protoboard. Las capacidades parásitas entre pines pueden provocar un desastre de gran magnitud. Tampoco olvides cómo organizar los nibbles dentro de los registros, tanto para su lectura como para su escritura. De ello depende el resultado correcto en el LCD, caso contrario comenzarán a aparecer caracteres extraños o números ilógicos (por ejemplo: días de más de 80 horas, 79 minutos y 92 segundos) en lugar de las cifras correctas. Para grabar la hora a partir del programa base que te mostramos, no olvides de quitar los apóstrofos de las líneas que permiten grabar el reloj en la programación inicial. Luego de esto, y una vez que el reloj esté grabado en la hora correcta, puedes volver a grabar el PIC con las líneas comentadas nuevamente. De lo contrario, cada vez que enciendas el sistema, se grabará la hora predeterminada.

Si no puedes compilar el programa porque tienes una versión de prueba, quita la línea que indica que estás trabajando con un BootLoader (DECLARE PROTON_START_ADDRESS = $1000) y arma todo con un 16F628A. El DS1307 sólo necesita una conexión I2C y un LCD para demostrarte todo su potencial. Quizás debas poner más esfuerzo en armar un circuito específico con un 16F628A, pero allí es donde se ven los desarrolladores de verdad. Como se nota en el video, trabajar con un BootLoader es muy cómodo y práctico, pero  diseñar y desarrollar tus propios equipos es el arte de crear que muy pocos tienen. Es el fuego sagrado que sólo algunos llevan dentro. ¿Tú eres uno de ellos? Disfruta el DS1307 y sorpréndenos con alguna aplicación interesante. Con mucho gusto publicaremos tus videos. Por supuesto, si aspiras a más, no dejes de experimentar con el DS1337 o similares que traen varias alarmas y más funciones. En fin, nunca dejes de crecer.

Escrito por Mario

Leave a Reply