junmadianzi 发表于 2009-8-2 09:46:26

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来计算程序执行的时间.但是又怕新的中断发生在记录和计算过程中,造成结果不正确.请高手帮忙.

bkkman 发表于 2009-8-2 11:17:52

在TIMER更新程序里连续读循环,当两次读相等退出读循环,当两次读不相等,说明发生了中断。

1.25mS中断太频繁了,MCU还能干什么?

117433525 发表于 2009-8-2 11:41:02

不要在中断里面放延时和耗时的计算,我50uS中断一次都可以,ATmega88,8M晶振,还处理了很多扫描任务。我用这个50uS做无线接收信号扫描。

junmadianzi 发表于 2009-8-2 13:46:37

1.25ms对MCU来说,还是很长的了,这个中断程序还包括了对数字输入的去抖计数,整个执行将耗时约20us,可能会影响到通讯,可能要考虑到中断嵌套或降低通讯波特率.
页: [1]
查看完整版本: 10ms,100ms,1秒周期脉冲已经实现了,这种情况下如何实现扫描周期的计算,请高手帮忙