灰灰不会飞 发表于 2013-3-28 17:14:26

写1838红外收发程序返回不了主函数

写1838红外解码程序时,遇到问题。经调试,有以下结论:
1.用外部中断0检测按键,结果通过两个数码管动态扫描显示。主函数始终在display(),即动态扫描。
2.外部中断不触发时,程序运行正常。
3.外部中断触发后,程序能从中断开始一直运行到中断最后一行。但是最后一行运行完后,程序停留在这里,不返回主函数。(中断函数开始EX0=0;末尾出有EX0=1)。
4.一次外部中断结束后,再按下一个键,能够再次进入中断,现象同3。

所以现在想问问各位,什么情况下会导致单片机有这种好像一直停留在中断函数函数尾,不返回主函数的现象?

灰灰不会飞 发表于 2013-3-28 17:18:30

补充一下第3点,程序停留在这里不返回主函数的具体现象是两个数码管只有一个常亮,另一个不亮。

lxa0 发表于 2013-3-28 20:43:39

你没用返回指令?

灰灰不会飞 发表于 2013-3-29 10:06:06

lxa0 发表于 2013-3-28 20:43 static/image/common/back.gif
你没用返回指令?

我用的c语言编译的 不用返回指令吧

电子爱好者_MCU 发表于 2013-3-29 11:16:45

你的意思是 在中断中设置返回值吗? 函数直接共享参数 可以通过全局变量 这个红外模块在进中断前做个简单的判断 稍微延时再判断 那样效果会好点

贝贝M 发表于 2013-3-29 15:13:55

怀疑是你的中断函数有问题

灰灰不会飞 发表于 2013-3-29 17:51:21

电子爱好者_MCU 发表于 2013-3-29 11:16 static/image/common/back.gif
你的意思是 在中断中设置返回值吗? 函数直接共享参数 可以通过全局变量 这个红外模块在进中断前做个简单的 ...

中断应该是不能返回值的吧

灰灰不会飞 发表于 2013-3-29 17:54:52

贝贝M 发表于 2013-3-29 15:13 static/image/common/back.gif
怀疑是你的中断函数有问题

void wbzdf() interrupt 0                               //外部中断函数
{
        uchar count,m,n;
        EX0=0;
        IE0=0;
        while(!hwir);                                               //9秒的低位引导码
        while(hwir);                                               //4.5秒的高位引导码
        for(m=0;m<4;m++)
        {
                for(n=0;n<8;n++)
                {
                        while(!hwir);                  //等低电平结束
                                while(hwir)                               //计算高电平时间
                                {
                                        delay(1);
                                        count++;
                                }               
                                        ir=ir>>1;
                                        if(count>5)                       //若超过1.12ms,赋1
                                        {
                                                ir=ir|0x80;
                                        }
                                count=0;
                }       
        }

        ir=ir&0x0f;                       //为ir和ir赋值
        ir=ir>>4;                                               //9秒的低位引导码

        display(0x01,0x04);
//        P1=ir;
        delay(2000L);
        P1=~P1;

        EX0=1;
}
本来的中断函数经过调试以后被我改成这样了,就是想知道程序执行的过程。原来的程序和这个的结果是一样的,都是返回不了主函数。求教。

BXAK 发表于 2013-3-29 21:56:53

没有超时跳出保护 while(hwir) 很危险

灰灰不会飞 发表于 2013-3-30 12:12:17

BXAK 发表于 2013-3-29 21:56 static/image/common/back.gif
没有超时跳出保护 while(hwir) 很危险

你的意思是程序可能会在这里一直等待,跳不出去吗?如上面所说,中断函数能执行到最后。

贝贝M 发表于 2013-3-30 17:35:54

你用的四个WHILE肯定要有某个进入死循环了,换个别的判断试试
页: [1]
查看完整版本: 写1838红外收发程序返回不了主函数