Страница 1 из 1

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

Добавлено: Вс дек 28, 2014 19:46:23
Sany81
Всем привет.
Имею CVAVR+tiny13a+ в основном цикле крутится процедура.
Как бы после внешнего прерывания перейти на начало процедуры а не на то место откуда меня "выдернуло" прерывание?

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

Добавлено: Вс дек 28, 2014 19:51:20
ARV
не ищите способ сделать через жопу - делайте правильно, даже если кажется, что это не очень красиво.

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

Добавлено: Вс дек 28, 2014 20:10:30
Sany81
т.е. нормального способа выйти из процедуры нету?

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

Добавлено: Вс дек 28, 2014 20:32:01
ARV
для обработки прерывания нормальный способ - это вернуться туда, откуда ушли в обработчик. то, что хотите сделать вы - уже ненормально.

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

Добавлено: Вс дек 28, 2014 23:01:32
shads
ARV писал(а):не ищите способ сделать через жопу - делайте правильно, даже если кажется, что это не очень красиво.
Правильно - как раз красивее будет...
Я на 99% уверен, что ТС неправильно формирует для себя реализацию задачу...
Sany81 опишите вашу задачу, вас тут направят на путь истинный...

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

Добавлено: Пн дек 29, 2014 06:33:19
pyzhman
Sany81 писал(а):после внешнего прерывания перейти на начало процедуры

Вместо reti написать pop R30 (снимаем адрес возврата), sei (разрешить прерывания) и rjmp где_у_вас_начало процедуры.
PS. Ну хочет человек поизгаляться. Пусть набъёт себе шишек.

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

Добавлено: Пн дек 29, 2014 06:45:53
Kavka
pyzhman писал(а):PS. Ну хочет человек поизгаляться. Пусть набъёт себе шишек.
Дык, он ещё и на Си пишет, похоже. :)

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

Добавлено: Пн дек 29, 2014 07:20:12
pyzhman
Ясен пень на Си. Пусть врезает ассемблерные вставки.

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

Добавлено: Пн дек 29, 2014 07:25:56
COKPOWEHEU
Если на Си, прерывание придется делать целиком на ассемблере, а то мало ли что оно захочет после вставки добавить.

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

ISR(INT_vect){
asm("pop r30");
}
INT_vect:
push r16
pop r30
pop r16
reti

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

Добавлено: Пн дек 29, 2014 07:44:22
Deer
pyzhman писал(а):Вместо reti написать pop R30 (снимаем адрес возврата), sei (разрешить прерывания) и rjmp где_у_вас_начало процедуры.

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

Плюс снять аппаратный флажок прерывания

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

Добавлено: Пн дек 29, 2014 08:01:35
pyzhman
Это в пиках его надо снимать. В AVR он сбросится при входе в прерывание.

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

Добавлено: Пн дек 29, 2014 08:07:21
pyzhman
COKPOWEHEU писал(а):мало ли что оно захочет после вставки добавить.

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

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

Добавлено: Пн дек 29, 2014 08:34:09
Sany81
Всем спасибо за ответы.
Да действительно, пишу на СИ.
А задача следующая:
Накрылась 4х-канальная гирлянда, сдохла микросборка-капелька.
Решил написать свою программу.
Суть в том, что есть несколько алгоритмов работы, каждый алгоритм работает по 2-5 сек. в бесконечном цикле.
Переключение между алгоритмами осуществляется кнопкой.
Так вот при нажатии копки, увеличивается переменная, отвечающая за выбор алгоритма.
Но после этого возвращаемся в то место, где было прерывание и продолжаем предыдущий алгоритм. Т.е. новый алгоритм начнет работать только после того, как полностью отработает текущий. Это не очень красиво. т.к. иногда кнопка почти моментально переводит на новый алгоритм, а иногда нажмешь кнопку и ждешь секунд 5 пока завершится предыдущий алгоритм и начнется новый.
Поэтому и зародилась мысль после прерывания переходить на начало процедуры, тогда переключение алгорима мигания лампочек происходило бы моментально, без всяких задержек.

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

Добавлено: Пн дек 29, 2014 08:41:39
COKPOWEHEU
pyzhman писал(а):
COKPOWEHEU писал(а):мало ли что оно захочет после вставки добавить.

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

В зависимости от оптимизации, самого кода и конкретной реализации прерывания восстановления может и не быть.
А задача следующая:
Накрылась 4х-канальная гирлянда, сдохла микросборка-капелька.
Ну кто бы сомневался, что задача именно в гирлянде! В соседней теме такой же извращенец хотел таким же методом добиться такой же цели.
Так вот при нажатии копки, увеличивается переменная, отвечающая за выбор алгоритма.
Но после этого возвращаемся в то место, где было прерывание и продолжаем предыдущий алгоритм. Т.е. новый алгоритм начнет работать только после того, как полностью отработает текущий.
И как и там, лучшим решением будет создание конечного автомата.

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

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

Хотите хитрость? Подключите кнопку к ноге RESET и после сброса опрашивайте флаг EXTRF регистра MCUSR. Содержимое памяти не сбрасывается при сбросе от ноги RESET, этим опросом можно узнать что сброс был от нее и спокойно менять переменную, которая отвечает за алгоритм, потом сразу переходить на нужный алгоритм. Вам даже не понадобятся прерывания для кнопки :idea:
+освобождается нога контроллера.

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

Добавлено: Пн дек 29, 2014 09:07:24
pyzhman
В таком разе память почистит компиляторная вставка. External Startup называется. Не, есть, конечно, возможность ее отключить в настройках проекта.

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

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


Так у вас все просто, в процедуре, где крутится "алгоритм" проверяйте не изменилась ли переменная , отвечающая за выбор алгоритма и если изменилась, немедленный выход и автоматический запуск нового эффекта.
(Если используете длинную задержку, разбейте ее на серию маленьких н.п. по 0.3 сек, а в промежутках и проверяйте переменную)

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

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

За подсказку с резетом огромнейшее спасибо :beer: , на днях обязательно попробую проверить. И если действительно поможет, то будет еще одна ножка, которой так не хватает на моей тиньке для ФИУ.

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

Добавлено: Пн дек 29, 2014 13:04:55
glaz73
а в саму функцию delay_ms проверку кнопки не судьба поставить? всего то одну функцию напильником подпилить.

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

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