TOP > MPLAB XC8編(PIC16F84A) > LEDを点滅させる(TMR0割込み,PIC16F84A XC8)
LEDを点滅させる− TMR0割込み −
(PIC16F84A XC8)
| 更新日2012.5.20 | 
| 作成日2009.9.22 | 
- 
	ここでは、0.5秒間隔でLEDを点滅させる実験を行います。
 使用する機種はPIC16F84Aで、コンパイラはMPLAB XC8を使います。
 0.5秒の時間はTMR0割込みにより作ります。
 
| 実験回路 | 
|  | 今回の実験回路はRB3にLEDを接続しただけのものです。このLEDを0.5秒間隔で点滅させます。 クロックは20MHzとしました。
 
 
		 
	
 | 
| TMR0割込みの使い方 | 
|  | TMR0割込みを使うためには、以下の3つのレジスタ操作が必要になります。 
	 
		| TMR0 | 割込み発生までのカウンタ。最大値の255から0に戻る(オーバフロー)時TMR0割込みが発生する。 |  | OPTION | プリスケーラ(後述)などの設定をする。 |  | INTCON | TMR0割込みを許可する。また、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ビットで構成され、各ビットは以下のようになっています。
 
	  | Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 |  | ^RBPU | INTEDG | T0CS | T0SE | PSA | PS2 | PS1 | PS0 |  
	  TMR0割込みで使用するビットについて説明します。他のビットの意味は、PICの仕組みを参照して下さい。
 
	  | T0CS | TMR0クロックソース選択ビット 1=RA4/T0CKIピンの入力
 0=内部命令サイクルクロック(今回は0にします)
 |  | PSA | プリスケーラ割り当てビット 1=プリスケーラはWDTへ割り当て
 0=プリスケーラはTMR0へ割り当て(今回は0にします)
 |  | PS2-PS0 | プリスケーラレート選択ビット 
 
		| PS2-PS0 | 倍率 |  | 000 | 2 |  | 001 | 4 |  | 010 | 8 |  | 011 | 16 |  | 100 | 32 |  | 101 | 64 |  | 110 | 128 |  | 111 | 256 |  TMR0レジスタをカウントアップする命令サイクル数を設定します。
 例えば、PS2-PS0に101を設定すると、64命令サイクル毎にTMR0レジスタが+1されます。
 
		 この設定で、クロックが10MHzの場合、TMR0割込みの最大時間は以下のようになります。
		TMR0レジスタ:0
		PS2-PS0 :111(256倍)
		
 0.4μS×256×256=26,214.4μS(約26.2mS)
 となります。
 
		これよりも長い時間が必要な場合は、割込み処理の中で割込み回数をカウントし、10回割込みが発生したらフラグを立てるなどの処理を行います。
 
	   | 
 
	 INTCONレジスタ
	 INTCONレジスタは8ビットで構成され、各ビットは以下のようになっています。
 
	  | Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 |  | GIE | EEIE | T0IE | INTE | RBIE | T0IF | INTF | RBIF |  
	  TMR0割込みで使用するビットについて説明します。他のビットの意味は、PICの仕組みを参照して下さい。
 
	  | GIE | グローバル割込みイネーブルビット 1=全てのマスクされていない割込み発生を許可する
 0=全ての割込み発生を禁止する
 |  | T0IE | TMR0割込みイネーブルビット 1=TMR0割込みを許可する
 0=TMR0割込みを禁止する
 |  | T0IF | TMR0割込みフラグビット 1=TMR0割込みが発生した(ソフトウェアでクリア要)
 0=TMR0割込みが発生していない
 | 
 
 | 
| TMR0の設定と0.5秒の時間作成方法 | 
|  | 0.5秒の時間を作るため、今回は以下のように設定します。
		
			| クロック | :20MHz(1命令実行時間:0.2μ秒) |  | TMR0レジスタ | :0(フリーラン:256) |  | PS2-PS0 | :101(64倍) | 
 となりますので、TMR0割込みを153回カウントすれば0.5秒の時間になります。この設定で、
		| TMR0割込み時間 = 0.2μS×64×256 = 3.2768mS 0.5秒間の割込み回数 = 500mS/3.2768mS ≒ 153回
 | 
 
 
	 
 | 
| プログラム全体 | 
|  | 上記の処理を組み込んだプログラムはこちらです。 
 
 | 
