TOP > PICC Lite編(PIC16F84A) > LEDを点滅させる(TMR0割込み,PIC16F84A PICC-Lite)

LEDを点滅させる

− TMR0割込み −
(PIC16F84A PICC-Lite)

更新日2009.9.22

ここでは、0.5秒間隔でLEDを点滅させる実験を行います。
使用する機種はPIC16F84Aで、コンパイラはPICC Liteを使います。
0.5秒の時間はTMR0割込みにより作ります。

実験回路
今回の実験回路はRB3にLEDを接続しただけのものです。このLEDを0.5秒間隔で点滅させます。
クロックは20MHzとしました。

TMR0割込みの使い方
TMR0割込みを使うためには、以下の3つのレジスタ操作が必要になります。

TMR0割込み発生までのカウンタ。最大値の255から0に戻る(オーバフロー)時TMR0割込みが発生する。
OPTIONプリスケーラ(後述)などの設定をする。
INTCONTMR0割込みを許可する。また、TMR0割込みが発生すると該当ビットがONになる。

TMR0レジスタ
8ビットのカウンタで、1命令サイクル毎に+1されます。(プリスケーラで変更できます)
最初に設定した値からカウントアップが始まります。
そして、最大値の255から0に戻る時にTMR0割込みが発生します。

例えば、TMR0に200がセットされていると、56命令サイクル(255−200+1)でTMR0割込みが発生します。
今回は、クロックとして20MHzを使用しますので、1命令サイクルは0.2μSです。
従って、この例では11.2μS(0.2μS×56サイクル)でTMR0割込みが発生します。

【補足】
TMR0レジスタのカウントアップは1命令サイクル毎に行われますが、プログラムでTMR0レジスタに値をセットした時は、値セット後4命令サイクルはカウントアップしません。(プリスケーラ無しの場合。プリスケーラを使う場合は更に異なります。)

また、TMR0レジスタがオーバフローして0に戻った時、TMR0割込みが発生しますが、割り込み処理の最初の命令が実行されるまでに、2命令サイクルかかります。(TMR0はカウントアップを続けます)

従って、正確な時間が必要な場合は、上記を考慮してTMR0の設定値を決定する必要があります。
より簡単な方法は、最初に0を設定し、後はTMR0を変更しない事です。(TMR0をフリーランさせる)
必要な時間は、オシレータやプリスケーラで調整するか、TMR0割込みを一定回数カウントするなどします。

OPTIONレジスタ
OPTIONレジスタは8ビットで構成され、各ビットは以下のようになっています。
Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
^RBPUINTEDGT0CST0SEPSAPS2PS1PS0

TMR0割込みで使用するビットについて説明します。他のビットの意味は、PICの仕組みを参照して下さい。

T0CSTMR0クロックソース選択ビット
1=RA4/T0CKIピンの入力
0=内部命令サイクルクロック(今回は0にします)
PSAプリスケーラ割り当てビット
1=プリスケーラはWDTへ割り当て
0=プリスケーラはTMR0へ割り当て(今回は0にします)
PS2-PS0プリスケーラレート選択ビット
PS2-PS0倍率
000
001
010
01116
10032
10164
110128
111256

TMR0レジスタをカウントアップする命令サイクル数を設定します。
例えば、PS2-PS0に101を設定すると、64命令サイクル毎にTMR0レジスタが+1されます。

TMR0割込みの最大時間は以下のようになります。
TMR0レジスタ:0
PS2-PS0 :111(256倍)
この設定で、クロックが10MHzの場合、
0.4μS×256×256=26,214.4μS(約26.2mS)
となります。

これよりも長い時間が必要な場合は、割込み処理の中で割込み回数をカウントし、10回割込みが発生したらフラグを立てるなどの処理を行います。

INTCONレジスタ
INTCONレジスタは8ビットで構成され、各ビットは以下のようになっています。
Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
GIEEEIET0IEINTERBIET0IFINTFRBIF

TMR0割込みで使用するビットについて説明します。他のビットの意味は、PICの仕組みを参照して下さい。

GIEグローバル割込みイネーブルビット
1=全てのマスクされていない割込み発生を許可する
0=全ての割込み発生を禁止する
T0IETMR0割込みイネーブルビット
1=TMR0割込みを許可する
0=TMR0割込みを禁止する
T0IFTMR0割込みフラグビット
1=TMR0割込みが発生した(ソフトウェアでクリア要)
0=TMR0割込みが発生していない

TMR0の設定と0.5秒の時間作成方法
0.5秒の時間を作るため、今回は以下のように設定します。
クロック:20MHz(1命令実行時間:0.2μ秒)
TMR0レジスタ:0(フリーラン:256)
PS2-PS0:101(64倍)
この設定で、
TMR0割込み時間 = 0.2μS×64×256 = 3.2768mS
0.5秒間の割込み回数 = 500mS/3.2768mS ≒ 153回
となりますので、TMR0割込みを153回カウントすれば0.5秒の時間になります。

プログラム全体
上記の処理を組み込んだプログラムはこちらです。