TimerOne和串行库

时间:2013-08-11 12:59:02

标签: timer arduino atmega

我正在使用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)

2 个答案:

答案 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();

:/