Conexión del reloj en tiempo real ds1302 a Arduino. DS1302 Venciendo al tiempo. ds1302.c para conexión WinAVR (GCC) Rtc ds1302 a arduino

- Reloj en tiempo real. A menudo se encuentra en kits KIT de componentes para Arduino (kit de inicio arduino).

Características del módulo:

  • Reloj en tiempo real, calendario hasta 2100, teniendo en cuenta los años bisiestos.
  • Soporte para batería Li-Ion CR2032\CR1220 según versión, para alimentación de respaldo.
  • tres hilos Interfaz de serie.

Entre las deficiencias, cabe destacar la muy mala precisión del movimiento.

Distribución de pines del módulo:

  • VCC Y Tierra- Alimentación y tierra, Tensión de alimentación de 2,0 V a 5,5 V. Típica 3,3 V.
  • CLK/SCLK— Señal de reloj de interfaz serie.
  • DAT/E/S— Entrada/Salida Push-Pull, línea de datos de interfaz serie.
  • PRIMERA/CE— Permiso de lectura/escritura.

Conexión a Arduino:

El módulo está conectado a cualquier puerto arduino libre, la fuente de alimentación del módulo es de 5 voltios.

Software:

Hay una biblioteca que puedes descargar.

Después de instalar la biblioteca, abra el ejemplo. set_clock.ino

constante int kCePin = 5; // Habilitación de chip const int kIoPin = 6; // Entrada/Salida constante int kSclkPin = 7; // Reloj en serie

en la línea de constantes indicamos a qué puertos está conectado el módulo, las designaciones en el módulo pueden diferir y están etiquetadas como CLK, DAT, RES, Este SCLK, E/S, CE respectivamente.

  • Características distintivas:
  • Cálculo del tiempo real en segundos, minutos, horas, fechas del mes, meses, días de la semana y años, teniendo en cuenta la altura del año en curso hasta 2100.
  • RAM adicional de 31 x 8 para almacenamiento de datos
  • Entrada en serie: información de salida para reducir los pines del microcircuito.
  • Realice todas las funciones con una tensión de alimentación de 2,0-5,5 V
    - realización de todas las funciones con un voltaje de 2,0-5,5 V en la salida de energía adicional
  • Consumo no superior a 300 nA con alimentación de 2,5 V
  • Leer y escribir información en un byte o flujo.
  • Ejecución en paquete DIP de 8 pines y también, bajo pedido, en paquete SOIC de montaje en superficie de 8 pines
  • Interfaz sencilla de 3 cables
  • Compatible con chips TTL (Vcc= 5V)
  • Disponible en rango de temperatura industrial: -40°C a +85°C
  • Compatible con DS1202
  • Diferencias con DS1202:
    posibilidad de conectar el circuito de carga incorporado al pin Vcc1
    Dos salidas de energía para conectar las fuentes de energía principal y de respaldo.
    RAM aumentada en 7 bytes

Descripción de pines:

X1, X2conexión resonador de cuarzo 32,768 kHz
Tierrageneral
primeroreiniciar
E/Sentrada de datos - salida
SCLKsincronización comunicación serial
VCC1, VCC2pines de poder

Diagrama de bloques de DS1302:

Descripción general:

El chip DS1302 contiene un reloj en tiempo real con calendario y 31 bytes de RAM estática. Se comunica con el microprocesador a través de una sencilla interfaz serie. La información del calendario y en tiempo real se presenta en segundos, minutos, horas, día, fecha, mes y año. Si el mes actual contiene menos de 31 días, el chip determinará automáticamente el número de días del mes, teniendo en cuenta la duración del año actual. El reloj funciona en formato de 24 o 12 horas con un indicador AM/PM (am/pm). La conexión del DS1302 a un microprocesador se simplifica mediante la comunicación serie síncrona. Solo requiere 3 cables: (1) RST (reinicio), (2) E/S (línea de datos) y (3) SCLK (reloj de comunicación serie). Los datos se pueden transferir un byte a la vez o en una secuencia de hasta 31 bytes. El DS1302 está diseñado para consumir poca energía y retener datos e información del reloj mientras consume menos de 1 µW. DS1302 es el sucesor de DS1202. Además de las funciones básicas de almacenamiento de tiempo del DS1202, el DS1302 tiene dos pines de alimentación para conectar las fuentes de alimentación principal y de respaldo, la capacidad de conectar un circuito de carga programable al pin VCC1 y siete bytes adicionales de RAM.

