0

我正在处理一个 arduino 项目。我正在使用定时器中断和串行通信。但是一旦定时器中断启用 arduino 串行库函数就无法正常工作。我被这个问题困住了。有没有办法做到这一点。我想同时使用串行通信和定时器中断。使用以下函数会停止串行通信

    void initialize()
    {
    //timer0
     TIMSK0 = 2;                             
     OCR0A = 125;                             
    TCCR0A = 0b00000010;   //commenting TCCR0A = 0b00000010; and  TIMSK1 = 1 ; enable
    TCCR0B = 0b00000011;   // the serial communications

    //timer1
    TCCR1B = 1 ;                                
   TIMSK1 = 1 ;                                         


   //timer2
     TCCR2A = _BV(COM2A0) | _BV(WGM21) | _BV(WGM20);
     TCCR2B = _BV(WGM22) | _BV(CS20);
    OCR2A = B11000111; 


     EICRA = 63 ;                                        
      EIMSK = (1 << INT0) | (1 << INT1);  
      }
4

2 回答 2

1

我会避免直接使用 Timer0。正如您所看到的,它会与 Arduino 核心库混淆。

乍一看,我建议使用经过验证的库,例如SimpleTimer()。它将设置和管理多个事件,其中它的“运行”基本上从计时器 0 中拉出 millis()。但请往下读。

我记得 Timer0 是由核心库设置为在 1K 时产生中断的溢出。micros() 函数在毫秒中断之间读取 timer0 内的值。

对于使用 Timer1,您可以尝试TimerOne()库。还有 TimerTwo、3 等。

您可能想通读 Ken Shirriff 的Arduino-IRremote库。因为它以离散的方法完成了您想要的大部分工作。比如40Khz PWM。而不是依赖于其他库。他的原始图书馆在哪里使用

USECPERTICK 50  // microseconds per clock interrupt tick

读取和采样来自 IR 解调器的接收输入,以解码帧。

我还要指出microtherion 的库分支,因为它使用引脚更改中断来获得更准确的引脚更改。他的图书馆,再次离散地管理这些中断。

就像可以使用PinChangeInt 库来设置您的实现一样。单个引脚更改的 ISR 几乎可以立即捕获时间戳。减去延迟,在这种情况下远小于 50 毫秒所需的分辨率。

如果你真的需要更高的分辨率,你可以使用输入捕捉功能。如InputCapture.ino 所示。它将实时捕获转换时间并生成用于潜在处理的 ISR。

从这些示例中,您应该能够实现您的超声波传感器。

于 2013-12-21T19:39:42.863 回答
0

我有同样的问题,所以我建议:

  1. 使用TimerOne()图书馆。

  2. 在计时器中使用标志,这样您就可以控制您编程的时间何时过去。

  3. 在循环函数中,你应该只使用Serial.available(), 所以时间会尽可能接近你想要的。

  4. 不要在循环函数中编写太多代码,并使用开关或 if 函数控制传感器读取。

它不是最好的解决方案,但它有效。您必须小心编程的时间,它应该高于读取数据所花费的时间。

于 2016-04-06T15:37:21.227 回答