Chip calendario (DS1307) + PICAXE



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.

 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