インターバルタイマと割り込み |
ここでは、どのPICにも実装されている8ビットのタイマを使って、タイマのカウントアップによって定期的な割り込み処理を行なう方法について記述します。 まず、タイマ0を準備、設定して、次に割り込みに対する設定を行います。
タイマ0の設定
タイマのカウント速度は、そのPICを動作させているクロックスピードが元になって決まります。そして、タイマ0は8ビット(256)のカウントができるタイマで、プリスケーラとの組み合わによって256*256=65536までのカウントが可能です。
クロック(CPUクロック/4) → 8ビットプリスケール → 8ビットカウンタ (CPUクロック/4)となっているのは、クロック4周期でPIC内部の1命令が進む仕組みになっているためです。
プリスケールの設定はOPTIONレジスタの下位3ビットで設定します。
OPTION_REG
PS0, PS1, PS2 :プリスケーラの設定
RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0
プリスケール値は2, 4, 8, 16, 32, 64, 128, 256 (0H から7Hが対応)
RBPU:PORT Bのプルアップ設定
通常は外部抵抗でプルアップするので1(プルアップしない)に設定(80H)
プリスケーラ値とカウント値の求め方 必要な総カウント数=インターバル時間/(1/CPUクロック)×4 TMR0のカウント値=必要な総カウント数/プリスケーラ値 プリスケーラ値は2, 4, 8, 16, 32, 64, 128, 256のどれかで、 ”TMR0のカウント値”は256以下に収まることが条件
例)10MHzの時
プリスケール値のカッコ内はRBPUを1とする場合のOPTION_REGへの設定値
時間 希望カウント プリスケール値 カウント値 実際の総カウント 1msec 2500 16(83H) 156(9CH) 2496 32(84H) 78(4EH) 64(85H) 39(27H) 128(86H) 20(14H) 256(87H) 10(0AH) 2msec 5000 32 156 4992 64 78 128 39 256 20 5msec 12500 64 195(C3H) 12480 128 98(62H) 256 49(31H) 10msec 25000 128 195 24960 256 98 20msec 50000 256 195 49920
タイマにカウンタ値をセットするアセンブラの記述例 MOVLW 03CH MOVWF TMR0
タイマ0による割り込みの設定
タイマ0のカウントアップ毎の一定時間に、繰り返し割り込み処理を行なうことができるように設定します。割り込み処理はINTCONレジスタを操作することによって、振る舞いを設定できます。
INTCON
GIE EEIE T0IE INTE RBIE T0IF INTF RBIF GIE:割り込み許可(1)/不許可(0) T0IE:TMR0による割り込みを有効にする TMR0オーバーフロー割り込み有効にしたい時1をセット T0IF:TMR0によるオーバーフロー割り込みフラグ TMR0がオーバーフローした場合1が立つ。プログラムでクリアする必要がある。
T0IFはT0IEと無関係にTMR0がオーバーフローした時に1が立つ 従って、プログラム中割り込みが受け付けられない場所ではT0IEをクリアしておき、割り込みが可能になったらT0IEにビットセットする事で即座に割り込みが実行されます。
TMR0の割り込みを有効にする BSF INTCON, T0IE TMR0の割り込みを無効にする BCF INTCON, T0IEプログラムが割り込みルーチンに入ったら、割り込みフラグ(T0IF)をクリアし、TMR0にカウント値を再び与えてから、目的の割り込み処理を行ない、RETFIEで戻るようにします。
インターバルタイマによる割り込み処理の例 ORG 0 GOTO MAIN ORG 4 GOTO INTR MAIN ;メインルーチン BSF STATUS, PR0 MOVLW 087H ;プリスケール値設定(B'10000111') MOVWF OPTION_REG BCF STATUS, PR0 MOVLW 03CH ;カウント値設定 MOVWF TMR0 BSF INTCON, T0IE BSF INTCON, GIE ; 以下通常処理 INTR ;割り込みルーチン BCF INTCON, T0IF MOVLW 03CH MOVWF TMR0 ;目的の割り込み処理をここに記述 RETFIE
PICマイコンと電子工作 HOME