Conexión:

Conexión de DS1307 a Arduino:

RTC DS1307Arduino UNO
TierraTierra
VCC+5V
S.D.A.A4
SCLA5

Conexión de DS1302 a Arduino:

RTC DS1302Arduino UNO
TierraTierra
VCC+5V
primero6 (Se puede cambiar a otros en el boceto)
CLK7 (Se puede cambiar a otros en el boceto)
DAT

(Se puede cambiar a otros en el boceto)

Conexión de DS3231 a Arduino:

RTC DS3231Arduino UNO
TierraTierra
VCC+5V
S.D.A.A4
SCLA5

Módulo DS1302 reloj en tiempo real en Aliexpress http://ali.pub/1br52w

Código de programa para el módulo 1302 y la pantalla 1602 I2C

Dependiendo del módulo que conectes deberás especificar en el programa

Para DS1302 :

tiempo. comenzar (RTC_DS1302, 10, 13, 12);

#incluir

virtuabotixRTC miRTC(6, 7, 8); //CLK, DAT, PRIMERO

Programa

#incluir

#incluir

LiquidCrystal_I2C lcd(0x3F, 2,1,0,4,5,6,7,3, POSITIVO);

configuración nula() (

lcd.comenzar(16,2);

//myRTC.setDS1302Time(00.04, 12, 06, 18, 04, 2017);

bucle vacío() (

myRTC.updateTime();

lcd.setCursor(0, 0);

lcd.print("fecha: ");

lcd.print(miRTC.díadelmes);

lcd.imprimir("/");

lcd.print(miRTC.mes);

lcd.imprimir("/");

lcd.print(miRTC.año);

lcd.imprimir(" ");

lcd.setCursor(0, 1);

lcd.print("hora: ");

lcd.print(misRTC.horas);

lcd.imprimir(":");

lcd.print(misRTC.minutos);

lcd.imprimir(":");

lcd.print(misRTC.segundos);

lcd.println(" ");

Tampoco nos olvidamos de ahorrar al comprar productos en Aliexpress mediante cashback.

Ventajas de la biblioteca:

la biblioteca tiene funciones internas procesamiento de hardware de los protocolos de transferencia de datos I2C y SPI y, por lo tanto, no requiere la conexión de bibliotecas adicionales, pero tampoco entra en conflicto con ellas, si están conectadas.

La biblioteca tiene funciones internas como programa para procesar el protocolo de transferencia de datos de 3 hilos.

Para inicializar un módulo, debe llamar a la función de inicio con el nombre del módulo.

Los módulos se conectan a los pines del hardware arduino del bus utilizado (a excepción de 3-Wire)

Fácil de configurar y leer la hora usando las funciones settime y gettime

La función settime puede configurar la fecha y la hora, ya sea total o parcialmente (por ejemplo, solo los minutos, o solo el día, etc.)

La función gettime funciona como la función de fecha en PHP, devolviendo una cadena con la hora, pero si se llama sin un parámetro, la función no devolverá nada y la hora se puede leer de las variables como números.

La biblioteca es extensible, es decir, para que funcione con un nuevo módulo, debe especificar los parámetros de este módulo en las matrices existentes del archivo RTC.h (tipo de bus, frecuencia del bus en kHz, modos de funcionamiento, direcciones de registro, etc.), ya que todo esto se describe en el archivo con extensión.txt

Así, al agregar un nuevo módulo a la biblioteca, solo aumentaremos el área de memoria dinámica ocupada en ~36 bytes, sin afectar el área de memoria del programa.

Al llamar a la función de inicio, la biblioteca lee las banderas de los registros del módulo y, si es necesario, las configura o restablece para que el módulo pueda funcionar con energía de la batería, y la frecuencia de 1 Hz se establece en el pin de onda cuadrada programable (si el módulo tiene uno), entonces este pin se puede utilizar como interrupción externa por segundo.

Cuando se trabaja con el módulo DS1302, no se necesitan resistencias en el pin GND (que son necesarias para que funcione con otras bibliotecas de este módulo), esto se logra especificando una frecuencia específica de 10 kHz para los 3- Bus de cables, independientemente de la frecuencia de la CPU Arduino.

La biblioteca implementa una más. opcional función period, tomando como único argumento el número de minutos (de 1 a 255)

Si la función gettime se llamó varias veces durante el tiempo especificado, entonces la solicitud al módulo a través del bus se enviará solo la primera vez y la respuesta a todas las demás solicitudes será la suma del tiempo de la última respuesta del módulo y el tiempo transcurrido desde esta respuesta.

La función de período solo necesita llamarse una vez.

Descripción detallada:

} // DESCRIPCIONES DE LOS PARÁMETROS DE FUNCIONES:// // Conectando la biblioteca:// #incluir // hora iarduino_RTC (nombre del módulo [, pin SS/RST [, pin CLK [, pin DAT]]]);// si el módulo funciona en el bus I2C o SPI, entonces basta con especificar 1 parámetro, por ejemplo: iarduino_RTC time(RTC_DS3231);// si el módulo opera en el bus SPI y el pin SS del hardware está ocupado, entonces el número del pin SS asignado para el módulo se indica mediante el segundo parámetro, por ejemplo: iarduino_RTC time(RTC_DS1305,22);// si el módulo funciona en un bus de tres cables, se indican los números de todos los pines, por ejemplo: iarduino_RTC time(RTC_DS1302, 1, 2, 3); // PRIMERO, CLK, DAT// // Para trabajar con módulos, la biblioteca implementa 5 funciones:// inicia el módulo comenzar();// especifica la hora settime(segundos [, minutos [, horas [, día [, mes [, año [, día de la semana]]]]]]);// obtiene la hora gettime("cadena con parámetros");// tiempo de parpadeo tiempo de parpadeo(0-no_parpadeo / 1-parpadeo_seg / 2-parpadeo_min / 3-parpadeo_hora / 4-parpadeo_días / 5-parpadeo_mes / 6-parpadeo_año / 7-parpadeo_días_de-semana / 8-parpadeo_mediodía)// descarga el período del bus (minutos);// // Función comenzar(): // la función inicia el módulo: verifica los registros del módulo, inicia el generador del módulo, etc.// // Función settime(segundos [, minutos [, horas [, día [, mes [, año [, día de la semana]]]]]]):// escribe la hora en el módulo// se indica el año sin tener en cuenta el siglo, en el formato 0-99// las horas se indican en formato de 24 horas, de 0 a 23// el día de la semana se especifica como un número del 0-domingo al 6-sábado// si el parámetro anterior no debe modificarse, entonces puede especificar un valor negativo o obviamente mayor// ejemplo: settime(-1, 10); establecerá 10 minutos y dejará los segundos, las horas y la fecha sin cambios// ejemplo: settime(0, 5, 13); establecerá 13 horas, 5 minutos, 0 segundos y dejará la fecha sin cambios// ejemplo: settime(-1, -1, -1, 1, 10, 15); establecerá la fecha en 01/10/2015 y dejará la hora y el día de la semana sin cambios// // Función gettime("cadena con parámetros"):// la función recibe y muestra la cadena, reemplazando los caracteres descritos a continuación por tiempo actual // ejemplo: gettime("d-m-Y, H:i:s, D"); responderá con la línea "01-10-2015, 14:00:05, jueves"// ejemplo: gettime("s"); responderá con la línea "05"// los caracteres especificados son idénticos a los caracteres de la función date() en PHP// s segundos de 00 a 59 (dos dígitos)// i minutos de 00 a 59 (dos caracteres)// h horas en formato de 12 horas de 01 a 12 (dos dígitos)// H horas en formato de 24 horas de 00 a 23 (dos dígitos)// d día del mes del 01 al 31 (dos caracteres)// w día de la semana de 0 a 6 (un signo: 0-domingo, 6-sábado)// D nombre del día de la semana de lunes a domingo (tres signos: lunes martes miércoles jueves viernes sábado domingo)// m mes del 01 al 12 (dos dígitos)// Nombre del mes M de enero a diciembre (tres caracteres: enero, febrero, marzo, abril, mayo, junio, julio, agosto, septiembre, octubre, noviembre, diciembre)// Año Y de 2000 a 2099 (cuatro dígitos)// año y de 00 a 99 (dos dígitos)// mediodía am o pm (dos caracteres, minúsculas)// Un mediodía AM o PM (dos caracteres, mayúsculas)// la línea no debe exceder los 50 caracteres// // si necesita obtener la hora en forma de números, puede llamar a la función gettime() sin un parámetro y luego obtener la hora a partir de variables// segundos segundos 0-59// minutos minutos 0-59 // horas horas 1-12 // horas horas 0-23

setTime(hora, min, seg);
Establecer la hora.
Opciones:
hora: Horas (0-23)
mín: Minutos (0-59)
segundo: Segundos (0-59)
Ejemplo: rtc.setTime(23, 59, 59); // Establece la hora a las 23:59:59
Nota: Al configurar la hora se restablece el indicador CH (Detención del reloj).

setDate(fecha, lunes, año);
Fijando la fecha.
Opciones:
fecha: Día (1-31)
lun: Mes (1-12)
año: Año (2000-2099)
Ejemplo: rtc.setDate(6, 8, 2015); // Fije la fecha al 6 de agosto de 2015.
Nota: No hay protección contra ingresar una fecha incorrecta. Es decir, es posible entrar el 31 de febrero, pero el resultado no será predecible.

establecerDOW(dow);
Configuración del día de la semana.
Opciones:
abajo: Día de la semana (1-7)
Ejemplo: rtc.setDOW(VIERNES); // Establece el día de la semana: viernes
Nota: Programado de lunes (1) a domingo (7).

getTimeStr();
Lea la hora actual como una variable de cadena.
Opciones:
formato: <необязательный параметр>
FORMATO_LARGO"HH:MM:SS" (predeterminado)
FORMATO_SHORT"HH:MM"
Ejemplo: Serial.print(rtc.getTimeStr()); //Envía la hora actual a través del puerto serie

getFechaStr(]]);
Lea la fecha actual como una variable de cadena.
Opciones:
formato sl: <необязательный параметр>
FORMATO_LARGO Año de 4 dígitos (AAAA) (predeterminado)
FORMATO_SHORT Año de 2 dígitos (AA)
formato: <необязательный параметр>
FORMAT_LITTLEENDIAN"DD.MM.AAAA" (predeterminado)
FORMAT_BIGENDIAN"AAAA.MM.DD"
FORMAT_MIDDLEENDIAN"MM.DD.AAAA"
divisor: <необязательный параметр>
Símbolo de división. Por defecto "."
Ejemplo: Serial.print(rtc.getDateStr()); // Enviar fecha actual vía puerto serie (En formato "DD.MM.AAAA")

