如何定义跨所有银行的寄存器?

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)

当中断发生时我们需要保存WSTATUS,但是STATUS已经在RAM中并且没有指令将寄存器从RAM位置移动到另一个,所以它必须先复制到W,然后再复制到最终目的地。
这意味着我们必须在此 exact 顺序中保存 WSTATUS

  1. 保存W
  2. STATUS 移动到 W
  3. 保存 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

注意:使用SWAPFSTATUS存入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_TEMPSTATUS_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
请注意,有些评论充其量是含糊不清的,最坏的情况下是误导性的。