Проблема понимания того, как запрограммировать DS3231 RTC

Мне нужно посылать импульс на Arduino каждый час. Мне не нужны день, месяц, год и так далее. Мне просто нужен импульс от DS3231 каждые 1 час через квадратный волновой вывод.

https://github.com/NorthernWidget/DS3231
Я включил эту библиотеку, но никак не могу понять, как генерировать импульс в каждый час, используя эту библиотеку. Возможно ли это?

Мое требование простое. Мне нужен импульс на выводе прерывания Arduino в каждый час.

#include <DS3231.h>
#include <Wire.h>

void setup()
{
  Wire.begin();
  EICRA |= 0b00000011;
  EIMSK |= 0b00000001;
  sei();
 // Нет подсказки о том, как настроить DS3231 для получения импульса в каждый час
}
ISR(INT0_vect)
{
  // Эта функция будет выполняться каждый час
}
void loop(){}

, 👍0

Обсуждение

Посмотрите документацию, на которую вы ссылаетесь, и посмотрите функцию turnOnAlarm(). Я не копался в этом, но это должно помочь вам начать., @jwh20

Это я тоже проверил. Пример был слишком сложным. Но, насколько я понял из примера, я должен проверить состояние тревоги через I2C., @Jack Danniels

В таком случае позвольте мне предложить вам попробовать несколько простых упражнений, прежде чем погружаться в относительно сложное устройство, такое как DTC3231. Если вы просто узнаете о том, как устанавливать и считывать время, это было бы хорошим началом., @jwh20


2 ответа


Лучший ответ:

2

Адрес DS3231 - 104. Вместо того чтобы использовать этот большой сложный заголовок, отправьте простой фрейм.

В течение 1 секундного импульса кадр будет : S 208 A 14 A 0 P

N.B. Здесь адрес - это 7-битное значение 104. И дополнительный бит для работы R / W.

В библиотеке Arduino wire вам не нужно включать бит R / W. Итак, просто напишите 104. Для почасового Алама установите бит INT управляющего регистра и отправьте простой кадр следующим образом. Не усложняйте ситуацию с помощью заголовка.

,

0

См. Документацию по адресу:

Документация библиотеки DTC3231

Где есть раздел о сигнальных битах и настройке аварийных сигналов:

        // Функции сигнализации
        
        void getA1Time(byte& A1Day, byte& A1Hour, byte& A1Minute, byte& A1Second, byte& AlarmBits, bool& A1Dy, bool& A1h12, bool& A1PM); 
/ * Извлекает все, что вы хотели бы знать о тревоге
 * один. 
 * A1Dy true заставляет будильник включаться A1Day = День недели,
 * A1Dy false заставляет сигнал тревоги включаться A1Day = Дата месяца.
 *
* byte AlarmBits задает поведение аварийных сигналов:
 * Dy A1M4 A1M3 A1M2 A1M1 Ставка
 * X 1 1 1 1 Один раз в секунду
 * X 1 1 1 0 Сигнал тревоги при совпадении секунд
 * X 1 1 0 0 Сигнал тревоги при совпадении мин, сек
 * X 1 0 0 0 Сигнал тревоги при совпадении часа, минуты, секунды
 * 0 0 0 0 0 Сигнал тревоги при совпадении даты, h, m, s
 * 1 0 0 0 0 Сигнал тревоги при совпадении DoW, h, m, s
 *
 * Dy A2M4 A2M3 A2M2 Ставка
 * X 1 1 1 Один раз в минуту (в секундах = 00)
 * X 1 1 0 Сигнал тревоги при совпадении минут
 * X 1 0 0 Будильник, когда часы и минуты совпадают
 * 0 0 0 0 Будильник при совпадении даты, часа, минуты
 * 1 0 0 0 Сигнал тревоги при совпадении DoW, hour, min
 */
        void getA2Time(byte& A2Day, byte& A2Hour, byte& A2Minute, byte& AlarmBits, bool& A2Dy, bool& A2h12, bool& A2PM); 
            // То же, что getA1Time();, но A2 длится только секунды == 00.
        void setA1Time(byte A1Day, byte A1Hour, byte A1Minute, byte A1Second, byte AlarmBits, bool A1Dy, bool A1h12, bool A1PM); 
            // Установить детали для сигнала тревоги 1
        void setA2Time(byte A2Day, byte A2Hour, byte A2Minute, byte AlarmBits, bool A2Dy, bool A2h12, bool A2PM); 
            // Установить детали для сигнализации 2
        void turnOnAlarm(byte Alarm); 
            // Включает сигнал тревоги 1 или 2 и вывод внешнего прерывания.
            // Если Alarm != 1 , то предполагается Alarm == 2 .
        void turnOffAlarm(byte Alarm); 
            // Отключает сигнал тревоги 1 или 2 (по умолчанию равно 2, если сигнал тревоги! = 1);
            // и оставляет контакт прерывания в покое.
        bool checkAlarmEnabled(byte Alarm); 
            // Возвращает T /F, чтобы указать, является ли запрошенный сигнал тревоги
            // включено. Значение по умолчанию равно 2, если Alarm ! = 1.
        bool checkIfAlarm(byte Alarm); 
            // Проверяет, есть ли указанный сигнал тревоги (1 или 2, 2 по умолчанию);
            // был активирован.

ОБНОВЛЕНИЕ:

Основываясь на вашем комментарии:

Это я тоже проверил. Пример был слишком сложным.

Вам нужно потратить некоторое время на знакомство с некоторыми основными функциями Arduino и AVR. Чтобы это сработало, вам нужно будет не только понять, как разговаривать с RTC через I2C, но и как включить PIN-прерывание в AVR и ответить на него. У вас есть функция ISR, но вы ничего не сделали, чтобы включить какой-либо источник прерываний.

,

Поверьте мне, я знаю, как включить внешнее прерывание (также прерывание смены PIN ATmega328P). EICRA |= 0b00000011; EIMSK |= 0b00000001;sei(); Вы просите об этом. Не так ли? Я не включил их, так как речь идет о функции RTC вместо функции ISR., @Jack Danniels