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

2010-3-21 21:01 2508 4 4 分类: 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的某些位,从输入态转为输出态,注意要把输出重置一下。防止此类问题发生。
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
4
关闭 站长推荐上一条 /3 下一条