Serialization 在arduino中使用定时器中断停止串行库函数为什么?

Serialization 在arduino中使用定时器中断停止串行库函数为什么?,serialization,timer,arduino,interrupt-handling,arduino-ide,Serialization,Timer,Arduino,Interrupt Handling,Arduino Ide,我正在处理一个arduino项目。我正在使用定时器中断和串行通信。但是一旦定时器中断启用arduino,串行库函数就不起作用。我被这个问题困住了。有没有办法做到这一点。我想同时使用串行通信和定时器中断。使用以下功能可停止串行通信 void initialize() { //timer0 TIMSK0 = 2; OCR0A = 125;

我正在处理一个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);  
      }
void initialize()
{
//计时器0
TIMSK0=2;
OCR0A=125;
TCCR0A=0b00000010;//注释TCCR0A=0b00000010;和TIMSK1=1;启用
TCCR0B=0b00000011;//串行通信
//定时器1
TCCR1B=1;
TIMSK1=1;
//定时器2
TCCR2A=_BV(COM2A0)| u BV(WGM21)| u BV(WGM20);
TCCR2B=_BV(WGM22)|u BV(CS20);
OCR2A=B11000111;
EICRA=63;

EIMSK=(1我会避免直接使用Timer0,因为它会弄乱Arduino核心库,正如您所看到的

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

我记得,核心库将Timer0设置为在1K处溢出,创建中断。其中,micros()函数在毫秒中断之间读取Timer0内的值

若要使用Timer1,你们可以试试library。还有TimerWO,3等等

您可能想通读Ken Shirriff的库。由于它做了您想要的很多事情,所以使用离散方法。例如40Khz PWM。而不是依赖于其他库。他的原始库使用

USECPERTICK 50  // microseconds per clock interrupt tick
从红外解调器读取并采样接收输入,以解码帧

我还想指出的是,库中使用了pin更改中断来获得更准确的pin更改。他的库中也对这些中断进行了离散管理

我们可以用来设置您的实现。单个pin更改的ISR几乎可以立即捕获时间戳。减去延迟,在这种情况下,所需的分辨率远小于50毫秒

如果您确实需要更高的分辨率,可以使用输入捕获功能。如中所示。该功能将实时捕获转换时间并生成ISR以进行潜在处理


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

我也遇到了同样的问题,因此我建议:

  • 使用
    TimerOne()

  • 在计时器中使用标志,以便您可以控制 编程已经过去了

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

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


  • 这不是最好的解决方案,但它可以工作。你必须小心编程的时间,它应该高于读取数据所花费的时间。

    你能确定是哪个实际命令导致串行停止工作吗?它真的需要同时工作吗?我还建议不要弄乱timer0,因为它是Arduino C使用的ore库用于其他函数,如毫秒计数器。因此我怀疑TIMSK1不会影响它。抱歉,这是一个错误。上述函数不仅停止串行库,而且停止arduino中的所有内容。我对计时器了解不多。我不想使用任何像millis()这样的函数除了串行库函数外,这会干扰timer0。我需要timer0给我一个0.5毫秒的刻度,timer1计算超声波的延迟,timer2产生40Khz的振荡。是否有任何一个库可以简化所有三个定时器和中断的使用?