如何使用PIC16F887或類似方法在所有組合的彙編中定義寄存器?如何在所有銀行中定義一個註冊表?
應該在不更改狀態位的情況下訪問該文件。
我想在進入中斷程序之前將W寄存器保存爲臨時文件(W_TEMP)。
從Microchip的文件:
用戶寄存器W_TEMP,必須在所有的銀行來定義,並且必須在相同的從銀行基地址(即,W_TEMP在0x70定義的偏移來定義 - 0x7F的在Bank0)
如何使用PIC16F887或類似方法在所有組合的彙編中定義寄存器?如何在所有銀行中定義一個註冊表?
應該在不更改狀態位的情況下訪問該文件。
我想在進入中斷程序之前將W寄存器保存爲臨時文件(W_TEMP)。
從Microchip的文件:
用戶寄存器W_TEMP,必須在所有的銀行來定義,並且必須在相同的從銀行基地址(即,W_TEMP在0x70定義的偏移來定義 - 0x7F的在Bank0)
當發生中斷時,我們需要保存W
和STATUS
,但STATUS
已經在RAM中並沒有指令從RAM位置移動到另一個寄存器,所以它必須首先被複制進入W
然後進入fi最終目的地。
這意味着我們必須保存W
和STATUS
在這個確切順序。
W
STATUS
到W
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
這似乎是一個無法解決的問題。
幸運的是我們需要移動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
這說明
(即W_TEMP在0x70定義 - Bank0中0x7F)
部分報價。
有關處理中斷的更多信息可以參考in this Microchip document about it。
請注意,有些評論充其量是最神祕的,最糟糕的是誤導。
很好。我錯過了「#定義」技巧。非常感謝你。 –