Страница 1 из 1
ds3231 ежеминутный аларм
Добавлено: Ср апр 13, 2022 21:40:46
Land
Приветствую всех.
В общем такое дело. Модуль часов на ds3231. Часы работают, время/дата записывается и читается. Все ок.
Но есть необходимость включить режим ежеминутного прерывания. И вот тут засада засадная.
По даташиту необходимо в регистры 0x0B, 0x0C и 0x0D записать 0x07. Что собственно и делается в виде:
Код: Выделить всё
uint8_t temp= 0;
temp |= (1 << DS3231_A2M2);
ds3231_write_reg(DS3231_ALARM_2_MIN,temp);
ds3231_write_reg(DS3231_ALARM_2_HOR,temp);
ds3231_write_reg(DS3231_ALARM_2_DAY,temp);
дефайны все верные, перепроверил несколько раз, плюс в протеусе видно, что в нужных регистрах часов выставляются нужные значения.
Затем разрешаю прерывания по второму будильнику и собственно прерывания
Код: Выделить всё
temp= 0;
temp |= (1 << DS3231_A2IE)|(1 << DS3231_INTCN);
ds3231_write_reg(DS3231_CONTROL,temp); // запуск прерывания будильника 2
и собственно ничего

Выход с ноги прерывания висит на INT0 меги ,которая по прерыванию переключает светодиод. Если INTCN не выставлю, с этой ноги начинает идти меандр в 1 Гц и мигание светодиода работает. Т.е. и мега настроена правильно и дорожка на месте.
Я наверное не вижу чего-то самого главного в даташите? Может надо еще что-то включить/выключить в ds3231?
Re: ds3231 ежеминутный аларм
Добавлено: Ср апр 13, 2022 22:02:54
Martian
temp |= (1 << DS3231_A2M2); - это что?
будет в итоге соответствовать чему-то здесь?:
P.S.
и зачем лишнее обнуление переменной при инициализации, с последующим И? Почему не сразу uint8_t temp = (1 << DS3231_A2M2); впрочем, это к проблеме не имеет отношения... как и необходимость устанавливать бит именно таким образом
Re: ds3231 ежеминутный аларм
Добавлено: Ср апр 13, 2022 22:13:58
Starichok51
Land писал(а):По даташиту необходимо в регистры 0x0B, 0x0C и 0x0D записать 0x07.
По даташиту необходимо в регистры 0x0B, 0x0C и 0x0D записать число 128 (бит 7 равен 128).
Re: ds3231 ежеминутный аларм
Добавлено: Ср апр 13, 2022 22:27:33
Martian
всё верно.
ТС оговорился и запись неудобная.
в итоге, в регистрах 0x0B, 0x0C и 0x0D записывается 128...
Re: ds3231 ежеминутный аларм
Добавлено: Ср апр 13, 2022 22:29:46
Land
[uquote="Martian",url="/forum/viewtopic.php?p=4214332#p4214332"]temp |= (1 << DS3231_A2M2); - это что?[/uquote]
я ж написал, что с #define вопросов нет, все перепроверено десять раз
Код: Выделить всё
#define DS3231_A2M2 0x07
#define DS3231_A2M3 0x07
#define DS3231_A2M4 0x07
Добавлено after 56 seconds:
[uquote="Martian",url="/forum/viewtopic.php?p=4214350#p4214350"]всё верно.
ТС оговорился и запись неудобная.
в итоге, в регистрах 0x0B, 0x0C и 0x0D записывается 128...[/uquote]
0х80 записывается, увы (
Re: ds3231 ежеминутный аларм
Добавлено: Ср апр 13, 2022 22:38:47
Martian
Странно. Может, нельзя использовать второй будильник без первого?
Re: ds3231 ежеминутный аларм
Добавлено: Чт апр 14, 2022 09:38:54
Land
Вот и мне странно. И в даташите я не нахожу ничего.
вот все будильники установлены ( и ничего ((

Re: ds3231 ежеминутный аларм
Добавлено: Чт апр 14, 2022 17:30:36
Novice user
У меня настроен будильник2,работает
На баском авр у меня так-
Код: Выделить всё
1_min:
I2cstart
I2cwbyte Ds3231w
I2cwbyte &H0B
I2cwbyte &B10000000'&H0B A2M2 Минуты
I2cwbyte &B10000000'&H0C A2M3 12/~24 часы
I2cwbyte &B10000000'&H0D A2M4 DY/~DT даты
I2cwbyte &B00000110'&H0E
I2cstop
return
Добавил-действительно,в прерывании у меня сброс флага
Код: Выделить всё
I2cstart 'запись байта в регистр упрaвления
I2cwbyte Ds3231w
I2cwbyte &H0F
I2cwbyte &B10001000
I2cstop
Re: ds3231 ежеминутный аларм
Добавлено: Чт апр 14, 2022 21:46:11
uldemir
[uquote="Land",url="/forum/viewtopic.php?p=4214311#p4214311"]Может надо еще что-то включить/выключить в ds3231?[/uquote]А в прерывании флаг прерывания A2F в регистре Control/Status сбрасываете? ну и a1f тоже, если в a1ie единицу прописали.
Bit 1: Alarm 2 Flag (A2F). A logic 1 in the alarm 2 flag
bit indicates that the time matched the alarm 2 registers.
If the A2IE bit is logic 1 and the INTCN bit is set to
logic 1, the INT/SQW pin is also asserted. A2F is
cleared when written to logic 0. This bit can only be
written to logic 0. Attempting to write to logic 1 leaves
the value unchanged
Re: ds3231 ежеминутный аларм
Добавлено: Чт апр 14, 2022 22:07:19
Martian
Логично. Если прочитать даташит внимательно, то эти флаги отрабатывают всегда при совпадении даты-времени, даже если AxIE отключено. AxIE и INTCN лишь разрешают отображать состояние флага на выход INT.
Но тогда вопрос звучал бы иначе, типа: почему сработало один раз и не сбрасывается?
Re: ds3231 ежеминутный аларм
Добавлено: Чт апр 14, 2022 22:13:49
Land
uldemir, да, уже нашел косяк
temp = ds3231_read_reg(DS3231_STATUS);
temp &= ~(1<< DS3231_A2F);
ds3231_write_reg(DS3231_STATUS,temp);
вот так в каждом прерывании работает. Спасибо, я ощущал, что чего-то не дочитал )
Martian, это хороший вопрос. Видимо дело в том, что я и при инициализации будильника флаг не сбрасывал. Поэтому даже одного срабатывания и не было. Мне как-то казалось ,что флаги должны бы при старте в нулях стоять.
Хм... и как в названии темы отметить, что решено?
Re: ds3231 ежеминутный аларм
Добавлено: Чт апр 14, 2022 22:17:44
Martian
я тоже не увидел в даташите значения регистров после запуска
Добавлено after 44 seconds:
да никак не надо. и так ясно из последних сообщений, что решено.