Переход на начало процедуры по прерыванию???
Переход на начало процедуры по прерыванию???
Всем привет.
Имею CVAVR+tiny13a+ в основном цикле крутится процедура.
Как бы после внешнего прерывания перейти на начало процедуры а не на то место откуда меня "выдернуло" прерывание?
Имею CVAVR+tiny13a+ в основном цикле крутится процедура.
Как бы после внешнего прерывания перейти на начало процедуры а не на то место откуда меня "выдернуло" прерывание?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Переход на начало процедуры по прерыванию???
не ищите способ сделать через жопу - делайте правильно, даже если кажется, что это не очень красиво.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Переход на начало процедуры по прерыванию???
т.е. нормального способа выйти из процедуры нету?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Переход на начало процедуры по прерыванию???
для обработки прерывания нормальный способ - это вернуться туда, откуда ушли в обработчик. то, что хотите сделать вы - уже ненормально.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Переход на начало процедуры по прерыванию???
Правильно - как раз красивее будет...ARV писал(а):не ищите способ сделать через жопу - делайте правильно, даже если кажется, что это не очень красиво.
Я на 99% уверен, что ТС неправильно формирует для себя реализацию задачу...
Sany81 опишите вашу задачу, вас тут направят на путь истинный...
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Переход на начало процедуры по прерыванию???
Sany81 писал(а):после внешнего прерывания перейти на начало процедуры
Вместо reti написать pop R30 (снимаем адрес возврата), sei (разрешить прерывания) и rjmp где_у_вас_начало процедуры.
PS. Ну хочет человек поизгаляться. Пусть набъёт себе шишек.
Docendo discimus
Re: Переход на начало процедуры по прерыванию???
Дык, он ещё и на Си пишет, похоже.pyzhman писал(а):PS. Ну хочет человек поизгаляться. Пусть набъёт себе шишек.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Переход на начало процедуры по прерыванию???
Ясен пень на Си. Пусть врезает ассемблерные вставки.
Docendo discimus
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Переход на начало процедуры по прерыванию???
Если на Си, прерывание придется делать целиком на ассемблере, а то мало ли что оно захочет после вставки добавить.
Код: Выделить всё
ISR(INT_vect){
asm("pop r30");
}
INT_vect:
push r16
pop r30
pop r16
reti- Deer
- Прорезались зубы
- Сообщения: 211
- Зарегистрирован: Пт июл 31, 2009 19:45:11
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Переход на начало процедуры по прерыванию???
pyzhman писал(а):Вместо reti написать pop R30 (снимаем адрес возврата), sei (разрешить прерывания) и rjmp где_у_вас_начало процедуры.
PS. Ну хочет человек поизгаляться. Пусть набъёт себе шишек.
Плюс снять аппаратный флажок прерывания
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Переход на начало процедуры по прерыванию???
Это в пиках его надо снимать. В AVR он сбросится при входе в прерывание.
Docendo discimus
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Переход на начало процедуры по прерыванию???
COKPOWEHEU писал(а):мало ли что оно захочет после вставки добавить.
Согласен. Только не "мало ли что", а компилятор там располагает восстановление данных. И нужно это дело отследить, дабы стек не запоролся.
Docendo discimus
Re: Переход на начало процедуры по прерыванию???
Всем спасибо за ответы.
Да действительно, пишу на СИ.
А задача следующая:
Накрылась 4х-канальная гирлянда, сдохла микросборка-капелька.
Решил написать свою программу.
Суть в том, что есть несколько алгоритмов работы, каждый алгоритм работает по 2-5 сек. в бесконечном цикле.
Переключение между алгоритмами осуществляется кнопкой.
Так вот при нажатии копки, увеличивается переменная, отвечающая за выбор алгоритма.
Но после этого возвращаемся в то место, где было прерывание и продолжаем предыдущий алгоритм. Т.е. новый алгоритм начнет работать только после того, как полностью отработает текущий. Это не очень красиво. т.к. иногда кнопка почти моментально переводит на новый алгоритм, а иногда нажмешь кнопку и ждешь секунд 5 пока завершится предыдущий алгоритм и начнется новый.
Поэтому и зародилась мысль после прерывания переходить на начало процедуры, тогда переключение алгорима мигания лампочек происходило бы моментально, без всяких задержек.
Да действительно, пишу на СИ.
А задача следующая:
Накрылась 4х-канальная гирлянда, сдохла микросборка-капелька.
Решил написать свою программу.
Суть в том, что есть несколько алгоритмов работы, каждый алгоритм работает по 2-5 сек. в бесконечном цикле.
Переключение между алгоритмами осуществляется кнопкой.
Так вот при нажатии копки, увеличивается переменная, отвечающая за выбор алгоритма.
Но после этого возвращаемся в то место, где было прерывание и продолжаем предыдущий алгоритм. Т.е. новый алгоритм начнет работать только после того, как полностью отработает текущий. Это не очень красиво. т.к. иногда кнопка почти моментально переводит на новый алгоритм, а иногда нажмешь кнопку и ждешь секунд 5 пока завершится предыдущий алгоритм и начнется новый.
Поэтому и зародилась мысль после прерывания переходить на начало процедуры, тогда переключение алгорима мигания лампочек происходило бы моментально, без всяких задержек.
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Переход на начало процедуры по прерыванию???
pyzhman писал(а):COKPOWEHEU писал(а):мало ли что оно захочет после вставки добавить.
Согласен. Только не "мало ли что", а компилятор там располагает восстановление данных. И нужно это дело отследить, дабы стек не запоролся.
В зависимости от оптимизации, самого кода и конкретной реализации прерывания восстановления может и не быть.
Ну кто бы сомневался, что задача именно в гирлянде! В соседней теме такой же извращенец хотел таким же методом добиться такой же цели.А задача следующая:
Накрылась 4х-канальная гирлянда, сдохла микросборка-капелька.
И как и там, лучшим решением будет создание конечного автомата.Так вот при нажатии копки, увеличивается переменная, отвечающая за выбор алгоритма.
Но после этого возвращаемся в то место, где было прерывание и продолжаем предыдущий алгоритм. Т.е. новый алгоритм начнет работать только после того, как полностью отработает текущий.
- Engineer_Keen
- Друг Кота
- Сообщения: 3868
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: Переход на начало процедуры по прерыванию???
Sany81 писал(а):Это не очень красиво. т.к. иногда кнопка почти моментально переводит на новый алгоритм, а иногда нажмешь кнопку и ждешь секунд 5 пока завершится предыдущий алгоритм и начнется новый.
Поэтому и зародилась мысль после прерывания переходить на начало процедуры, тогда переключение алгорима мигания лампочек происходило бы моментально, без всяких задержек.
Хотите хитрость? Подключите кнопку к ноге RESET и после сброса опрашивайте флаг EXTRF регистра MCUSR. Содержимое памяти не сбрасывается при сбросе от ноги RESET, этим опросом можно узнать что сброс был от нее и спокойно менять переменную, которая отвечает за алгоритм, потом сразу переходить на нужный алгоритм. Вам даже не понадобятся прерывания для кнопки
+освобождается нога контроллера.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Переход на начало процедуры по прерыванию???
В таком разе память почистит компиляторная вставка. External Startup называется. Не, есть, конечно, возможность ее отключить в настройках проекта.
Docendo discimus
-
codenamehawk
- Вымогатель припоя
- Сообщения: 528
- Зарегистрирован: Вт фев 09, 2010 17:52:26
Re: Переход на начало процедуры по прерыванию???
Sany81 писал(а):Так вот при нажатии копки, увеличивается переменная, отвечающая за выбор алгоритма.
Но после этого возвращаемся в то место, где было прерывание и продолжаем предыдущий алгоритм.
Так у вас все просто, в процедуре, где крутится "алгоритм" проверяйте не изменилась ли переменная , отвечающая за выбор алгоритма и если изменилась, немедленный выход и автоматический запуск нового эффекта.
(Если используете длинную задержку, разбейте ее на серию маленьких н.п. по 0.3 сек, а в промежутках и проверяйте переменную)
Re: Переход на начало процедуры по прерыванию???
Вариант с проверкой в процедуре на переход на новый алгоритм я я так делаю, а вот в самом алгоритме после каждого вызова delay_ms вставлять проверку "на нажатость кнопки" - это изврат, это хоть и будет работать, но сильно увеличит объем кода, а у меня всего лишь 1кб памяти под проект 
За подсказку с резетом огромнейшее спасибо
, на днях обязательно попробую проверить. И если действительно поможет, то будет еще одна ножка, которой так не хватает на моей тиньке для ФИУ.
За подсказку с резетом огромнейшее спасибо
, на днях обязательно попробую проверить. И если действительно поможет, то будет еще одна ножка, которой так не хватает на моей тиньке для ФИУ.Re: Переход на начало процедуры по прерыванию???
а в саму функцию delay_ms проверку кнопки не судьба поставить? всего то одну функцию напильником подпилить.
Re: Переход на начало процедуры по прерыванию???
Еще раз огромное спасибо за РЕЗЕТ, получилось, работает так как хотел, моментально переключаются режимы, без всяких задержек и код намного компактнее, т.к. нет прерывания. Теперь придется думать над ФИУ и продумывать красивые эффекты только как все это в 1кб уложить 