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.
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 |
- 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 |
Fig4. Mapa de Registros del DS1307 |
- 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.
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.
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.
#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)
Atentamente, Pablo Zárate Arancibia email: pablinza@me.com / pablinzte@gmail.com, @pablinzar
No hay comentarios.:
Publicar un comentario