Arduino问题:使用TimerOne和delayMicroseconds()

时间:2017-01-02 16:26:20

标签: c timer arduino

我一直在使用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,代码行为奇怪。为什么会发生这种情况?谢谢!

1 个答案:

答案 0 :(得分:0)

根据this

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

  2. 您不应该使用delay()/delayMicroseconds(),因为它们再次使用中断但是它们在 ISR 中被禁用..您的风险使计时器错过了一些中断并且忽略了正确的时间流

  3. 作为一个评论,我在这里重复@Unimportant在评论中所说的内容: ISR中的代码应尽可能短而快。