getDOWStr();
Lea el día actual de la semana como una variable de cadena.
Opciones:
formato:<необязательный параметр>
FORMATO_LARGO Día de la semana en idioma en Inglés(Por defecto)
FORMATO_SHORT Nombre abreviado del día de la semana en inglés (3 caracteres)
Ejemplo: Serial.print(rtc.getDOWStr(FORMAT_SHORT)); //Envía el nombre abreviado del día actual de la semana a través del puerto serie

getMonthStr();
Lea el mes actual como una variable de cadena.
Opciones:
formato: <необязательный параметр>
FORMATO_LARGO nombre del mes en inglés (predeterminado)
FORMATO_SHORT Nombre del mes abreviado en inglés (3 caracteres)
Ejemplo: Serial.print(rtc.getMonthStr()); //Envía el nombre del mes actual a través del puerto serie

detener(valor);
Control de bandera CH (reloj start-stop).
Opciones:
valor:
verdadero: Establecer bandera CH
FALSO: borrar bandera CH
Ejemplo: rtc.halt(verdadero); // Establecer bandera CH
Notas: Cuando se establece la bandera, el generador de reloj
se detiene y el DS1302 está en modo de espera de bajo consumo con una corriente inferior a 100 nA. Si se reinicia la bandera, el reloj comienza a contar.

