arduina 2560 грабли в скетче

Тема в разделе "Arduino & Shields", создана пользователем Вий, 14 ноя 2016.

  1. Вий

    Вий Нуб

    Доброго времени суток

    Есть контроллер на Mega 2560.
    Взял за основу скетч по миганию диодами и попытался вставить аварийную остановку выполнения по нажатию кнопки, вот только не могу понять почему после отпускания зависает, не продолжается выполнение.

    Код (C++):
    /*настройка кнопок */
    /*настройка таймеров */
    /*настройка выходов */
    /*
    Мигаем светодиодами на контактах со 2 по 9, далее в обратном порядке с 8 по 3
    */

    // Setup - этот блок выполняется лишь один раз, при запуске скетча
    int del=200; // присваиваем переменной "del" значение 100,
                 // это будет в дальнейшем являться задержкой в 100 миллисекунд

    ///////////////////////////////////////////////////////////////////////////////////////////////

    // constants won't change. They're used here to
    // set pin numbers:
    const int buttonPin = 9;     // pin кнопки

    // variables will change:
    int buttonState = 0;         // variable for reading the pushbutton status
    ///////////////////////////////////////////////////////////////////////////////////////////////
           
    void setup()
    {
      // устанавливаем цыфровые выводы со 2 по 9 как выходы
      // (далее мы рассмотрим как это сделать более простым способом)
      pinMode(2, OUTPUT);
      pinMode(3, OUTPUT);
      pinMode(4, OUTPUT);
      pinMode(5, OUTPUT);
      pinMode(6, OUTPUT);
      pinMode(7, OUTPUT);
      pinMode(8, OUTPUT);
      pinMode(46, OUTPUT);
      pinMode(44, OUTPUT);
      pinMode(30, OUTPUT);  // аварийный диод //
      pinMode(32, OUTPUT);  // аварийный диод //
      // initialize the pushbutton pin as an input:
    ////  pinMode(embPin, INPUT);
    pinMode(buttonPin, INPUT);
      //
    }
    // блок цикла - данный блок будет повторяться бесконечно, до тех пор пока вы не отключите питание
    void loop()
    {
      digitalWrite(2, HIGH);   // включить светодиод на контакте 2
      delay(del);              // выполнить задержку длительностью "del"
                               // ("del" как мы помним равна 100 миллисекунд)
      digitalWrite(2, LOW);    // выключить светодиод
      digitalWrite(3, HIGH);   // включить светодиод на контакте 3
      delay(del);              // выполнить задержку
      digitalWrite(3, LOW);    // выключить светодиод
      digitalWrite(4, HIGH);   // включить светодиод на контакте 4
      delay(del);              // выполнить задержку
      digitalWrite(4, LOW);    // выключить светодиод
      digitalWrite(5, HIGH);   // включить светодиод на контакте 5
      delay(del);              // выполнить задержку
      digitalWrite(5, LOW);    // выключить светодиод
      digitalWrite(6, HIGH);   // включить светодиод на контакте 6
      delay(del);              // выполнить задержку
      digitalWrite(6, LOW);    // выключить светодиод
      digitalWrite(7, HIGH);   // включить светодиод на контакте 7
      delay(del);              // выполнить задержку
      digitalWrite(7, LOW);    // выключить светодиод
      digitalWrite(8, HIGH);   // включить светодиод на контакте 8
      delay(del);              // выполнить задержку
      digitalWrite(8, LOW);    // выключить светодиод
      digitalWrite(46, HIGH);   // включить светодиод на контакте 9
      delay(del);              // выполнить задержку
      digitalWrite(46, LOW);    // выключить светодиод
      digitalWrite(8, HIGH);   // включить светодиод на контакте 8
      delay(del);              // выполнить задержку
      digitalWrite(8, LOW);    // выключить светодиод
      digitalWrite(7, HIGH);   // включить светодиод на контакте 7
      delay(del);              // выполнить задержку
      digitalWrite(7, LOW);    // выключить светодиод
      digitalWrite(6, HIGH);   // включить светодиод на контакте 6
      delay(del);              // выполнить задержку
      digitalWrite(6, LOW);    // выключить светодиод
      digitalWrite(5, HIGH);   // включить светодиод на контакте 5
      delay(del);              // выполнить задержку
      digitalWrite(5, LOW);    // выключить светодиод
      digitalWrite(4, HIGH);   // включить светодиод на контакте 4
      delay(del);              // выполнить задержку
      digitalWrite(4, LOW);    // выключить светодиод
      digitalWrite(3, HIGH);   // включить светодиод на контакте 3
      delay(del);              // выполнить задержку
      digitalWrite(3, LOW);    // выключить светодиод
      digitalWrite(2, HIGH);   // включить светодиод на контакте 2
      delay(del);              // выполнить задержку длительностью "del"
      digitalWrite(2, LOW);    // выключить светодиод
      digitalWrite(44, HIGH);   // включить светодиод на контакте 3
      delay(del);              // выполнить задержку
      digitalWrite(44, LOW);    // выключить светодиод
      //

      // read the state of the pushbutton value:
      buttonState = digitalRead(buttonPin);
    ////////////////////////////////////////////////////////
    // прописать goto                   ////////////////////
    ////////////////////////////////////////////////////////
    emer:
      // check if the pushbutton is pressed.
      // if it is, the buttonState is HIGH:
    if (buttonState == HIGH) {
        // turn LED red on-off:
      digitalWrite(30, HIGH);   // включить аварийный диод //
      delay(del);              // выполнить задержку
      digitalWrite(30, LOW);    // выключить аварийный диод //
    if (buttonState == HIGH) {goto emer;}  
    else if (buttonState == LOW)
      {
        // turn LED green on-off:
      digitalWrite(32, HIGH);   // включить аварийный диод //
      delay(del);              // выполнить задержку
      digitalWrite(32, LOW);    // выключить аварийный диод //
      }
    }
    }
    первый диод после кнопки загорается и дальше ни как
    Люди добрые подскажите или направьте на путь истинны
     
  2. rkit

    rkit Гуру

    Состояние кнопки считывается вне цикла emer
     
    Вий нравится это.
  3. Вий

    Вий Нуб

    а не подскажешь ещё
    как правильно сделать прерывание цыкла после каждого срабатывания digitalWrite
     
  4. rkit

    rkit Гуру

    Зачем его прерывать? Вообще посоветую избавиться от goto. это плохая практика. Тут нужен while-цикл.
     
  5. Вий

    Вий Нуб

    это для пром станка
    нужна аварийная остановка станка с программой
     
  6. rkit

    rkit Гуру

    Аварийная остановка делается в обход микроконтроллера, так как это весьма вероятная точка отказа.
    Циклы - языковые конструкции прерывают оператором break, однако всё зависит от конкретного кода.
     
  7. Вий

    Вий Нуб

    кнопка аварийной остановки будет с двойными контактами, обесточивать исполнительные устройства и останавливать программу
    кнопку нажал, всё остановилось, отжал продолжил с того же места
     
  8. rkit

    rkit Гуру

    Это не аварийная остановка, а пауза. Тут всю программу придется переписать как абстрактный автомат, что является довольно-таки продвинутым уровнем программирования.
     
  9. Вий

    Вий Нуб

    плак плак
     
  10. Вий

    Вий Нуб

    ни как не соображу как применить