Прервать выполнение функции немедленно
- Войдите на сайт для отправки комментариев
Пнд, 09/01/2017 - 02:13
Друзья, привет!
Делаю светофор с четырьма режимами:
0. автопереключалка
1. красный
2. желтый
3. зеленый
Все хорошо пока не выполняю функцию autol() она выполняется непрерывно.
Подскажите пожалуйста, как можно:
1. Прервать выполнение функции немедленно.
2. При возвращении в функцию начать не с того же места а с начала. То-есть заново ее запустить и забыть о прерваной итерации.
Код ниже:
int red = 2; int yellow = 3; int green = 4; int sb = 12; int modec = 1; int reading; int lastButtonState=LOW; int buttonState=LOW; unsigned long lastDebounceTime = 0; unsigned long debounceDelay = 0; void setup() { // put your setup code here, to run once: pinMode(red, OUTPUT); pinMode(yellow, OUTPUT); pinMode(green, OUTPUT); pinMode(sb, INPUT); } void loop (){ int reading = digitalRead(sb); if (reading != lastButtonState) { lastDebounceTime = millis(); } if ((millis() - lastDebounceTime) > debounceDelay) { if (reading != buttonState) { buttonState = reading; if (buttonState == HIGH) { modec++; if (modec==4) { modec=0; } } } } if (modec==0) { digitalWrite(red,LOW); digitalWrite(yellow,LOW); digitalWrite(green,LOW); autol(); } if (modec==1) { digitalWrite(red,HIGH); digitalWrite(yellow,LOW); digitalWrite(green,LOW); } if (modec==2) { digitalWrite(red,LOW); digitalWrite(yellow,HIGH); digitalWrite(green,LOW); } if (modec==3) { digitalWrite(red,LOW); digitalWrite(yellow,LOW); digitalWrite(green,HIGH); } } void autol() { digitalWrite(red, HIGH); delay(5000); digitalWrite(red, LOW); digitalWrite(yellow, HIGH); delay(1000); digitalWrite(yellow, LOW); digitalWrite(green, HIGH); delay(5000); digitalWrite(green, LOW); digitalWrite(yellow, HIGH); delay(2000); digitalWrite(yellow, LOW); return; }
А какое событие должно вызвать это прерывание?
(мне кажется , или я ответил на его вопрос)
Все хорошо пока не выполняю функцию autol() она выполняется непрерывно.
Подскажите пожалуйста, как можно:
1. Прервать выполнение функции немедленно.
2. При возвращении в функцию начать не с того же места а с начала. То-есть заново ее запустить и забыть о прерваной итерации.
Поэтой причине удобная функция delay() так НЕУДОБНА. используйте millis().
Пока нет ответа на вопрос inspiritus, всё остальное - толчение воды в ступе. Ждем-с :)
Повторяю для тах кто в ТАНКЕ, delay() прервать нельзя.
Да, ладно Вам. Любое, самое замухрыжное прерывание, прервёт delay за милую душу.
Да, ладно Вам. Любое, самое замухрыжное прерывание, прервёт delay за милую душу.
И дальше что? Передаст управление другой строке. Ну не будет же программа висеть в вечном прерывании.
всегда можно нажать кнопку reset и случится то, чего желает ТС
... или сделать программный ресет...
... или сделать программный ресет...
ага - из делея прерыванием
И дальше что?
Что нужно программисту, то и дальше.
Ну так напишите свой delay() в котором будет выход по условию. Это ж программа. Не нравится стандартный delay - ни кто не запрещает написать свой, если клапауция всуе не упоминать.
Не хочу вникать в программу ТС, но если Вы хотите быстро прервать delay-длиное, то можно вместо длиного delay использовать свою функцию, которая будет тысячу раз, в цикле, использовать в тысячу раз болеее короткий delay. А между использованиями короткого delay, проверяйте нужное Вам условие для быстрого прекращения длинного delay. Если оно, условие, возникло, то прекращаете работу своей функции. Например, в операторе for
(
int
i=0; i <= 1000; i++){
delay(1);..........} переменной i по нужному Вам условию присваиваете i=1000 и цикл скоропостижно завершается.класс титановый велосипед для delay без delay().
Ну я конечно не решил вопрос с перыванием delay(). Я просто написал иначе программу. Я проверил собирайте и закачивайте скетч.
А ТС еще спит?
А ТС еще спит?
разбудить?
Ахахахаха! Срочно за учебник!
Ахахахаха! Срочно за учебник!
Достал банку с попкорном... ))
Лучше учебник.
универсальный прерыватель функций
Ахахахаха! Срочно за учебник!
Достал банку с попкорном... ))
Присоединяюсь
универсальный прерыватель функций
у него время срабатывания 100 миллисекунд, при токе более 200 ампер )))
Если делей на 5 часов, то пойдеть )))))
Ахахахаха! Срочно за учебник!
ну давай, вещай, прерыватель делеев.
сегодня твой день, что не пост прям хоть записывай.
ну давай, вещай, прерыватель делеев.
...иш...петь хотели заставить...