Имею CVAVR+tiny13a+ в основном цикле крутится процедура.
Как бы после внешнего прерывания перейти на начало процедуры а не на то место откуда меня "выдернуло" прерывание?
Правильно - как раз красивее будет...ARV писал(а):не ищите способ сделать через жопу - делайте правильно, даже если кажется, что это не очень красиво.
Вместо reti написать pop R30 (снимаем адрес возврата), sei (разрешить прерывания) и rjmp где_у_вас_начало процедуры.Sany81 писал(а):после внешнего прерывания перейти на начало процедуры
Дык, он ещё и на Си пишет, похоже.pyzhman писал(а):PS. Ну хочет человек поизгаляться. Пусть набъёт себе шишек.
Код: Выделить всё
ISR(INT_vect){
asm("pop r30");
}
INT_vect:
push r16
pop r30
pop r16
retiПлюс снять аппаратный флажок прерыванияpyzhman писал(а):Вместо reti написать pop R30 (снимаем адрес возврата), sei (разрешить прерывания) и rjmp где_у_вас_начало процедуры.
PS. Ну хочет человек поизгаляться. Пусть набъёт себе шишек.
Согласен. Только не "мало ли что", а компилятор там располагает восстановление данных. И нужно это дело отследить, дабы стек не запоролся.COKPOWEHEU писал(а):мало ли что оно захочет после вставки добавить.
В зависимости от оптимизации, самого кода и конкретной реализации прерывания восстановления может и не быть.pyzhman писал(а):Согласен. Только не "мало ли что", а компилятор там располагает восстановление данных. И нужно это дело отследить, дабы стек не запоролся.COKPOWEHEU писал(а):мало ли что оно захочет после вставки добавить.
Ну кто бы сомневался, что задача именно в гирлянде! В соседней теме такой же извращенец хотел таким же методом добиться такой же цели.А задача следующая:
Накрылась 4х-канальная гирлянда, сдохла микросборка-капелька.
И как и там, лучшим решением будет создание конечного автомата.Так вот при нажатии копки, увеличивается переменная, отвечающая за выбор алгоритма.
Но после этого возвращаемся в то место, где было прерывание и продолжаем предыдущий алгоритм. Т.е. новый алгоритм начнет работать только после того, как полностью отработает текущий.
Хотите хитрость? Подключите кнопку к ноге RESET и после сброса опрашивайте флаг EXTRF регистра MCUSR. Содержимое памяти не сбрасывается при сбросе от ноги RESET, этим опросом можно узнать что сброс был от нее и спокойно менять переменную, которая отвечает за алгоритм, потом сразу переходить на нужный алгоритм. Вам даже не понадобятся прерывания для кнопкиSany81 писал(а):Это не очень красиво. т.к. иногда кнопка почти моментально переводит на новый алгоритм, а иногда нажмешь кнопку и ждешь секунд 5 пока завершится предыдущий алгоритм и начнется новый.
Поэтому и зародилась мысль после прерывания переходить на начало процедуры, тогда переключение алгорима мигания лампочек происходило бы моментально, без всяких задержек.
Так у вас все просто, в процедуре, где крутится "алгоритм" проверяйте не изменилась ли переменная , отвечающая за выбор алгоритма и если изменилась, немедленный выход и автоматический запуск нового эффекта.Sany81 писал(а):Так вот при нажатии копки, увеличивается переменная, отвечающая за выбор алгоритма.
Но после этого возвращаемся в то место, где было прерывание и продолжаем предыдущий алгоритм.