Будильники DS3231

diosdima

✩✩✩✩✩✩✩
8 Окт 2022
3
0
Всем привет!
Объясните пожалуйста, как работают будильники DS3231?
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,412
978
58
Марий-Эл
Будильник можно выставить на конкретную дату.
На день недели.
На время каждый день
На каждый час.
На каждую минуту.
На каждую секунду.

Срабатывание вызывает прерывание.
Нужно считать регистр и узнать который будильник вызвал прерывание.
 

Вложения

  • Лойс +1
Реакции: diosdima

diosdima

✩✩✩✩✩✩✩
8 Окт 2022
3
0
@Эдуард Анисимов, спасибо большое!
Я правильно понял если не менять один раз установленный будильник то:
срабатывает каждую секунду
или каждую минуту при совпадении секунд
или каждый час при совпадении минут и секунд
или каждый день при совпадении часа, минуты и секунды
или каждый год при совпадении даты и времени
или раз в неделю при совпадении дня недели и времени

Когда срабатывает будильник, DS3231 устанавливает A1F в единицу. Низкий уровень на INT появится только тогда когда установлены биты INTCN и A1IE. При обработке прерывания по INT необходимо сбросить A1F (на пине появится высокий уровень), что бы при следующем срабатывании снова вызвать прерывание. То есть, A1F устанавливает железка, а сбрасывает пользователь?

Если я захочу прерывать контроллер каждые пять минут мне нужно после каждого срабатывания переустанавливать будильник?
 

diosdima

✩✩✩✩✩✩✩
8 Окт 2022
3
0
В общем разобрался.
Для того что дергать ногу с определенным интервалом, например 5 сек, после каждого срабатывания будильника нужно его переустанавливать на нужный интервал вперед.
При установленном INTCN и A1IE и совпадении будильника устанавливается флаг A1F и на ноге INT/SQW появляется низкий уровень. При сбросе A1F на INT/SQW снова устанавливается высокий уровень. Флаг A1F устанавливает железка, а сбрасывает пользователь при обработке прерывания.
В общем алгоритм такой (работаем с первым будильником):
1. заводим свои флаги событий
2. цепляем обработчик ардуиновского INT1 или INT2 на FALLING
3. устанавливаем будильник например на 5 сек. При этом будильник будет срабатывать на пятой секунде каждой минуты.
4. разрешаем INTCN и A1IE и ждем прерывания
5. в прерывании поднимаем флаг сработавшего будильника и быстро вываливаемся из обработчика
6. в loop() ловим наш флаг, обрабатываем событие, сбрасываем A1F и ждем следующего пинка

Шаг пятый требует пояснений: процедуру сброса A1F нужно вынести за пределы обработчика прерывания. I2C слишком медленная для сброса A1F внутри прерывания и поэтому клинит ардуинку намертво. В прерывании мы просто поднимаем флаг срабатывания будильника а все остальные телодвижения в контексте основной программы.
Ну как то так :cool:

Всем спасибо за ответы!