我正在使用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);
}
答案 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)
我遇到了同样的问题,所以我建议:
使用TimerOne()
库。
在计时器中使用标志,这样您就可以控制何时 已经过去了。
在循环函数中,您应该只使用Serial.available()
,
所以时间尽可能接近你想要的时间。
不要在循环函数中写太多代码并控制 传感器通过开关或功能读取。
它不是最好的解决方案,但它确实有效。您必须小心编程的时间,它应该高于数据读取所花费的时间。