打印

如何用定时器做多事件超时计时???

[复制链接]
2113|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hzocce|  楼主 | 2015-12-14 14:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hzocce 于 2015-12-16 08:45 编辑

我的定时器中断服务函数为:
// unsigned char Second=0;这个是全局变量在程序中已经定义好!
void Time0() interrupt 1
{
           Fifty_ms++;
        if(Fifty_ms==20)
        {
                Fifty_ms=0;
                Second++;
                if(        ((Second%2)==1)        )Two_Sec_Flag=1;

        };           //自加一次为50ms
}


先定义一个时间戳数组,用于处理6个超时登记:unsigned char Device_Time_Buffer[6];

//进入for循环体后:
Device_Time_Buffer=Second;//将当时时间的秒的值符放在数组中

//然后工作过一段时间后,将后面的Second跟数组中的初值比对
if(    Second>Device_Time_Buffer ? (        (Second-Device_Time_Buffer)>10 )  :  ( (256-Device_Time_Buffer+Second)>10) ) //是否超过预定的10秒钟时间?

//这样比对,是否可以?

相关帖子

沙发
mcu5i51| | 2015-12-14 16:01 | 只看该作者
Timer isr:
for...{
if(DTB[i]) DTB[i]--;
}
task:
if(DTB[n] == 0){DTB[n] = xx;...}
多数时候自加和自减速度相同,不过有些芯片不同
多数时候判断0比比较数值要简单
当然说的是MCU,

使用特权

评论回复
板凳
hzocce|  楼主 | 2015-12-15 08:36 | 只看该作者
不要沉了!

使用特权

评论回复
地板
airwill| | 2015-12-15 15:10 | 只看该作者
感觉有 BUG.  不知道 Second 是如何定义的
假设是 unsigned 类型, 倒是可以;
假如是 signed 类型, 那就有问题.

使用特权

评论回复
5
coody| | 2015-12-15 15:32 | 只看该作者
只要有一个基准定时,比如1ms,那么久可以做N个软件定时器,分辨率是1ms。

使用特权

评论回复
6
hzocce|  楼主 | 2015-12-16 08:47 | 只看该作者
airwill 发表于 2015-12-15 15:10
感觉有 BUG.  不知道 Second 是如何定义的
假设是 unsigned 类型, 倒是可以;
假如是 signed 类型, 那就有问 ...

高手就是高手,的确有BUG,这样比对就是错的!不正确的理论。。。。。。
类型就是 unsigned char 类型的。

不知道群里还有谁做过类似的案例???

使用特权

评论回复
7
hzocce|  楼主 | 2015-12-16 08:48 | 只看该作者
coody 发表于 2015-12-15 15:32
只要有一个基准定时,比如1ms,那么久可以做N个软件定时器,分辨率是1ms。

请问Coody是否可以讲的明一点?

使用特权

评论回复
8
hzocce|  楼主 | 2015-12-16 16:59 | 只看该作者
airwill 发表于 2015-12-15 15:10
感觉有 BUG.  不知道 Second 是如何定义的
假设是 unsigned 类型, 倒是可以;
假如是 signed 类型, 那就有问 ...

发现了问题,只要把这个数组申明在 unsigned char xata 就可以问题了!
或者说更改一个数组名字就解决了!

不知为什么那么奇怪,还请高手分析!

使用特权

评论回复
9
airwill| | 2015-12-16 21:31 | 只看该作者
这种情况, 通常我会看编译后的汇编代码再分析

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

127

主题

561

帖子

4

粉丝