Este post lo dedico a la programación y configuración de la
hora para el Circuito Integrado DS1307.
DS1307
Es un IC de reloj en tiempo real, el que funciona con una pequeña
circuitería y una batería CS2032 de 3V. Funciona con comunicación I2C, provee
de: segundos, minutos, horas, día, fecha, mes y año. Está programado automáticamente
para meses inferiores a 31 días y años bisiestos. El reloj puede funcionar en
formado de 12 o 24 horas con indicador de AM y PM.
La circuitería es:
Los pines son:
- X1 y X2: Pines de conexión para un cristal estándar de 32.768kHz. El circuito oscilador interno está diseñado para trabajar a una carga capacitivo de 12.5pF. X1 es la entrada al oscilador y puede ser conectado opcionalmente con un oscilador externo, la salida del oscilador interno es X2.
- VBAT: fuente de alimentación de respaldo, puede ser una batería de litio de 3V.
- Ground: Tierra
- SDA (Serial Data Input/Output): SDA es la entrada de información por el protocolo I2c, este pin es colector abierto así que debe colocarse una Resistencia pull-up a VCC.
- SCL (Serial Clock Input): Es la entrada del protocolo I2C del pulso de reloj para sincronizar los datos.
- SQW/OUT (Square Wave/Output Driver): Cuando está en 1 lógico, la SQW/OUT saca una de las ondas cuadradas (1Hz, 4kHz, 8kHz, 32kHz). Este pin es colector abierto así que debe colocarse una Resistencia pull-up a VCC
- VCC: 5V
Código para ver y programar la hora con PICAXE:
Los pines de comunicación al DS1307 con el PICAXE, son los pines dedicados para I2C, SDA y SCL.
Los pines de comunicación al DS1307 con el PICAXE, son los pines dedicados para I2C, SDA y SCL.
symbol segundos = b0
symbol minutos = b1
symbol horas = b2
symbol dia = b3
symbol fecha = b4
symbol mes = b5
symbol ano = b6
symbol control = b7
i2cslave %11010000, i2cslow, i2cbyte 'configura para la dirección del chip calendario
output b.2
input c.0,b.0,b.1,b.2 'pulsadores para configurar segundos, minutos, horas y activar el modo de moficación de hora
main:
if pinc.0 = 0 then 'switch para grabar la hora
pause 300
readi2c 0,(segundos,minutos,horas,dia,fecha,mes,ano) 'lee la hora del reloj
if pinc.0 = 1 then
do 'ciclo para escoger los segundos, minutos y la hora
if pinb.0 = 0 then
pause 200
segundos = segundos + $01
if segundos > $09 and segundos < $11 then
segundos = $10
endif
if segundos > $19 and segundos < $21 then
segundos = $20
endif
if segundos > $29 and segundos < $31 then
segundos = $30
endif
if segundos > $39 and segundos < $41 then
segundos = $40
endif
if segundos > $49 and segundos < $51 then
segundos = $50
endif
if segundos > $59 then
segundos = $00
endif
endif
if pinb.1 = 0 then
pause 200
minutos = minutos + $01
if minutos > $09 and minutos < $11 then
minutos = $10
endif
if minutos > $19 and minutos < $21 then
minutos = $20
endif
if minutos > $29 and minutos < $31 then
minutos = $30
endif
if minutos > $39 and minutos < $41 then
minutos = $40
endif
if minutos > $49 and minutos < $51 then
minutos = $50
endif
if minutos > $59 then
minutos = $00
endif
endif
if pinb.2 = 0 then
pause 200
horas = horas + $01
if horas > $09 and horas < $11 then
horas = $10
endif
if horas > $19 and horas < $21 then
horas = $20
endif
if horas > $23 then
horas = $00
endif
endif
sertxd(#horas,":",#minutos,":",#segundos,13,10)
if pinc.0 = 0 then
pause 200
writei2c 0,(segundos,minutos,horas,dia,fecha,mes,ano,control)'graba la hora en el chip calendario
goto main
endif
loop
endif
endif
readi2c 0,(segundos,minutos,horas,dia,fecha,mes,ano) 'lee la hora del reloj
sertxd(#horas,":",#minutos,":",#segundos,13,10) 'despliega la hora en la terminal
goto main
symbol minutos = b1
symbol horas = b2
symbol dia = b3
symbol fecha = b4
symbol mes = b5
symbol ano = b6
symbol control = b7
i2cslave %11010000, i2cslow, i2cbyte 'configura para la dirección del chip calendario
output b.2
input c.0,b.0,b.1,b.2 'pulsadores para configurar segundos, minutos, horas y activar el modo de moficación de hora
main:
if pinc.0 = 0 then 'switch para grabar la hora
pause 300
readi2c 0,(segundos,minutos,horas,dia,fecha,mes,ano) 'lee la hora del reloj
if pinc.0 = 1 then
do 'ciclo para escoger los segundos, minutos y la hora
if pinb.0 = 0 then
pause 200
segundos = segundos + $01
if segundos > $09 and segundos < $11 then
segundos = $10
endif
if segundos > $19 and segundos < $21 then
segundos = $20
endif
if segundos > $29 and segundos < $31 then
segundos = $30
endif
if segundos > $39 and segundos < $41 then
segundos = $40
endif
if segundos > $49 and segundos < $51 then
segundos = $50
endif
if segundos > $59 then
segundos = $00
endif
endif
if pinb.1 = 0 then
pause 200
minutos = minutos + $01
if minutos > $09 and minutos < $11 then
minutos = $10
endif
if minutos > $19 and minutos < $21 then
minutos = $20
endif
if minutos > $29 and minutos < $31 then
minutos = $30
endif
if minutos > $39 and minutos < $41 then
minutos = $40
endif
if minutos > $49 and minutos < $51 then
minutos = $50
endif
if minutos > $59 then
minutos = $00
endif
endif
if pinb.2 = 0 then
pause 200
horas = horas + $01
if horas > $09 and horas < $11 then
horas = $10
endif
if horas > $19 and horas < $21 then
horas = $20
endif
if horas > $23 then
horas = $00
endif
endif
sertxd(#horas,":",#minutos,":",#segundos,13,10)
if pinc.0 = 0 then
pause 200
writei2c 0,(segundos,minutos,horas,dia,fecha,mes,ano,control)'graba la hora en el chip calendario
goto main
endif
loop
endif
endif
readi2c 0,(segundos,minutos,horas,dia,fecha,mes,ano) 'lee la hora del reloj
sertxd(#horas,":",#minutos,":",#segundos,13,10) 'despliega la hora en la terminal
goto main
No hay comentarios:
Publicar un comentario