Проблема понимания того, как запрограммировать 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(){}
@Jack Danniels, 👍0
Обсуждение2 ответа
Лучший ответ:
Адрес DS3231 - 104. Вместо того чтобы использовать этот большой сложный заголовок, отправьте простой фрейм.
В течение 1 секундного импульса кадр будет : S 208 A 14 A 0 P
N.B. Здесь адрес - это 7-битное значение 104. И дополнительный бит для работы R / W.
В библиотеке Arduino wire вам не нужно включать бит R / W. Итак, просто напишите 104. Для почасового Алама установите бит INT управляющего регистра и отправьте простой кадр следующим образом. Не усложняйте ситуацию с помощью заголовка.
См. Документацию по адресу:
Документация библиотеки 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
- Ошибка модуля часов реального Времени-DS3231
- RtcDateTime' не называет тип
- Не удалось выделить SSD1306 при добавлении константы
- Установить регистр управления на низкий уровень в ds3231 rtc
- Библиотека Parola и часы DS3231
- Как подсчитать количество нарастающих фронтов на DS3231 rtc?
- Программа Arduino, использующая i2c, перестает работать после нескольких раз печати на OLED
- TimeAlarms перестает работать при использовании setSyncProvider(RTC.get) DS1307
Посмотрите документацию, на которую вы ссылаетесь, и посмотрите функцию turnOnAlarm(). Я не копался в этом, но это должно помочь вам начать., @jwh20
Это я тоже проверил. Пример был слишком сложным. Но, насколько я понял из примера, я должен проверить состояние тревоги через I2C., @Jack Danniels
В таком случае позвольте мне предложить вам попробовать несколько простых упражнений, прежде чем погружаться в относительно сложное устройство, такое как DTC3231. Если вы просто узнаете о том, как устанавливать и считывать время, это было бы хорошим началом., @jwh20