Оператор else

Идей нет… я пас. Надо глубже погружаться и в библиотеку. и в этот конкретный МК.

Да, вот так работает:

void loop() {
  if (ir.available()) {
    Serial.println(ir.readData(), HEX);
  }
  else {
    delay(10);
  }
}

Работает:

void loop() {
  if (ir.available()) {
    Serial.println(ir.readData(), HEX);
  }
  else {
    delay(0);
  }
}

Работает:

void loop() {
  static uint8_t i;
  if (ir.available()) {
    Serial.println(ir.readData(), HEX);
  }
  else {
    i++;
  }
}

Теперь пытаюсь понять почему именно в этом месте нужна задержка. Чтобы избавиться от некрасивого молдавского партизана “else”.

я думаю это бесполезная трата времени, хотя мне кажется что я где то читал что там явно об этом говорили, если нет желания оставлять загадку предкам, типа такой

void loop() {
if (ir.available()) {
 uint32_t data = ir.readData();
Serial.println(data, HEX);
 PORTA.OUTTGL = PIN7_bm;
 }
// Универсальная пауза для всех состояний
delay(1); // Снижает частоту опроса с ~100kHz до ~1kHz(но это не точно)
}

чтоб потомки гадали что там и зачем, ставьте ЕвгенийП что вопрос решен, и ищите новую аномалию))) а то скучно…

Смотрите. У Вас available проверяет внутреннюю переменную _ready. Изменяется она в обработчике прерывания (в функции tick()). Но при этом она ни разу не volatile (посмотрите исходник библиотеки). Вот отсюда и приключения на одно место.

5 лайков

Гайвер как всегда