El nombre completo del circuito Integrado RTC (Reloj en Tiempo Real o Real Time Clock) es: ECS-RTC-SOP8-5101A.
Es desarrollado por ECS Inc. International que es una compañía que se dedica a diseñar y fabricar circuitos integrados que
ayudan a cuantificar el tiempo de manera adecuada; ya sea con Relojes en Tiempo Real o con osciladores, etc.
Este reloj en tiempo real, en particular, me gusta mucho por que es muy pequeñito, es de montaje superficial, pero de los que todavía tienen las patitas
para poderlo soldar con un cautín común y corriente. Lo que nos brinda una gran versatilidad a la hora de fabricar y montar los PCBs. Además tiene
las siguientes funciones que nos da una gran ventaja:
Utiliza un bus i2C.
Tiene un bajo consumo de corriente 0.5μA, lo que nos permite operar con baterías.
Cuenta con una Alarma.
Cuenta con un pin especificamente para activar la alarma y despertar al microprocesador.
Lo podemos alimentar desde 1.1V a 5.5V. Lo que nos brinda una gran versatilidad en el diseño y en la operación con baterías.
Corrección de año bisiesto.
Rango de Operación: -40°C a +85°C
El circuito integrado viene en un encapsulado SOP8 (4.9mm × 6.0mm × 1.6mm) y viene rotulado con las siglas 5101A.
La hoja de datos del circuito integrado la puedes descargar aquí: Hoja de Datos RTC5101A.
El acomodo de los pines de este ecapsulado es el siguiente:
Recapitulando y explicando cada uno de los pines mostrados en la imagen/tabla anterior:
No. Pin
Nombre del Pin
Entrada/Salida
Descripción con Comentarios
1
XIN
Bidireccional
Entrada del Oscilador. Que expresamente aquí es donde conectamos un pin del cristal de cuarzo de 32.768kHz de 12.5pF.
Recuerda que los cristales no tienen polaridad, por lo que no importa cual de los dos pines conectes.
2
XOUT
Bidireccional
Entrada del Oscilador. Que expresamente aquí es donde conectamos el otro pin del cristal de cuarzo de 32.768kHz de 12.5pF.
Recuerda que los cristales no tienen polaridad, por lo que no importa cual de los dos pines conectes.
3
/INT
Salida (Open-Drain)
Este es un pin que se puede configurar como salida de la Alarma o como salida del timmer.
Es muy importante considerar en el diseño que esta es una salida Open-Drain, lo que requiere que se le conecte una resistencia (normalmente de 10KΩ).
4
GND
Alimentación
Conectar la tierra.
5
SDA
Bidireccional
Es una señal del bus I2C. Este pin es donde se conecta los datos a transmitir por el I2C.
6
SCL
Entrada
Es una señal del bus I2C. Este pin es donde se conecta la señal de reloj proveniente por el Maestro del I2C.
7
FOUT
Salida
Este pin es puede ser utilizado para sacar la señal de frecuencia que puede generar el RTC 5101A del que hablamos en esta página de internet.
8
VDD
Alimentación
Este es el pin de alimentación positiva. También conocido como +Vcc.
CONEXIONES DEL RTC5101A
Vdd se conecta directo al positivo de la alimentación +Vcc. Que debe de estar entre 1.1v y 5.5v.
GND se conecta directamente a tierra.
Xout y Xin se conecta directamente al cristal de cuarzo de 32.768kHz de 12.5pF.
SDA se debe conectar la línea de datos (SDA) proveniente del maestro, que normalmente es el microprocesador.
SCL es la línea de reloj del bus I2C, proveniente del maestro, que normalmente es el microprocesador.
/INT o el pin de Interrupción (Negado) va conectado a la entrada del microprocesador para que ejecute la rutina que corresponda.
Se activa con un nivel bajo, es una salida Open-Drain, por lo que debemos de conectar una resistencia de 10kΩ a positivo (+Vcc).
Fout es la señal para generar una onda cuadrada a una frecuencia configurada en el RTC.
Para efectos de esta conexión, no la vamos a usar por lo que la dejamos sin conectar.
Comunicación I2C.
La dirección del RTC para el bus I2C es 65h para lectura de un registro y 64h para la escritura. Pero para ponerlo en el arduino es 32h por que se omite el último bit:
Tipo de transferencia de información
Dirección del RTC 5101A
R/W
bit 7
bit 6
bit 5
bit 4
bit 3
bit 2
bit 1
bit 0
65h Lectura
0
1
1
0
0
1
0
1 Lectura
64h Escritura
0 Escritura
32h Arduino
0
1
1
0
0
1
0
X
Lectura o Escrutura según corresponda, lo asigna el compilador.
3
2
Para arduino hay que poner 32h 0x32
Registros del RTC 5101A.
Mapa de Memoria del RTC 5101A.
00h
Sin especificar. No se debe usar.
0Fh
10h
Registros de Fecha y Hora
16h
17h
Reservado
18h
Registros de la Alarma
1Fh
20h
RAM
2Fh
30h
Reservado
31h
32h
Control de Interrupciones
Sincronizar la fecha y hora en el RTC 5101A.
Es importante que recordarle al lector, que la fecha y hora en los registros debe de ser en código BCD. No en código ascii, no en hexadecimal, sino en código BCD.
Acuerdese que el código BCD se parece al número hexadecimal o binario, pero solo hasta llegar al número nueve.
No existe 10, 11, 12, 20, 30 ,40, 50, etc. cosa muy importante a tener en cuenta a la hora de escribir los meses o las horas.
Para sincronizar la fecha, es necesario escribir los registros del 10h al 16h, que son los que están en verde en el mapa de memoria del RTC 5101A.
El código que se utiliza en Arduino es:
// Fecha a a justar = 16/Ene/2025 19:46:08
COMANDO_FECHA[0]=A;
//Año
COMANDO_FECHA[1]=2;
COMANDO_FECHA[2]=0;
COMANDO_FECHA[3]=2;
COMANDO_FECHA[4]=5;
//Mes
COMANDO_FECHA[5]=0;
COMANDO_FECHA[6]=1;
//Día
COMANDO_FECHA[7]=1;
COMANDO_FECHA[8]=6;
//Hora
COMANDO_FECHA[9]=1;
COMANDO_FECHA[10]=9;
//Minutos
COMANDO_FECHA[11]=4;
COMANDO_FECHA[12]=6;
//Segundos
COMANDO_FECHA[13]=0;
COMANDO_FECHA[14]=8;
//------------------------- Sincronizamos el Reloj -----------------
//Sincronizamos la Fecha y Hora en el RTC 5101A
Wire.beginTransmission(0x32);
Wire.write(0x10); // Registro de los Segundos donde comenzamos la carga
//Sincronizamos los Segundos
PARAMETRO = CHARTOBCD(COMANDO_FECHA[13], COMANDO_FECHA[14]);
Wire.write(PARAMETRO);
//Sincronizamos los Minutos
PARAMETRO = CHARTOBCD(COMANDO_FECHA[11], COMANDO_FECHA[12]);
Wire.write(PARAMETRO);
//Sincronizamos la Hora
PARAMETRO = CHARTOBCD(COMANDO_FECHA[9], COMANDO_FECHA[10]);
Wire.write(PARAMETRO);
//Dia de la Semana
Wire.write(0X01);
//Sincronizamos Dia del mes
PARAMETRO = CHARTOBCD(COMANDO_FECHA[7], COMANDO_FECHA[8]);
Wire.write(PARAMETRO);
//Sincronizamos Mes
PARAMETRO = CHARTOBCD(COMANDO_FECHA[5], COMANDO_FECHA[6]);
Wire.write(PARAMETRO);
//Sincronizamos Anio
PARAMETRO = CHARTOBCD(COMANDO_FECHA[3], COMANDO_FECHA[4]);
Wire.write(PARAMETRO);
Wire.endTransmission();