выход из прерывания на начало программы
- Войдите на сайт для отправки комментариев
Сб, 25/04/2015 - 05:15
Здравствуйте, необходимо по нажатию кнопки (из обработчика прерывания на INT0) вывалиться на начало программы. При прописывании команды goto для перехода из обработчика прерываня на метку в основной программе loop() компилятор ругается.
Как правильно выйти из обработчика прерывания на начало программы loop() ?
russo, досрочный выход из функций -return;
Разве из прерывания можно делать return;
Возврат все равно будет на место прерывания.
Я не могу опрашивать флаг установленого прерывания в основной программе, т.к. много функций delay();
russo, покажите скетч. Вы что-то перемудрили по-моему.
Не могу понять, что за ошибки
Это светофор со световыми эфектами с регулятором скорости мигания и переключением программ мигания
В 49 строке после else не должно быть круглой скобки. И в 60й строке убрать её пару
Спасибо, вот лоханулся.
И все таки вопросс по выходу из прерывание на начало программы, вот обработчик прерывания
При returne из прерывания нужно перепрыгивать на начало программы loop(), у меня вроде бы не так.
Отладку бы в протеусе сделать...
russo, у вас много недостатков в скетче. Недостатки вызывают проблемы. Из-за использования delay() вам досталась проблема, что выходя из прерывания нужно закончить очень затяжной цикл loop() прежде чем изменения вступят в силу. Если бы вы не использовали delay() то и проблемы не было, программа бы изменилась едва вы коснулись кнопки. То, что вы сейчас хотите -это попытка бороться со следствием, а не лучше ли заняться причиной? Вместо delay написать функцию задержки, хотя бы на том-же миллисе. Проблема сразу же отпадёт.
В ассемблере нет таких проблем, поставил goto по метке и радуйся...
В этом "компиляторе" (ардуино не хочу называть компилятором) goto в другую функцию не прокатывает. В общем я огорчен.
Если без delay() - никак то можно перед каждым delay() ставить проверку, было ли прерывание и если да тогда "goto".
Это ускорит переход по прерыванию. А вообще dimax, прав delay() нужно убрать.
О да, С плохой язык, он не позволяет из обработчика прерываний перейти в любую точку программы. Забавно даже. Используйте другой язык.
А если без сарказма, то любая задача решается без особых проблем, если все делать правильно. Но есть другой вариант, свалить все на язык, вместо того, что бы просто решить задачу.
А если задача не решается, значит решение не правильное.
О чем dimax и написал.
russo: Если Вам еще интересен Ваш проэкт, то я его сделал без delay() и проверил на протеусе, можете посмотреть.
Првда без прерывания, На мой взгля оно там не нужно, хотя для общего развития можно поставить.
Критика приветствуется!
В ассемблере нет таких проблем, поставил goto по метке и радуйся...
В этом "компиляторе" (ардуино не хочу называть компилятором) goto в другую функцию не прокатывает. В общем я огорчен.
Как у вас все просто, вы еще скажите, что "goto" за вас и указатель стека поправит :)
russo, конечно, в ассемблере можно всё, но под свою ответственность. :)
C/C++ пытаются хоть как-то защитить нас от глупых ошибок, и упростить программирование.
Хотя, тоже позволяют очень многое - не спешите критиковать.
Например, если ваш способ возврата в исходную точку вам так дорог, и хочется именно его - обратите внимание на очень интересные функции setjmp и longjmp.
vosara, ваш код существенно лучше, (по крайней мере основная проблема решена). Однако до совершенства далеко :) Обычно, когда стоит задача рулить сразу большим количеством портов удобнее создать специальную функцию, которой будут скармливать некую переменную, в которой лежат побитово все данные, необходимые для записи в порты. Применительно к данному случаю -у нас 12 светодиодов, значит заводим двухбайтовую переменную, в которой состояние 12-ти младших бит будет соответствовать 12 нужным выходам. Я для тренировки решил набросать такую. Светодиоды включены как у автора, на ногах 3..14 относительно земли. Функция ledout() зажжёт светодиоды в точном соответствии с битами переменной, которую передадут в функцию. Разбирать какие там программы переключений у автора уже не интересно, ограничусь для примера одной -бегущий огонёк.
dimax, Спасибо за кементарий, я понимаю что с побитовыми операциями намного удобней, быстрей и экономней но для меня это пока проблема. Благодаря Вашему, хорошо прокоментированому коду, буду продвигаться в этом направлении.
vosara, c функцией ledout() очень легко добавлять новые эффекты. Их можно генерить чисто математически (как в скетче), а можно и просто рисовать битами, например
потом эти команды прокрутить назад, будет красивый эффект ) Можно сделать светодиодную палочку, и ей в воздухе слова рисовать, или к велосипеду на колесо приделать что-то подобное, и узоры рисовать).
dimax, Да как работает Ваш код я понял, вроде ничего сложного, благодаря коментариям. Вот теперь ищу больше информации. По поводу рисования, я делал свои символы на дисплей но на порт никогда не выводил да и 12 бит вывести на 3 порта (D,B,C) не знал.
Добавка к тому-же коду, функция "индикатор уровня звука". Звук подавать на аналоговый вход. analogReference сделать INTERNAL, что-б чувствительность поднять. Вот записал маленький видеоролик работы, скачать.
Ещё один бегущий огонёк, бегает от 1-го до 12-го и обратно от 12-го до 1-го :)