Виснет цикл while
- Войдите на сайт для отправки комментариев
Пт, 18/10/2019 - 07:49
Всем привет!
Беда, не могу справиться. Виснет цикл. Хотел, что бы цикл работал, пока переменная Р1==1. При этом, Р1 меняет свое значение от состояния 13 пина. Изменение состояния 13 пина имитирую кнопкой (это временно, потом он будет меняться от работы датчика). Пока Р1==0, система работает, как только нажимаю кнопку и Р1==1, то начинает работать цикл while и система больше на кнопку не реагирует. При этом, если вместо Р1 в условиях циклов прописывать (digitalRead(6)==LOW), то система работает без замечаний. А надо, что бы работало от из изменения переменной Р1.
int a,b;//переменные для работы счетчика времени int over1;//переменные для перевода секунд в минуты и часы int t1cycle;//время работы в цикле в секундах float h1,m1,s1;//переменные для хранения времени работы в цикле void setup() { Serial.begin(9600); pinMode(6, INPUT); digitalWrite(6, HIGH); pinMode(13, OUTPUT); digitalWrite(13, LOW); } void loop() { if(digitalRead(6) == LOW) {digitalWrite(13, HIGH); } if(digitalRead(6) == HIGH) {digitalWrite(13,LOW); } volatile bool P1 = digitalRead(13); if (P1 == 1) { a = millis()/1000; while (P1 == 1) { b = millis()/1000; t1cycle = (b - a); h1 = int(t1cycle/3600); over1 = t1cycle%3600; m1 = int(over1/60); over1 = over1%60; s1 = int(over1); Serial.print(s1); } } if (P1==0) { Serial.println("m"); } }
Чтобы не вис, нужно чтобы условие в теле цикла менялось...
Вот так?
Всё равно не работает.
Что за странные манипуляции с пином #13? Для того, чтобы digitalRead() работал, какой pinMode() должен быть?
По замыслу, выход 13 будет менять значение от разных условий. Что бы не прописывать в каждом условии команды (а то запутаюсь) на запуск цикла While, то мне проще снимать значение с выхода 13. Причем попробовал снять данные командой digitalRead - работает, переменная Р1 меняла свое значение.
Присвоение один символ =
Что бы не прописывать в каждом условии команды (а то запутаюсь) на запуск цикла While,
Вы уже это сделали. При каких обстоятельствах в стр. #32 выполнится условие в if()?
Вот. Упростил. Кнопка - это временная мера, она имитирует команду на запуск и на остановку (нажал - старт, отпустил - стоп), в последствии её не будет, будет flag. При нажатии на кнопку - цикл while запускается, считает и выводит значения в порт, но больше ни на что не реагирует. А нужно, что бы при отпускании кнопки - счетчик остановился.
Вставь опрос своей кнопли и изменение флага ВНУТРЬ while
Дед,
он уже пробовал в строке №33 в #2, а сообщение #5 пропустил. Так что теперь ... "так пробовал - не работает" :)
Не могу топик найти, но пару-тройку лет назад было тут ...
- не работает ...
- так ты подключил к пятому пину, а в скетче читаешь с четвёртого
- подключил к четвёртому, всё равно не заработало, вернул обратно.
Никогда не забуду :-)))
Ну лана, пусь человек постигает infinite loop, а у меня с котом - пятница.
Всем спасибо, кто помогал. Буду ковырять дальше.