我一直在使用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,代码行为奇怪。为什么会发生这种情况?谢谢!
答案 0 :(得分:0)
根据this:
您不应在中断服务例程中使用Serial.print()/Serial.read()
,因为最新版本的Serial
使用中断来执行 >读取和写入但它们在 ISR 中被禁用。
您不应该使用delay()/delayMicroseconds()
,因为它们再次使用中断但是它们在 ISR 中被禁用..您的风险使计时器错过了一些中断并且忽略了正确的时间流。
作为一个评论,我在这里重复@Unimportant在评论中所说的内容: ISR中的代码应尽可能短而快。