miércoles, 3 de octubre de 2018

I2C Usando el reloj DS1307

Real Time Clock DS1307 con el PIC16F

Fig1. Modulo RTC y chip DS1307


Antes de nada, quiero agradecer por tu visita a este blog que tiene por finalidad practicar la programación de los PIC's. Esta vez veremos como utilizar un RTC(Real Time Clock) en nuestro circuito electrónico. El objetivo de esta sección es que el PIC16F887 pueda enviar(configurar) y recibir la información del tiempo desde el circuito integrado DS1307.
 
La programación del microcontrolador se realizara utilizando el software  de diseño  MPLABX  y el compilador de lenguaje C para PIC XC8 ambos disponibles en la pagina de microchip de forma gratuita. Aquí dejo los enlaces de las versiones utilizadas para nuestro ejemplo:  <<MPLABX v6.20>>   <<XC8 v2.45>>
Mencionar también que es necesario contar con conocimientos mínimos sobre programación en lenguaje C y el uso de microcontroladores PIC16F.

Al final de la sección dejo el enlace para descargar el proyecto MPLABX que incluye todos los archivo mencionados.

Acerca del Modulo RTC1307

Fig2. Mapa de pines DS1307

Este pequeño chip RTC(Real Time Clock) utiliza el conocido protocolo I2C para lograr comunicarse con un microprocesador con solo dos lineas o pines, además sus registros de reloj y calendario proveen información de segundos, minutos, horas, días, mes y año, haciendo el ajuste automático de los días que corresponden a cada mes de acuerdo al año en curso.
El circuito integrado opera con solo 5V y una batería de 3V como respaldo para retener la información del tiempo, seguidamente se describen los pines:

  • pin X1/X2. Se debe conectar un cristal de cuarzo estándar de 32.768KHz necesarios para el circuito oscilador.
  • pin VBAT. Alimentación de respaldo, utilizado para conectar una batería de 3V. El pin debe conectase a tierra en caso de no requerir la fuente de respaldo.
  • pin SQW/OUT. Es una salida opcional de colector abierto que puede configurarse para generar pulsos de 1Hz, 4KHz, 8KHz y 32KHz.
  • pin SCL. Es la señal de reloj para el bus I2C, este integrado puede operar hasta los 100Khz.
  • pin SDA. Es un señal del bus I2C para transferir los datos 

Adicionalmente posee 56 registros de 8 bits, de uso general que podrían ser utilizados por el microcontrolador como un recurso extra para guardar información.


Toda la configuración y operación del chip radica en un conjunto de registros de 8-bits que se describen en la siguiente figura. Todos los registros son de lectura y escritura, en particular el registro CONTROL permite ajustar ciertas opciones relacionadas con una señal externa del pin SQW/OUT.


Fig3. Registros del DS1307

También es importante recalcar que los registros del DS1307 almacenan la información de la fecha y hora en formato BCD, por lo que sera necesario convertir esta representación a valores decimales si vamos a realizar cálculos. La siguiente figura describe los bits de cada registro.

Fig4. Mapa de Registros del DS1307

Para el ejemplo se elaboro dos funciones de conversión entre BCD y decimal que se llaman:
  • BCDtoDec(num): Realiza la conversión un numero con formato BCD a un numero decimal.
  • DectoBCD(valor): Realiza la conversión de un numero decimal a numero con formato BCD.

Circuito del PIC16F887.
El esquema que se ilustra en la figura 5, muestra la conexión del PIC16F al circuito RTC DS1307 y el modulo de conversion serial USB - TTL.

Fig5. Esquema de Circuito PIC<->RTC
 
En bus I2C requiere un par de resistencias Pull-ups como se muestran en la figura superior para asegurar que el nivel lógico en estado inactivo sea alto(Idle), El valor de estas resistencias(Rpu) para nuestro ejemplo es 2k. Al pin VBAT se conectara una batería tipo celda CR2032 que garantizara que la información de hora y fecha no se pierda luego de una configuración, en caso de no requerir esta funcionalidad conectarse el pin VBAT a tierra mediante una resistencia mayor a 1k
El modulo MSSP del PIC16F887 se configura en modo maestro y utiliza los pines RC3(SCL) y RC4(SDA) para comunicarse con el DS1307.

Programación con en el RTC.
Son tres las rutinas utilizadas para manejar este chip, y estas se describen a continuación:
Fig6. Comunicación I2C para Escritura de Registro DS1307

  • RTCSetup(Modo). Permite inicializar el modulo RTC,  es posible configurar los pulsos externos en el pin SQW/OUT de acuerdo al parámetro Modo, pudiendo ser: (OSCOFF)Sin señal o pulsos, (OSC1HZ) Un pulso por cada segundo, (OSC4KHZ/OSC8KHZ/OSC32KHZ) 4,8 y 32 mil pulsos por segundo.
  • RTCWriteReg(Registro, Valor).  Esta rutina permite guardar o escribir el valor de un dato en un registro del RTC. La rutina opera conforme a las especificaciones descritas en la hoja de datos, mismas que se visualizan en el siguiente diagrama.
  • valor = RTCReadReg(). La rutina permite realizar la lectura de un registro del chip RTC, este valor que tiene representación BCD deberá ser convertido a su equivalente en decimal. El procedimiento se lleva conforme a las especificaciones descritas en la hoja de datos la cuales se reflejan en el siguiente diagrama.
