Программа работает только с Serial.begin

Моя программа работает только тогда, когда добавлена следующая строка:

Serial.begin(9600);

Когда это отключено/удалено, программа больше не переключает выходное состояние.

Я использую Arduino Mega 2560.

При добавлении строки:

  • Выход регулярно включается или ВЫКЛЮЧАЕТСЯ примерно каждые 1 сек.

Когда линия удалена:

  • Выход переключается через 1 секунду (как и ожидалось), но затем переключается несколько раз примерно через 3 секунды.
  • Я попробовал использовать еще один Arduino Mega 2560: на этот раз выход переключается через 1 секунду (как и ожидалось), но затем переключается несколько раз сразу после этого (а не примерно через 3 секунды).

В чем может быть проблема?

Мой код:

byte inputPin2 = 2;
byte inputPin3 = 3;
byte outputPin = 13;
boolean outputPin_HIGH = false;
volatile short angle = -18;

void setup() {
  Serial.begin(9600);      //<----------------------
  pinMode(hallSensorPin, OUTPUT);

  pinMode(inputPin2, INPUT_PULLUP);
  pinMode(inputPin3, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(inputPin2), ISR_addAngle, CHANGE);
  attachInterrupt(digitalPinToInterrupt(inputPin3), ISR_addAngle, CHANGE);
}

void ISR_addAngle() {
  angle = angle + 18;
}

void loop() {
  if (angle == 900) {
    if (outputPin_HIGH) {
      digitalWrite(outputPin, LOW);
      outputPin_HIGH = false;
    } else {
      digitalWrite(outputPin, HIGH);
      outputPin_HIGH = true;
    }
    angle = angle - 900;
  }
}

, 👍1

Обсуждение

"Когда это отключено/удалено, программа больше не работает..." не очень информативно. Что именно не работает? Чего вы ожидали, что произойдет? Что произошло вместо этого?, @JRobert

Когда линия отключена/удалена, программа больше не получает регулярные прерывания, и поэтому вывод больше не переключается в состояние. Когда строка будет добавлена: Выход устанавливается (включается и выключается) регулярно примерно каждые 1 сек. Когда строка будет удалена: Выход устанавливается через 1 секунду (как и ожидалось), но затем устанавливается несколько раз примерно через 3 секунды., @Magnus

... или я думаю, что прерывание работает (я вижу, что сигнал отправляется на вывод прерывания), но, поскольку я не могу последовательно.распечатать флаг, я не знаю, действительно ли это работает..., @Magnus

Программа отлично с ней работает, но я хочу ее удалить (это было только для отладки), @Magnus

вы можете хранить значения флагов в массиве ... когда вы достигнете некоторого желаемого количества сохраненных значений, затем вызовите функцию для выполнения serial.begin и распечатайте значения, @jsotola

Я предполагаю, но похоже, что "правильная" операция зависит от прерываний UART, которые исчезают без " Serial.begin ()". Можете ли вы подтвердить, что ваш датчик действительно подает сигналы так, как вы ожидаете?, @JRobert

@JRobert Прерывание исходит от драйвера, а не от датчика (светодиод загорается, когда он посылает сигнал), и я уверен, что сигнал отправляется как обычно. Я запустил код с "Serial.begin(9600);" без проблем и сразу после этого снова без ошибок. Поэтому я также не думаю, что должна быть проблема с сигналом, который запускает прерывание., @Magnus

@jsotola Я попробую это завтра. Но я уверен, что получаю ожидаемые флаги в нужное время, когда используется "Serial.begin(9600);". Я скорее хочу отладить эту ошибку без последовательного., @Magnus

Похоже, вы используете Arduino на базе ATmega328P (UNO, Nano и т. Д.). Но, вероятно, вам следует сказать, что вы используете, и устранить все сомнения., @timemage

@timemage Я использую Arduino Mega 2560. Я попробовал с другим Arduino Mega 2560: на этот раз выход переключается через 1 секунду (как и ожидалось), но затем переключается несколько раз сразу после (а не примерно через 3 секунды)., @Magnus

Он работает без "Serial.begin(9600)" при использовании Arduino Micro Pro (ATmega32U4). Здесь вывод 0 и вывод 1 используются в качестве входов для прерываний. Больше ничего в коде не меняется. К сожалению, это не решение проблемы..., @Magnus

"выход переключается через 1 секунду (как и ожидалось)" почему ожидается 1 секунда?, @timemage

Когда я добавляю "Serial.begin(9600)", "1 сек" примерно в это время, я обычно ожидаю, что выход переключится. Снаружи все совсем по-другому. Почему эта строка должна иметь значение?!?, @Magnus