搜索
bottom↓
回复: 2

接红外遥控的外部中断会使ADC12的中断程序进不去,请问是...

[复制链接]

出0入0汤圆

发表于 2014-6-20 16:42:38 | 显示全部楼层 |阅读模式
本帖最后由 oldsport 于 2014-6-20 16:41 编辑

一次红外遥控大概60到70个沿变,两个沿变之间最少560us,上下沿都可触发外部中断。一下是程序


外部中断处理:
#pragma vector=PORT1_VECTOR
__interrupt void port1(void)
{
        u8 pulse_long,key_temp = 0;
        if(P1IFG & BIT5)
        {        
                P1IFG &= ~BIT5;
                pulse_long = pulse_measurement(BIT5);
                if(pulse_long != 0xff && pulse_long > 0)
                        key_temp = red_key_scan(pulse_long);
                if(0 != key_temp)
                        red_key_num = key_temp;
        }
}

脉冲测量:pulse_long = pulse_measurement(BIT5);
u8 pulse_measurement(u8 pin_num)  //BTI0 或者 BIT1 或者 BIT2 等等
{
        static u16 time_old = 0,time_now = 0;
        static u8 overflow_a_now = 0,pulse_ok = 0;
        u16 pulse_temp;
        u8 res_temp;
        
        pulse_temp = TAR;
        overflow_a_now = overflow_a;
        
        if(P1IES & pin_num)                                //下降沿
        {
                if(1 == pulse_ok)
                {
                        time_now = pulse_temp;
                        pulse_temp = overflow_a_now*65536 - time_old + time_now;
                        P1IES ^= pin_num;
                        if(pulse_temp < 255)
                                res_temp = pulse_temp;
                        else
                                res_temp = 0;
                        pulse_ok = 0;
                }
                return (res_temp);               
        }
        else                                                       //上升沿
        {        
                P1IES ^= pin_num;
                time_old = pulse_temp;
                pulse_ok = 1;
                overflow_a = 0;
                return 0xff;
        }
        
}

红外解码:key_temp = red_key_scan(pulse_long);
u8 red_key_scan(u8 pulse_long)
{
        static u8 red_state = 0;
        static u16 red_control;
        static u8 red_full = 0;
        u8 pulse_num;

        if(pulse_long < 22 )
                pulse_num = 0;
        if(pulse_long >= 22 )
                pulse_num = 1;
        if(pulse_long >= 85 )
                pulse_num = 2;

        switch(red_state)
        {
        case 0:
                        if(2 == pulse_num)
                        {
                                red_state++;
                                red_control = 0;
                        }
                        break;
        case 1:
                        if(0 == pulse_num || 1 == pulse_num)
                        {
                                red_full++;
                                if(16 == red_full)
                                {
                                        red_full = 0;
                                        red_state++;
                                }
                        }
                        else
                        {
                                red_state = 0;
                                return 0;
                        }
                        break;
        case 2:
                        if(0 == pulse_num || 1 == pulse_num)
                        {
                                if(0 == pulse_num)
                                        red_control = red_control>>1;
                                if(1 == pulse_num)
                                {
                                        red_control = red_control>>1;
                                        red_control |= 0x8000;
                                }
                                red_full++;
                                if(16 == red_full)
                                {
                                        red_full = 0;
                                        red_state = 0;
                                        pulse_num = red_control;
                                        return pulse_num;
                                }
                        }
                        else
                        {
                                red_state = 0;
                                return 0;
                        }                                
                        break;
        
        default:break;
        }
        return 0;
}


ADC打开:次任务20ms执行一次
void adc_sequence_start(u8 start_num)                //A0  或者 A5 等等
{
        if(start_num == A0)        start_num = 0;
        else if(start_num == A1)        start_num = 1;
        else if(start_num == A2)        start_num = 2;
        else if(start_num == A3)        start_num = 3;
        else if(start_num == A4)        start_num = 4;
        else if(start_num == A5)        start_num = 5;
        else if(start_num == A6)        start_num = 6;
        else if(start_num == A7)        start_num = 7;
        
        ADC12CTL1 |= (start_num * 0x1000) | CONSEQ_1;        
        ADC12CTL0 |= MSC | ADC12ON;                        //打开转换器
        ADC12CTL0 &= ~ENC;
        ADC12CTL0 &= ~ADC12SC;
        asm("nop");
        ADC12CTL0 |= ENC;                                   // 使能转换
        ADC12CTL0 |= ADC12SC;                        // 开始转换
}




ADC中断服务:  在中断服务中调用
void adc_int_num_0()
{
        
        data0[index0++] = ADC12MEM0;
        _EINT();       //打开中断是因为显示的执行太久,会影响红外解码,并且这两行只是为了找问题(无法显示才找到问题),删除了问题依旧
        disp_num(10,1,data0[index0 - 1]);
        if(index0 == 20)
                        index0 = 0;
}
问题,问题,问题,问题,问题,问题,问题,问题,问题,问题,问题,问题,问题,问题,问题,问题是:
           在某个时间点上,按下红外遥控,会无法进入ADC中断,大概两秒多一点又恢复正常了。整个系统除了ADC中断无法进去之外一切正常。
请问是为什么呢,我调试两天了,找不到原因啊~~~~~~~~•



出0入0汤圆

 楼主| 发表于 2014-6-20 18:36:38 | 显示全部楼层
    吃饭回来了,怎么没人呢,囧。

    前段时间用了下瑞萨的代码生成工具,好爽,决定写个类似库函数的模版,这样就不需要面对一大堆寄存器了,只要启动相应的初始化函数,填写需求配置就可以使用相应模块了。当然,这样就造成了代码的庞大(但是60k的Flash用来干什么呢·····),只能使用与一般情况下。

    只是无聊时写点好玩的,有这方面兴趣的我可以共享工程文件,大家一起完善啊。

出0入0汤圆

发表于 2014-8-13 10:13:59 | 显示全部楼层
HAO ZAN  YI GE
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 21:42

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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