Прерывание МК по сигналу часов реального времени DS1339.

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Нашел транзистор. Понюхал.
Сообщения: 194
Зарегистрирован: Сб ноя 07, 2009 15:27:59

Сообщение kushman »

Добрый день!
Хочу сделать девайс, в котором необходимо выводить микроконтроллер из спящего режима в определенное время. Использую для этого часы реального времени с будильником - 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);
}
Функции работы I2C и DS_Set_Time() не привожу, ибо они свою работоспособность доказали.
В функции DS_Init, я выставляю время, которое записывается в часы, а в функции DS_Alarm_set() добавляю одну минуту к тем же значениям, чтобы будильник сработал на следующей минуте. Теперь самое главное. В функции DS_Alarm_Set() есть операции ИЛИ с записываемым регистром. Это сделано для того, чтобы гарантированно установить первый бит в 1, поскольку он управляет временем срабатывания будильника (при установке всех трех битов в 1, это происходит 1 раз в минуту), см. приложение. Компилирую, прошиваю - результата никакого. Однако же, если я выберу в регистре 0Eh не прерывание, а частоту (установлена в 1Гц), все прекрасно работает, приходят прерывания на контроллер раз в секунду, которые контролирую по UART-у. Отсюда я и сделал вывод, что все подключено верно, и правильно настроены прерывания. Собственно вопрос: что я делаю не так?)
Вложения
DS.jpg
(196.56 КБ) 412 скачиваний
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4751
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение vem566 »

У меня была такая же проблема. Не было сигнала срабатывания будильника.
Решил просто: перед началом программы (основного цикла), записывал байт конфигурации и смотрел, что получается в результате работы программы. Перебирал комбинации бит, пока не получил нужную. Получив результат, снова читал даташит. Так и не дошло, почему получается именно так. В конец запутался и плюнул. Работает, и хрен с ним.
Реклама
Нашел транзистор. Понюхал.
Сообщения: 194
Зарегистрирован: Сб ноя 07, 2009 15:27:59

Сообщение kushman »

А я кажется догадываюсь. В регистры нужно записывать байты в BCD формате. И я делаю это при записи минут и часов, а также при чтении)) Просто этот код написан очень давно, и перекочевал сюда с DS1307, а я и внимания на это не обратил))

Но еще проблема в том, что при записи данного байта в BCD формате прерывания возникают с очень большой частотой, и контроллер только и делает, что находится в обработчике)
А можно Вашу конфигурацию часов посмотреть?
Друг Кота
Аватара пользователя
Сообщения: 4751
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение vem566 »

Вечером напишу. Дома проект.
Реклама
Эиком - электронные компоненты и радиодетали
Нашел транзистор. Понюхал.
Сообщения: 194
Зарегистрирован: Сб ноя 07, 2009 15:27:59

Сообщение kushman »

А флаг прерывания в часах изначально надо сбрасывать?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4751
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение vem566 »

Куча извинений. Совсем забыл.
Вот установка конфигурации
1.txt
(1.91 КБ) 202 скачивания
Как то так подбирал биты.
Реклама
Ответить

Вернуться в «Периферия»