前回 12F629 に関する Tips を書いたので、 ついでに PIC 全般に関する Tips も書いておきます。
焼き方
ここ参照
ヒューズ
WDT のチェックを外さないと、定期的にリセットされるので注意。 (定期的にCLRWDT を呼ばない場合)。
割り込み
割り込みは INTCON の 3〜6bit 目で何を許可するか、7bit 目で 全体を許可するようにする。フレーズは次にような感じ。
org 0x00
goto start
;;;;; 実際はここに
:;;; org 0x04
;;;; goto interrupt
;;;;; というフレーズを入れる
start
clrf INTCON ; 割り込み禁止
;;;;; ここに初期設定を入れる ;;;;;;;;;;
bsf INTCON, 5 ; 割り込み許可要因の設定
; この例ではタイマ割り込み (ただしタイマ割り込みでは
; 初期設定の中で OPTION_REG を弄る必要がある)
bsf INTCON, 7 ; 割り込み全体を有効にする
;;;;; メインループへ ;;;;;;;;;;
|
割り込み先の処理
W レジスタと STATUS は明示的に保存しなければならない。また、 割り込み要因をクリアしなければ次の割り込みがかからない。 以下のようなフレーズになる。
wtmp equ 20H ; W レジスタ退避先 (環境によって数値は変える)
sttmp equ 21H ; STATUS レジスタ退避先 (環境によって数値は変える)
org 0x04
goto interrupt
interrupt
bcf INTCON, 7 ; 二重割り込みを禁止
movwf wtmp ; W, STATUS レジスタ退避
swapf STATUS, w
movwf sttmp
;;;;; ここに処理を入れる ;;;;;;;;;;
swapf sttmp, w ; W, STATUS レジスタ復活
movwf STATUS
swapf wtmp, f
swapf wtmp, w
bcf INTCON, 2 ; 割り込み要因 (この例はタイマ割り込み) をクリア
retfie ; 割り込み終了
|
速度
1 サイクルはクロック周期の四倍。TMR0 は (OPTION が xx0x0000 の 場合) 2 サイクルで 1 上がる
サイクル
命令表にサイクルが書かれているが btfsc, btfss, decfsz, incfsz は 「1 (2)」と書いてある。これは、次の命令をスキップしたら 2, スキップ しなければ 1 の意味
フラグ
movlw は z フラグは変化しない (うっかりして、たまにハマるもので...)