Хочу сделать девайс, в котором необходимо выводить микроконтроллер из спящего режима в определенное время. Использую для этого часы реального времени с будильником - DS1339. Самого спящего режима пока не касаюсь, пытаюсь просто подать сигнал прерывания от часов на Атмегу8. Подключил вывод SQW/INT часов к выводу INT1 контроллера через подтягивающий резистор. Все подключено 100% верно, и прерывание в контроллере тоже настроено верно, потом будет ясно почему я такой вывод сделал) Вся проблема в часах, точнее в самом будильнике, поскольку установка и считывание времени на них тоже работает хорошо.
Самый главный регистр в DS1339 находится по адресу 0Eh, в нем имеются следующие биты:
Bit7 - включение или выключение генератора (0-вкл.)
Bit6 - зарезервировано (0)
Bit5 - разрешение прерывания при работе от батареи (1-разрешено)
Bit4 - выбор частоты меандра
Bit3 - выбор частоты меандра
Bit2 - выбор прерывания или мендра (1 - прерывание)
Bit1 - разрешение прерывания по будильнику 2 (A2IE) (1-вкл.)
Bit0 - разрешение прерывания по будильнику 1 (A1IE) (1-вкл.)
Соответственно в этот регистр я записываю значение 0x26 (0010 0110). То есть разрешаю прерывание при работе от батареи, выбираю прерывание по будильнику 2.
Далее приведу кусок кода, которым я инициализирую другие регистры:
Код: Выделить всё
void DS_Alarm_Set(unsigned char hour, unsigned char minute, unsigned char second) {
I2C_Start();
I2C_Send_byte(0xD0);
I2C_Send_byte(0x0B);
I2C_Send_byte(minute|0x80);
I2C_Stop();
delay();
I2C_Start();
I2C_Send_byte(0xD0);
I2C_Send_byte(0x0C);
I2C_Send_byte(hour|0x80);
I2C_Stop();
delay();
I2C_Start();
I2C_Send_byte(0xD0);
I2C_Send_byte(0x0D);
I2C_Send_byte(0x89);
I2C_Stop();
delay();
}
void DS_Init(void) {
unsigned char hour, minute, second;
hour=20;
minute=5;
second=0;
DS_Set_Time(9, 9, 13, hour, minute); //day, month, year, hour, minute
I2C_Start();
I2C_Send_byte(0xD0);
I2C_Send_byte(0x0E);
I2C_Send_byte(0x26);
I2C_Stop();
delay();
DS_Alarm_Set(hour,minute+1,second);
}В функции DS_Init, я выставляю время, которое записывается в часы, а в функции DS_Alarm_set() добавляю одну минуту к тем же значениям, чтобы будильник сработал на следующей минуте. Теперь самое главное. В функции DS_Alarm_Set() есть операции ИЛИ с записываемым регистром. Это сделано для того, чтобы гарантированно установить первый бит в 1, поскольку он управляет временем срабатывания будильника (при установке всех трех битов в 1, это происходит 1 раз в минуту), см. приложение. Компилирую, прошиваю - результата никакого. Однако же, если я выберу в регистре 0Eh не прерывание, а частоту (установлена в 1Гц), все прекрасно работает, приходят прерывания на контроллер раз в секунду, которые контролирую по UART-у. Отсюда я и сделал вывод, что все подключено верно, и правильно настроены прерывания. Собственно вопрос: что я делаю не так?)
- Вложения
-
- DS.jpg
- (196.56 КБ) 412 скачиваний


