gpt4 book ai didi

c - Arduino 问题 : Using TimerOne and delayMicroseconds()

转载 作者:太空宇宙 更新时间:2023-11-04 04:26:04 25 4
gpt4 key购买 nike

我一直在使用 Arduino,遇到了一个非常奇怪的问题。这是我正在使用的代码:

#include <TimerOne.h>

const int LED_PIN = 8;

const int PERIOD = 3000; // micros

void setup()
{
pinMode(LED_PIN, OUTPUT);

Timer1.initialize(PERIOD);
Timer1.attachInterrupt(sendPulse);

Serial.begin(115200);
}

void loop()
{

}

void sendPulse()
{
Serial.println(micros());
delayMicroseconds(x);
Serial.println();
}

因此,我尝试更改 sendPulse() 中 x 的值。例如,如果 x 为 300,串行监视器将按预期输出“3016 6016 9016...”。但是,当 x 大于或等于 835 时会发生一些奇怪的事情——串行监视器输出“3016 4992 7992 ....”我的问题是为什么第一次和第二次中断之间的时间不是 3000?此外,如果我将中断中的代码更改为:

  Serial.println(micros());
delayMicroseconds(x);
digitalWrite(LED_PIN, HIGH);
Serial.println();

当 x 大于或等于 830 而不是 835 时,代码表现异常。为什么会这样?谢谢!

最佳答案

根据 this :

  1. 您不应该在中断服务例程中使用Serial.print()/Serial.read(),因为最新版本的Serial 使用中断 进行读取和写入,但它们在ISR 中被禁用。

  2. 您不应该使用delay()/delayMicroseconds(),因为它们再次使用了中断,但是它们在中被禁用了ISR.. 您的风险使定时器错过一些中断并失去对正确时间流的跟踪。


作为评论,我在这里重复@Unimportant 在评论中所说的话:ISR 中的代码应该尽可能短和快。

关于c - Arduino 问题 : Using TimerOne and delayMicroseconds(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41430232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com