请教单片机汇编语言

[复制链接]
2880|8
 楼主| stone1712 发表于 2007-5-29 11:15 | 显示全部楼层 |阅读模式
下面是一段检测debug脉冲的函数:等待P3.0口给脉冲,P3.0初始值为1,根据这个程序,R6存放的是脉冲的宽度。那么脉冲沿是不是一定要在第一个NOP期间给出,否则就检测不到这个沿了?多谢!
         JNB  P3.0,USER_MODE
         NOP                    
JUDGE_lenth:    
    JB   P3.0,USER_MODE            
         DJNZ R6,JUDGE_lenth
    NOP                            JNB  P3.0,USER_MODE
    SETB    C
    RET
USER_MODE:
    CLR    C
    RET
老黄头 发表于 2007-5-29 11:50 | 显示全部楼层

不行

USER_MODE:后面的 RET  是干什么的?
 楼主| stone1712 发表于 2007-5-29 12:55 | 显示全部楼层

RET是返回

RET是返回调用这个汇编函数的子程序(C编的)。返回C=1表示检测到了debug脉冲;C返回0就是没有检测到debug脉冲。
conwh 发表于 2007-5-29 13:20 | 显示全部楼层

根据你的逻辑,这条指令就永远不成立了。

   JB   P3.0,    $
这可是没有NOP。
 楼主| stone1712 发表于 2007-5-29 16:05 | 显示全部楼层

第二行的NOP

 楼主| stone1712 发表于 2007-5-29 16:11 | 显示全部楼层

第二行的NOP

这个程序是别人写的,我没有读明白。脉冲宽度是放到R6里面了。可是如何检测到下降沿脉冲呢?第一条指令JNB  P3.0,USER_MODE是判断P3.0是否是高电平,初始化是高电平,则继续执行第二条指令NOP,也就是等待一个机器周期;然后再判断P3.0口的状态,如果还是高电平,则跳到USER_MODE处,返回C=0;即没有检测到脉冲;如果这时检测到P3.0口是低电平,则进入循环程序判断低电平的脉冲宽度。我的意思是只有debug脉冲沿在NOP指令执行期间到达才可以,否则检测不到。这样理解对么?多谢了!
why_buaa 发表于 2007-5-30 00:24 | 显示全部楼层

似乎是下降沿必须在第一个NOP期间才能检测到

而且还要宽度正好是设定的那么长才行。

我不知道这个系统是怎么保证能在执行这个函数的时候刚好撞上这个脉冲的,如果是撞大运的话,这种方式的成功率就太值得怀疑了。
conwh 发表于 2007-5-30 00:41 | 显示全部楼层

如果是这样,这里的NOP是起到延时的作用,可能设计者知道

在低电平时最少(多)要几个微妙。看程序不能简单地看人家的程序,要结合电路和动作原理进行分析,否则可能走进误区。
 楼主| stone1712 发表于 2007-5-30 09:05 | 显示全部楼层

附另一种解释,不理解

这个是我自己对这个程序的理解。我现在的想法和7楼的一样,就是觉得撞上这个脉冲太难了,所以我想问问各位大虾,我上面的理解对不对?
下面是别人给的一种解释:我没读明白,请那位高人帮我解释一下,多谢了。
“首先程序检测高电平,然后等待一个NOP的时间后再检测P3.0口,根据R6写入的信息,循环判断IO口是否为低电平,如果循环结束,此时检测IO口是否为高电平”
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

6

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部