在arduino中使用定时器中断停止串口库的功能为什么?

时间:2013-12-18 18:47:30

标签: serialization timer arduino interrupt-handling arduino-ide

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

2 个答案:

答案 0 :(得分:1)

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

初看一眼,我建议使用经过验证的库,例如SimpleTimer()。它将设置和管理多个事件,其中“run”基本上从计时器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's fork,因为它使用引脚更改中断来获得更准确的引脚更改。他的图书馆,再次离散地管理这些中断。

我们可以使用PinChangeInt Library来设置您的实施。单个引脚改变的地方'ISR几乎可以立即捕获时间戳。在这种情况下,减去等待时间远小于50ms所需的分辨率。

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

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

答案 1 :(得分:0)

我遇到了同样的问题,所以我建议:

  1. 使用TimerOne()库。

  2. 在计时器中使用标志,这样您就可以控制何时 已经过去了。

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

  4. 不要在循环函数中写太多代码并控制 传感器通过开关或功能读取。

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