Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Выход после Sleep в режиме Idle
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
dinam
Изучаю ATMEGA 128. И возник вопрос. Можно ли сделать чтобы переход был не по вектору прерывания, а на следующую команду после SLEEP?
BVU
Цитата(dinam @ Sep 28 2005, 12:10)
Изучаю ATMEGA 128. И возник вопрос. Можно ли сделать чтобы переход был не по вектору прерывания, а на следующую команду после SLEEP?
*

А как Вы себе это представляете без прерывания? Выход из режима SLEEP может осуществляться либо по прерыванию, либо по WD, либо по внешнему RESET. Вот и выбирайте... Но в Вашем случае необходимо организовать какое нибудь внутреннее прерывание от таймера или внешнее по событию, а в теле прерырания - только возврат от туда. Вот Вам и будет старт со следующей команды.
dinam
Почему без прерывания? Я имел ввиду, как сделать прерывания, реализованные например как в PICах. Хочу минимальное время реакции на прерывание -> задаю чтобы перехода на вектор прервания не было, а программа продолжала выполняться дальше, начиная со следующей команы после Sleep. А с переходом по вектору прерывания у меня сейчас нормально работает. Но так теряется куча тактов драгоценного времени.
andrvisht
Цитата(dinam @ Sep 28 2005, 11:33)
Почему без прерывания? Я имел ввиду, как сделать прерывания,  реализованные например как в PICах. Хочу минимальное время реакции на прерывание -> задаю чтобы перехода на вектор прервания не было, а программа продолжала выполняться дальше, начиная со следующей команы после Sleep. А с переходом по вектору прерывания у меня сейчас нормально работает. Но так теряется куча тактов драгоценного времени.
*

Что-то совсем запутанно. У пиков вектор события прерывания один. Если на него не ходить то все обработчики прерывания автоматом игнорируются. У AVR для каждого прерывания свой адрес по которому стоит переход на обработчик прерывания. Если вы не хотите обрабатывать прерывание - запретите его.
Может я что не понял, подробнее плиз... wacko.gif

А если Вас смущает то что возврат занимает "драгоценного время", то поставьте вместо JMP "Обработчик прерывания" reti. А что касается быстродействия то 4 такта пика - 1 такт AVR.
Karl
Цитата(dinam @ Sep 28 2005, 13:33)
Почему без прерывания? Я имел ввиду, как сделать прерывания,  реализованные например как в PICах. Хочу минимальное время реакции на прерывание -> задаю чтобы перехода на вектор прервания не было, а программа продолжала выполняться дальше, начиная со следующей команы после Sleep. А с переходом по вектору прерывания у меня сейчас нормально работает. Но так теряется куча тактов драгоценного времени.
*


Можешь вместо перехода на подпограмму обработки прерывания сразу написать reti. Быстрее никак.
dinam
Я вас спрашиваю как в ATMEGe, а вы как в PICax smile.gif . Вы всё правильно сказали. Но дело в том, что если не разрешать глобальные прерывание в PICax, то он всё равно просыпается и начинает выполнять программу дальше, начиная со следующей команды после Sleep. Удобно реализовывать всякие паузы. А самое главное отработка прерывания происходит очень быстро. Если мне не изменяет память, то при работе от внутреннего генератора 4МГц (время команды 1мкс), время между внешним сигналом прерывания и изменением сигнала на ноге, которой надо управлять порядка одного такта (250нс)! Смотрел осциллографом.
dinam
Цитата(Karl @ Sep 28 2005, 16:02)
Можешь вместо перехода на подпограмму обработки прерывания сразу написать reti. Быстрее никак.
*

Понятно, спасибо.
mse
Цитата(dinam @ Sep 28 2005, 12:11)
Цитата(Karl @ Sep 28 2005, 16:02)
Можешь вместо перехода на подпограмму обработки прерывания сразу написать reti. Быстрее никак.
*

Понятно, спасибо.
*


Ну, можно ещё анализировать флаг вручную
Код
while:
   sbis  interrupt_flags,interest_flag
   rjmp  while
 ;interrupt service
 ...
 ;interrupt flag clear

Съэкономишь 4 такта в самом худшем случае
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.