打印

STC90C516RD+中断怎么会这样

[复制链接]
4011|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
litong_874|  楼主 | 2013-1-11 21:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在STC90C516RD+上做程序时遇到一个怪现象,有外部中断有计时器中断,计时器启动语句是在外部中断响应里的,但外部中断响应的其它语句并没有执行,计时器溢出中断却来了。
测试程序如下:
        ORG 0000H
        JMP MAIN
        ORG 0003H
        JMP INTRUP0
        ORG 000BH
        JMP TOUT0
        ORG 0040H
MAIN:
        SETB P3.2                ;INIT 2 INT SOURCE TO ACCEPT INPUT
        SETB P3.3
           SETB TCON.2                ;SET INT1 AS EDGE TRIGGER
        SETB TCON.0                ;SET INT0 AS EDGE TRIGGER
        MOV IE,#083H        ;ENABLE BOTH INT1 AND TIMER0
        MOV TMOD,#011H        ;INIT TMOD AS 00010001 ENABLE BOTH TIMERS AS TIMER AND IN MODE 1
        MOV TL0,#0H
        MOV TH0,#0H
        MOV P2,#0H
        MOV P1,#077H        ;DISPLAY A
        JMP $
INTRUP0:
        MOV P1,#079H        ;DISPLAY E
        SETB TR0
        RETI
TOUT0:
        MOV P1,#071H        ;DISPLAY F
        RETI
        END
硬件搭在普中开发板上,相当于8051最小系统,P1口接8段数码管,P2口接数码管选通信号,INT0也就是P32脚接地。

理论上这段程序应该只显示字母A,但实际上A亮了一下就飞快跑到F了。INT0中断源为下降沿触发,常低的电平应该不会触发,即便触发了也应该会显示一下E。当MOV P1,#071H这句注释掉,也没有出现E,只有A,说明INTRUP0根本没执行到。但奇怪的是当我把SETB TR0注释掉,F也不出来了,只有A。从这些现象上看很像INTRUP0的第一句没执行而第二句被执行了。

想了好久都想不出为什么,只能来求教于各位高人了!

相关帖子

沙发
litong_874|  楼主 | 2013-1-11 21:28 | 只看该作者
另外,P32脚如果悬空,程序也只显示A。用TIMER0,1和INT0,1分别试了,效果一样。

使用特权

评论回复
板凳
ningling_21| | 2013-1-11 22:53 | 只看该作者
也许是程序有问题...

使用特权

评论回复
地板
litong_874|  楼主 | 2013-1-12 17:40 | 只看该作者
ningling_21 发表于 2013-1-11 22:53
也许是程序有问题...

请不吝赐教,万分感谢!

使用特权

评论回复
5
ningling_21| | 2013-1-13 11:47 | 只看该作者
litong_874 发表于 2013-1-12 17:40
请不吝赐教,万分感谢!

先要把问题缩小
例如,先不开定时器,只开外部中断,用按键触发外部中断看看有没有问题。

使用特权

评论回复
6
litong_874|  楼主 | 2013-1-13 22:36 | 只看该作者
本帖最后由 litong_874 于 2013-1-13 22:38 编辑

呵呵,我以为已经缩到最小的失效模式了。
本来是在做一个应用程序时发现的问题,然后把一些无关的部分砍掉,得到这么一个测试程序。
不开定时器,就是我注释掉SET TR0这句的效果,这时候一直保持显示A,也就是2个中断均未被触发的状态。INT0切到高电平,再切回来,才有E显示。

使用特权

评论回复
7
litong_874|  楼主 | 2013-1-21 21:38 | 只看该作者
关帖,STC问题。

使用特权

评论回复
8
gx_huang| | 2013-1-22 12:41 | 只看该作者
你换一个其它的51芯片。
边沿触发,还是需要条件的。
另外,你到底是INT0还是INT1中断?
中断向量是INT0,程序注释又是INT1的。

使用特权

评论回复
9
gx_huang| | 2013-1-22 12:42 | 只看该作者
汇编本来就容易错,肯定是你的程序问题,不要怪芯片,大家都用这么多了。

使用特权

评论回复
10
sky大花猫| | 2013-1-22 13:14 | 只看该作者
从你说的现象来看,应该是E显示时间过短,定时器最常也就几十毫秒,人眼估计看不出来,现实E的地方加个延时看下。。

使用特权

评论回复
11
coody| | 2013-1-22 17:15 | 只看该作者
没详细看汇编, 但是敢肯定是程序问题.

使用特权

评论回复
12
litong_874|  楼主 | 2013-1-22 19:15 | 只看该作者
gx_huang 发表于 2013-1-22 12:42
汇编本来就容易错,肯定是你的程序问题,不要怪芯片,大家都用这么多了。 ...

谢谢回复!
注释本来跟着程序还改,但砍为测试程序以后就懒得改了。
我是听另一个朋友说的,STC的中断跟定时器很混乱,他同样的程序用STC跑就出问题,换ATMEL就没问题。我手头暂时只有STC。

使用特权

评论回复
13
litong_874|  楼主 | 2013-1-22 19:25 | 只看该作者
sky大花猫 发表于 2013-1-22 13:14
从你说的现象来看,应该是E显示时间过短,定时器最常也就几十毫秒,人眼估计看不出来,现实E的地方加个延时 ...

谢谢回复!
我考虑过这种情况,于是把显示“F”的地方注释掉,但留下的不是E而是A,说明E根本就没出来过。

使用特权

评论回复
14
gx_huang| | 2013-1-23 11:10 | 只看该作者
在开中断之前,先把INT0的中断请求标志清零。
现在的关键是:
你先SETB P32,再开启下降沿中断,同时外部一直拉低,可能初始状态就不对。

使用特权

评论回复
15
litong_874|  楼主 | 2013-1-24 18:42 | 只看该作者
gx_huang 发表于 2013-1-23 11:10
在开中断之前,先把INT0的中断请求标志清零。
现在的关键是:
你先SETB P32,再开启下降沿中断,同时外部一 ...

今天按你说的试了下,IE设置前加了句CLR IE0,果然外部中断和定时器中断都不误触发了。
按一般思路这就解决了,但是对前面为什么误触发外部中断里,只执行后一句不执行前一句还是想不通。

使用特权

评论回复
16
gx_huang| | 2013-1-25 11:06 | 只看该作者
我帮你解决一个关键问题,其它问题,你自己应该可以分析的。
任何芯片设计都可能有BUG,都可能需要前提条件。
如果你不能满足条件,就软件处理一下。
直接把和中断0、T0相关的所有寄存器都初始化一下,特别是中断标志。
芯片应该不会有大问题的。

使用特权

评论回复
17
litong_874|  楼主 | 2013-1-25 20:53 | 只看该作者
gx_huang 发表于 2013-1-25 11:06
我帮你解决一个关键问题,其它问题,你自己应该可以分析的。
任何芯片设计都可能有BUG,都可能需要前提条件 ...

好的,非常感谢!今天去弄了两片AT89S52回来做一下对比试验。

使用特权

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

本版积分规则

0

主题

12

帖子

0

粉丝