Переход на начало процедуры по прерыванию???

Обсуждаем контроллеры компании Atmel.
Ответить
Sany81
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Пн июл 05, 2010 16:51:16

Переход на начало процедуры по прерыванию???

Сообщение Sany81 »

Всем привет.
Имею CVAVR+tiny13a+ в основном цикле крутится процедура.
Как бы после внешнего прерывания перейти на начало процедуры а не на то место откуда меня "выдернуло" прерывание?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Переход на начало процедуры по прерыванию???

Сообщение ARV »

не ищите способ сделать через жопу - делайте правильно, даже если кажется, что это не очень красиво.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Sany81
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Пн июл 05, 2010 16:51:16

Re: Переход на начало процедуры по прерыванию???

Сообщение Sany81 »

т.е. нормального способа выйти из процедуры нету?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Переход на начало процедуры по прерыванию???

Сообщение ARV »

для обработки прерывания нормальный способ - это вернуться туда, откуда ушли в обработчик. то, что хотите сделать вы - уже ненормально.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Переход на начало процедуры по прерыванию???

Сообщение shads »

ARV писал(а):не ищите способ сделать через жопу - делайте правильно, даже если кажется, что это не очень красиво.
Правильно - как раз красивее будет...
Я на 99% уверен, что ТС неправильно формирует для себя реализацию задачу...
Sany81 опишите вашу задачу, вас тут направят на путь истинный...
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Переход на начало процедуры по прерыванию???

Сообщение pyzhman »

Sany81 писал(а):после внешнего прерывания перейти на начало процедуры

Вместо reti написать pop R30 (снимаем адрес возврата), sei (разрешить прерывания) и rjmp где_у_вас_начало процедуры.
PS. Ну хочет человек поизгаляться. Пусть набъёт себе шишек.
Docendo discimus
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: Переход на начало процедуры по прерыванию???

Сообщение Kavka »

pyzhman писал(а):PS. Ну хочет человек поизгаляться. Пусть набъёт себе шишек.
Дык, он ещё и на Си пишет, похоже. :)
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Переход на начало процедуры по прерыванию???

Сообщение pyzhman »

Ясен пень на Си. Пусть врезает ассемблерные вставки.
Docendo discimus
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Переход на начало процедуры по прерыванию???

Сообщение COKPOWEHEU »

Если на Си, прерывание придется делать целиком на ассемблере, а то мало ли что оно захочет после вставки добавить.

Код: Выделить всё

ISR(INT_vect){
asm("pop r30");
}
INT_vect:
push r16
pop r30
pop r16
reti
Аватара пользователя
Deer
Прорезались зубы
Сообщения: 211
Зарегистрирован: Пт июл 31, 2009 19:45:11
Откуда: Санкт-Петербург
Контактная информация:

Re: Переход на начало процедуры по прерыванию???

Сообщение Deer »

pyzhman писал(а):Вместо reti написать pop R30 (снимаем адрес возврата), sei (разрешить прерывания) и rjmp где_у_вас_начало процедуры.

PS. Ну хочет человек поизгаляться. Пусть набъёт себе шишек.

Плюс снять аппаратный флажок прерывания
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Переход на начало процедуры по прерыванию???

Сообщение pyzhman »

Это в пиках его надо снимать. В AVR он сбросится при входе в прерывание.
Docendo discimus
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Переход на начало процедуры по прерыванию???

Сообщение pyzhman »

COKPOWEHEU писал(а):мало ли что оно захочет после вставки добавить.

Согласен. Только не "мало ли что", а компилятор там располагает восстановление данных. И нужно это дело отследить, дабы стек не запоролся.
Docendo discimus
Sany81
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Пн июл 05, 2010 16:51:16

Re: Переход на начало процедуры по прерыванию???

Сообщение Sany81 »

Всем спасибо за ответы.
Да действительно, пишу на СИ.
А задача следующая:
Накрылась 4х-канальная гирлянда, сдохла микросборка-капелька.
Решил написать свою программу.
Суть в том, что есть несколько алгоритмов работы, каждый алгоритм работает по 2-5 сек. в бесконечном цикле.
Переключение между алгоритмами осуществляется кнопкой.
Так вот при нажатии копки, увеличивается переменная, отвечающая за выбор алгоритма.
Но после этого возвращаемся в то место, где было прерывание и продолжаем предыдущий алгоритм. Т.е. новый алгоритм начнет работать только после того, как полностью отработает текущий. Это не очень красиво. т.к. иногда кнопка почти моментально переводит на новый алгоритм, а иногда нажмешь кнопку и ждешь секунд 5 пока завершится предыдущий алгоритм и начнется новый.
Поэтому и зародилась мысль после прерывания переходить на начало процедуры, тогда переключение алгорима мигания лампочек происходило бы моментально, без всяких задержек.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Переход на начало процедуры по прерыванию???

