Хоть ответьте правильно ли я думаю. Кстати прерывания основные и дополнительные я настроил регистрами, не применяя функции аттач ..
тут понятно что ты там что-то настроил. только непонятно как, т.е. есть таки разрешенные тобой прерывания или нет .
Roman2344 пишет:
... и у меня нету обработчиков прерывания, мне нужно было при прерывания сразу переходить в сетап. Может всё-таки нужны обработчики прерываний только оставить их пустыми?
Если не разрешал прерываний, то и обрабатывать нечего, а если разрешал, то сами по себе вектора преываний не ведут в сетап, а если не описаны обработчики, то выполняется хз что из того что лежит по этим векторам.
Потом, сетап по идеалогии выпослняется перед стартом основной программы 1 раз, зайти на сетап это фактически рестарт проца, какой смысл в таком прерывании, если это только не прерывание по вдт - непонятно.
Прерывания разрешены в сетапе, регистрами настроенны на срабатывание по заднему фронту, вот только нет обработчиков прерываний. Идея такая сработал датчик с 1 в 0 потом прерывание которое перебрасывает в сетап, в сетапе идёт проверка состояния датчика и если 0 то выполняется бесконечный цикл вайл.
Для дополнительных прерываний у меня тоже нету обработчиков прерываний на дополнительном у меня висит кнопка пуск-стоп ( кнопка с фиксацией)мне тоже создать пустой обработчик прерываний который сделает переход в сетап?
По умолчанию все прерывания wiring выстваляет на вектор _bad_interrupt(), который представляет из себя ровно одну команду: rti - возврат из процедуры обработчика прерывания. Так что, что там и какими регистрами "настроил" автор в сетапе, да ещё и без назначения обработчиков .. нипанятна.
Пока что (без кода) сумбурные разъяснения автора указывают только на то, что он что-то явно накуролесил в программе. Пока не разберется чего он (ли сам) там накуролесил и не исправит прогу .. двигаться далее и выискивать "пришельцев из розетки в 40см от платы" - думаю бесполезно.
Идея такая сработал датчик с 1 в 0 потом прерывание которое перебрасывает в сетап, в сетапе идёт проверка состояния датчика и если 0 то выполняется бесконечный цикл вайл.
Жаль что нет идеи почитать, что такое сетап, и как работают прерывания ....
Когда убрал все настройки прерываний то есть вообще всё что связанно с прерываниями, и включил в сеть то ничего не перезагружается когда что - то включаю выключаю в розетку.
Да я читал, но на форумах утверждают что работает. Мне впринципе задержка от дребезга нужна для одной кнопки(да она применяется редко, и задержку думаю можно сделать и в функции if обычным delay(30);), остальные обработчики прерываний оставить пустыми что ли? Как правильно сделать прерывания?
э.. ну ты сейчас явно указал, что у тебя есть 3 шт millis_prev, причем начально они никак не инициализированы, т.е. что там сидит внутри за значение при первом проходе можно только гадать.
и реально нужно 3 разных millis_prev ?
Если нужно после выполнения прерывания совершить куда-то переход, введи какой-то флаг и устанавливай его внутри прерывания, а в осн цикле проверяй и делай переход куда надо, если флаг установлен.
А можно переход из обработчика прерываний сделать goto и поставить метку в начале void loop?
хм ... это не вариант, поскольку ты вывалишься в основной цикл, то постепенно возникнет множество вызванных и не закрытых прерываний, а этому есть предел.
Потом надо смотреть, когда сбрасывается флаг прерывания, если при выходе из обработки, то блокируется вызов прерывания, которое уже обрабатывается. Если при входе, то проблема множественности вложенных вызовов.
да и еще вступает в действие это ограничение
"Внутри функции обработки прерывания не работает delay(), значения возвращаемые millis() не изменяются"
Наверно можно попробовать, как ты первоначально хотел: сдеть goto на сетап или вызвать сетап в конце обработки прерывания. Вроде как в этом случае все флаги должны бы быть сброшены в исходное состояние и указатель поставлен в начало стека, прерывание сбрасывается по дефолту.
Похоже на партизанщину, но возможно такой вариант и пройдет.
1. Код, который вы привели, как понимаю "сильно урезан", ибо в таком виде он не способен даже скомпиляться, поскольку после функции setup() стоит аж сразу 2 закрывающие фигурные скобки .. да и остальной код мягко говоря "ни о чем".
Строка 50 последнего примера всегда выдаст "истину", поскольку значение currenMillis присваивается непосредственно стркой выше .. да и сам цикл - пуст (строки 51,52) и будет редуцирован оптимизатором как избыточный.
2. Поскольку читать описание wiring вам явно "в лом", то напомню что функция setup() предназначена ИСКЛЮЧИТЕЛЬНО для первичной настройки выводов, переменных и прочих условий работы программы. А функция loop() предназначена для выполнение постоянных повторяющихся действий ПОСЛЕ таковой настройки. Соответственно ваш вопрос, хотя и имеет положительное решение, тем не менее "странен" и, как понимаю, из-за нежелания читать документацию на платформу и её библиотеки.
3. Поскольку приведенный кусок кода очевидно неграмотен (имеет использование неустановленных переменных, что вам уже заметили), то смею предположить, что и остальной код ровно такой же. А стало быть, искать ваших "пришельцев" надо в первую очередь не из розетки, а в самом коде программы.
Но, тут вам помочь крайне сложно, ибо все телепаты, как обычно в отпусках.. попробуйте изложить весь код и рассказать что вы хотели на самом деле подробней - возможно ситуация прояснится.
Не стоит предлагать неграмотных решений. Вывал из обработчика прерывания в setup(), следуюя логике wiring - это желание "странного" и не предполагается от слова "никак", ибо незачем.
Почистил полностью Сетап, сделал обработчики прерываний, перебрал весь код, повесил керамику на каждый вход и всё ничего не перезагружается, всем спасибо
тут понятно что ты там что-то настроил. только непонятно как, т.е. есть таки разрешенные тобой прерывания или нет .
Если не разрешал прерываний, то и обрабатывать нечего, а если разрешал, то сами по себе вектора преываний не ведут в сетап, а если не описаны обработчики, то выполняется хз что из того что лежит по этим векторам.
Потом, сетап по идеалогии выпослняется перед стартом основной программы 1 раз, зайти на сетап это фактически рестарт проца, какой смысл в таком прерывании, если это только не прерывание по вдт - непонятно.
Прерывания разрешены в сетапе, регистрами настроенны на срабатывание по заднему фронту, вот только нет обработчиков прерываний. Идея такая сработал датчик с 1 в 0 потом прерывание которое перебрасывает в сетап, в сетапе идёт проверка состояния датчика и если 0 то выполняется бесконечный цикл вайл.
Для дополнительных прерываний у меня тоже нету обработчиков прерываний на дополнительном у меня висит кнопка пуск-стоп ( кнопка с фиксацией)мне тоже создать пустой обработчик прерываний который сделает переход в сетап?
По умолчанию все прерывания wiring выстваляет на вектор _bad_interrupt(), который представляет из себя ровно одну команду: rti - возврат из процедуры обработчика прерывания. Так что, что там и какими регистрами "настроил" автор в сетапе, да ещё и без назначения обработчиков .. нипанятна.
Пока что (без кода) сумбурные разъяснения автора указывают только на то, что он что-то явно накуролесил в программе. Пока не разберется чего он (ли сам) там накуролесил и не исправит прогу .. двигаться далее и выискивать "пришельцев из розетки в 40см от платы" - думаю бесполезно.
Жаль что нет идеи почитать, что такое сетап, и как работают прерывания ....
Сейчас так у меня прерывания сделаны, а всё равно влияние когда с сети включаешь выключаешь есть, в сетапе при этом всё практически убрал.
Когда убрал все настройки прерываний то есть вообще всё что связанно с прерываниями, и включил в сеть то ничего не перезагружается когда что - то включаю выключаю в розетку.
В середине этой странички прочтите что происходит с millis() во время прерывания
http://arduino.ru/Reference/AttachInterrupt
Да я читал, но на форумах утверждают что работает. Мне впринципе задержка от дребезга нужна для одной кнопки(да она применяется редко, и задержку думаю можно сделать и в функции if обычным delay(30);), остальные обработчики прерываний оставить пустыми что ли? Как правильно сделать прерывания?
скорее тут надо смотреть область видимости переменной объявленой как
static
в какой-то функции.т.е. насколько понимаю, три вызова
static
unsigned
long
millis_prev;
порождают три независимых переменных, хотя
Roman2344 похоже считает, что работает с одной.т.е. объявление millis_prev следует сделать 1 раз, вне тела прерываний.
зы. посколльку не великий прогер, надеюсь меня поправят, если не прав.
Основная задача мне нужно что бы обработчик прерываний меня перекидывал либо в сетап, либо в начало void loop.
Сделал так тоже самое
э.. ну ты сейчас явно указал, что у тебя есть 3 шт millis_prev, причем начально они никак не инициализированы, т.е. что там сидит внутри за значение при первом проходе можно только гадать.
и реально нужно 3 разных millis_prev ?
Если нужно после выполнения прерывания совершить куда-то переход, введи какой-то флаг и устанавливай его внутри прерывания, а в осн цикле проверяй и делай переход куда надо, если флаг установлен.
Сделал так теперь использую только основные внешние прерывания, без дополнительных.
Питаю от БП ничего не перезагружается, осталось понять как сделать переход в начало функции loop после обработчика прерываний void pusk
А можно переход из обработчика прерываний сделать goto и поставить метку в начале void loop?
Потом надо смотреть, когда сбрасывается флаг прерывания, если при выходе из обработки, то блокируется вызов прерывания, которое уже обрабатывается. Если при входе, то проблема множественности вложенных вызовов.
да и еще вступает в действие это ограничение
"Внутри функции обработки прерывания не работает delay(), значения возвращаемые millis() не изменяются"
Наверно можно попробовать, как ты первоначально хотел: сдеть goto на сетап или вызвать сетап в конце обработки прерывания. Вроде как в этом случае все флаги должны бы быть сброшены в исходное состояние и указатель поставлен в начало стека, прерывание сбрасывается по дефолту.
Похоже на партизанщину, но возможно такой вариант и пройдет.
1. Код, который вы привели, как понимаю "сильно урезан", ибо в таком виде он не способен даже скомпиляться, поскольку после функции setup() стоит аж сразу 2 закрывающие фигурные скобки .. да и остальной код мягко говоря "ни о чем".
Строка 50 последнего примера всегда выдаст "истину", поскольку значение currenMillis присваивается непосредственно стркой выше .. да и сам цикл - пуст (строки 51,52) и будет редуцирован оптимизатором как избыточный.
2. Поскольку читать описание wiring вам явно "в лом", то напомню что функция setup() предназначена ИСКЛЮЧИТЕЛЬНО для первичной настройки выводов, переменных и прочих условий работы программы. А функция loop() предназначена для выполнение постоянных повторяющихся действий ПОСЛЕ таковой настройки. Соответственно ваш вопрос, хотя и имеет положительное решение, тем не менее "странен" и, как понимаю, из-за нежелания читать документацию на платформу и её библиотеки.
3. Поскольку приведенный кусок кода очевидно неграмотен (имеет использование неустановленных переменных, что вам уже заметили), то смею предположить, что и остальной код ровно такой же. А стало быть, искать ваших "пришельцев" надо в первую очередь не из розетки, а в самом коде программы.
Но, тут вам помочь крайне сложно, ибо все телепаты, как обычно в отпусках.. попробуйте изложить весь код и рассказать что вы хотели на самом деле подробней - возможно ситуация прояснится.
Не стоит предлагать неграмотных решений. Вывал из обработчика прерывания в setup(), следуюя логике wiring - это желание "странного" и не предполагается от слова "никак", ибо незачем.
Почистил полностью Сетап, сделал обработчики прерываний, перебрал весь код, повесил керамику на каждый вход и всё ничего не перезагружается, всем спасибо