英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流
标题:
关于中档PIC系列单片机的页和PCLATH
[打印本页]
作者:
kingman
时间:
2009-4-18 18:22
标题:
关于中档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
所以,在
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
是个很重要的寄存器,你对它稍不注意,它就会让你跑飞
欢迎光临 英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 (http://enroobbs.com/)
Powered by Discuz! X3.2