Сбой Асинхронной Функции 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.
@Jwdsoft, 👍1
Обсуждение1 ответ
Ваша проблема в том, что вы используете функцию 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
- Как сделать очень долгую функцию delay(), несколько часов
- Разница между «time_t» и «DateTime»
- Получение BPM из данного кода
- Создание таймера с использованием часов реального времени с указанием времени начала и остановки
- Arduino непрерывно считывает значение АЦП с помощью прерывания
- Генерация стабильной частоты
- Как исправить ошибку компиляции для tone (), используя тот же таймер, что и другая функция
- Использовать timer0, не влияя на millis() и micros().
Покажите нам остальную часть вашего кода. 35 секунд, говоришь? Держу пари, что prev и prev2-это переменные типа int, а не unsigned long, как следовало бы., @Delta_G