10ms,100ms,1秒周期脉冲已经实现了,这种情况下如何实现扫描周期的计算,请高手帮忙
MCU为Mega64,外部时钟为14.7456M,T0用来实现一个1.25ms的中断.//变量
bit blnClk1s,blnClk100ms,blnClk10ms;//1秒,100ms,10ms位
unsigned char ucMsCounter,uc10MsCounter,uc100MsCounter;//ms,10ms,100ms计数器
//T0,1.25ms中断
interrupt void timer0_comp_isr(void)
{
if(ucMsCounter < 7)
ucMsCounter++;//ms计数
else
{
ucMsCounter = 0;
if(uc10MsCounter < 9)
uc10MsCounter++;//10ms计数
else
{
uc10MsCounter = 0;
if(uc100MsCounter < 9)
uc100MsCounter++;//100ms计数
else
uc100MsCounter = 0;
}
}
blnClk1s = uc100MsCounter > 4;
blnClk100ms = uc10MsCounter > 4;
blnClk10ms= ucMsCounter > 3;
}
原打算在程序执行前,记录ucMsCounter,uc10MsCounter,uc100MsCounter,在程序结束时再用新的ucMsCounter,uc10MsCounter,uc100MsCounter来计算程序执行的时间.但是又怕新的中断发生在记录和计算过程中,造成结果不正确.请高手帮忙. 在TIMER更新程序里连续读循环,当两次读相等退出读循环,当两次读不相等,说明发生了中断。
1.25mS中断太频繁了,MCU还能干什么? 不要在中断里面放延时和耗时的计算,我50uS中断一次都可以,ATmega88,8M晶振,还处理了很多扫描任务。我用这个50uS做无线接收信号扫描。 1.25ms对MCU来说,还是很长的了,这个中断程序还包括了对数字输入的去抖计数,整个执行将耗时约20us,可能会影响到通讯,可能要考虑到中断嵌套或降低通讯波特率.
页:
[1]