writeProtect(habilitar);
Configurar o restablecer el bit WP.
Opciones:
permitir:
verdadero: Instalar bit WP
FALSO: Restablecer el bit WP
Ejemplo: rtc.writeProtect (falso); //Restablecer el bit WP
Nota: WP: bit (protección contra escritura). Bloquea la escritura de información en DS1302

establecerTCR(valor);
Configuración del modo de carga lenta (carga de baja corriente).
Opciones:
valor: ciertos literales que indican el número de diodos y resistencias para cargar.
Ejemplo: rtc.setTCR(TCR_D1R4K); // El modo de carga lenta está configurado en 1 diodo y una resistencia de 4 kOhm.
Nota: Los literales tienen la forma TCR_DxRyK donde x es el número de diodos (1 o 2) e y es la resistencia utilizada (2, 4 u 8 kOhm). TCR_OFF desactiva la función de carga.

writeBuffer(búfer);
Escritura de información en la RAM DS1302.
Opciones:
buffer: DS1302_búfer RAM
Ejemplo: rtc.writebuffer(ramBuffer); // Escribe 31 bytes de la variable ramBuffer en la RAM DS1302

leerBuffer();
Lectura de información de la RAM DS1302.
Opciones: No
Ejemplo: ramBuffer=rtc.readBuffer(); // Lee los 31 bytes de la RAM DS1302 en la variable ramBuffer

