前回 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 フラグは変化しない (うっかりして、たまにハマるもので...)