Сообщение COKPOWEHEU »

pyzhman писал(а):
COKPOWEHEU писал(а):мало ли что оно захочет после вставки добавить.

Согласен. Только не "мало ли что", а компилятор там располагает восстановление данных. И нужно это дело отследить, дабы стек не запоролся.

В зависимости от оптимизации, самого кода и конкретной реализации прерывания восстановления может и не быть.
А задача следующая:
Накрылась 4х-канальная гирлянда, сдохла микросборка-капелька.
Ну кто бы сомневался, что задача именно в гирлянде! В соседней теме такой же извращенец хотел таким же методом добиться такой же цели.
Так вот при нажатии копки, увеличивается переменная, отвечающая за выбор алгоритма.
Но после этого возвращаемся в то место, где было прерывание и продолжаем предыдущий алгоритм. Т.е. новый алгоритм начнет работать только после того, как полностью отработает текущий.
И как и там, лучшим решением будет создание конечного автомата.
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Переход на начало процедуры по прерыванию???

Сообщение Engineer_Keen »

Sany81 писал(а):Это не очень красиво. т.к. иногда кнопка почти моментально переводит на новый алгоритм, а иногда нажмешь кнопку и ждешь секунд 5 пока завершится предыдущий алгоритм и начнется новый.
Поэтому и зародилась мысль после прерывания переходить на начало процедуры, тогда переключение алгорима мигания лампочек происходило бы моментально, без всяких задержек.

Хотите хитрость? Подключите кнопку к ноге RESET и после сброса опрашивайте флаг EXTRF регистра MCUSR. Содержимое памяти не сбрасывается при сбросе от ноги RESET, этим опросом можно узнать что сброс был от нее и спокойно менять переменную, которая отвечает за алгоритм, потом сразу переходить на нужный алгоритм. Вам даже не понадобятся прерывания для кнопки :idea:
+освобождается нога контроллера.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Переход на начало процедуры по прерыванию???

Сообщение pyzhman »

В таком разе память почистит компиляторная вставка. External Startup называется. Не, есть, конечно, возможность ее отключить в настройках проекта.
Docendo discimus
codenamehawk
Вымогатель припоя
Сообщения: 527
Зарегистрирован: Вт фев 09, 2010 17:52:26

Re: Переход на начало процедуры по прерыванию???

Сообщение codenamehawk »

Sany81 писал(а):Так вот при нажатии копки, увеличивается переменная, отвечающая за выбор алгоритма.
Но после этого возвращаемся в то место, где было прерывание и продолжаем предыдущий алгоритм.


Так у вас все просто, в процедуре, где крутится "алгоритм" проверяйте не изменилась ли переменная , отвечающая за выбор алгоритма и если изменилась, немедленный выход и автоматический запуск нового эффекта.
(Если используете длинную задержку, разбейте ее на серию маленьких н.п. по 0.3 сек, а в промежутках и проверяйте переменную)
Sany81
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Пн июл 05, 2010 16:51:16

Re: Переход на начало процедуры по прерыванию???

Сообщение Sany81 »

Вариант с проверкой в процедуре на переход на новый алгоритм я я так делаю, а вот в самом алгоритме после каждого вызова delay_ms вставлять проверку "на нажатость кнопки" - это изврат, это хоть и будет работать, но сильно увеличит объем кода, а у меня всего лишь 1кб памяти под проект :-)

За подсказку с резетом огромнейшее спасибо :beer: , на днях обязательно попробую проверить. И если действительно поможет, то будет еще одна ножка, которой так не хватает на моей тиньке для ФИУ.
glaz73
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Пн дек 01, 2014 23:33:05

Re: Переход на начало процедуры по прерыванию???

Сообщение glaz73 »

а в саму функцию delay_ms проверку кнопки не судьба поставить? всего то одну функцию напильником подпилить.
Sany81
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Пн июл 05, 2010 16:51:16

Re: Переход на начало процедуры по прерыванию???

Сообщение Sany81 »

Еще раз огромное спасибо за РЕЗЕТ, получилось, работает так как хотел, моментально переключаются режимы, без всяких задержек и код намного компактнее, т.к. нет прерывания. Теперь придется думать над ФИУ и продумывать красивые эффекты только как все это в 1кб уложить :-)
Ответить

Вернуться в «AVR»