pinchar(dirección, valor);
Escriba un byte en la RAM DS1302.
Opciones:
DIRECCIÓN: dirección para grabación (0-30)
valor: número para escribir a la dirección

(0-255)
Ejemplo: rtc.poke(15, 160); //Escribe el número 160 en la dirección 15

vistazo (dirección);
Leyendo un byte de la RAM DS1302.
Opciones:
DIRECCIÓN: leer dirección (0-30)
Ejemplo: b=rtc.peek(18); // Lee 1 byte en la dirección 18 en la variable b

Publicado el 18/08/2011

- Este es un chip en tiempo real. Garantiza el paso del tiempo incluso cuando el dispositivo principal está desconectado de la alimentación.

Características principales:

  • – fácil conexión al microcontrolador a través de una interfaz de tres cables.
  • – alimentación de 2 a 5,5 V.
  • – de elementos externos un reloj de cuarzo de 32768 Hz y una batería de respaldo de 3V (yo uso RC2032). La batería dura mucho tiempo, el microcircuito consume unos 300 nA ( nano amperio)!
  • – cuenta segundos, minutos, horas, día del mes, mes, año, día de la semana. Se tienen en cuenta los años bisiestos. El microcircuito podrá funcionar hasta las 21:00. El contador de años ya no será suficiente. Esto ciertamente me entristeció. 🙂
  • – visualización de la hora en modos de 12 o 24 horas con visualización AM o PM

Matices

A veces escriben “el chip tiene un calendario incorporado hasta el año 2100”. No se apresure a sorprenderse, esto solo significa que el tiempo se calcula teniendo en cuenta años bisiestos. ¡Eso es todo! De hecho, incluso es necesario configurar el día de la semana. Aquellos. el día de la semana no está determinado por una fecha fija. El día de la semana funciona como un simple contador y cambia a medianoche. Pero por otro lado es muy cómodo. Después de todo, en Europa del Este Se acostumbra considerar el primer día de la semana como el lunes, y en Occidente el primer día de la semana es el domingo. En este caso, al microcircuito no le importa en absoluto. Configuramos el día actual de la semana según nuestro propio cálculo y luego cambiará cada medianoche.

Conexión a MK

Distribución de pines del microcircuito:

Conexión al microcontrolador:

tomado de la documentación, que se puede descargar aquí:

Biblioteca para GCC WinAVR

Para ser honesto, inmediatamente quise no molestarme y usar una biblioteca ya preparada. Eso es lo que hice, incluso descargué dos. Uno fue escrito por un programador ruso y el segundo por un extranjero. Ambos no funcionaron correctamente. En el primer caso, por alguna razón, no se fijó un día mayor que el mágico séptimo día del mes, bueno, claro, nunca han oído hablar del modo de 12 horas en Rusia, y las letras AM PM, para nosotros. Los eslavos son extraños e incomprensibles. En el segundo caso… ¿ya lo has adivinado? ¡Sí! ¡¡¡Los extranjeros no tuvieron en cuenta que en algún lugar del planeta naciones insidiosas calculan el tiempo en 24 horas!!! Además, el año se escribió (y por tanto se leyó) incorrectamente. Aquellos. Por supuesto que funciona de alguna manera, pero el año que viene todos los errores desaparecerán. Me di por vencido y escribí mi propia biblioteca sencilla.

