如何定义跨所有银行的寄存器?
How to define a register across all banks?
如何使用 PIC16F887 或类似器件在汇编中定义跨所有组的寄存器?
应该在不更改 STATUS 位的情况下访问该文件。
在进入中断例程之前,我正在尝试将 W 寄存器保存到临时文件 (W_TEMP)。
来自 Microchip 文档:
The user register, W_TEMP, must be defined across all banks and must be defined at the same offset from the bank base address (i.e., W_TEMP is defined at 0x70 - 0x7F in Bank0)
当中断发生时我们需要保存W
和STATUS
,但是STATUS
已经在RAM中并且没有指令将寄存器从RAM位置移动到另一个,所以它必须先复制到W
,然后再复制到最终目的地。
这意味着我们必须在此 exact 顺序中保存 W
和 STATUS
。
- 保存
W
- 将
STATUS
移动到 W
- 保存
W
(=STATUS
)
我们无法在将 STATUS
移至 W
之前对其进行修改,否则我们将永远无法恢复其现在可能丢失的原始值;由于我们在 STATUS
之后移动 保存 W
我们无法将其修改为 select 特定银行以保存 W
.
当中断发生时,任何bank都可以selected,所以我们必须能够将W
保存到任何bank.
如果我们使用
#define W_TEMP 0x40
这意味着地址 0x40、0x80+0x40、0x100+0x100、0x180+0x40 必须全部被我们的程序考虑保留,因为这些位置可能会突然被覆盖通过中断。
这是
的意思
The user register, W_TEMP, must be defined across all banks and must be defined at the same offset from the bank base address
这是一个警告,可能不是很清楚,警告说 W_TEMP
存在于所有银行(如果没有保存,则根本没有银行)。
给"define"一个寄存器,就是给它设置一个偏移量,一个数字。
说到保存STATUS
一定要小心,不能保存在任何bank中,因为ISR会修改它,我们会丢失原来告诉bank的RP<1:0>
位其中 STATUS
被保存。
所以我们需要选择一个bank并使用它,通常是bank 0,因为有些芯片只有那里有RAM。
由于设置银行需要修改STATUS
这似乎是一个无法解决的问题。
幸运的是我们需要将 STATUS
移动到 W
来保存它,所以一旦它在 W
我们可以使用 BCF
指令设置当前银行而不改变原来的 STATUS
(现在在 W
)。
示例代码
#define W_TEMP 0x70
#define STATUS_TEMP 0x71
MOVWF W_TEMP ;Save W
SWAPF STATUS, W
BCF STATUS, RP0 ;Set bank0
MOVWF STATUS_TEMP ;Save STATUS
注意:使用SWAPF
将STATUS
存入W
是必要的,因为MOVF
改变了Z
标志,在恢复期间不能使用。
ISR恢复状态后,以上操作必须逆序执行
SWAPF STATUS_TEMP, W
MOVWF STATUS ;Restore STATUS (and bank)
;There is no load W from memory without affecting flags
SWAPF W_TEMP, F ;We swap W_TEMP in place (no flags affected)
SWAPF W_TEMP, W ;Then swap W_TEMP in W (this restoring W)
一些设备,如 PIC16F887,有一部分 RAM 在所有存储区之间共享。
这部分是每个银行的最后 16 个字节,偏移量 0x70-0x7f.
在这种情况下,如果 W_TEMP
和 STATUS_TEMP
在那里定义,我们不需要在上下文保存期间切换库:
#define W_TEMP 0x70
#define STATUS_TEMP 0x71
MOVWF W_TEMP
SWAPF STATUS, W
MOVWF STATUS_TEMP
这解释了
(i.e., W_TEMP is defined at 0x70 - 0x7F in Bank0)
引用的一部分。
可以找到有关中断处理的更多信息in this Microchip document about it。
请注意,有些评论充其量是含糊不清的,最坏的情况下是误导性的。
如何使用 PIC16F887 或类似器件在汇编中定义跨所有组的寄存器?
应该在不更改 STATUS 位的情况下访问该文件。
在进入中断例程之前,我正在尝试将 W 寄存器保存到临时文件 (W_TEMP)。
来自 Microchip 文档:
The user register, W_TEMP, must be defined across all banks and must be defined at the same offset from the bank base address (i.e., W_TEMP is defined at 0x70 - 0x7F in Bank0)
当中断发生时我们需要保存W
和STATUS
,但是STATUS
已经在RAM中并且没有指令将寄存器从RAM位置移动到另一个,所以它必须先复制到W
,然后再复制到最终目的地。
这意味着我们必须在此 exact 顺序中保存 W
和 STATUS
。
- 保存
W
- 将
STATUS
移动到W
- 保存
W
(=STATUS
)
我们无法在将 STATUS
移至 W
之前对其进行修改,否则我们将永远无法恢复其现在可能丢失的原始值;由于我们在 STATUS
之后移动 保存 W
我们无法将其修改为 select 特定银行以保存 W
.
当中断发生时,任何bank都可以selected,所以我们必须能够将W
保存到任何bank.
如果我们使用
#define W_TEMP 0x40
这意味着地址 0x40、0x80+0x40、0x100+0x100、0x180+0x40 必须全部被我们的程序考虑保留,因为这些位置可能会突然被覆盖通过中断。
这是
的意思The user register, W_TEMP, must be defined across all banks and must be defined at the same offset from the bank base address
这是一个警告,可能不是很清楚,警告说 W_TEMP
存在于所有银行(如果没有保存,则根本没有银行)。
给"define"一个寄存器,就是给它设置一个偏移量,一个数字。
说到保存STATUS
一定要小心,不能保存在任何bank中,因为ISR会修改它,我们会丢失原来告诉bank的RP<1:0>
位其中 STATUS
被保存。
所以我们需要选择一个bank并使用它,通常是bank 0,因为有些芯片只有那里有RAM。
由于设置银行需要修改STATUS
这似乎是一个无法解决的问题。
幸运的是我们需要将 STATUS
移动到 W
来保存它,所以一旦它在 W
我们可以使用 BCF
指令设置当前银行而不改变原来的 STATUS
(现在在 W
)。
示例代码
#define W_TEMP 0x70
#define STATUS_TEMP 0x71
MOVWF W_TEMP ;Save W
SWAPF STATUS, W
BCF STATUS, RP0 ;Set bank0
MOVWF STATUS_TEMP ;Save STATUS
注意:使用SWAPF
将STATUS
存入W
是必要的,因为MOVF
改变了Z
标志,在恢复期间不能使用。
ISR恢复状态后,以上操作必须逆序执行
SWAPF STATUS_TEMP, W
MOVWF STATUS ;Restore STATUS (and bank)
;There is no load W from memory without affecting flags
SWAPF W_TEMP, F ;We swap W_TEMP in place (no flags affected)
SWAPF W_TEMP, W ;Then swap W_TEMP in W (this restoring W)
一些设备,如 PIC16F887,有一部分 RAM 在所有存储区之间共享。
这部分是每个银行的最后 16 个字节,偏移量 0x70-0x7f.
在这种情况下,如果 W_TEMP
和 STATUS_TEMP
在那里定义,我们不需要在上下文保存期间切换库:
#define W_TEMP 0x70
#define STATUS_TEMP 0x71
MOVWF W_TEMP
SWAPF STATUS, W
MOVWF STATUS_TEMP
这解释了
(i.e., W_TEMP is defined at 0x70 - 0x7F in Bank0)
引用的一部分。
可以找到有关中断处理的更多信息in this Microchip document about it。
请注意,有些评论充其量是含糊不清的,最坏的情况下是误导性的。