You are on page 1of 13

DS1307: Reloj en tiempo real con

18F2550
ELECTRNICA
etiquetas: tutoriales

HTTP://WWW.NEOTEO.COM/DS1307-RELOJ-EN-TIEMPO-REAL-CON-18F2550/

El DS1307 de Dallas Semiconductor (Maxim) es una solucin muy interesante cuando necesitamos
trabajar con eventos que requieren puntualidad y exactitud a lo largo del tiempo. Este pequeo
circuito integrado es uno de los ms 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 ao
2100, esta semana agregamos a la entrenadora NeoTeo esta til aplicacin con la explicacin en
detalle de su construccin, caractersticas y ajustes. El DS1307 a fondo en este artculo.
La flexibilidad de trabajo que nos ofrece el bus I2C hoy nos trae una aplicacin 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 travs del bus
I2C y que, adems de brindarnos la hora con minutos y segundos, posee un calendario que
contempla los aos bisiestos hasta fin de siglo, es decir, hasta el ao 2100.
Entre las caractersticas destacadas, posee una salida (configurable por software) que, en nuestro
caso, la utilizamos como segundero luminoso, y la posibilidad de trabajar con una pequea
baterapara almacenar los datos mientras el sistema se encuentra desconectado de la alimentacin.
Adems, esta pequea alimentacin de respaldo permite mantener funcionando el oscilador maestro
del reloj con un consumo nfimo de 300nA, segn su hoja de datos. Una simple batera de Litio
CR2032 puede brindarnos un funcionamiento satisfactorio durante 10 aos. Te parece poco?

Conectar un artefacto que construimos hace tres aos y que siga estando siempre ajustado en fecha
y hora es algo muy interesante de experimentar.

Este curioso circuito integrado es mucho ms que un simple segundero o un contador de minutos: es
un reloj que podemos incorporar a nuestros desarrollos para que, adems de informar la hora en un
visor, sea capaz de activar perifricos o recordar actividades con absoluta precisin. Un ejemplo: que
nos recuerde que cada da a determinada hora se ponga en marcha un motor, una luz o cualquier
dispositivo externo que realice un trabajo por nosotros, o tambin que el da 15 de agosto de cada
ao nos recuerde el cumpleaos de algn amigo. Por supuesto que para el desarrollo de este
artculo y la explicacin paso a paso de cmo aprender a utilizar este genial reloj utilizaremos
la placa entrenadora NeoTeo y el sper-cmodo sistema de carga de archivos por USB con el
mtodo de BootLoaderdesarrollado en el artculo anterior. No ms palabras, observa este video.
Esto haremos hoy:
Lo primero que haremos entonces es construir el hardware. Habrs notado en las imgenes 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 tambin trabajan con el protocolo de comunicaciones I2C. En prximos
montajes combinaremos el uso del reloj con eventos grabados en la memoria, como pueden ser
alarmas mltiples seleccionadas por el mismo PIC o para utilizarla como banco de datos generales
que pueda conservar informacin a pesar de que el equipo conectado pierda el suministro de
energa. Por ejemplo, podemos citar el caso de un sistema de semforos sincronizados que deben
manejar un trfico variable, es decir, variar sus tiempos de operacin de acuerdo a las horas de

mayor trnsito. A esto podemos sumarle la posibilidad de dejar liberada la circulacin vehicular a
partir de un horario determinado durante la noche hasta las primeras horas del da siguiente, y todos
estos datos deben ser almacenados en un lugar seguro, a prueba de cortes energticos y con la
seguridad de inicializar su funcionamiento en perfecta sincrona horaria. Para eso, nada mejor que
una EEPROM 24Cxx.

El circuito es muy sencillo de organizar y comprender. Tanto el DS1307 como la


memoria 24C04comparten las conexiones SDA y SCL, respectivamente, mientras que la tensin de
alimentacin es filtrada C2 L1 C1 para eliminar ruidos extraos en el circuito que pudieran llegar
a corromper las tramas de datos. Esta prevencin la incrementamos con el diseo 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
submltiplos de 32768Khz para otras aplicaciones especficas. Por su parte, en el pin 3
conectaremos una batera de Litio tipo CR2032que nos permitir el funcionamiento
del DS1307 cuando la tensin de alimentacin Vcc no est presente. No dejes de colocar un
receptculo apropiado para permitir una remocin cmoda de la batera cuando sea necesario
cambiarla. Adems, si te decides soldarle pequeos 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
batera.

