Доброго времени суток Есть контроллер на 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); // выключить аварийный диод // } } } первый диод после кнопки загорается и дальше ни как Люди добрые подскажите или направьте на путь истинны
Аварийная остановка делается в обход микроконтроллера, так как это весьма вероятная точка отказа. Циклы - языковые конструкции прерывают оператором break, однако всё зависит от конкретного кода.
кнопка аварийной остановки будет с двойными контактами, обесточивать исполнительные устройства и останавливать программу кнопку нажал, всё остановилось, отжал продолжил с того же места
Это не аварийная остановка, а пауза. Тут всю программу придется переписать как абстрактный автомат, что является довольно-таки продвинутым уровнем программирования.