2

我正在使用TimerOne 库,代码如下所示:

#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());
}

问题是,在一些循环之后(当循环()的毫秒返回 930 时),arduino 停止

我认为问题在于,当 arduino 运行循环并在串行端口中写入时,ISR 例程也在写入。我怎么解决这个问题?

我尝试改变:

Serial.print("FROM Time1: ");
Serial.println(millis());

经过:

digitalWrite(13, !digitalRead(13));

而且工作正常,我认为arduino的串行库在使用中断时有一些问题,有可能吗?

有任何方法可以在某些代码块中阻止 arduino,我尝试使用原子但没有用。

我正在使用 Arduino UNO (ATmega328)

4

2 回答 2

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());
}

希望这可以帮助。

于 2013-08-11T19:29:44.323 回答
0

我花了很多时间去发现。

只是

Serial.flush();

:/

于 2013-08-12T06:57:41.287 回答