4471|10

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

ARM9外中断问题 [复制链接]

U8 key;

U8 Key_Scan( void )
{
        Delay( 80 ) ;

        if(      (rGPGDAT&(1<< 0)) == 0 )       
                return 1 ;
        else if( (rGPGDAT&(1<< 3)) == 0 )
                return 2;
        else if( (rGPGDAT&(1<< 5)) == 0 )
                return 3 ;
        else if( (rGPGDAT&(1<< 6)) == 0 )
                return 4 ;
        else if( (rGPGDAT&(1<< 7)) == 0 )
                return 5 ;
        else if( (rGPGDAT&(1<<11)) == 0 )
                return 6 ;
       
}

static void __irq Key_ISR(void)
{
       
        U32 r;

        EnterCritical(&r);
        if(rINTPND==BIT_EINT8_23) {
                ClearPending(BIT_EINT8_23);
                if(rEINTPEND&(1<<8)) {
                //Uart_Printf("eint11\n");
                        rEINTPEND |= 1<< 8;
                }
                if(rEINTPEND&(1<<11)) {
                //Uart_Printf("eint11\n");
                        rEINTPEND |= 1<< 11;
                }
                if(rEINTPEND&(1<<13)) {
                //Uart_Printf("eint11\n");
                        rEINTPEND |= 1<< 13;
                }
                if(rEINTPEND&(1<<14)) {
                //Uart_Printf("eint11\n");
                        rEINTPEND |= 1<< 14;
                }
                if(rEINTPEND&(1<<15)) {
                //Uart_Printf("eint11\n");
                        rEINTPEND |= 1<< 15;
                }
                if(rEINTPEND&(1<<19)) {
                //        Uart_Printf("eint19\n");               
                        rEINTPEND |= 1<< 19;
                }
        }

        key=Key_Scan();
        ExitCritical(&r);
}

void KeyScan_Test(void)
{
        Uart_Printf("\nKey Scan Test, press ESC key to exit !\n");       

       
        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)) ;                //GPG11,3 set EINT
       
        rEXTINT1 &= ~(7|(7<<0));       
        rEXTINT1 |= (2|(0<<0));        //set eint8 falling edge int
       
        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 |= (2<<24);        //set eint14 falling edge int
       
        rEXTINT1 &= ~(7<<28);
        rEXTINT1 |= (2<<28);        //set eint15 falling edge int
               
        rEXTINT2 &= ~(0xf<<12);
        rEXTINT2 |= (2<<12);        //set eint19 falling edge int
       

        rEINTPEND |= (1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19);                //clear eint 11,19
        rEINTMASK &= ~((1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19));        //enable eint11,19
        ClearPending(BIT_EINT8_23);
        pISR_EINT8_23 = (U32)Key_ISR;
        EnableIrq(BIT_EINT0|BIT_EINT2|BIT_EINT8_23);       

               
}


为什么在主函数测KEY的值是255
此帖出自ARM技术论坛

最新回复

一般来说,KEY_SCAN一类的处理,在TIMER中断里面弄一个状态机,要比使用外部中断做更好.  详情 回复 发表于 2009-7-10 07:57
点赞 关注
 

回复
举报

73

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
U8 Key时要赋初值,比如0;

Scan里面那么多if else,最后却少个else处理。就好比switch case的default。

明显的是超出这些条件的情况出现了,没经过处理。
此帖出自ARM技术论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
u8 key=6;

if(      (rGPGDAT&(1 < < 0)) == 0 )
return 1 ;
else if( (rGPGDAT&(1 < < 3)) == 0 )
return 2;
else if( (rGPGDAT&(1 < < 5)) == 0 )
return 3 ;
else if( (rGPGDAT&(1 < < 6)) == 0 )
return 4 ;
else if( (rGPGDAT&(1 < < 7)) == 0 )
return 5 ;
else if( (rGPGDAT&(1 < <11)) == 0 )
return 6 ;
else   return oxff;

  这样也不行,我单步调试按一次按键,进两次外中断,不知道为什么?
此帖出自ARM技术论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

4
 
看看是不是配成上升、下降沿都触发中断了; 另外所有的执行路径是否都请了中断标记。 FYI。
此帖出自ARM技术论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

5
 
学习一下
此帖出自ARM技术论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

6
 
配成上升、下降沿都触发中断也弄了,还是不行

晕呀~~~
此帖出自ARM技术论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(中级)

7
 
抖动?
此帖出自ARM技术论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

8
 
Delay( 80 ) ; 这就是去抖,所以不是这的问题。
此帖出自ARM技术论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

9
 
你的抖动处理不好.....

较简单的抖动处理,在检测到KEY时开始延时,延时结束再检测KEY,如果两次状态相同,则KEY被确认
否则不确认
此帖出自ARM技术论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

10
 
还有,要尽量避免在ISR里面做延时. 用状态机来处理抖动,对处理能力的占用比较有效率
此帖出自ARM技术论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

11
 
一般来说,KEY_SCAN一类的处理,在TIMER中断里面弄一个状态机,要比使用外部中断做更好.
此帖出自ARM技术论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表