Выход из внешнего прерывания.

Dimonaman
Offline
Зарегистрирован: 27.08.2016

Здравствуйте!

Помогите разобраться, почему программа не выходит из внешнего прерывания. Вот скетч обработчика прерывания:

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 и из прерывания.

Но, что-то не работает. Помогите!

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Минимум добавьте условие default, иначе есть риск словить ошибку и остаться в прерывании навечно.

Dimonaman
Offline
Зарегистрирован: 27.08.2016

Yarik.Yar пишет:
Минимум добавьте условие default, иначе есть риск словить ошибку и остаться в прерывании навечно.

Добавление условия DEFAULT не помогает. Тем более, что это не обязательное условие.

Может я какие-нибудь другие правила написания программы нарушил?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не понял, вся эта хрень стоит в обьработчике прерывания? А что делает MM5450 и функции Bright, stepa, Distance при запрещённых прерываниях?

Dimonaman
Offline
Зарегистрирован: 27.08.2016

Да! Вся эта хрень стоит в обработчике прерывания.

Просто, ничего другого не придумал, чтобы вся эта хрень выполнялась, а программа в loop() - нет.

Выход из этой хрени по условию.

По моему, выполнение функции никак не связано с запретом прерываний. Функция ММ5450 - фукция работы LED драйвера. А остальные пока пустые, могу убрать.

void PBSet()
{
  noInterrupts();
  int flag =0;
  while (flagPB_Set = 1)
  {
    if (digitalRead(PB_OK) == LOW && flag == 0) {flag = 1; pressPB_Set++;} 
    if (digitalRead(PB_OK) == HIGH && flag == 1) flag = 0;
    if (pressPB_Set > 3) pressPB_Set = 0;
    switch (pressPB_Set)
      {
        case 0:
          MM5450(0b0000000000);
          flagPB_Set = 0;
          break;
        case 1:
          MM5450(0b0000000001);
          break;
        case 2:
          MM5450(0b0000000011);
          break;
        case 3:
          MM5450(0b0000000111);
          break;
       }
   }
   interrupts();
}

Вопрос: почему нет выхода из внешнего прерывания?

Убираю цикл WHILE и выход есть !? Но мне нужен выход по условию.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Намекаю.

 while (flagPB_Set = 1)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Gippopotam пишет:

Намекаю.

 while (flagPB_Set = 1)

Ох, напрасно. Я готовил дальний заход, чтобы ТС сам это заметил :(

Dimonaman
Offline
Зарегистрирован: 27.08.2016

Намёк понял.

Но, когда flagPB_Set станет равной "0", должен произойти выход из WHILE.

А это произойдёт в  SWITCH case 0:

Я уже подумываю, что МК не знает куда вернуться, потому что в прерывании я работал с функцией ММ5450().

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Dimonaman пишет:

Намёк понял.

Неее, не понял. Намекаю ещё раз: есть разница между оператором сравнения и оператором присваивания ;)

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Dimonaman пишет:

Намёк понял.

Но, когда flagPB_Set станет равной "0", должен произойти выход из WHILE.

А это произойдёт в  SWITCH case 0:

Я уже подумываю, что МК не знает куда вернуться, потому что в прерывании я работал с функцией ММ5450().

То, что у вас в прерывании столько всего - это уже другая проблема, но в вашем случае выхода из while() не будет никогда, ибо результат операции присваивания вегда true

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Dimonaman пишет:

Я уже подумываю, что МК не знает

Да нет, это Вы не знаете как два числа сравнить :)

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

ЕвгенийП, котЭ мышке некролог зачитывает?

Dimonaman
Offline
Зарегистрирован: 27.08.2016

Вот я лошара.

Правильный вариант:

while (flagPB_Set == 1)

Спасибо!!!

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Dimonaman, и кстати прерывание из под прерывания по умолчанию в GCC запрещено. Так что строки nointerrupts не нужны.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Gippopotam,

нет. Он зачитывает совсем другое. История появления этой картинки у меня фантастична и просто шикарна. Пусть меня забанят за флудерастию - расскажу таки.

Значит, чтобы никого и  ничего не палить, скажу так: сижу я на одном длинном и скучном совещании в одном из министерств. Выступает мужик. Этот мужик выступал здесь и год назад, и два, и три – в общем я начал присутствовать на таких совещаниях лет пять назад – он и тогда выступал, а сколько лет ещё раньше – я не знаю. Мужик – руководитель некой конторы, которая считается «естественным монополистом» в неких делах.

Его выступления каждый год абсолютно одинаковые и выглядят примерно так: «За отчётный период мы добились больших успехов: провели конференцию, разработали дорожную карту, утвердили план, … однако, есть два фактора, которые не позволили нам решить проблему полностью – недостаток финансирования и появление новых вызовов с которыми мы раньше не сталкивались. Необходимо продолжить и расширить работы в будущем году». В переводе на русский язык это означает: «В прошлом году Вы выделили нам бабки на решение проблемы. Мы нихрена не сделали т.к. бабок мало, а проблем много. Давайте нам на этот год больше бабла и тогда уж мы точно всё решим». И так каждый год.

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

 


 

Я слегка обалдел, потом посмотрел на картинку, на докладчика, ещё раз на картинку, блин, ну как с него рисовали … показал картинку соседу … тот своему. Минут через пять в нашем углу стола началось такое фырканье и хихиканье, что даже министр нахмурил брови и попросил не мешать докладчику. Тут уж народ вообще стал просто рты руками зажимать. Но … дисциплина восторжествовала – мы не сорвали доклад, дотерпели, а потом, в перерыве, меня завалили визитками с просьбой переслать URL на почту.

Так что, вот! Дорога мне эта картинка :-)))

 

Dimonaman
Offline
Зарегистрирован: 27.08.2016

Спасибо за инфу!

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Dimonaman пишет:

Спасибо за инфу!

про кота?

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

ЕвгенийП пишет:

Так что, вот! Дорога мне эта картинка :-)))

Про мышку в сыре - тоже захватывающая история?

Dimonaman
Offline
Зарегистрирован: 27.08.2016

Про всё! :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Gippopotam пишет:

Про мышку в сыре - тоже захватывающая история?

Нет, хотя ... когда она (картинка) попалась мне на глаза, я вспомнил как лет 20+ назад, когда моя дочь была ещё маленькой, мы гостили у моего отца. Отец сделал мышеловку из ведра с кукурузой. Подробностей не помню, но глупая мышь оказывалась в ведре и не могла выбраться. Ну, набилось там несколько мышей, он и показал их моей дочери. Та умилилась, побежала на кухню. Мы спросили "зачем", а она - "Ну, возьму молока, мышек покормлю" - "Так они ж в кукурузе сидят, чего их кормить?" - "Ну, как, а вдруг они голодные". Вот увидел я эту мышку на картинке и сохранил у себя - а вдруг голодная?