Сначала опишу задачу. Может её кто по другому решал и я зря огород горожу.
Стоит M8. Обслуживает некоторые датчики и часы реального времени. На вход Int0 поступает сигнал от внешнего (не батарейного) питания. Мне надо чтобы она заснула как можно быстрее. Опрос не проходит, так как в теле очень много временных интервалов формируется и везде вставлять выход на точку засыпания не получается. Короче формирую прерывание по провалу питания.
Хочу из обработчика прерывания перейти на сон. Естественно с сохранением стеков. Остальное не волнует. После сна инициализация по новый.
Вопросы такие
1) возможно ли это (написано что из более высокоуровневой только).
2) Как это сделать
я пробую так
Код
....
// Голова. Вот сюда я хочу перейти по провалу питания
setjmp(Adr_sleep);
if((INT0_PIN & (1<<INT0))==0) { // При нормальном питании - не выполнять
// Вырубание переферии для уменьшения потребления
......
......
#pragma vector=INT0_vect // Пропадание питания
__interrupt static void Power(void)
{
//=========================================
if((INT0_PIN & (1<<INT0))==0){
PWR_BAT_ON; // Если питание пропало, то включить батарейку
#if __ATmega88__
EIMSK=0; // прерывание от INT0 запретить
#else
GICR=0x0; // прерывание от INT0 запретить
#endif
longjmp(Adr_sleep,1); // И перейти на сон
}
}
....
// Голова. Вот сюда я хочу перейти по провалу питания
setjmp(Adr_sleep);
if((INT0_PIN & (1<<INT0))==0) { // При нормальном питании - не выполнять
// Вырубание переферии для уменьшения потребления
......
......
#pragma vector=INT0_vect // Пропадание питания
__interrupt static void Power(void)
{
//=========================================
if((INT0_PIN & (1<<INT0))==0){
PWR_BAT_ON; // Если питание пропало, то включить батарейку
#if __ATmega88__
EIMSK=0; // прерывание от INT0 запретить
#else
GICR=0x0; // прерывание от INT0 запретить
#endif
longjmp(Adr_sleep,1); // И перейти на сон
}
}
....
Пожалуйста не обращайте внимание на мелочи. Просто правлю по живому.