Ожидание в цикле while

pryanic
Offline
Зарегистрирован: 04.09.2019

Приветствую. Задача в сабже. Сделать ожидание в цикле while. Есть байт с флагами, пока нужный флаг равен 0, то дальше не идем. Но в железе не работает, т.е. работает весьма странно. Если тело цикла остается пустым, то программа не идет дальше. Но стоит вписать в тело цикла пару действий, тот же delay(), то выполнение происходит. Не могу понять почему. 

 

#define interrupt 0
#define left 1
#define right 2
#include <avr/interrupt.h>
byte  flags;

void setup() {

  pinMode (4, INPUT_PULLUP);
  pinMode (5, INPUT_PULLUP);
  pinMode(13, OUTPUT);
  Serial.begin(9600);
  Serial.println(F("encoder test"));
  PCICR = B00000100;
  PCMSK2 = B00010000;
  sei();

}

void loop() {

  while (!bitRead(flags, interrupt)){
    //Serial.println(flags);
    //delay(1000);
  }

 // Serial.println(flags);


 // if (bitRead(flags, interrupt)) {
    Serial.println(flags);
    if (bitRead(flags, left)) {
      Serial.println(F("turn left"));
      bitClear(flags, left);

      //bitClear(flags, interrupt);
    }

    if (bitRead(flags, right)) {
      Serial.println(F("turn right"));
      bitClear(flags, right);
      //bitClear(flags, interrupt);
    }
    bitClear(flags, interrupt);

  //}
}



ISR(PCINT2_vect)
{


  if (!digitalRead(4)) {
    bitSet(flags, interrupt);
    digitalWrite(13, !digitalRead(13));

    if (digitalRead(5)) {
      bitSet(flags, right);
      //bitClear(flags, right);
    } else {
      bitSet(flags, left);
      //bitClear(flags, right);
    }
  }
}

 

pryanic
Offline
Зарегистрирован: 04.09.2019

Все, разобрался. 

Переменную надо volatile объявить, чтобы в прерывании менялась. Но все равно странно...  Почему тогда в остальных случаях работало. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Потому что non-volatile переменные и связанные с ними вычисления компилятор оптимизирует. Видимо считает, что результат вычисления условия всегда false и выкидывает while() целиком из объектного кода. 

Включите уровень дебага компилятора повыше - узнаете много нового.