Прошу совета с функцией
- Войдите на сайт для отправки комментариев
Чт, 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
дребезг мешать не может потому как функция это предусматривает
while ( digitalRead(BUTTON) ) { b++; digitalWrite(BUTTON_LED, 1); if ( b == 100 ) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Restored"); delay(1000); a = 0;void protectI () { labelWork: byte a = 0; byte b = 0; int c; c = analogRead(A1); if ( c < 510 ) return; if ( c > 510 ) { a = 1; cycle = 1; }Не помогло..
void protectI () { labelWork: byte a = 0; byte b = 0; int c; c = analogRead(A1); if ( c > 510 ) { if ( c < 510 ) return; a = 1; cycle = 1;Собственно и так тоже
Второй вариант спас =) сам ошибся немного
Спасибо за помощь!