Добрый день. Тренируюсь с Arduino UNO. Делаю программу простую программу, которая отслеживает текущее давление в трубе и включает или выключает двигатель. Программа позволяет настроить минимум и максимум давления. Так вот по нажатию кнопки контроллер обрабатывает прерывание. Вот кусок кода прерывания. Логику закладывал такую: есть две кнопки, по нажатию кнопки 1 происходит прерывание и начинается его обработка, нажимая кнопку 1 мы увеличиваем уставку минимальную сначала, потом нажимаем два раза кнопку 2, что является подтверждением и переходим к уставке максимальной, далее снова конпка 1 - увеличиваем уставку максимальную, далее кнопка 2 опять два раза - подтверждаем и вываливаемся обратно в работу. Уставка минимальная пишется в Так вот почему-то два цикла подряд не работают. По отдельности работают, а вместе нет. Ощущение, что программа не вываливается из первого цикла. Получается первый цикл отрабатывается, начинается второй, но в момент нажатия кнопки 1 опять запускается первый цикл. Что неправильно делаю? Что-то нужно еще добавить для ясности? void myEvent(){ myOLED.clrScr(); myOLED.update (); buttonState2 = 0; pressCount = 0; while (pressCount <=10){ buttonState2 = digitalRead(buttonPin2); buttonState = digitalRead(buttonPin); if (buttonState2 == HIGH) { pressCount++; } if (buttonState == HIGH){ pressureMinADC++; pressureMIN = pressureMinADC*0.01172; } myOLED.print("Set pressure MIN: " ,CENTER, 0); myOLED.printNumF(pressureMIN,2,CENTER,20); myOLED.print("pressCount: " ,0, 35); myOLED.printNumI(pressCount,30,55); myOLED.update (); } // Ввод значения максимума давления отключения myOLED.clrScr(); myOLED.update (); buttonState2 = 0; pressCount = 0; while (pressCount <=10 ) { buttonState2 = digitalRead(buttonPin2); buttonState = digitalRead(buttonPin); if (buttonState == HIGH) { pressureMaxADC++; pressureMAX = pressureMaxADC*0.01172; } if (buttonState2 == HIGH) { pressCount2++;} myOLED.print("Set pressure MAX: " ,CENTER, 0); myOLED.printNumF(pressureMAX,2,CENTER,35); myOLED.print("pressCount: " ,0, 35); myOLED.printNumI(pressCount,30,55); myOLED.update (); } myOLED.clrScr(); }
в этом коде нет никаких прерываний странно, что этот код вообще работает. По идее, он и компилироваться не должен.
Почему лучше опрашивать? Кроме как избавления от дребезга? Опрашивать получается по таймеру? Извиняюсь, код выкладываю. Там много мусора. Я пока пытаюсь понять принцип. Получается, что в прерывании, когда я нажимаю кнопку 1 снова происходит прерывание, но в инструкции пишут, что в обработчике прерывание запрещены.
Я упростил код до элементарного. Посмотрите, пожалуйста. В обработчике прерывания простой счетчик в цикле, когда я повторно нажимаю кнопку 1, он сбрасывается. Почему так? Опроса кнопки в обработке нет.
Потому что так работает оптимизация. Чтобы ее отключить для переменной, необходим квалификатор volatile перед определением переменной.
Поставил перед всеми переменными в обработчике volatile - не помогло. Помогло то, что убрал команды myOLED.clrScr(); myOLED.update (); из обработчика. Но теперь вопрос другой, как тогда правильно использовать эти команды. Они нужны мне для вывода на дисплей информации.