Сбой Асинхронной Функции Arduino

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

void loop() {
  if(millis()-prev>=gap){
    Serial.print("Prev: ");Serial.println(millis()-prev);
    prev = millis();
  }

  Serial.print("Prev2: ");Serial.println(millis()-prev2);
  delay(mils);
  prev2 = millis();
}

Вы можете попробовать это самостоятельно код работает нормально в начале, но ошибки через некоторое время. Что я пытаюсь сделать, так это иметь некоторый код, который работает в цикле, и функцию, которая будет работать каждую секунду. код опробован на нескольких платах Arduino Uno.

, 👍1

Обсуждение

Покажите нам остальную часть вашего кода. 35 секунд, говоришь? Держу пари, что prev и prev2-это переменные типа int, а не unsigned long, как следовало бы., @Delta_G


1 ответ


0

Ваша проблема в том, что вы используете функцию delay() в своем цикле. Это останавливает выполнение кода на заданное время, поэтому неудивительно, что через некоторое время ваш код начинает сбоить.

Чтобы достичь того, чего вы хотите, попробуйте это:

void loop() {
  if(millis() - prev >= gap){
    Serial.print("Prev: ");Serial.println(millis()-prev);
    prev = millis();
  }
  if(millis() - prev2 >= mils){    
  Serial.print("Prev2: ");Serial.println(millis()-prev2);
  prev2 = millis();
 }
}

ОТРЕДАКТИРУЙТЕ, Если вы попытаетесь создать генератор частоты, он не будет работать таким образом - прочитайте этот поток и посмотрите на программу в последней трети, которая использует для этого технику битовой перестройки.
Вот пример генератора волн (с дополнительным оборудованием)

,

Я использовал это в начале, но я удалил его, потому что второй должен использовать более высокое разрешение, поэтому он должен использовать микро вместо миллиса, но когда я использую микро вместо миллиса, он работает не так, как ожидалось, поэтому я использовал задержки.Я просто упростил код, чтобы сосредоточиться на том, что вызывает проблему.но мой код, который будет выполняться в цикле, - это код, который использует микросхемы для генерации точного импульса, который варьируется от 1 мс до 220 мс, поэтому я был вынужден использовать задержку и задержку в микросекундах, чтобы понять, есть ли другой способ получить импульс вовремя, и время выключения должно быть одинаковым, но ширина варьируется.тональный сигнал не достигает 1 мс, @Jwdsoft

Когда тот же принцип не сработал с " micros ()", вы сделали с ним что-то не так. Вы можете показать нам свой микро-код, @chrisl

Тот же код в течение 1 секунды просто измените миллис на микро и пробел на 1000000, и он не будет работать , если(micros() - prev >= 1000000){ Serial.print("До: ");Serial.println(micros()-до); prev = micros(); }, @Jwdsoft