CALL/GOTO 不需要 PIC 16F84 PCLATH Bit3+4?
PIC 16F84 PCLATH Bit3+4 unnecessary for CALL/GOTO?
我正在尝试模拟 PIC16F84
,现在需要实现 PCL
/ PCLATH
寄存器。
PIC16F84
有 1K 的程序内存。
PCL
是8Bit宽,所以在这种情况下PCLATH
的Bit 0和Bit 1用于在每个大小为256B
的四个页面之间切换,我是不是到目前为止?
基于此,我不理解以下内容:
Datasheet 状态 GOTO
:
The
upper bits of PC are loaded from
PCLATH<4:3>. GOTO is a two-
cycle instruction.
但是 PCLATH
的高位是不是太多了?我的意思是只有 4 页,每页 256B,因此只需要 PCLATH
的第 0 位和第 1 位。或者换句话说 - PCLATH
的第 3 位和第 4 位总是 0 ?为什么我在执行 'CALL' 或 'GOTO' 时需要关心 'PCLATH' ?
程序计数器为 13 位。 GOTO
的操作数是 11 位,因此对于剩余的位,您需要从 11-sizeof(PCL)
开始的 PCLATH
的两位,即 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
-------------------------
PCH
(PC
的高字节)不能直接访问。相反,您通过 PCLATH
写入它。因此,为什么 PCLATH
的位 0 在我的图表中与 PC
的位 8 对齐。
PIC16F84 有 13 位程序计数器 (PC)。 GOTO
和 CALL
指令有 11 位地址操作数,其余 2 位需要来自某个地方,即 PCLATH<4:3>
。由于PIC16F84只有1K字的程序存储器,所以使用GOTO
& CALL
时不需要关心PCLATH
。即使有一个 non-zero 随机值也不会影响寻址,因为数据表指出:
Accessing a location above the physically implemented address will
cause a wraparound.
不过,最好保持 PCLATH<4:3>
位干净,以便将来与具有更大闪存的其他 PIC 型号兼容。
那么,PCLATH
与 PIC16F84 完全无关吗? No. 还有一种情况用到PCLATH
:修饰PCL
,PC的低8位。当修改PCL
时,PC的剩余5位来自PCLATH<4:0>
。修改 PCL
,主要是通过向其添加一些值,用于创建 RETLW
表,可用于将常量值数组嵌入到闪存中。因此,最好在 PCLATH
.
中始终有一个正确且有效的值
我正在尝试模拟 PIC16F84
,现在需要实现 PCL
/ PCLATH
寄存器。
PIC16F84
有 1K 的程序内存。
PCL
是8Bit宽,所以在这种情况下PCLATH
的Bit 0和Bit 1用于在每个大小为256B
的四个页面之间切换,我是不是到目前为止?
基于此,我不理解以下内容:
Datasheet 状态 GOTO
:
The upper bits of PC are loaded from PCLATH<4:3>. GOTO is a two- cycle instruction.
但是 PCLATH
的高位是不是太多了?我的意思是只有 4 页,每页 256B,因此只需要 PCLATH
的第 0 位和第 1 位。或者换句话说 - PCLATH
的第 3 位和第 4 位总是 0 ?为什么我在执行 'CALL' 或 'GOTO' 时需要关心 'PCLATH' ?
程序计数器为 13 位。 GOTO
的操作数是 11 位,因此对于剩余的位,您需要从 11-sizeof(PCL)
开始的 PCLATH
的两位,即 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
-------------------------
PCH
(PC
的高字节)不能直接访问。相反,您通过 PCLATH
写入它。因此,为什么 PCLATH
的位 0 在我的图表中与 PC
的位 8 对齐。
PIC16F84 有 13 位程序计数器 (PC)。 GOTO
和 CALL
指令有 11 位地址操作数,其余 2 位需要来自某个地方,即 PCLATH<4:3>
。由于PIC16F84只有1K字的程序存储器,所以使用GOTO
& CALL
时不需要关心PCLATH
。即使有一个 non-zero 随机值也不会影响寻址,因为数据表指出:
Accessing a location above the physically implemented address will cause a wraparound.
不过,最好保持 PCLATH<4:3>
位干净,以便将来与具有更大闪存的其他 PIC 型号兼容。
那么,PCLATH
与 PIC16F84 完全无关吗? No. 还有一种情况用到PCLATH
:修饰PCL
,PC的低8位。当修改PCL
时,PC的剩余5位来自PCLATH<4:0>
。修改 PCL
,主要是通过向其添加一些值,用于创建 RETLW
表,可用于将常量值数组嵌入到闪存中。因此,最好在 PCLATH
.