2016-09-16 69 views
0

如何使用PIC16F887或類似方法在所有組合的彙編中定義寄存器?如何在所有銀行中定義一個註冊表?

應該在不更改狀態位的情況下訪問該文件。

我想在進入中斷程序之前將W寄存器保存爲臨時文件(W_TEMP)。

從Microchip的文件:

用戶寄存器W_TEMP,必須在所有的銀行來定義,並且必須在相同的從銀行基地址(即,W_TEMP在0x70定義的偏移來定義 - 0x7F的在Bank0)

回答

3

當發生中斷時,我們需要保存WSTATUS,但STATUS已經在RAM中並沒有指令從RAM位置移動到另一個寄存器,所以它必須首先被複制進入W然後進入fi最終目的地。
這意味着我們必須保存WSTATUS在這個確切順序。

  1. 保存W
  2. 移動STATUSW
  3. 保存W(= STATUS

它移入W之前,我們不能修改STATUS,否則我們將永遠無法恢復它,現在可能丟失,原始價值;因爲我們移動STATUS保存W我們不能修改它來選擇一個特定的銀行保存W

當一箇中斷髮生時,可以選擇任何一個銀行,所以我們必須能夠將W保存到任何銀行
如果我們使用

#define W_TEMP 0x40 

這意味着地址0x40的,0x80的+ 0x40的,爲0x100 + 0x100的量0x180 + 0x40的必須全部是認爲通過我們的節目預約,因爲這些位置可以突然被覆蓋一箇中斷。

是這樣的,必須在所有的銀行來定義,並且必須在相同的從銀行基地址偏移被定義

,它是一個的

用戶寄存器W_TEMP含義,也許不是很清楚,警告W_TEMP住在所有銀行(或者如果沒有保存,銀行根本就沒有)。 要「定義」一個寄存器,意思是爲它設置一個偏移量,一個數字。

當談到節約STATUS我們必須小心,我們不能將其保存在任何一家銀行,因爲ISR將修改它,我們就會失去原有的RP<1:0>位,告訴其中STATUS保存的銀行。
所以我們需要選擇一家銀行並使用它,通常它是銀行0,因爲有些芯片只有RAM。
由於設置銀行需要修改STATUS這似乎是一個無法解決的問題。
幸運的是我們需要移動STATUSW保存它,所以一旦它在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保存STATUSW是必要的,因爲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 

這說明

(即W_TEMP在0x70定義 - Bank0中0x7F)

部分報價。


有關處理中斷的更多信息可以參考in this Microchip document about it
請注意,有些評論充其量是最神祕的,最糟糕的是誤導。

+0

很好。我錯過了「#定義」技巧。非常感謝你。 –

相關問題