/* *调试时一个疑惑,为何下述TMR0应用,示波器测量,发现偏差将近1半: *8分频,定0.5ms,测高/低脉宽在300us *8分频,定0.1ms,测高/低脉宽在60us *32分频,定2ms,测高/低脉宽在1.16ms * * */ #ifdef USING_TMR0 ISR (TIMER0_OVF_vect) { TCNT0=TMR0_LOAD; if(bit_is_set(PORTB, PB3)) PORTB &=~_BV(PB3); else PORTB |=_BV(PB3); } #endif
思路解释: Winavr + Avrstudio, 4MHz,8分频,TMR0_LOAD随定时时长而变.每次溢出,取反PB3(有更快捷的操作方式?),所谓高/低脉宽时长,即在PB3口测得. 调试察看过上述代码的汇编程序,理论推算下来,对PB3口操作前后,耗时均在16us左右.
初始化TMR0代码如下 #ifdef USING_TMR0 TCNT0=TMR0_LOAD; TIMSK = _BV(TOIE1); TCCR0= _BV(CS01); #endif
不解了... 望高人指点一二! |