Antes de usar la biblioteca, abramos el archivo.
En él editamos solo estos parámetros:

#definir DS1302_E 0 #definir DS1302_SCLK 1 #definir DS1302_IO 2 #definir DS1302_DDR_RTC DDRC #definir DS1302_PORT_RTC PORTC #definir DS1302_PIN_RTC PINC

Aquellos. Describimos a qué patas y a qué puerto está conectado el nuestro.

Tenga en cuenta que el mismo archivo describe la estructura:

Typedef struct ( uint8_t Seg; uint8_t Min; uint8_t Hora; uint8_t Mes; uint8_t Día; uint8_t Año; uint8_t Día de la semana; uint8_t AMPM; uint8_t H12_24; ) tpDateTime; tpDateTime FechaHora;

A través de él, la relación (escritura y lectura) con .

La biblioteca tiene sólo dos funciones:
anular DS1302_ReadDateTime();
anular DS1302_WriteDateTime();

Para configurar la hora en el chip necesitas
1. En la estructura Fecha y hora establecer hora y modo (12 o 24 horas)
2. Llame a la función DS1302_WriteDateTime();

Para leer la hora del microcircuito:
1. Llame a la función DS1302_ReadDateTime();
2. Leer la hora y el modo de la estructura. Fecha y hora.

tenga en cuenta que FechaHora.AMPM Y FechaHora.H12_24 se dan de la siguiente manera:

FechaHora.AMPM = AM; o FechaHora.AMPM = PM;

FechaHora.H12_24 = H12; o FechaHora.H12_24 = H24;

Ejemplo de uso:

#incluir #incluir #include "lcd_lib.h" #include "ds1302.h" char buffer=""; int main() ( // Establece la hora y los parámetros (AM/PM debe configurarse solo con H12) DateTime.Sec = 57; DateTime.Min = 59; DateTime.Hour = 11; DateTime.Month = 8; DateTime.Day = 16 ; DateTime.Year = 11; DateTime.WeekDay = 2; DateTime.AMPM = AM; //AM/PM DateTime.H12_24 = H12; //H12/H24 // Escribe la hora en el chip ds1302 DS1302_WriteDateTime(); // Inicializa la pantalla LCDinit(); LCDcursorOFF(); LCDclr(); while(1) ( // Lee la hora del chip ds1302 DS1302_ReadDateTime(); // Muestra la hora y la fecha sprintf(buffer, "%02i: %02i:%02i" , DateTime.Hour, DateTime.Min, DateTime.Sec); LCDGotoXY(0,0); LCDstring(buffer, 8); if (DateTime.H12_24 == H12) ( if (DateTime.AMPM = = AM)( LCDsendChar( "A"); ) else ( LCDsendChar("P"); ) LCDsendChar("M"); ) sprintf(buffer, "%02i-%02i-%02i,%i", DateTime. Día, FechaHora.Mes, FechaHora.Año, FechaHora.DíaSemana); LCDGotoXY(0,1); LCDstring(buffer, 10); _delay_ms(100); ) )

¡Atención! En el ejemplo de las siguientes líneas, se establece de antemano tiempo especificado cuando arranca el microcontrolador.

FechaHora.Sec = 57; FechaHora.Min = 59; FechaHora.Hora = 11; FechaHora.Mes = 8; FechaHora.Día = 16; FechaHora.Año ​​= 11; FechaHora.DíaSemana = 2; FechaHora.AMPM = AM; //AM/PM FechaHora.H12_24 = H12; //H12/H24 // Escribe la hora en el chip ds1302 DS1302_WriteDateTime();

Aquellos. El microcontrolador configurará la misma hora cada vez que se encienda la alimentación. Si la hora ya está configurada en el chip (por supuesto, con una batería conectada), puedes comentar la función. DS1302_WriteDateTime(); compilar y actualizar el microcontrolador con nuevo firmware. Después de lo cual solo leerá la hora del chip.



Si encuentra un error, seleccione un fragmento de texto y presione Ctrl+Entrar.