原创 义隆单片机risc指令:bsbc指令一个容易忽略导致问题的现象

2006-12-4 20:15 4405 7 8 分类: MCU/ 嵌入式

bs,bc指令慢慢解 [zt]



 


各位大侠是否有碰到过这样得情况:就是没个IO口电位莫名其妙的变化,从而出现你不希望的结果?别急,这很有可能就是bs、bc指令在作怪,欲知为何,且听俺慢慢解来。
要回答这个问题,首先要对IO PORT的结构要有所了解。具体io 口电路结构图请参照相关资料。在EMC单片机中,不能单独更改一个位的数据。当试图更改没个IO 口(或RAM)中的一个位时,其8个位的数据都将被取入ALU中,然后执行AND/OR指令之后再写回io port(RAM)。
举个例子,将PORT 6 bit 0 置1,指令为bs 0X06,0。指令的执行过程是这样,首先将整个PORT 6的数据取到ALU,然后用二进制数据“00000001”跟取回的数据执行“或”操作,最后将结果写入port 6;相反的,如果要将它清零,那么会用11111110与之相与再写回去。
那么为什么可能产生错误呢?有两种情况,用port6 bit7举例,一种情况是port6.7设置为input,另一种则为output,现用第一种情况分析一下错误是怎么产生的。bit 7设置为input,此时bit7锁存器上的值为0或1;当在port6 bit0-6上执行bs或bc指令改变bit0-6上的值时,如上所述的,bit7io port(不是latch)上的值也会被读入ALU,之后再写入bit7之data latch,尽管你并没有如此意图。如此,bit7上之data latch上的值就有可能不经意的被改变了。当bit7由input转变为output时,意想不到的错误就可能发生了。另一种情况就不罗嗦了。
可以发现,这种影响只会影响io port的其他位,对本身不会影响;对于非io port的RAM,也不会有这种影响出现;除了bs,bc指令外,如下指令也可能出现上述情况:XOR/AND/OR R,A;DEC R;RRC R;RLC R;SWAP R;MOV R,R;COM R;DJZ R;SWAP R;JZ R;JBC R,B;JBS R,B;等等,这里如果R不是io port而是RAN,则错误不会发生。

 

 

所以,在程序中把一个io的某些位,从输入态转为输出态,注意要把输出重置一下。防止此类问题发生。

文章评论1条评论)

登录后参与讨论

ak 2006-12-17 21:18

在将I/O口转为OUTPUT之前改变PORT的值就可以避免这个问题提。
相关推荐阅读
12864_944456583 2010-04-28 09:10
关于VMware虚拟机下串口配置使用技巧
 USB转串口使用设置:   在Windows下可以使用超级终端来连接交换机和路由器等工业设备,而且在Windows下使用usb转串口的线也有相应的驱动,但是如何在Linux下使用呢?   首先要有一...
12864_944456583 2008-11-21 14:51
用单片机实现的感应触摸电路的原理图
家电中最常用的感应触摸电路,通过单片机检测电压的变化来识别是否有手指按下 ...
12864_944456583 2008-11-21 14:48
AVR单片机捕获中断实现红外线解码
1 红外线编码红外线编码是数据传输和家用电器遥控常用的一种通讯方法,其实质是一种脉宽调制的串行通讯。家电遥控中常用的红外线编码电路有μPD6121G型HT622型和7461型等。本文就以这些电路的编码...
12864_944456583 2008-11-21 14:45
用三极管实现RS232的转换电路图
用三极管实现RS232的转换电路图: ...
12864_944456583 2008-11-21 14:42
诺基亚3310液晶屏驱动程序
#include "global.h"#include "nokia3310.h"#include "font.h"#include "bmp.h"void LCDClear(void)//LCD清屏...
12864_944456583 2008-11-21 14:41
最详细电磁炉原理讲解
                                       最详细电磁炉原理讲解           日期: 2008-03-22             发表人: 稻田守望者   ...
我要评论
1
7
1
2
3
4
5
6
7
8
9
0
关闭 热点推荐上一条 /2 下一条