首页 文章

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

提问于
浏览
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);  
      }

2 回答

  • 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 .

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

  • 0

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

    • 使用 TimerOne() 库 .

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

    • 在循环函数中,您应该只使用 Serial.available() ,因此时间将尽可能接近您想要的时间 .

    • 不要在循环功能中写入太多代码,并用开关或功能控制传感器读数 .

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

相关问题