数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 3345|回复: 16

[other] 单片机,如果我要两个中断函数,对应同一个中断源,要咋办

[复制链接]
发表于 2020-10-26 11:51:06 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
就是同一个时钟源,预分频,中断源,不同的就是一个定时3分钟,另外一个要定时半小时,这要怎么办
发表于 2020-10-26 12:50:21 | 显示全部楼层
3分钟那个中断里加一个变量,累加10次处理半小时那个,这样行不行?
回复 支持 反对

使用道具 举报

发表于 2020-10-26 13:37:17 | 显示全部楼层
设置好定时器初值,一般16位定时器可调设置成50毫秒中断一次,设置两个变量A和B,在中断函数里每中断一次,自加1,当A等于3600时,就是3分钟,清零,再执行3分钟定时任务,当B等于36000时,清零并执行30分钟的定时任务(程序)。
回复 支持 反对

使用道具 举报

发表于 2020-10-26 13:39:53 | 显示全部楼层
我会我会,嘿嘿嘿。

参考Systick。设定中断每100ms发生一次,在ISR中计数,计数每满10次(1秒)分别调用1min()和30min(),1min函数内部计数,每60次调用执行函数。30min函数内部和1min相同。

问题:执行函数会耽误计数。
解决:换RTOS用多任务,想怎么定时就怎么定时,互相不耽误。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-26 14:00:19 | 显示全部楼层
apple1999 发表于 2020-10-26 13:39
我会我会,嘿嘿嘿。

参考Systick。设定中断每100ms发生一次,在ISR中计数,计数每满10次(1秒)分别调用1m ...

我是想先定时三分钟,然后再定时半小时,这样怎么弄
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-26 14:01:27 | 显示全部楼层
温力口 发表于 2020-10-26 13:37
设置好定时器初值,一般16位定时器可调设置成50毫秒中断一次,设置两个变量A和B,在中断函数里每中断一次, ...

我是想先定时三分钟,然后触发一个中断服务,再定时半小时,再触发一个中断服务,用的是同一个,中断源,怎么办
回复 支持 反对

使用道具 举报

发表于 2020-10-26 18:44:58 | 显示全部楼层
定时1分钟++,加到3就是3分钟,加到30就是30分钟:titter:
回复 支持 反对

使用道具 举报

发表于 2020-10-27 00:14:06 | 显示全部楼层
在中断里判断时间
回复 支持 反对

使用道具 举报

发表于 2020-10-27 01:39:16 | 显示全部楼层
如楼上所言,定时器设个合理的基本时间片,在中断里对N个不同需要定时长的变量自加,可在主程序中对变量做判断处理,也可在中断中对变量做判断处理。
回复 支持 反对

使用道具 举报

发表于 2020-10-27 08:00:29 | 显示全部楼层
apple1999 发表于 2020-10-26 13:39
我会我会,嘿嘿嘿。

参考Systick。设定中断每100ms发生一次,在ISR中计数,计数每满10次(1秒)分别调用1m ...

    在中断处理函数中只负责对全局变量计数,在主循环中对变量进行判断和处理(包括变量复位),这样就不会影响到中断的准确性了。
回复 支持 反对

使用道具 举报

发表于 2020-10-27 08:07:51 | 显示全部楼层
啊蔡 发表于 2020-10-26 14:01
我是想先定时三分钟,然后触发一个中断服务,再定时半小时,再触发一个中断服务,用的是同一个,中断源, ...

假设全局变量为n,中断间隔为100ms,则在中断处理函数中只需要一句:
n++;
在主循环中写入以下代码:
if((n%30) == 0)
{
     //3分钟一次的处理代码
}
if(n == 300)
{
    n = 0;
    //30分钟一次的处理代码
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-27 09:05:18 | 显示全部楼层
hujj 发表于 2020-10-27 08:07
假设全局变量为n,中断间隔为100ms,则在中断处理函数中只需要一句:
n++;
在主循环中写入以下代码:

这样的话,第二个不是就没有定时到30分钟吗,我是想先三分钟定时完,再重新开始定时半小时,可不可以,三分钟定时完成后,n清零,再开始n++j计数,定时半小时?
回复 支持 反对

使用道具 举报

发表于 2020-10-27 10:30:37 | 显示全部楼层
啊蔡 发表于 2020-10-27 09:05
这样的话,第二个不是就没有定时到30分钟吗,我是想先三分钟定时完,再重新开始定时半小时,可不可以,三 ...

抱歉!数据单位弄错了,算成秒了。
更正如下:
再添加个计分的变量m,
if(n>599)
{
    n = 0;
    m++;
}
if((m%3) == 0)
{
    //每三分钟处理一次,计分变量不清零
}
if(m > 29)
{
    m = 0;
    //每三十分钟处理一次,计分变量复位
}
回复 支持 反对

使用道具 举报

发表于 2020-10-27 13:19:51 | 显示全部楼层
也许是我理解有误,我以为3分钟定时与30分钟定时是两个并行的事件,所以才按这个思路写的代码,如果楼主是先定时3分钟,之后再定时30分钟,然后又定时3分钟......如此循环下去的话(也就是串行)则可以设一个标志变量f,然后在主循环中写入下列代码:
f = 1800-1;     //1800*100(ms)/1000=180(秒)
while(1)
{
    if(n > f)
    {
        n = 0;                 //重新计数
        if(f = 1799)
        {
            //定时3分钟处理的代码

            f = 17999;        //30分钟差0.1秒
        }
        else
        {
            //定时30分钟的处理代码

            f = 1799;         //3分钟差0.1秒
        }
    }
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-27 14:09:54 | 显示全部楼层
hujj 发表于 2020-10-27 10:30
抱歉!数据单位弄错了,算成秒了。
更正如下:
再添加个计分的变量m,

这样写的话,如果是不是两个计时一起走啊,就是3分钟在计时的同时,半小时那个也在计时,还是三分钟计时完成后,半小时才开始计时?
回复 支持 反对

使用道具 举报

发表于 2020-10-27 15:56:53 | 显示全部楼层
啊蔡 发表于 2020-10-27 14:09
这样写的话,如果是不是两个计时一起走啊,就是3分钟在计时的同时,半小时那个也在计时,还是三分钟计时 ...

是两个计时同时进行,三分钟计时的同时,半小时也在计时,即同步计时,互不影响。
你需要的是后者吗?
回复 支持 反对

使用道具 举报

发表于 2020-10-27 16:00:50 | 显示全部楼层
楼主有点晕啊!先按上面建议自己试着写一个。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-22 20:49 , Processed in 0.249600 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表