ds3231 ежеминутный аларм

Обсуждаем контроллеры компании Atmel.
Ответить
Прорезались зубы
Сообщения: 217
Зарегистрирован: Ср янв 11, 2012 11:55:51

Сообщение 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 
и собственно ничего :shock: Выход с ноги прерывания висит на INT0 меги ,которая по прерыванию переключает светодиод. Если INTCN не выставлю, с этой ноги начинает идти меандр в 1 Гц и мигание светодиода работает. Т.е. и мега настроена правильно и дорожка на месте.
Я наверное не вижу чего-то самого главного в даташите? Может надо еще что-то включить/выключить в ds3231?
Реклама
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

temp |= (1 << DS3231_A2M2); - это что?

будет в итоге соответствовать чему-то здесь?:
Изображение

P.S.
и зачем лишнее обнуление переменной при инициализации, с последующим И? Почему не сразу uint8_t temp = (1 << DS3231_A2M2); впрочем, это к проблеме не имеет отношения... как и необходимость устанавливать бит именно таким образом
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 19055
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

Land писал(а):По даташиту необходимо в регистры 0x0B, 0x0C и 0x0D записать 0x07.
По даташиту необходимо в регистры 0x0B, 0x0C и 0x0D записать число 128 (бит 7 равен 128).
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

всё верно.
ТС оговорился и запись неудобная.
в итоге, в регистрах 0x0B, 0x0C и 0x0D записывается 128...
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Прорезались зубы
Сообщения: 217
Зарегистрирован: Ср янв 11, 2012 11:55:51

Сообщение 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 записывается, увы (
Реклама
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

Странно. Может, нельзя использовать второй будильник без первого?
Контактная информация:
Реклама
Прорезались зубы
Сообщения: 217
Зарегистрирован: Ср янв 11, 2012 11:55:51

Сообщение Land »

Вот и мне странно. И в даташите я не нахожу ничего.
вот все будильники установлены ( и ничего ((
Изображение
Мудрый кот
Сообщения: 1704
Зарегистрирован: Вт янв 05, 2016 10:14:25
Откуда: поселок Мелеуз

Сообщение 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
Последний раз редактировалось Novice user Чт апр 14, 2022 23:28:07, всего редактировалось 1 раз.
Друг Кота
Аватара пользователя
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение 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
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

Логично. Если прочитать даташит внимательно, то эти флаги отрабатывают всегда при совпадении даты-времени, даже если AxIE отключено. AxIE и INTCN лишь разрешают отображать состояние флага на выход INT.
Но тогда вопрос звучал бы иначе, типа: почему сработало один раз и не сбрасывается?
Контактная информация:
Прорезались зубы
Сообщения: 217
Зарегистрирован: Ср янв 11, 2012 11:55:51

Сообщение Land »

uldemir, да, уже нашел косяк
temp = ds3231_read_reg(DS3231_STATUS);
temp &= ~(1<< DS3231_A2F);
ds3231_write_reg(DS3231_STATUS,temp);
вот так в каждом прерывании работает. Спасибо, я ощущал, что чего-то не дочитал )
Martian, это хороший вопрос. Видимо дело в том, что я и при инициализации будильника флаг не сбрасывал. Поэтому даже одного срабатывания и не было. Мне как-то казалось ,что флаги должны бы при старте в нулях стоять.
Хм... и как в названии темы отметить, что решено?
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

я тоже не увидел в даташите значения регистров после запуска

Добавлено after 44 seconds:
да никак не надо. и так ясно из последних сообщений, что решено.
Контактная информация:
Ответить

Вернуться в «AVR»