Продолжить воспроизведение звука во время процедуры прерывания

Я пытаюсь воспроизвести тон (на Arduino Mega через библиотеку тонов) и сделать так, чтобы тон не прерывался, если во время воспроизведения тона вызывается процедура прерывания. Я не уверен, что это возможно. Блок кода ниже. Соответствующая функциональность:

-A цикл while выполняется бесконечно, пока не будет нажата кнопка S1. Нажатие кнопки S1 запускает процедуру обработки прерывания, в которой для параметра interruptFlag_s1 установлено значение 1.

-Это запускает воспроизведение звукового сигнала в течение 300 мс.

-Возможно, что в течение 300 мс будет вызвано прерывание по нажатию другой кнопки. Это прерывает звуковой сигнал примерно на 0,5 мс, что достаточно, чтобы сделать заметный перерыв в тональном сигнале, которого я хотел бы избежать.

-В идеале звуковой сигнал не прерывается процедурой прерывания.

    while (restart == 0) {
      if (interruptFlag_s1 == 1 || interruptFlag_s2 == 1) {
        if (interruptFlag_s1 == 1) {
          primary_sensor = 1;
          interruptFlag_s1 = 0;
          rBot = false;
          gBot = true;
          bBot = false;
        } else if (interruptFlag_s2 == 1) {
          primary_sensor = 2;
          interruptFlag_s2 = 0;
          rBot = false;
          gBot = false;
          bBot = true;
        }

        interruptFlag_rtc = 0;
        finish_id = 0;
        button_flag = 0;
        time_diff = 0.00;
        alt_finish_time = 0.00;
        tone(speakerPin, 3000, 300); // Start tone
        restart = 1;
      }
    }

, 👍0

Обсуждение

Прерывания не должны влиять на tone(), если только ISR не занимает слишком много времени для выполнения. Держите свой ISR коротким, и все должно быть хорошо., @Edgar Bonet

Вы пробовали это и столкнулись с разрывом?, @the busybee


1 ответ


1

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

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

,