インターバルタイマと割り込み

 ここでは、どのPICにも実装されている8ビットのタイマを使って、タイマのカウントアップによって定期的な割り込み処理を行なう方法について記述します。  まず、タイマ0を準備、設定して、次に割り込みに対する設定を行います。

タイマ0の設定

タイマのカウント速度は、そのPICを動作させているクロックスピードが元になって決まります。そして、タイマ0は8ビット(256)のカウントができるタイマで、プリスケーラとの組み合わによって256*256=65536までのカウントが可能です。

クロック(CPUクロック/4) → 8ビットプリスケール → 8ビットカウンタ

(CPUクロック/4)となっているのは、クロック4周期でPIC内部の1命令が進む仕組みになっているためです。

プリスケールの設定はOPTIONレジスタの下位3ビットで設定します。
OPTION_REG
RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0
PS0, PS1, PS2 :プリスケーラの設定
プリスケール値は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への設定値
時間希望カウントプリスケール値カウント値実際の総カウント
1msec250016(83H)156(9CH)2496
32(84H)78(4EH)
64(85H)39(27H)
128(86H)20(14H)
256(87H)10(0AH)
2msec5000321564992
6478
12839
25620
5msec1250064195(C3H)12480
12898(62H)
25649(31H)
10msec2500012819524960
25698
20msec5000025619549920

タイマにカウンタ値をセットするアセンブラの記述例

	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



inserted by FC2 system