Подскажите ошибки

Тема в разделе "Arduino & Shields", создана пользователем Deasd, 10 дек 2018.

  1. Deasd

    Deasd Нуб

    Добрый день.

    Тренируюсь с 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();
    }
     
  2. Это не весь код. И воспользуйтесь кнопкой "код" в панели отправки сообщения на форуме.
     
  3. parovoZZ

    parovoZZ Гуру

    кнопки надо опрашивать, а не ждать от них прерывания. Заодно и дребезг будет убран автоматом.
     
    ostrov нравится это.
  4. b707

    b707 Гуру

    в этом коде нет никаких прерываний
    странно, что этот код вообще работает. По идее, он и компилироваться не должен.
     
  5. Deasd

    Deasd Нуб

    Почему лучше опрашивать? Кроме как избавления от дребезга? Опрашивать получается по таймеру?

    Извиняюсь, код выкладываю. Там много мусора. Я пока пытаюсь понять принцип. Получается, что в прерывании, когда я нажимаю кнопку 1 снова происходит прерывание, но в инструкции пишут, что в обработчике прерывание запрещены.
     

    Вложения:

  6. parovoZZ

    parovoZZ Гуру

    По таймеру.
     
  7. parovoZZ

    parovoZZ Гуру

    Так не бывает. Это надо специально включить и знать, где включить.
     
  8. Deasd

    Deasd Нуб

    Я упростил код до элементарного. Посмотрите, пожалуйста. В обработчике прерывания простой счетчик в цикле, когда я повторно нажимаю кнопку 1, он сбрасывается. Почему так? Опроса кнопки в обработке нет.
     

    Вложения:

  9. parovoZZ

    parovoZZ Гуру

    Потому что так работает оптимизация. Чтобы ее отключить для переменной, необходим квалификатор volatile перед определением переменной.
     
  10. Deasd

    Deasd Нуб

    Поставил перед всеми переменными в обработчике volatile - не помогло. Помогло то, что убрал команды
    myOLED.clrScr();
    myOLED.update ();
    из обработчика.
    Но теперь вопрос другой, как тогда правильно использовать эти команды. Они нужны мне для вывода на дисплей информации.
     
  11. b707

    b707 Гуру

    в прерывании ничего, кроме чтения пина, вообще не должно быть. Все остальное - в основной программе.
     
  12. Deasd

    Deasd Нуб

    До конца не понятно, но ход действия ясен.
    Спасибо.