用汇编指令,在中断里用指令来定时,这样很准确,不会汇编也没关系,会改就行,下面这个是用MEGA644做的VGA信号发生器的行扫描中断程序,时间要求很精确。这里要特别提一下AVR的中断进入时间,AVR大部分指令是1个时钟,还有2,3,4个时钟的,只有执行完当前指令,才进中断,所以在中断开头哪里,读取定时器值来做修正,保证任何情况下,都在定时器达到计数值后的同一个延迟开始运行中断
SIGNAL(TIMER1_COMPA_vect)
{
__asm__ \
( "lds r24,TCNT1L" "\n\t" \
"cpi r24,27" "\n\t" \
"brlo LATFIX1" "\n\t" \
"LATFIX1:" "\n\t" \
"cpi r24,28" "\n\t" \
"brlo LATFIX2" "\n\t" \
"LATFIX2:" "\n\t" \
"cpi r24,29" "\n\t" \
"brlo LATFIX3" "\n\t" \
"LATFIX3:" "\n\t" \
"cpi r24,30" "\n\t" \
"brlo LATFIX4" "\n\t" \
"LATFIX4:" \
);
PORTC= 1 ;
PORTC= 2 ;
PORTC= 3 ;
PORTC= 4 ;
PORTC= 5 ;
增加这些指令来调节时间,或改为一个循环
}
|