jianhong_wu 发表于 2014-11-14 21:38:12

如何在一个定时中断里衍生出多个软件定时器?已解答。

本帖最后由 jianhong_wu 于 2014-11-14 23:17 编辑

苏畅 -江苏:
嗯……红外信号检测和超声波信号检测……定时器中断定时用了好几个?

鸿哥-深圳:
不要用那么多定时器中断。用一个就好了。一个定时器中断就可以当N多定时器来用。

华菲-山东:
那是怎么做的,求解,鸿哥。

苏畅 -江苏:
……发射超声波要定时,另外还要定时计算反射信号到达时间……查询中断也要定时……查询之前消除干扰改得定时1.5ms

Inc-东莞:
鸿哥,上课时间到了。


鸿哥-深圳:
比如:
void T0_time() interrupt 1
{
TF0=0;//清除中断标志
TR0=0; //关中断
++uiTimeCnt1; //定时1
++uiTimeCnt2; //定时2
++uiTimeCnt3; //定时3
++uiTimeCntN; //定时N

TH0=0xf8;   //重装初始值(65535-2000)=63535=0xf82f
TL0=0x2f;
TR0=1;//开中断
}
在一个系统里,最好只用一个定时器中断,如果你开的定时器中断越多越是兵家大忌,就像在主函数循环不能轻易用delay延时一样。如果非要用很多定时器中断,那么宁愿多加几个单片机进行多机通讯,这样相当于几个核CPU。所以说,虽然stm32很多定时器中断,但是你不要都打开呀,用一个就好了。

苏畅 -江苏:
你意思用一个定时器初值一样的,溢出次数不同……可以定时1、2、3……N

鸿哥-深圳:
对。

Inc-东莞:
软件定时器。
苏畅 -江苏:
定时器启动时间相同,延时不一样,关中断的时间也不一样……怎么办?而且接收到检测信号时怎么重新启动定时器呢……   

鸿哥-深圳:
再添加一个开关变量来控制定时器的是否计时,
void T0_time() interrupt 1
{
TF0=0;//清除中断标志
TR0=0; //关中断
if(ucStart1==1)//开关变量
{
   ++uiTimeCnt1; //定时1
}
if(ucStart2==1)//开关变量
{
   ++uiTimeCnt2; //定时2
}


TH0=0xf8;   //重装初始值(65535-2000)=63535=0xf82f
TL0=0x2f;
TR0=1;//开中断
}


苏畅 -江苏:
不好意思!辛苦你!原来每个溢出次数可以通过开关分开管理……我下次专门去把帖上的讲解存下来,以后多理解你讲的内涵 。太精彩了!   





页: [1]
查看完整版本: 如何在一个定时中断里衍生出多个软件定时器?已解答。