打印
[STC单片机]

关于外部中断的问题

[复制链接]
1770|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
peichao888|  楼主 | 2013-12-6 22:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题:外部中断异常后不能进入中断程序
描述:以前用12C56做的系统,基本调试完毕,考虑硬件等其他问题换成15F204EA,外部中断是作为一个时钟检测用的,所以速度有些高,但这不是主要问题,因为在12C56正常的基础上将速度放低了好几倍还是会出现异常。主程序有监视,没有死机,程序没有跑飞。外部中断随即次数后就产生异常,然后再也无法进入中断程序。中断程序里面尝试在中断开始执行时关中断,退出时请外部中断标志位和打开中断,现象依然存在。
下面是测试程序(急等大家帮助,先跪谢!)
void Timer0() interrupt 1 using 1
{
    TH0=0xdc;
    TL0=0x00;                                //dc00:10ms
       
        if(KeyCmd.Delay>0)        KeyCmd.Delay--;
        // if(SPICmd.TimeOut<200) SPICmd.TimeOut++;
        // else
        // {
                // SPICmd.Step=0;
        // }
       
    m_100ms++;
    if (m_100ms>9)
    {
                if(FlashTim>0) FlashTim--;
        m_100ms=0;
                m_1s++;
    }
       
    if (m_1s>9)
    {
        LED=!LED;
        m_1s=0;
                if(Min<59) Min++;
                else
                {
                        Min=0;
                        if(Hour<11) Hour++;
                        else Hour=0;
                }
    }

}

void SclkInt() interrupt 0 using 2
{
       
        SpiBitNum++;
        if(SpiBitNum>7)
        {
                SpiBitNum=0;
        }
       
        IE0=0;
}

void InitSFR()
{
    EA=0;
    IE=0;
    IP=0x01;
    TCON=0x00;
    TMOD=0x11;

    ET0=1;                                //定时器0初始化
    TH0=0xdc;
    TL0=0x00;                        //预装定时0定时值
    TR0=1;
       
        IT0=1;
        EX0=1;                //外部中断SCLK下降沿中断
       
        P3M1=0x00;
        P3M0=0xf0;
        P2M1=0x00;
        P2M0=0xff;
       
    EA=1;
}

void OutDig()
{
        P16=Dig0;
        P17=Dig1;
        P00=Dig2;
        P01=Dig3;
        P34=Dig4;
        P35=Dig5;
        P36=Dig6;
        P37=Dig7;
}

void main()
{
        uchar KeepTmp;
        uchar AccTmp;
       
        ScanNum=0;
        DispCmd.Item.DarkTim=7;
        DispCmd.Item.LightTim=15;
        SPICmd.Step=0;
       
    InitSFR();
    while (1)
    {               
                AccTmp=Min;
                DispCmd.Item.DispBuf[4]=DispTab[AccTmp%10];
                AccTmp/=10;
                DispCmd.Item.DispBuf[5]=DispTab[AccTmp%10];
                AccTmp=SpiBitNum;
                DispCmd.Item.DispBuf[6]=DispTab[AccTmp%10];
                AccTmp/=10;
                DispCmd.Item.DispBuf[7]=DispTab[AccTmp%10];
                DispCmd.Item.DispBuf[0]=DispTab[16];
                DispCmd.Item.DispBuf[1]=DispTab[16];
                DispCmd.Item.DispBuf[2]=DispTab[16];
                DispCmd.Item.DispBuf[3]=DispTab[16];
               
                DigCode=0xff;                //消隐
                OutDig();
                P2=DispCmd.Item.DispBuf[ScanNum];
                DigCode=DigTab[ScanNum];                //输出位码
                OutDig();
                ScanNum++;                //扫描字移位
                if(ScanNum>7)        ScanNum=0;
               
        }
}

相关帖子

沙发
peichao888|  楼主 | 2013-12-6 22:42 | 只看该作者
补充:程序结果是SpiBitNum在主程序的显示里随机次数后就不再动了,其他显示都正常。而且外部中断“死机”后,外部中断信号用仪器测量是实际存在的,并且在主程序里能正常监视外部中断信号,就是进入不了中断。

使用特权

评论回复
板凳
ayb_ice| | 2013-12-7 09:33 | 只看该作者
IE0=0;
拿掉

使用特权

评论回复
地板
peichao888|  楼主 | 2013-12-7 09:59 | 只看该作者
IE0=0是我给宏晶技术支持打电话他们建议的,最开始就没有。这一条有和没有都一样。

使用特权

评论回复
5
ayb_ice| | 2013-12-7 10:39 | 只看该作者
关键外部中断
间隔一段时间将SpiBitNum变量加一测试,看是否正常,
估计是显示程序本身有问题吧

使用特权

评论回复
6
peichao888|  楼主 | 2013-12-7 11:14 | 只看该作者
谢谢!
AccTmp=Min;
                 DispCmd.Item.DispBuf[4]=DispTab[AccTmp%10];
                 AccTmp/=10;
                 DispCmd.Item.DispBuf[5]=DispTab[AccTmp%10];
秒显示正常。速度很慢时中断累加也没问题,比如降到1S,快了就出错
或者帮我想其它办法测试一下看看

使用特权

评论回复
7
ayb_ice| | 2013-12-7 11:41 | 只看该作者
程序不完整,不好判断问题

使用特权

评论回复
8
ayb_ice| | 2013-12-7 11:43 | 只看该作者
好象听说过STC有些芯片的中断硬件有BUG

使用特权

评论回复
9
peichao888|  楼主 | 2013-12-7 12:03 | 只看该作者
非常感谢!那我再好好看看手册和相关资料,以前做AD转换等,都用的外部中断,没遇到过这种问题,把我搞得很头疼。原本想STC15F的片子更简单,没想到把问题复杂化了

使用特权

评论回复
10
peichao888|  楼主 | 2013-12-7 14:46 | 只看该作者
搞清楚问题了,是15F204芯片本身的问题,说明书中有声明。
感谢ayb_ice的提示与帮助,现将说明书关于该内容放在下面,以便后来人可以更快捷的处理该问题。

G1.1  A版本的外部中断有时会异常,建议不要使用,B版本的外部中断可正常使用。

使用特权

评论回复
11
Leeone| | 2013-12-7 21:50 | 只看该作者
lkInt() interrupt 0 using 2    中断0不是用第2组寄存器吧

使用特权

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

本版积分规则

1

主题

18

帖子

1

粉丝