Ожидание в цикле while
- Войдите на сайт для отправки комментариев
Ср, 18/09/2019 - 20:56
Приветствую. Задача в сабже. Сделать ожидание в цикле 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);
}
}
}
Все, разобрался.
Переменную надо volatile объявить, чтобы в прерывании менялась. Но все равно странно... Почему тогда в остальных случаях работало.
Потому что non-volatile переменные и связанные с ними вычисления компилятор оптимизирует. Видимо считает, что результат вычисления условия всегда false и выкидывает while() целиком из объектного кода.
Включите уровень дебага компилятора повыше - узнаете много нового.