В общем ситуация такая : есть 8мега, к ней подцеплен кварц на 32768Гц. По сути обычные часы, прерывание происходит каждую секунду, при сравнении счетчика. Часы 99% времени будут питаться от внешнего источника, но хотелось бы добавить батарейку на случай отключения электричества, что-бы время не сбивалось. Резервное питание реализовано через 2 диода шотки, и нпн транзистор. В общем, нужно что-бы при отключении внешнего питания МК засыпал, а при появлении просыпался. Выбрал я для этих целей режим сна PowerSave. Так вот, усыпить получается, а вот разбудить нет. Если что, колектор транзистора подключен к INT1, то бишь при наличии внешнего питания на PD3 будет 0, при отсутствии 1. Код: Спойлер
ISR(TIMER2_COMP_vect) // Должно ли это прерывание будить??? { sleep_disable(); // Запрещаем сон sec++; fix++; if (sec == 60) { sec = 0; min ++; };
if (min == 60) { min = 0; hour ++; }; if (hour > 23) { hour = 0; }; if (fix > 169) { TCNT2++; fix = 0; }; if((PIND & (1<<PD3))) // проверяем на наличие внешнего питания { sleep_enable(); // разрешаем сон Offall(); // отключаем отображение sleep_mode(); // Засыпаем (по описанию не понял разницы между sleep_mode(); и sleep_cpu(); но результат одинаковый. } }
void Offall(void){ PORTB = 0x00; PORTD &= 0x1F;
}
void delayws(char del) // задержка, но без отключения отображения. { for(int i = 0; i< del; i++){ ShowTime(hour, min, sec); } }
Спасибо тебе огромное, я почему-то думал что у меня там разрешены прерывания, но просто всунув еще одну asm ("sei"); , прямо перед засыпанием все заработало. Еще раз спасибо, ты даже не представляешь сколько я времени впустую убил пытаясь найти причину
Сейчас этот форум просматривают: Varlakotam и гости: 34
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения