我试图使用ATmega 328/p(arduino uno)上的一个硬件定时器,在接收到输入脉冲后几微秒产生一个短脉冲。
目前我的代码是这样的:
uint16脉冲延迟=12000//半微秒uint16脉冲长度=20;void setup(){pinMode(8,输入);pinMode(9,输出);TCCR1A=0;TCCR1B=_BV(ICNC1)//输入捕获噪声取消|u BV(ICES1)//正边缘| u BV(CS11)///8预分频器TIMSK1=_BV(ICIE1)//启用输入捕获中断}void循环(){}ISR(TIMER1_CAPT)ISR{TCCR1A=_BV(COM1A0)| COM1A1)//设置匹配;//启用匹配中断OCR1A=pulse\u delay;//脉冲开始时间TCNT1=TCNT1-ICR1;//TCNT1现在包含自输入脉冲开始的时间,即使//中断没有立即运行}ISR(TIMER1\u COMPA vect){TIMSK1&=~\u BV(OCIE1A);//禁用匹配中断TCCR1A=\u BV(COM1A1);//清除匹配OC1A上的OC1A=pulse\u delay+pulse长度;}
这段代码理论上应该完成任务,但它根本不产生任何输出-对我的示波器,它看起来像输出引脚只是保持低。
但是,如果我替换最后一行(cr1a = pulse_delay + pulse_length;
)的比较匹配中断与以下两行,它输出一个脉冲刚刚好。这个问题是,它使用了更多的CPU时间,它只能从中断开始时计算时间,所以如果中断执行晚,脉冲将更长。
delayMicroseconds (pulse_length);TCCR1C = _BV (FOC1A);//手动触发匹配事件
第一个版本所做的不同之处在于通过定时器上设置的“报警”触发匹配事件,而不是等待手动触发匹配。
为什么第一个版本不能工作,我如何使它工作?