主题 : 请教,MINI2440 按键采用中断方式,一次按键产生多次中断,求解 复制链接 | 浏览器收藏 | 打印
级别: 侠客
UID: 8129
精华: 0
发帖: 78
金钱: 490 两
威望: 213 点
综合积分: 156 分
注册时间: 2009-08-11
最后登录: 2017-09-13
楼主  发表于: 2009-08-12 09:48

 请教,MINI2440 按键采用中断方式,一次按键产生多次中断,求解

管理提醒: 本帖被 qq2440 从 QQ2440技术交流专区 移动到本区(2009-08-12)
各位大侠,我目前在调试按键中断上出现一个奇异的现象,,大家帮我看看是怎么回事。。谢谢了

// 中断初始化函数
void KeyScan_Test(void)
{
        
    rGPGCON = rGPGCON & (~((3<<22)|(3<<6)|(3<<0)|(3<<10)|(3<<12)|(3<<14))) |
                         ((2<<22)|(2<<6)|(2<<0)|(2<<10)|(2<<12)|(2<<14)) ;        //設置相應的I/O口為中斷口
    rGPGUP = rGPGUP&((0<<0)|(0<<3)|(0<<5)|(0<<6)|(0<<7));// ENABLE PULL UP
    
    rEXTINT1 &= ~(7|(7<<0));    //~(7|(7<<0));
    rEXTINT1 |= 2;    //set eint8 rising edge int
    rEXTINT1 |=(1<<3); //ENABLE FILTER
    
    rEXTINT1 &= ~(7<<12);
    rEXTINT1 |= (2<<12);    //set eint11 falling edge int
    
    rEXTINT1 &= ~(7<<20);
    rEXTINT1 |= (2<<20);    //set eint13 falling edge int
    
    rEXTINT1 &= ~(7<<24);
    rEXTINT1 |= (0<<24);    //
    
    rEXTINT1 &= ~(7<<28);
    rEXTINT1 |= (0<<28);    //
        
    rEXTINT2 &= ~(0xf<<12);
    rEXTINT2 |= (0<<12);    //
    
  
    rEINTPEND |= (1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19);        //clear eint
    rEINTMASK &= ~((1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19));        //enable eint
    
    ClearPending(BIT_EINT0|BIT_EINT2|BIT_EINT8_23); //clear pending
    EnableIrq(BIT_EINT0|BIT_EINT2|BIT_EINT8_23);    //INTMSK 執行對應為為0的中斷服務
    pISR_EINT8_23 = (U32)Key_ISR; //
    Uart_Printf("Enter keyscan program!!!\n");
}


//中断服务函数

static void __irq Key_ISR(void)
{
    U32 r;
    EnterCritical(&r);
    Uart_Printf("Enter the ISR Service!!!\n");
    Uart_Printf("Time = %d !!!\n",Time); //这里TIme是一个全局变量,用来记录进入中断函数的次数
    Time +=1;
        
    if(rINTPND==BIT_EINT8_23)
     {
         ClearPending(BIT_EINT8_23);
        
        if(rEINTPEND&(1<<8))
         {
            rEINTPEND = rEINTPEND & ( ~(1<< 8))|(1<< 8);
            Num = Num+1;
            if(Num>=MAX_PAT+1) Num = 1;
            Patten_change(Num);
         }
        
        if(rEINTPEND&(1<<11))
        {
        rEINTPEND |= 1<< 11;
        Num = Num-1;
        if(Num==0) Num = MAX_PAT;
        Patten_change(Num);
        }
        
        if(rEINTPEND&(1<<13))
        {
            rEINTPEND |= 1<< 13;
            Num = Num+1;
            if(Num>=MAX_PAT+1) Num = 1;
            Patten_change(Num);
        }
    }

    ExitCritical(&r);
}

当我按下按键的时候,会进入中断处理程序。但是我只按键一次,有些时候可能会执行3次中断处理函数,有些时候又只执行一次。。大家帮忙看看,到底是怎么回事?
是程序问题还是硬件问题,现在我已经在按键旁边加上了电容了,仍然是一样的。

