标题: 关于中档PIC系列单片机的页和PCLATH [打印本页]

作者: 51黑fan    时间: 2016-1-31 20:49
标题: 关于中档PIC系列单片机的页和PCLATH

首先想从CALL和GOTO指令的机器码讲起。PIC16是14位的长字指令,操作码和操作数放到同一个指令字里,也就是所谓单字指令。

CALL 指令(14位的指令字长)

-------------------------------------------

| 1| 0| 0| k| k| k| k| k| k| k| k| k| k| k|

-------------------------------------------

100是CALL指令的操作码,GOTO指令类似上面,只是操作码为101.后面11位的k,就是所要CALL或者GOTO的地址。显然,11位的地址只能访问2K的地址范围,为了实现在8K范围内调用和跳转,于是引入了Page的概念。Page其实就是实际要调用或跳转到的地址的高两位。PC的高两位在发生GOTO或CALL指令时从PCLATH寄存器的4:3位装入(如下图)

   PCLATH 5bits

----------------

|4|3|          |

----------------

  |

  V

---------------- ---------------------

|x|x|          | |                   |  (实际PC)

---------------- ---------------------

   PCH 5bits           PCL 8bits

PC 13bit地址,可寻址8K字程序空间。

所以,在CALL或者GOTO指令执行前,要设定好PCLATH的4:3位,也就是设置好Page.PC的高位字节PCH是不可由程序直接写入的,它必须是在PC改变时通过它的锁存器PCLATH装入。PCLATH始终是作为装载PCH用的一个锁存器,它自己的值不会随着PCH的改变而改变。一个很简单的例子,程序假如顺序执行从00一直到8K末尾,这样PCH的最高两位也就从00一直变成11,但PCLATH的高两位,如果你没有人为改变,原来是什么还是什么。当CALL子程序时,CALL指令当前PC+1的13位PC地址压入堆栈(因为硬件堆栈是和PC等宽的)。所以RETURN时能从堆栈弹出整个13位PC的返回地址,就不再需瓒≒CLATH了。但是,要记住,不设定并不代表它自己会改变。假设你CALL之前设定到Page1了,Return之后回到Page0了,但此时,PCLATH里的4:3位还是0:1。当发生直接修改PC时,也就是直接改写PCL,如addwf PCL,F

此时,在改写PCL的同时,作为PCH锁存器的PCLATH会把整个5位的值瞬间传递给PCH,如下图

PCLATH 5bits

----------------

| 4| 3| 2| 1| 0|

----------------     程序修改PC低位字节

       |                  |

       V                  V

---------------- ---------------------

| x| x| x| x| x| |                   |  (实际PC)

---------------- ---------------------

  PCH 5bits           PCL 8bits


PCLATH是个很重要的寄存器,你对它稍不注意,它就会让你跑飞.


作者: 999看    时间: 2016-6-2 10:05
谢谢楼主分享经验




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1