我正在使用TimerOne library,代码如下所示:
#include <TimerOne.h>
void setup() {
Serial.begin(9600);
pinMode(13, OUTPUT);
Serial.println();
Timer1.initialize(1000000); // set a timer of length 1000000 microseconds
Timer1.attachInterrupt(timerIsr); // attach the service routine here
}
void loop() {
Serial.println(millis());
}
void timerIsr() {
Serial.print("FROM Time1: ");
Serial.println(millis());
}
问题是,经过一些循环(当millis of loop()返回930时),arduino停止
我认为问题是,当arduino运行循环并写入串口时,ISR例程也在编写。我该如何解决这个问题?
我尝试改变:
Serial.print("FROM Time1: ");
Serial.println(millis());
由:
digitalWrite(13, !digitalRead(13));
工作正常,我认为arduino的串口库在使用中断时有一些问题,有可能吗?
在某些代码块中有任何阻止arduino的方法,我尝试使用atomic并且无效。
我正在使用Arduino UNO(ATmega328)
答案 0 :(得分:3)
第一个问题是您的ISR(中断服务例程),必须执行任何IO。 而是写点东西,比如:
int timedone;
setup() {
// etc.
timedone = 0;
}
loop() {
if (timedone == 1)
{
Serial.print("FROM Time1: ");
Serial.println(millis());
}
}
void timerISR() {timedone = 1;}
而不是你拥有的东西:
void timerIsr() {
Serial.print("FROM Time1: ");
Serial.println(millis());
}
希望这有帮助。
答案 1 :(得分:0)
我花了很多时间去发现。
只需
Serial.flush();
:/