Прошу совета с функцией

out-space
out-space аватар
Offline
Зарегистрирован: 11.03.2015

Помогите найти ошибку в работе функции, проявляется она в следующем: 

Если с станет больше 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;
      }
    }
  }
}

 

toc
Offline
Зарегистрирован: 09.02.2013

1. как должно работать?
2. как определена перeменная cycle?
3. может дадите полный текст программы?
4. строки 02 и 36 я бы заменил на ещё один цикл while
5. добавьте дебаг-принты на каждое ветвление и задержку, возможно работает быстрее чем вы думаете

out-space
out-space аватар
Offline
Зарегистрирован: 11.03.2015

1) Условие не должно больше выполняться 

  c = analogRead(A1);
  if ( c > 510 ) 

и программа должна пойти дальше, а то получается что она зацикливается в этой функции.

2) byte cycle = 0; в самом начале кода, используется для служебных функций

3) могу дать и полный текст, но он порядка 500 строк, 90% которых к проблеме не относятся

4) по хорошему goto не нужно, это я уже начал искать проблему, и не помогло(

out-space
out-space аватар
Offline
Зарегистрирован: 11.03.2015

5) Делал принт в порт, в конце цикла a=0, потом опять a=1, получается что срабатывает условие 

  c = analogRead(A1);
  if ( c > 510 ) 

но я делал принт c, но там числа меньше чем 500

toc
Offline
Зарегистрирован: 09.02.2013

1. "условие не должно больше выполняться"
условие можно проверять и что-то делать или не делать в зависимости от результата проверки.
Добавьте печать значения с после analogRead.

6. дребезг кнопки может мешать

toc
Offline
Зарегистрирован: 09.02.2013

7. вариант:
if (c<500) return;

out-space
out-space аватар
Offline
Зарегистрирован: 11.03.2015

печатает 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;

 

out-space
out-space аватар
Offline
Зарегистрирован: 11.03.2015
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;
  }

Не помогло..

out-space
out-space аватар
Offline
Зарегистрирован: 11.03.2015
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;

Собственно и так тоже

out-space
out-space аватар
Offline
Зарегистрирован: 11.03.2015

Второй вариант спас =) сам ошибся немного

out-space
out-space аватар
Offline
Зарегистрирован: 11.03.2015

Спасибо за помощь!