Una consideracin especial se debe tener a la hora de montar el cristal de 32768Khz. Primero
debes saber que ser muy difcil lograr un circuito impreso ptimo para obtener una precisin ideal
en el funcionamiento del reloj. Luego, debes comprender tambin 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 das (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 comn (sin demasiada seleccin 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 conexin (tal como indica la hoja de datos del DS1307) y con un largo adecuado de los pines
de conexin, debes lograr una pequea variacin de pocos segundos en uno o dos
meses. NUNCA obtendrs una precisin absoluta pero al menos puedes aproximarte mucho a un
excelente funcionamiento. Observa los planos de tierra en el circuito impreso.

En el prrafo anterior mencionamos que entre los puntos destacados para obtener un correcto
funcionamiento del DS1307 est el largo de los pines de conexin desde el cristal hasta el IC. Esto
significa dos cosas: en primer lugar, que las vas de cobre del impreso entre un dispositivo y el
otroDEBEN ser lo ms cortas posibles y, en segundo lugar, que los pines del cristal NO DEBEN
ser tan cortos como sea posible (en su conexin hacia el impreso). Parece una contradiccin, pero
la explicacin est en que al acercar o alejar los pines del cristal entre s, estamos provocando
variaciones de capacidad parsita entre ambos conductores. En la prctica y en los instrumentos
de medicin 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 variacin 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 milmetro
de variacin podemos resolver todo nuestro problema. De lo que puedes estar seguro es que
conocers la posicin 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 especfico que dejamos
reservado para las conexiones dedicadas a dispositivos que trabajen por bus I2C. La imagen
superior (como el video mostrado al inicio del artculo) nos muestra que la placa se puede insertar de
manera muy fcil, quedando en una posicin cmoda de trabajo y visualizacin 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 artculos
relacionados a esta entrenadora, al final encontrars 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 prxima
pgina veremos como es la programacin de sus registros y su funcionamiento en detalle. Avanza a
la siguiente pgina!

DS1307: Reloj en tiempo real con


18F2550
ELECTRNICA
etiquetas: tutoriales

7FLARES Twitter

0Facebook 3Google+ 4

Pin It Share 0Email--Email to a friend


Comprendiendo de manera correcta el funcionamiento y el orden de trabajo de los bytes de registro
del DS1307, podremos lograr una construccin rpida y eficaz. Al momento de grabar o escribir
sobre el dispositivo, debemos hacerlo sobre ocho registros que tienen el tamao de un byte. En
cambio, al leer la informacin horaria, slo lo haremos con siete registros. Los registros se
distribuyen en el mapa de memoria del DS1307 del siguiente modo:

El primer registro (posicin 0) corresponde a los segundos durante la cuenta del tiempo. El segundo
registro corresponde a los minutos, el tercero a las horas, luego los das, los meses, los aos y por
ltimo, en el octavo registro (posicin 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 detencin. Esta funcin puede
ser muy til en ciertas aplicaciones donde haya que detener una cuenta de tiempo por motivos de
operacin. Pero en nuestro caso, como utilizaremos este circuito integrado como un reloj comn, 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 configuracin se mantendr mientras la batera 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 slo llegar hasta 9. Es decir, si hacemos una pequea 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 mximo de 9 (las unidades) y en la parte alta
cuenta las decenas (del 10 al 50). Uniendo los mximos 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 notacin hexadecimal, por lo tanto, para visualizarla en el LCD
debemos manejarla como tal. Al leer el registro, el DS1307 nos devuelve slo un nmero cuando no
llegamos a la decena, pero utilizando la instruccin HEX2 en BASIC el LCD nos muestra un cero en
adelanto cuando esta situacin se produce. Del mismo modo se registran los minutos, las horas, los
nmeros de los das, los meses y los aos.

Para el caso de las horas, el DS1307 nos brinda la posibilidad de seleccionar una vista de 12 o 24
horas con slo variar el bit 6 del registro que corresponde a las horas. El cuarto registro cuenta los
das y los enumera comenzando por el domingo, al que le asigna el nmero 0. Luego viene el lunes
con el 1, el martes con el 2 y as sucesivamente, hasta el sbado con el 7. Utilizando estos nmeros
podemos mostrar en pantalla el nombre del da en el que estamos a partir del nmero 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 direccin dentro del bus, es decir, un nombre
propioy un bit (el ltimo) que le indicar al dispositivo si vamos a escribir sobre l o si vamos a leer
datos nicamente. La direccin (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 cdigo fuente que te dejamos al final del artculo est muy bien comentado. Para que
sea sencillo comprender las instrucciones utilizadas, te explicamos el significado que tiene cada lnea
de programa y la funcin que cumplir. Por ejemplo, si utilizas CCS o C18 no ser muy difcil
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
visualizacin 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
parsitas entre pines pueden provocar un desastre de gran magnitud. Tampoco olvides
cmo 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 comenzarn a aparecer caracteres
extraos o nmeros ilgicos (por ejemplo: das de ms 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 apstrofos de las lneas que permiten grabar el reloj en la programacin
inicial. Luego de esto, y una vez que el reloj est grabado en la hora correcta, puedes volver a grabar
el PIC con las lneas 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 versin de prueba, quita la lnea que indica
que ests trabajando con un BootLoader (DECLARE PROTON_START_ADDRESS = $1000)
y arma todo con un 16F628A. El DS1307 slo necesita una conexin I2C y un LCD para
demostrarte todo su potencial. Quizs debas poner ms esfuerzo en armar un circuito especfico 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 cmodo y prctico, pero disear y desarrollar tus propios
equipos es el arte de crear que muy pocos tienen. Es el fuego sagrado que slo algunos llevan
dentro. T eres uno de ellos? Disfruta el DS1307 y sorprndenos con alguna aplicacin
interesante. Con mucho gusto publicaremos tus videos. Por supuesto, si aspiras a ms, no dejes de
experimentar con el DS1337 o similares que traen varias alarmas y ms funciones. En fin, nunca
dejes de crecer.
Circuito Impreso:PDF
Cdigo Fuente:Download
DS1307:Datasheet
DS1337:Datasheet

'****************************************************************
'* Name
: DS1307.BAS
*
'* Author : Mario G. Sacco
*
'* Notice : Copyright (c) 2010 - NeoTeo
*
'*
: All Rights Reserved
*
'* Date
: 18/06/2010
*
'* Version : 1.0
*
'* Notes
:
*
'*
:
*
'****************************************************************
'SELECCIONO PIC, CLOCK E INICIALIZACIN
Device = 18F2550
'SELECCIONO PIC Y CLOCK
Xtal = 48
'UTILIZO BOOTLOADER
Declare PROTON_START_ADDRESS = $1000 ' INICIO EN DIRECCIN
CMCON = 7
All_Digital = True
'DECLARO EL LCD
LCD_DTPin = PORTB.4
LCD_RSPin = PORTB.2
LCD_ENPin = PORTB.3
LCD_Interface = 4
LCD_Lines = 2
LCD_Type = 0

$1000

'APAGO LOS COMPARADORES


'Y ANULO LAS ENTRADAS ADC (TODO DIGITAL)
'SETEO EL LCD 16X2 PARA 4 CABLES

'DECLARO LOS PINES DEL BUS I2C


Declare SDA_Pin PORTB.0
'DECLARO QUE RB0 VA A SER SDA
Declare SCL_Pin PORTB.1
'DECLARO QUE RB1 VA A SER SCL
Declare Slow_Bus On
'PARA OSCILADORES MENORES A 8MHZ (100Khz COMO
TRABAJA EL DS1307)
'VARIABLES DEL RELOJ
Dim SEG As Byte
Dim MINU As Byte
Dim HORA As Byte
Dim DIAP As Byte
Dim DIAN As Byte
Dim MES As Byte
Dim YEAR As Byte
Dim DIA As String * 3

'SEGUNDOS
'MINUTOS
'HORAS
'DIA DE LA SEMANA EN PALABRA
'DIA DE LA SEMANA EN NUMERO
'MES
'AO
'STRING QUE ESCRIBE EL DA EN PALABRA

'I2C
Symbol PROGCLOCK = %11010000 'ALIAS DEL CODIGO PARA PROGRAMAR EL DS1307
Symbol LEOCLOCK = %11010001
'ALIAS DEL CODIGO PARA LEER EL RELOJ
'***********************************************************************************
***************
'*
RUTINA PARA PROGRAMAR EL RELOJ// LOS REGISTROS SE ARMAN EN HEXADECIMAL !!!!
*
'***********************************************************************************
***************
'PRIMERO HAY QUE PROGRAMAR LOS REGISTROS Y LA HORA (MIERCOLES 16 DE JUNIO DE 2010 A
LAS 01:57:00)(TODO EN HEX)
'BSTART
'ABRIMOS EL CONTACTO I2C
'BUSOUT PROGCLOCK,0,[%00000000]
'GRABAMOS EN EL PRIMER REGISTRO 00 SEGUNDOS Y
HABILITAMOS EL OSCILADOR
'DELAYMS 10
'TIEMPO PARA QUE SE GRABE
'BUSOUT PROGCLOCK,1,[%00000010]
'GRABAMOS EN EL SEGUNDO REGISTRO 23
MINUTOS

'DELAYMS 10
'BUSOUT PROGCLOCK,2,[%00010000]
CON FORMATO DE 24 Hs.
'DELAYMS 10
'BUSOUT PROGCLOCK,3,[%00000110]
DE DIA DE LA SEMANA (VARIABLE DIAP)
'DELAYMS 10
'BUSOUT PROGCLOCK,4,[%00011000]
DE DIA DEL MES (VARIABLE DIAN)
'DELAYMS 10
'BUSOUT PROGCLOCK,5,[%00000110]
'DELAYMS 10
'BUSOUT PROGCLOCK,6,[%00010000]
'DELAYMS 10
'BUSOUT PROGCLOCK,7,[%10010000]
CONTROL PARA LA SALIDA DE PATA 7

'TIEMPO PARA QUE SE GRABE


'GRABAMOS EN EL TERCER REGISTRO LA HORA
'TIEMPO PARA QUE SE GRABE
'GRABAMOS EN EL CUARTO REGISTRO EL NOMBRE
'TIEMPO PARA QUE SE GRABE
'GRABAMOS EN EL QUINTO REGISTRO EL NUMERO
'TIEMPO PARA QUE SE GRABE
'GRABAMOS EN EL SEXTO REGISTRO EL MES
'TIEMPO PARA QUE SE GRABE
'GRABAMOS EN EL SPTIMO REGISTRO EL AO
'TIEMPO PARA QUE SE GRABE
'GRABAMOS EL LTIMO REGISTRO QUE ES DE
'Y LA PROGRAMAMOS A ONDA

CUADRADA A 1 SEGUNDO
'DELAYMS 10

'TIEMPO PARA QUE SE GRABE

'BSTOP
'DELAYMS 10

'TERMINO EL CONTACTO I2C


'TIEMPO DE DESCANSO

'****************************************************************************************
**********
'*
RUTINA PARA LEER EL RELOJ
*
'***********************************************************************************
***************
Cls
MOSTRAR:
BStart
BusIn LEOCLOCK,0,[SEG]
PONGO EN LA VARIABLE CORRESPONDIENTE
BusIn LEOCLOCK,1,[MINU]
PONGO EN LA VARIABLE CORRESPONDIENTE
BusIn LEOCLOCK,2,[HORA]
EN LA VARIABLE CORRESPONDIENTE
BusIn LEOCLOCK,3,[DIAP]
LO PONGO EN LA VARIABLE CORRESPONDIENTE
BusIn LEOCLOCK,4,[DIAN]
LA VARIABLE CORRESPONDIENTE
BusIn LEOCLOCK,5,[MES]
LA VARIABLE CORRESPONDIENTE
BusIn LEOCLOCK,6,[YEAR]
EN LA VARIABLE CORRESPONDIENTE
BStop
If
If
If
If
If
If
If

DIAP
DIAP
DIAP
DIAP
DIAP
DIAP
DIAP

=
=
=
=
=
=
=

1
2
3
4
5
6
7

Then
Then
Then
Then
Then
Then
Then

DIA
DIA
DIA
DIA
DIA
DIA
DIA

=
=
=
=
=
=
=

"DOM"
"LUN"
"MAR"
"MIE"
"JUE"
"VIE"
"SAB"

'ABRIMOS EL CONTACTO I2C


'LEEMOS LOS SEGUNDOS DEL PRIMER REGISTRO Y LO
'LEEMOS LOS MINUTOS DEL SEGUNDO REGISTRO Y LO
'LEEMOS LA HORA DEL TERCER REGISTRO Y LO PONGO
'LEEMOS EL NOMBRE DEL DIA DEL CUARTO REGISTRO Y
'LEEMOS EL DIA DEL QUINTO REGISTRO Y LO PONGO EN
'LEEMOS EL MES DEL SEXTO REGISTRO Y LO PONGO EN
'LEEMOS EL AO DEL SPTIMO REGISTRO Y LO PONGO
'TERMINO EL CONTACTO I2C

'ESCRIBO EL DA DE LA SEMANA CON NOMBRE


'SEGN AL VALOR QUE DEVUELVA EL REGISTRO
'CORRESPONDE UN DA COMENZANDO POR EL DOMINGO

'LOS DATOS OBTENIDOS (EXCEPTO DIAP) SON HEXADECIMALES


'HEX2 ME ASEGURA QUE SI EL DATO ES MENOR DE 10, APARECE CON EL 0 EN ADELANTO
'POR EJEMPLO CUANDO EL DS1307 DEVUELVE 4, EN EL LCD APARECE 04

Print At 1,2,"Hora:",Hex2 HORA,":", Hex2 MINU,":", Hex2 SEG


Print At 2,2,DIA, 044, Hex2 DIAN,"/", Hex2 MES, "/20", Hex2 YEAR
GoTo MOSTRAR

You might also like