реклама на сайте
подробности

 
 
> Поммогите с setjmp, Не смог разобраться самостоятельно
SasaVitebsk
сообщение Jan 24 2007, 02:37
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Не ругайте сильно и не отсылайте пожалуйста к литературе. Перечитал всё что мог, но не смог разобраться полностью. Наверное тупею с годами. К тому же не очень очевидно, ну и хочу заметить себе в оправдание, что IAR жутко скупится на примеры. Те же примеры которые я нашёл, оставили некоторые вопросы.

Сначала опишу задачу. Может её кто по другому решал и я зря огород горожу.
Стоит 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);                                // И перейти на сон
  }
}
....


Пожалуйста не обращайте внимание на мелочи. Просто правлю по живому.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SasaVitebsk
сообщение Jan 24 2007, 15:12
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



2 prottoss подставить адрес возврата, - я такое делал на асме для x51 в структуре типа case. Экономилось много памяти. ret - 1 байт, jmp - 2-3. На Си мягко говоря не очень будет смотреться. На мой взгляд.

Прога работает. В общем то. Но хочется лучше, как всегда. Тут в соседней ветке у человека Tiny13 мрут как мухи smile.gif (по его словам 10 циклов перезаписи) так он отвечает что ему на ночь от 5 до 10 штук требуется. smile.gif Я так понимаю это отладка уже. Я не так силён. В том плане, что за ночь могу разных версий штуки три рабочих выдать. Ну и 10 переписываний мне за глаза. smile.gif Это я zltigo обращаюсь. Я понимаю что значит один бит. Без ошибок конечно не обходится, но при возникновении работоспособность восстанавливаю быстро. Ну там веду штук 10 последних версий (для отката) проверяю по частям, прежде чем заливать проверяю раз несколько. smile.gif

Переход в 0 пробовал, правда после просыпания. Хотя какая разница соб-сно. Смысл в том что у меня часы. Так во время сна они тикают. Ну и структура со временем реальным __no_init. Уж не знаю как, но если перезапуск делаю, то адрес этой структуры текёт. Минуты становятся секундами и т.д. Не стал разбираться, по тому как это мне тоже не очень нравится. Хотелось бы максимально в рамках языка.

Ладно попробую в прерывании. Разрешение не фокус сделать на сон грядущий, а прерывания от Int0 (пропадание питания) я и так запрещаю, так как судя по даташиту, если я правильно понял, только по уровню работает.

Подал внешнее питание ч/з диод шотки, батарейка CR2032 на прямую, а землю батарейки корочу транзистором КП505 об землю по сигналу с порта. Кондёра 500мкФ хватает чтобы включить. Пробую так.

Но общий вывод неутишительный. Практически Mega8 не предназначена для использования в качестве часов реального времени, что и подтверждают ответы других несчастных. M88 намного лучше, и вроде проблем нет, но теперь у меня уже мондраж. Я хочу солидный запас иметь. И спать спокойно. Дополнительная обвеска микрухи, для того чтобы она работала без DS1307 получается дороже самой DS1307. Повоюю ещё день, и если нет то откажусь. В новых платах предусмотрю DS1307.

Спасибо всем откликнувшимся.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 12:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01374 секунд с 7
ELECTRONIX ©2004-2016