Выход из внешнего прерывания.
- Войдите на сайт для отправки комментариев
Чт, 01/09/2016 - 12:13
Здравствуйте!
Помогите разобраться, почему программа не выходит из внешнего прерывания. Вот скетч обработчика прерывания:
void PBSet() { noInterrupts(); int flag =0; while (flagPB_Set = 1) { if (digitalRead(PB_Set) == LOW && flag == 0) {flag = 1; pressPB_Set++;} if (digitalRead(PB_Set) == HIGH && flag == 1) flag = 0; if (pressPB_Set > 3) pressPB_Set = 0; switch (pressPB_Set) { case 1: MM5450(0b0000000001); Steps(); break; case 2: MM5450(0b0000000011); Bright(); break; case 3: MM5450(0b0000000111); Distance(); break; case 0: MM5450(0b0000000000); flagPB_Set = 0; interrupts(); break; } } }
По моему, когда "pressPB_Set" станет равным нулю, должен произойти выход из цикла WHILE и из прерывания.
Но, что-то не работает. Помогите!
Минимум добавьте условие default, иначе есть риск словить ошибку и остаться в прерывании навечно.
Добавление условия DEFAULT не помогает. Тем более, что это не обязательное условие.
Может я какие-нибудь другие правила написания программы нарушил?
Не понял, вся эта хрень стоит в обьработчике прерывания? А что делает MM5450 и функции Bright, stepa, Distance при запрещённых прерываниях?
Да! Вся эта хрень стоит в обработчике прерывания.
Просто, ничего другого не придумал, чтобы вся эта хрень выполнялась, а программа в loop() - нет.
Выход из этой хрени по условию.
По моему, выполнение функции никак не связано с запретом прерываний. Функция ММ5450 - фукция работы LED драйвера. А остальные пока пустые, могу убрать.
Вопрос: почему нет выхода из внешнего прерывания?
Убираю цикл WHILE и выход есть !? Но мне нужен выход по условию.
Намекаю.
while
(flagPB_Set = 1)
Намекаю.
while
(flagPB_Set = 1)
Ох, напрасно. Я готовил дальний заход, чтобы ТС сам это заметил :(
Намёк понял.
Но, когда flagPB_Set станет равной "0", должен произойти выход из WHILE.
А это произойдёт в SWITCH case 0:
Я уже подумываю, что МК не знает куда вернуться, потому что в прерывании я работал с функцией ММ5450().
Намёк понял.
Неее, не понял. Намекаю ещё раз: есть разница между оператором сравнения и оператором присваивания ;)
Намёк понял.
Но, когда flagPB_Set станет равной "0", должен произойти выход из WHILE.
А это произойдёт в SWITCH case 0:
Я уже подумываю, что МК не знает куда вернуться, потому что в прерывании я работал с функцией ММ5450().
То, что у вас в прерывании столько всего - это уже другая проблема, но в вашем случае выхода из while() не будет никогда, ибо результат операции присваивания вегда true
Я уже подумываю, что МК не знает
Да нет, это Вы не знаете как два числа сравнить :)
ЕвгенийП, котЭ мышке некролог зачитывает?
Вот я лошара.
Правильный вариант:
while (flagPB_Set == 1)
Спасибо!!!
Dimonaman, и кстати прерывание из под прерывания по умолчанию в GCC запрещено. Так что строки nointerrupts не нужны.
Gippopotam,
нет. Он зачитывает совсем другое. История появления этой картинки у меня фантастична и просто шикарна. Пусть меня забанят за флудерастию - расскажу таки.
Значит, чтобы никого и ничего не палить, скажу так: сижу я на одном длинном и скучном совещании в одном из министерств. Выступает мужик. Этот мужик выступал здесь и год назад, и два, и три – в общем я начал присутствовать на таких совещаниях лет пять назад – он и тогда выступал, а сколько лет ещё раньше – я не знаю. Мужик – руководитель некой конторы, которая считается «естественным монополистом» в неких делах.
Его выступления каждый год абсолютно одинаковые и выглядят примерно так: «За отчётный период мы добились больших успехов: провели конференцию, разработали дорожную карту, утвердили план, … однако, есть два фактора, которые не позволили нам решить проблему полностью – недостаток финансирования и появление новых вызовов с которыми мы раньше не сталкивались. Необходимо продолжить и расширить работы в будущем году». В переводе на русский язык это означает: «В прошлом году Вы выделили нам бабки на решение проблемы. Мы нихрена не сделали т.к. бабок мало, а проблем много. Давайте нам на этот год больше бабла и тогда уж мы точно всё решим». И так каждый год.
Так вот, сижу я, слушаю этот бред, который знаю настолько хорошо, что могу продолжить с любого места и от нехрен делать полез в сеть. А там, чуть ли ни на первой загруженной мною странице вижу вот такую шикарную картинку.
Я слегка обалдел, потом посмотрел на картинку, на докладчика, ещё раз на картинку, блин, ну как с него рисовали … показал картинку соседу … тот своему. Минут через пять в нашем углу стола началось такое фырканье и хихиканье, что даже министр нахмурил брови и попросил не мешать докладчику. Тут уж народ вообще стал просто рты руками зажимать. Но … дисциплина восторжествовала – мы не сорвали доклад, дотерпели, а потом, в перерыве, меня завалили визитками с просьбой переслать URL на почту.
Так что, вот! Дорога мне эта картинка :-)))
Спасибо за инфу!
Спасибо за инфу!
про кота?
Так что, вот! Дорога мне эта картинка :-)))
Про мышку в сыре - тоже захватывающая история?
Про всё! :)
Про мышку в сыре - тоже захватывающая история?
Нет, хотя ... когда она (картинка) попалась мне на глаза, я вспомнил как лет 20+ назад, когда моя дочь была ещё маленькой, мы гостили у моего отца. Отец сделал мышеловку из ведра с кукурузой. Подробностей не помню, но глупая мышь оказывалась в ведре и не могла выбраться. Ну, набилось там несколько мышей, он и показал их моей дочери. Та умилилась, побежала на кухню. Мы спросили "зачем", а она - "Ну, возьму молока, мышек покормлю" - "Так они ж в кукурузе сидят, чего их кормить?" - "Ну, как, а вдруг они голодные". Вот увидел я эту мышку на картинке и сохранил у себя - а вдруг голодная?