Fig7. Comunicación I2C para Lectura de Registro DS1307

Prueba y Simulación.
Realizaremos un pequeño programa a manera de ver como utilizar las funciones de la librería ds1302, El programa permitirá configurar la fecha y hora al "02 de Septiembre del 2024 horas 13:30", una vez configurado estos valores en el RTC, el programa deberá leer el tiempo y enviarlo cada segundo a través del puerto USART como mensaje "hora:minuto:segundo".

#pragma config FOSC=INTRC_NOCLKOUT, WDTE = OFF, LVP = OFF
#include <xc.h>
#include <stdio.h>
#include "i2c.h"
#include "ds1307.h"
#define _XTAL_FREQ 8000000
volatile __bit tickms;
uint8_t hora, min, seg, val;
void setupMCU(void);
void putch(char byte);
void main(void)
{
    setupMCU(); //Configura el PIC
    RTCSetup(OSC1HZ);
    RTCWriteReg(REG_YEAR, DectoBCD(18)); //Ajusta el año  2018
    RTCWriteReg(REG_MONTH, DectoBCD(9)); //Ajusta el Mes de Septiembre
    RTCWriteReg(REG_DATE, DectoBCD(2));  //Ajuste el día 02
    RTCWriteReg(REG_HOURS, DectoBCD(13));//Ajusta la hora 13
    RTCWriteReg(REG_MINUTES, DectoBCD(30));//Ajusta el minuto 30
    while(1)
    {
        val = RTCReadReg(REG_HOURS); //Lee la hora RTC
        hora = BCDtoDec(val);   //Convierte la hora BCD a Decimal
        val = RTCReadReg(REG_MINUTES); //Lee el minuto RTC
        min = BCDtoDec(val);
        val = RTCReadReg(REG_SECONDS); //Lee el segundo RTC
        seg = BCDtoDec(val);
        //Envia mensaje hh:mm:ss por el puerto USART
        printf("%02u:%02u:%02u\r\n", hora, min, seg);
        __delay_ms(1000);
    }
}

void setupMCU(void) //Procedimiento para configurar el PIC
{
    OSCCONbits.IRCF = 0b111; //Oscilador Interno 8MHz
    while(OSCCONbits.HTS == 0);
    ANSEL = 0; //Desactiva pines ADC AN0 al AN7
    ANSELH = 0;//Desactiva pines ADC AN8 al AN13
    TRISEbits.TRISE2 = 0; //Salida Pin LED
    PORTEbits.RE2 = 0; //Apaga el LED
    OPTION_REGbits.nRBPU = 0; //Activa las pull-ups PORTB
    /* CONFIGURACION UART 9600 BPS*/
    BAUDCTLbits.BRG16 = 0; //8-bit BaudGen
    TXSTAbits.BRGH = 1; //Modo High Speed
    TXSTAbits.TXEN = 1; //Habilita el transmisor UART
    RCSTAbits.SPEN = 1; //Activa el modulo UART
    SPBRG = 51; //Formula [8M/(16 * 9600)] - 1
    /* CONFIGURACION MSSP MODO I2C MASTER Fosc=8MHz -> rate=100KHz*/
    TRISCbits.TRISC3 = 1; //SCL Input Open Drain Slave Mode
    TRISCbits.TRISC4 = 1; //SDA Input Open Drain Slave Mode
    SSPSTATbits.SMP = 1; //Slew rate 1=off(100KHz/1MHz) 0=On(400KHz)
    SSPADD = 19; //[Fosc/(4 * rate)]-1;  
    SSPCONbits.SSPM = 0b1000; //Master Mode Fosc/(4*(SPADD+1))
    SSPCONbits.SSPEN = 1;
}
void putch(char byte)
{
    while(PIR1bits.TXIF == 0) {};
    TXREG = byte;
}

Fig8. Montaje del circuito en Protoboard


Conclusiones y Recomendaciones  

La precisión en tiempo que tiene el modulo RTC dependerá principalmente del oscilador, es decir la calidad del cristal utilizado. En futuros desarrollos podría considerar utilizar como reemplazo el modulo DS3231 o MCP79410 que poseen características adicionales, y con apoyo de la hoja de datos no necesitara demasiados cambios en su implementación.  

Aquí dejo el enlace para que puedas descargar el proyectos creados con MPLAB para este blog, Proyecto ds1307p16f (MPLABX v6.20 compilador XC8 v2.50)

Sin mas que mencionar agradezco tu visita al blog y espero que el ejemplo visto pueda ser útil en tu formación y el proyecto que desarrollas.

Atentamente, Pablo Zárate Arancibia  email: pablinza@me.com / pablinzte@gmail.com, @pablinzar

Santa Cruz de la Sierra - Bolivia

No hay comentarios.:

Publicar un comentario