2

我正在尝试模拟PIC16F84,现在需要实现PCL/PCLATH寄存器。

PIC16F84有 1K 的程序内存。

PCL是 8Bit 宽,所以在这种情况下,Bit 0 和 1用于PCLATH在每个大小为 的四个页面之间切换,256B到目前为止我是对的吗?

基于此,我不明白以下内容:

数据表说明了GOTO

PC 的高位从 PCLATH<4:3> 加载。GOTO 是一个两周期指令。

但是上位是不是PCLATH太多了?我的意思是只有 4 个页面,每个 256B,因此只PCLATH需要第 0 位和第 1 位。或者换句话说 - 第 3 位和第 4 位PCLATH始终为 0 ?为什么我在执行“CALL”或“GOTO”时需要关心“PCLATH”?

4

2 回答 2

2

PIC16F84 具有 13 位程序计数器(PC)。GOTO并且CALL指令有 11 位地址操作数,其余 2 位需要来自某个地方,即PCLATH<4:3>. PCLATH由于 PIC16F84 只有 1K 字的程序存储器,所以使用GOTO&时无需关心CALL。即使具有非零随机值也不会影响寻址,因为数据表指出:

访问物理实现地址之上的位置将导致回绕。

不过,最好保持PCLATH<4:3>位清洁,以便将来与具有更大闪存的其他 PIC 型号兼容。

那么,PCLATH与PIC16F84完全无关吗?,还有一种PCLATH使用情况:修改PCLPC的低8位。当PCL被修改时,PC 的剩余 5 位来自PCLATH<4:0>. 修改PCL,主要是给它添加一些值,用于创建RETLW表,可以用来将常量值数组嵌入到闪存中。因此,最好始终在PCLATH.

于 2022-02-04T12:05:58.783 回答
1

程序计数器为 13 位。的操作数是 11 位,因此对于其余位,您需要从 开始GOTO的两位,即。PCLATH11-sizeof(PCL)3

这里有一张图来说明这一点:

          12 11 10  9  8  7  6  5  4  3  2  1  0
-------------------------------------------------
|--|--|--|  |  |  |  |  |  |  |  |  |  |  |  |  |  PC (PCH:PCL)
-------------------------------------------------
          ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^
          |  |  |  |  |  |  |  |  |  |  |  |  |  
          |  | 10  9  8  7  6  5  4  3  2  1  0
          |  | ---------------------------------- 
          |  | |  |  |  |  |  |  |  |  |  |  |  |  GOTO operand
          |  | ----------------------------------
 7  6  5  4  3  2  1  0
-------------------------  
|--|--|--|  |  |  |  |  |  PCLATH
-------------------------

PCHPC)的高字节不能直接访问。相反,您通过PCLATH. 因此,为什么我的图表中的第 0PCLATH位与第 8 位对齐。PC

于 2022-02-04T11:09:59.423 回答