级别: 侠客
UID: 8129
精华: 0
发帖: 78
金钱: 490 两
威望: 213 点
综合积分: 156 分
注册时间: 2009-08-11
最后登录: 2017-09-13
1楼  发表于: 2009-08-12 09:48
等待老大们帮帮小弟。。。谢谢           
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
2楼  发表于: 2009-08-12 11:59
1. 这和GPIO中断的电平触发方式有关,你可以拿示波器看看精确的按键时电平变化;
2. 实际应用中这不会造成问题,大部分GUI系统,比如Qtopia, 都有对按键的去抖动处理。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 侠客
UID: 8129
精华: 0
发帖: 78
金钱: 490 两
威望: 213 点
综合积分: 156 分
注册时间: 2009-08-11
最后登录: 2017-09-13
3楼  发表于: 2009-08-12 16:26
GPIO口的中断触发电平 我设置为下降沿触发, 而且我用示波器量测过波形,波形中杂波在我加上电容之后是很小的,最高的电平也就才1.1V左右。
目前我没有跑系统的,就是裸机在测试。 结果就发现了这个问题,
现在还发现一个问题就是, 在第一次进入 中断服务程序的时候
执行完 clearpengding()这个函数之后, INTPND = 0X0020 ,SRCPND = 0X2420,
然后在第二次进入之后, ClearPending() 之后 INTPND = 0X0000,SRCPND = 0X2400,
我想问一下,为什么在第一次进入 clearpending之后, INTPND 和SRCPND的值不会被清掉呢?

__inline void ClearPending(int bit)
{
  
    register i;
    rSRCPND = rSRCPND & (~bit)|bit;//SRCPND 源未決寄存器,通過對相應的中斷源寫1來清除SRCPND寄存器中的相應中斷請求
    rINTPND = rINTPND & (~bit)|bit;//INTPND 中斷未決寄存器,通過對相應位寫1來清除INTPND寄存器中的相應中斷請求
    i = rINTPND;
}

还请版主帮忙看看,谢谢
级别: 侠客
UID: 5949
精华: 0
发帖: 51
金钱: 470 两
威望: 353 点
综合积分: 102 分
注册时间: 2009-05-14
最后登录: 2010-12-07
4楼  发表于: 2009-08-13 16:45
貌似友善本身的按键测试程序也会有这样的现象,但是目前只发现局限于key2,其他的5个key没问题。
级别: 侠客
UID: 8129
精华: 0
发帖: 78
金钱: 490 两
威望: 213 点
综合积分: 156 分
注册时间: 2009-08-11
最后登录: 2017-09-13
5楼  发表于: 2009-08-14 16:06
我就是在友善之臂的程序上改动的,,我的是KEY1~3都有这个问题啊。。唉  真的不知道是怎么回事啊。。
      
求真知!去浮躁!
级别: 侠客
UID: 6514
精华: 0
发帖: 86
金钱: 770 两
威望: 642 点
综合积分: 172 分
注册时间: 2009-06-04
最后登录: 2019-08-08
6楼  发表于: 2009-08-20 13:35
去抖看看!
级别: 新手上路
UID: 8387
精华: 0
发帖: 2
金钱: 20 两
威望: 10 点
综合积分: 4 分
注册时间: 2009-08-21
最后登录: 2009-08-21
7楼  发表于: 2009-08-21 14:52
加软件去抖动试试下!
级别: 骑士
UID: 4234
精华: 0
发帖: 152
金钱: 1420 两
威望: 1142 点
综合积分: 304 分
注册时间: 2009-03-05
最后登录: 2012-08-18
8楼  发表于: 2009-08-26 22:29
可以考虑定时器去抖动,就像在单片机程序中用延时去抖动一样
级别: 新手上路
UID: 2193
精华: 0
发帖: 15
金钱: 140 两
威望: 44 点
综合积分: 30 分
注册时间: 2008-11-01
最后登录: 2012-03-19
9楼  发表于: 2009-08-26 22:33
软件去抖动