Прошу совета с функцией
- Войдите на сайт для отправки комментариев
Чт, 31/03/2016 - 18:10
Помогите найти ошибку в работе функции, проявляется она в следующем:
Если с станет больше 510, то срабатывае первый цикл while, из которого невозможно выйти, даже если а присваивается 0, при нажатии кнопки (( digitalRead(BUTTON)). Нажимаю кнопку начинает выводить Restored, отпускаю кнопку начинает выводить Protect I Hold Button.
void protectI () { labelWork: byte a = 0; byte b = 0; int c; c = analogRead(A1); if ( c > 510 ) { a = 1; cycle = 1; } while (a > 0) { if (cycle == 1) { pwmWrite(PWM_PIN, 0); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Protect I"); lcd.setCursor(0, 1); lcd.print("Hold Button"); Serial.println(a); } if (cycle > 50) digitalWrite(BUTTON_LED, 1); else digitalWrite(BUTTON_LED, 0); if (cycle == 100) cycle = 0; cycle++; delay(10); while ( digitalRead(BUTTON) ) { b++; digitalWrite(BUTTON_LED, 1); if ( b == 100 ) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Restored"); delay(1000); a = 0; Serial.println(a); goto labelWork; } } } }
1. как должно работать?
2. как определена перeменная cycle?
3. может дадите полный текст программы?
4. строки 02 и 36 я бы заменил на ещё один цикл while
5. добавьте дебаг-принты на каждое ветвление и задержку, возможно работает быстрее чем вы думаете
1) Условие не должно больше выполняться
и программа должна пойти дальше, а то получается что она зацикливается в этой функции.
2) byte cycle = 0; в самом начале кода, используется для служебных функций
3) могу дать и полный текст, но он порядка 500 строк, 90% которых к проблеме не относятся
4) по хорошему goto не нужно, это я уже начал искать проблему, и не помогло(
5) Делал принт в порт, в конце цикла a=0, потом опять a=1, получается что срабатывает условие
но я делал принт c, но там числа меньше чем 500
1. "условие не должно больше выполняться"
условие можно проверять и что-то делать или не делать в зависимости от результата проверки.
Добавьте печать значения с после analogRead.
6. дребезг кнопки может мешать
7. вариант:
if (c<500) return;
печатает 499-500
дребезг мешать не может потому как функция это предусматривает
Не помогло..
Собственно и так тоже
Второй вариант спас =) сам ошибся немного
Спасибо за помощь!