打印

请教一个51外部中断0、1嵌套碰到的问题

[复制链接]
2971|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
2ap15|  楼主 | 2008-7-3 17:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机是飞记P89V51RB2
想法是这样的,复位基本设置后待机循环,中断1触发后进行测量程序,测量到一定数据后产生中断0,计算显示,然后继续进入待机。
INT0 INT1都设置为边沿触发方式,INT0的触发电路为一个滞回比较器+三极管的电平调理电路,INT1的触发电路为传统的复位电路过一反门,通过示波器观察应该进行有效触发是完全没有问题的
INT0为高优先级,INT1为低优先级,在KEILC下面编译没有问题,但是在DEBUG的时候出现一个小现象——就是当INT0完成之后并不运行本身RETI语句,自然也不再跳回上级中断INT1中运行RETI语句,而是直接跳回待机循环语句。
请问一下大致问题会出在哪个地方呢? 

相关帖子

沙发
2ap15|  楼主 | 2008-7-4 10:16 | 只看该作者

11

现在进一步改进后的问题是:高优先级的中断INT0程序中的RETI指令会执行,而低优先级INT1程序中的RETI不执行,这样虽然表面上已经跳回了主程序中循环等待,其实还没有跳出低优先级中断。
因此我想人工再触发INT1再启动测量就不可能了。

使用特权

评论回复
板凳
ayb_ice| | 2008-7-4 10:33 | 只看该作者

你的中断程序写的有问题吧

使用特权

评论回复
地板
2ap15|  楼主 | 2008-7-4 11:05 | 只看该作者

44

;------ÖжϷþÎñ³ÌÐò------
INTER0: CLR     TR0               
        CLR     EX0
    LCALL   TIMECONVERS       
        LCALL   DISPLAY           
        CLR     IE1
    SETB    EX1
        RETI

INTER1: CLR     EX1
        LCALL   DELAY1s
    LCALL   DELAY1s
        LJMP    SENDPULSE
        RETI
贴上中断程序

使用特权

评论回复
5
2ap15|  楼主 | 2008-7-4 11:16 | 只看该作者

55

 ORG     0030H
MAIN:   CLR     PULSE
        MOV     TMOD,#01H         ;T0Ϊ16λ¶¨Ê±
    MOV     TH0,#00H
    MOV     TL0,#00H
    SETB    PX0               ;ÍⲿÖжÏ0Ϊ¸ßÓÅÏȼ¶
    CLR     PX1               ;ÍⲿÖжÏ1ΪµÍÓÅÏȼ¶
    SETB    IT0               ;±ßÑØ´¥·¢
        SETB    IT1               ;±ßÑØ´¥·¢
    CLR     IE1               ;ÇåÖжÏ1±ê־λ
    SETB    EX1               ;¿ªÍⲿÖжÏ1
    SETB    EA                ;¿ªÖжÏ
    LJMP    $
主程序
我在想是不是时间过长,芯片复位放弃的原因

使用特权

评论回复
6
农民讲习所| | 2008-7-4 11:36 | 只看该作者

问题多,太多

1)中断必须保护现场

2)没入门的才这么用:
    LCALL   DELAY1s
    LCALL   DELAY1s
    LJMP    SENDPULSE

3)"LJMP    SENDPULSE"这里思维严重缺陷。

使用特权

评论回复
7
puppyh| | 2008-7-4 11:41 | 只看该作者

楼主说到根子上了

中断里的现场被破坏了。

使用特权

评论回复
8
acmilann| | 2008-7-4 12:30 | 只看该作者

农民讲习所 分析的很好了

使用特权

评论回复
9
wushuang_z| | 2008-7-4 23:59 | 只看该作者

中断要保护现场的啊。。

基本常识

使用特权

评论回复
10
wushuang_z| | 2008-7-5 00:01 | 只看该作者

请教6楼,,,

3)"LJMP    SENDPULSE"这里思维严重缺陷。
 怎么讲?

使用特权

评论回复
11
2ap15|  楼主 | 2008-7-5 15:04 | 只看该作者

11

晕死
我发现问题了
不小心把LCALL SENDPULSE 写成LJMP SENDPULSE了
难怪一到SENDPULSE运行一结束之后就马上回到主程序循环了!

另外说到保护现场的问题——子程序中的数据每一次发生都是重新赋值重新计算,子程序之间不影响没有联系,还需要对哪些数据保护呢?

使用特权

评论回复
12
2ap15|  楼主 | 2008-7-5 15:06 | 只看该作者

12

另外那个延时1S的子程序只是我加进去看看是不是时间长了被放弃的缘故

恩,就是出在那个LJMP上了

使用特权

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

本版积分规则

29

主题

102

帖子

0

粉丝