Arduino计时器似乎崩溃了?

时间:2013-06-20 08:23:39

标签: timer arduino dmx512

对于有一些互动装置的展览,我必须创建一个系统,从三个超声波PING传感器读取数据,并在一个输出端连接DMX调光器。

所以我拿走了我的Arduino Mega板,在它周围构建了一些硬件(用于DMX的信号逆变器)并使用库DmXSimple测试了DMX调光器。它工作正常!

下一步:测试PING传感器。我使用了库NewPing,并连接了传感器。它工作正常!

现在两个一起,在一个程序中:使用相同的代码导入两个库。 不起作用!

计时器碰撞?好吧......无论如何 - 我不知道如何解决这个问题。我该怎么办?如果它是一个计时器问题(也就是说,两个库都调用相同的计时器),我真的不知道如何修改库以使其工作。

1 个答案:

答案 0 :(得分:1)

Arduino上有两个定时器,你可以将这两个定时器放在一边。 DmxSimple明确表示它使用计时器#2,而NewPing则不清楚。但NewPing库可以在不使用计时器的情况下工作。您可以使用其计时器(这对于与其总线的实时交互是必需的)使DmxSimple工作,而您可以在循环函数中处理声纳ping:

void loop() {
    int dst = sonar.ping_cm();
    delay(50);
    DmxSimple.write(1, dst);
}

你不应该让计时器发生冲突。

查看NewPing的源代码,如果您使用timer_us() / timer_ms()函数,则使用Timer2,否则使用无计时器。但如果您在Arduino Leonardo(或Arduino Micro或任何其他基于ATmega32U4的微控制器)上运行它,它将使用与DmxSimple不冲突的Timer4。

如果要修补NewPing库以使用Timer3,您可能需要在NewPing.cpp中替换它:

OCR2A = 249;
TIMSK2 |= (1 << OCIE2A);

OCR3A = 640;
TIMSK3 |= (1 << OCIE3A);

并在stop_timer中:

TIMSK2 &= ~(1 << OCIE2A);

TIMSK3 &= ~(1 << OCIE3A);