打印

外部中断去抖动

[复制链接]
7859|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
各位大侠帮忙看看我的代码哪里有问题,我是用外部中断0计数,光电开关连接到外部中断0.

EA=1;
EX0=1;
IT0=1;

……
void yanshi(uint c)
{
        for(a=c;a>0;a--);
                for(b=110;b>0;b--);
                }

void zhongduan() interrupt 0        
{
       
        yanshi(20); //延时,这个延时不知道怎么的消不了抖动
        num_jishu++;

        num_cha=num-num_jishu;   //计数达到设定值,则关马达
        if(num_cha==0)
                {
                        key_start=1;    //关闭马达开关
                       
                }       
                               
}

这个程序不知道怎么的,消不了抖动,大多数时候能计数准确,然后关马达。但是偶尔会出错,比如设定10个就关闭,但是只数了9个就关了。外部中断那里我也延时了,不知道怎么延时的,这里中断不管设定多少,好像就跟没设定延时样的,各位大侠,帮忙看看问题在哪里啊?小弟不甚感激。

相关帖子

沙发
Iit| | 2013-4-21 08:14 | 只看该作者
中断也能软件去抖??  有事件触发的时候,就执行中断程序了.  去抖应该在中断进入前就能判断,而不是进入中断程序再处理吧??

使用特权

评论回复
板凳
NE5532| | 2013-4-21 08:24 | 只看该作者
中断可以去抖动,但是楼主是在掩耳盗铃!
1.搞清楚有没有抖动,抖动时间是多少?如果时间在uS级别,你延时mS时间,只能减缓系统响应。
2.去抖流程应该是这样的

int_ser:
{
   delay();
   if(signal != true)
      return;
   process.....;   //signal is true
}

楼主看看自己少了什么呢。

使用特权

评论回复
地板
华丽生活| | 2013-4-21 08:59 | 只看该作者
楼上说的有道理的,楼主去试试看

使用特权

评论回复
5
南宫云明| | 2013-4-21 09:22 | 只看该作者
窃以为。。。。还是不要在中断里面加延时得好。。。想想其他办法吧。。

使用特权

评论回复
6
NE5532| | 2013-4-21 09:24 | 只看该作者
南宫云明 发表于 2013-4-21 09:22
窃以为。。。。还是不要在中断里面加延时得好。。。想想其他办法吧。。

如果没有其他事情需要处理,这样加延时是最简单的,中断服务程序尽量短只是一个原则,不是金科玉律,金科玉律是“需求”。

使用特权

评论回复
7
miao5540112|  楼主 | 2013-4-21 13:10 | 只看该作者
NE5532 发表于 2013-4-21 08:24
中断可以去抖动,但是楼主是在掩耳盗铃!
1.搞清楚有没有抖动,抖动时间是多少?如果时间在uS级别,你延时m ...

谢谢版主,我在那里延时20ms,是因为我发现,实际数量应该是9,它多计数了,但是我加了延时后,就是想要中断延缓,如果延时过多,照道理,他应该不计数或者少计数。而不是加和没加没影响样的。我的理解不知道哪里有问题?手里资源也少,要不然用个示波器检查下光电开关输出端,应该可以看到问题的所在。

使用特权

评论回复
8
miao5540112|  楼主 | 2013-4-21 13:24 | 只看该作者

上面是我采用的光眼的图纸。
sbit    kaishi=P2.0;            //接马达
sbit    key_button=P3.2;    //接光电开关Vo端
sbit    key_start=P3.7;
key_start=1;     
if(key_start==0)   
{
    EA=1;
    EX0=1;
    IT0=1;      //开中断0
    kaishi=0;   //开马达开关
    while(!key_start)
}
num=10;
……
void yanshi(uint c)
{
        for(a=c;a>0;a--);
                for(b=110;b>0;b--);
                }

void zhongduan() interrupt 0         
{
        
        yanshi(20); //延时,这个延时不知道怎么的消不了抖动
        num_jishu++;

        num_cha=num-num_jishu;   //计数达到设定值,则关马达
        if(num_cha==0)
                {
                        kaishi=1;    //关闭马达开关
                        
                }        
                                
}

使用特权

评论回复
9
NE5532| | 2013-4-21 13:55 | 只看该作者
楼主啊,延时去抖是指检测到疑似信号以后,延时一小段时间,再确认信号是否存在。你的“再确认信号存在”做了么?你不确认光延时,和不去抖有区别么?这个不需要示波器,只需要脑袋清醒。

使用特权

评论回复
10
ouyang6800| | 2013-4-21 14:03 | 只看该作者
楼上正解!!

使用特权

评论回复
11
13538074093| | 2013-4-21 17:14 | 只看该作者
hhhhhh围观啊

使用特权

评论回复
12
smxzyfjb| | 2013-4-21 17:59 | 只看该作者
建议对输入的信号进行处理,用示波器观察输入波形,利用整形电路和微分电路处理,中断设置成边沿触发即可,没有听说过在中断中去抖动的。

使用特权

评论回复
13
jt4117| | 2013-4-21 22:46 | 只看该作者
楼主首先要清楚那个输入信号 的 电平 持续时间大概是多少。  然后根据这个做延时处理。 进行软件去抖动。 但如果是要做准确的计数器,我觉得最好还是在输入端做硬件处理好些。

使用特权

评论回复
14
NE5532| | 2013-4-23 19:14 | 只看该作者
昨天没看到你的图,现在看到了,补充给楼主,这个器件里面已经加了施密特触发器了,程序不需要去抖动了。

使用特权

评论回复
15
miao5540112|  楼主 | 2013-4-23 22:10 | 只看该作者
这个程序在计数的时候,偶尔会漏掉1个数不到,确定硬件应该没问题,问题在程序上,我如果自己解决我也会公布出方法,谢谢版主了,好热心哦,谢谢各位。

使用特权

评论回复
16
NE5532| | 2013-4-24 11:16 | 只看该作者
miao5540112 发表于 2013-4-23 22:10
这个程序在计数的时候,偶尔会漏掉1个数不到,确定硬件应该没问题,问题在程序上,我如果自己解决我也会公布 ...

检查你的程序里,有没有其它占用处理时间的地方,比如其它长中断。

使用特权

评论回复
17
liusensen| | 2013-4-24 11:46 | 只看该作者
讨论的有些意思  哈哈

使用特权

评论回复
18
zd420325| | 2013-4-25 17:58 | 只看该作者
可以的话,加下硬件去抖

使用特权

评论回复
19
WWW.DZ3W.COM| | 2013-4-25 18:13 | 只看该作者
路过

使用特权

评论回复
20
烈炎明龙| | 2014-4-25 18:50 | 只看该作者
我也做过中断软件消抖,在中断服务程序里进行flag赋值,在主程序里对flag进行判断的时候进行延时消抖。  不知道 这样可以不可以,反正我是做出来效果了。

使用特权

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

本版积分规则

1

主题

4

帖子

0

粉丝