我正在使用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 回答
我会避免直接使用Timer0 . 正如您所看到的那样,它将与Arduino核心库混乱 .
初看一眼,我建议使用经过验证的库,例如SimpleTimer() . 它将设置和管理多个事件,其中"run"基本上从定时器0拉出millis() . 但是读得更远 .
我记得Timer0由核心库设置为在1K时溢出创建中断 . 其中micros()函数在毫秒中断之间读取timer0内的值 .
而对于使用Timer1,您可以尝试TimerOne()库 . 那里还有TimerTwo,3等等 .
您可能想要阅读Ken Shirriff的Arduino-IRremote库 . 因为它以离散的方式完成了你想要的大部分工作 . 如40Khz PWM . 而不是依赖于其他图书馆 . 他的原始图书馆使用的地方
读取和采样来自IR解调器的接收输入,以解码帧 .
我还要指出库的microtherion's fork,因为它使用引脚更改中断来获得更准确的引脚更改 . 他的图书馆,再次离散地管理这些中断 .
可以使用PinChangeInt Library来设置您的实现 . 单个引脚改变的地方'ISR几乎可以立即捕获时间戳 . 在这种情况下,减去等待时间远小于50ms所需的分辨率 .
如果您真的需要更多分辨率,可以使用输入捕获功能 . 如InputCapture.ino所示 . 这将实时捕获转换时间并生成用于潜在处理的ISR .
从这些示例中,您应该能够实现超声波传感器 .
我有同样的问题,所以我建议:
使用
TimerOne()
库 .在计时器中使用标志,这样您就可以控制编程时间过去的时间 .
在循环函数中,您应该只使用
Serial.available()
,因此时间将尽可能接近您想要的时间 .不要在循环功能中写入太多代码,并用开关或功能控制传感器读数 .
它不是最好的解决方案,但它确实有效 . 您必须小心编程的时间,它应该高于数据读取所花费的时间 .