in

Thug lifeThug life

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.

DS1307: Un completo reloj de precisión en un encapsulado de 4 pines por lado

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 de conexiones para la placa del DS1307

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 pequeña batería puede conservar el ajuste del DS1307 durante muchos años

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.

La placa terminada vista desde el lado del circuito impreso (lado solder)

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.

La placa instalada sobre la entrenadora y lista para comenzar a funcionar

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:

Los 8 registros del DS1307 (00H - 07H) que primero deben ser "escritos" para luego ser "leídos" y así obtener la información horaria

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:

Ejemplo de cómo se incrementan los valores dentro de los registros del DS1307

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.

Vista del sistema completo funcionando

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.

Reportar

¿Qué te pareció?

Escrito por Mario

49 Comments

Leave a Reply
  1. interesante el aparatito me pase la tarde de hoy armandolo pero en ves de una pantalla preferi algo mas tradicional le agrege unos pequeños(pero muchos) engranajes mecanicos ademas de un sistema de alarma esta bien padre y todo pero tengo que buscar una pequeña carcasa para la maquina

    gracias mario otra ves le diste sentido a mi tarde del sabado =)

      • de verdad que gente como tu me hace hervir las pelotas el hecho de tener un hobby no significa que nadie sea un inepto social que no pueda tomar la luz del sol por estar pegado a una pc las 24 horas del dia.

        dime tu que haces acaso eh??? puedes modificar algunos de los diseños de mario no verdad porque para ti es mas importante estar trolleando que aprender algo util de verdad tu si me das lastima porque parece que eres tu el que no tiene amigos o una vida propia y tienes que estar haciendo estas tonterias para evitar la realidad.

        me das mucha pena MUCHA O"o
        _

    • Dalay amigo mindmaster dalay!!

      Déjalo que es un troll, mejor envía un mensaje a contacto de Neoteo para que borren este comentario, ponte a celebrar que ya me dieron de alta en el hospital después de una operación en el apéndice el doctor dijo que puedo recuperarme desde casa asi que lo primero que hice fue agarra mi portátil y actualizarme en neoteo y mi blog.

      hombrequepiensa.blogspot.com

    • Hola estoy implementando el circuito con el Pic182520 pero tengo duda en la parte de la inductancia que valor debo conseguir o que matricula me recomiendan

  2. Hola Mario,

    Cada vez estas agregando más aplicaciones sobre los Pics, el tema de la electrónica se pone mas interesante. Me gusta la electrónica, aunque mi trabajo no tiene nada que ver con ésta. En mis ratos libres me dedico a aprender y/o probar circuitos como los que publicas.

    Saludos amigo Mario!

  3. io trabaje con este rtc en la esc pero tuve un problema k no resolvi xk jamas volvi a utilizarlo… 🙁 bueno lo k me pasaba es que a la hora de desconectar todo el sistema el reloj o no me guardaba la hora o lo hacia mal y no se a que se debiera…

    mi programa funcionaba de lo lindo y hacia todo lo k debia pero a la hora de quitar la alimentacion y dejar solo la bateria de respaldo mi reloj valia queso xD…

    como le hago para madarles el codigo??? una vez k lo encuentre xD

  4. Espectacular! justo que estoy entrando en el mundo de los PIC, esto me viene barbaro, para la computadora de abordo que me estoy armando para mi auto 😀

    excelente!

  5. Con perdón pero … joder que crack!!

    Estos artículos son dignos de cualquier revista de electrónica de las serias (y caras!).

    Por cierto, se pueden proponer temas? Porque a mi ahora me gustaría trastear con una batería de esas ‘lead-acid’ y he visto que en Neoteo había un par de artículos, uno con la descripción de como funcionaban y otro con un cargador-monitor de carga. Me pregunto si no sería descabellado hacer otro post resumiendo los dos anteriores y modificando el cargador para que funcione en uno u otro régimen de carga según el estado de carga de la batería (una de 12V x ejemplo ;D).

    En fin, otro artículo alucinante. Un saludo!

  6. Me encanta, creo que seria bueno como una versión en pdf para imprimir y tener un carpeta de proyecto como la revista de electrónica.

  7. Hola soy nuevo en el foro, me interesa la aplicacion estoy trabajando con PIC18F2520 que me llegaron de muestra y estaba buscando un reloj de tiempo real y llegue aqui, saludos cordiales desde México.

  8. Me interesa mucho esta aplicación, pero los links del código fuente y de la pcb están rotos, podrías volver a subirlos por favor
    un saludo y gracias

  9. Hola queria antes que nada felicitar a Mrio por sus proyectos, son insuperables.
    Aprobechando esto, queria preguntarte por el proyecto del ds1307, lo estoy inplementando pero no tengo claro lo del codigo, resulta que al compilarlo con c18 me da error de sintaxis.
    el codigo que dejas es un archivo bas y no c ¿como hago para editarlo en c?,tiene algo que ver lo del bas con el problema de sintaxis que me sale en c18
    Saludos.

  10. Excelente aporte, pero te importaria decirme que valor tiene el inductor? porque quisiera implementarlo.

    Gracias

  11. Disculpa hice el circuito y lo estoy usando con un PIC18F4550 y lo programe solo para que visualice la hora pero al encenderlo solo aparece 45:85:85 te agradecería si me pudieras decir cual puede ser el problema

  12. Deberian poner ejemplos en Mikrobasic, MikroC, proton o sea simultaneamente para quienes utilizan un compilador diferente puedan hacer sus pruebas sin ningun problema a la hora de probar los circuitos.

  13. Hola que tal, disculpen yo hice un circuito parecido hace 2 semanas y funciona bastante bien, cada vez que lo enciendo actualiza los datos de maravilla, solo que este placer me duró unos pocos días, ya que la batería de respaldo no duró ni una semana, la compré nueva (3 volts) y en cinco días ya no actualizaba los datos y al desconectar la bateria la medí con un voltímetro y tenía 1.6 volts ¿no que dura 10 años? la forma de conectar la batería es la misma que tienes en tus imagenes, ¿alguna respuesta o comentario?

  14. Tengo novia, y nada mal eh… amigos y tengo un trabajo por las mañanas con el que puedo pagar mi vida normal, pero con trabajos como este que es la electronica al cual me dedico en mi tiempo libre, me doy mis buenos lujos… Soy proveedor de una empresa de gobierno, y todo por mis ratos libres ja…. Hagan lo que les gusta, la vida los va llevando.

  15. No se abre la pagina dos de este proyecto…que sera … queria saber de cuanto es el valor de la inductancia….. Felicitaciones muy chevere la pagina y buenos proyectos sigan adelante

  16. Saludos, Primero quisiera felicitarte por este proyecto, es muy interesante y de mucho uso hoy en la actualidad, asi que muchas Felicidades. Posteo aqui pues tengo un problema para entrar a la pagina 2 dice que no existe el post porfavor avisame a este email cuando este arreglado porfavor es de mucha urgencia gracias>>!

  17. alguien puede indicarme con que nombre puedo comprar el componente que en el esquema se llama L1 ferrite, agradezco mucho su ayuda

  18. por favor podrían indicarme con que nombre puedo comprar el componente que en el esquema se llama L1 ferrite, agradezco mucho su ayuda, quiere realizar este circuito para un trabajo en la empresa

  19. por favor podrían indicarme con que nombre puedo comprar el componente que en el esquema se llama L1 ferrite, agradezco mucho su ayuda, quiere realizar este circuito para un trabajo en la empresa

  20. por favor podrían indicarme con que nombre puedo comprar el componente que en el esquema se llama L1 ferrite, agradezco mucho su ayuda, quiere realizar este circuito para un trabajo en la empresa

Responder a Lordwarrior Cancelar la respuesta

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

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

Crea texto 3D en cortos pasos (Photoshop)

Picnik: Fiebre de fútbol en tus fotos