代码之家  ›  专栏  ›  技术社区  ›  Robin LeBon

如何定义所有银行的登记簿?

  •  0
  • Robin LeBon  · 技术社区  · 8 年前

    如何使用PIC16F887或类似工具在汇编中跨所有库定义寄存器?

    应该在不更改STATUS位的情况下访问该文件。

    在进入中断例程之前,我尝试将W寄存器保存到临时文件(W_temp)。

    从Microchip文档:

    用户寄存器W_TEMP必须在所有银行中定义,并且必须在与银行基本地址相同的偏移量处定义(即,W_TEMP在银行0中定义为0x70-0x7F)

    1 回复  |  直到 8 年前
        1
  •  3
  •   Margaret Bloom    8 年前

    W STATUS 但是 状态 已经在RAM中,并且没有将寄存器从RAM位置移动到另一个位置的指令,因此必须首先将其复制到 W 然后进入最终目的地。
    这意味着我们必须节约 W 状态 准确的

    1. 拯救 W
    2. 移动 状态 进入 W
    3. 拯救 W 状态 )

    我们无法修改 状态 在将其移入之前 W 否则,我们将永远无法恢复其现在可能丢失的原始价值;自从我们搬家 状态 之后 节省物 W 我们不能修改它来选择要保存的特定银行 W .

    当中断发生时,可以选择任何银行,因此我们 必须能够保存 W 存入任何银行 .
    如果我们使用

     #define W_TEMP 0x40
    

    这意味着地址0x40、0x80+0x40、0x100+0x100、0x180+0x40必须全部为 考虑过的 由我们的程序保留,因为这些位置可能会被中断突然覆盖。

    这就是

    用户寄存器W_TEMP必须在所有银行中定义,并且必须在与银行基本地址相同的偏移量处定义

    W_TEMP 所有银行都有存款(如果没有存款,就根本没有银行)。 “定义”寄存器意味着为它设置一个偏移量,一个数字。

    说到节约 状态 我们必须小心,我们不能把它存到任何银行,因为ISR会修改它,我们会丢失原件 RP<1:0> 告诉银行哪些 状态 已保存。
    所以我们需要选择一个存储库并使用它,通常它是存储库0,因为一些芯片只有内存在那里。
    由于设置银行需要修改 状态 这似乎是一个无法解决的问题。
    幸运的是我们需要搬家 状态 W W 我们可以使用 BCF 状态 (现在在 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 保存 状态 进入 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。
    在这种情况下,如果 工作_环境管理计划 STATUS_TEMP 我们在上下文保存期间不需要切换银行:

    #define W_TEMP 0x70
    #define STATUS_TEMP 0x71
    
    MOVWF W_TEMP
    SWAPF STATUS, W 
    MOVWF STATUS_TEMP 
    

    这解释了

    (即,W_TEMP在0组中定义为0x70-0x7F)

    报价的一部分。


    in this Microchip document about it .
    请注意,有些评论充其量是隐晦的,最坏的时候是误导性的。