タイマ (PIC)

ウェイト関数を作りタイマの基本的な使い方を解説していきます。
PICのコンパイラC30には周辺機能ライブラリが含まれていて、簡単に?(ヘッダファイルを見なくても)タイマなどの周辺機能が使えます。
今回はこれを利用してプログラムを作ります。

準備

PIC24Fのタイマについては後閑さんのHP「電子工作の実験室」や「PIC24F活用ガイドブック」で解説されているので参照してください。

周辺機能ライブラリの説明は MPLAB C30\docs\periph_lib 内にある Microchip PIC24F Peripheral Library.chm に書かれています。ライブラリ関数の解説はこのファイルを参照してください。

また、ライブラリ関数のソースファイルは MPLAB C30\src 内の peripheral_24F.zip にまとめられています。解凍するとcファイルが出てくるので関数の中身が知りたい時は見てください。vistaや7の場合、このzipファイルがあるフォルダには解凍できないのでドキュメントフォルダなどに解凍してください。

プログラム


解説

ウェイト関数msecwait()を使いLEDを交互に点滅させるプログラムです。
プログラムは下の3つからなっています。
24F64_TIMER.c 大きな流れやIO操作を記述
msecwait_v202.c ウェイト関数 msecwait()
msecwait_v202.h ウェイト関数を他のファイルで使うためのヘッダファイル

ポート定義

LEDは下の表のように接続されているものとします。また出力1のときLEDはON、0の時OFFするとします。
LED1 ポートAのビット4
LED2 ポートBのビット5

24F64_TIMER.cを見てください。ヘッダファイル読み込みとコンフィグ設定の下でLEDに出力するポートを以下のように定義しています。
#define LED1  _LATA4			//出力ポートは_LATで指定
#define LED2  _LATB5
IO操作をするときはポート名を定義しなおして回路に変更があった時でもすぐに変更しやすいようにします。

同様に出力論理も定義しておきます。
#define LED_ON  1				//回路により論理が変わるので定義文で値を指定
#define LED_OFF 0

IOの入出力設定

24F64_TIMER.c内のinit()関数で行っています。
プログラムファイルの同梱の 24F_TIMER_2011-ピン配置.xls を使ってIOの入出力・プルアップ・オープンドレイン・アナログ入力設定の設定値を決めています。
今回はLEDを接続する12,14番ピンのみを出力に、それ以外はすべて入力に設定しています。
入出力設定は間違えやすいのでExelなどで表を作り、設定することをお勧めします。

タイマ(ウェイト関数)

今回メインの「タイマ」に関係する記述はmsecwait_v202.cとmsecwait_v202.hにまとめられています。
msecwait_v202.cを見ていきます。

#include <p24Fxxxx.h>
p24Fxxxx.h はデバイス(マイコン)にあったヘッダファイルをコンパイラの設定によって自動的に選んでインクルードしてくれるヘッダです。今回の場合は PIC24FJ64GA002 使うので p24FJ64GA002.h がインクルードされます。

#include <timer.h>
周辺機能ライブラリ中のタイマ関係の関数を使うためインクルードします。timer.h は MPLAB C30\support\peripheral_24F 内にあります。

#include "msecwait_v202.h"
定義や関数のプロトタイプ宣言を記述した自作のヘッダファイルです。プロジェクトフォルダ内のファイルをインクルードするときには""で囲みます。

msecwait()関数

この関数は引数で設定した秒数(単位はms)だけ処理を一時停止する関数です。
関数の中の処理は、
  1. タイマの設定&スタート
  2. 時間経過待ちループ
  3. タイマ停止
に分かれています。
順に見ていきます。

タイマの設定&スタート
ヘルプファイルの Microchip PIC24F Peripheral Library.chm を参照しながら見てください。
CloseTimer1();
まずはじめに、タイマを停止させます。今回は特に必要な処理ではありませんが、割り込みを使用している際に再設定を行う場合は一度停止させておいたほうが安心です。「タイマを停止させてから設定」の習慣をつけておくといいでしょう。

#ifdef USE_AND_OR
	~~~~
	~~~~
#else
	~~~~
	~~~~
#endif
このプリプロセッサはコンパイラのバージョンによってパラメータ設定を&で繋ぐのか|で繋ぐのか違うのでその違いを吸収するためのものです。最新版(v3.30)は&で繋ぐようなので#else以下の文を見てください。

ConfigIntTimer1( T1_INT_PRIOR_4 &
				 T1_INT_OFF );
この関数はタイマの割り込み設定をしています。引数のT1_INT_PRIOR_4は割り込みレベルを4に、T1_INT_OFFは割り込みを使用しないを表しています。ヘルプのConfigIntTimer1 Functionにその他の設定値が解説されています。

WriteTimer1( 0 );
タイマのカウント値TMR1を0に設定します。次のOpenTimer1()で0に設定されるので必要ありませんが、0に設定されていることが分かりやすいので記述しています。

OpenTimer1( T1_ON &
		    T1_IDLE_CON &
		    T1_GATE_OFF &
		    T1_PS_1_8 &
		    T1_SYNC_EXT_OFF &
		    T1_SOURCE_INT ,
		    MSECWAIT_PR );
タイマの設定と同時にタイマをスタートさせています。第1引数はT1CON、第2引数はPR1の設定値です。
この引数の中で、よく変更する設定は以下の3つです。
  • T1_ON
  • T1_PS_1_8
  • MSECWAIT_PR
T1_ONはタイマを動作させる設定です。停止させる場合はT1_OFFです。

T1_PS_1_8とMSECWAIT_PRは組み合わせてリセット周期を決定します。
T1_PS_1_8はプリスケーラの設定です。24F64では下の表の値を設定できます。
T1_PS_1_1 1/1
T1_PS_1_8 1/8
T1_PS_1_64 1/64
T1_PS_1_256 1/256
今回は発振子の周波数が32MHzなので、周辺クロックは1/2の16MHzとなっています。この1/8がタイマのクロック周波数になります。すなわち16/8MHzの2MHzがタイマのクロック周波数です。

MSECWAIT_PRは周期設定値です。リセットまでのカウント値を設定します。MSECWAIT_PRの値はmsecwait_v202.h内で定義してあります。
リセット周期 = (周期設定値+1)/タイマのクロック周波数
でリセット周期は計算できます。今回の場合は1msに設定するので周期設定値は1999に設定しています。
タイマのリセット周期の計算はよく行うのでExcelで自動的に計算するようにしています。

その他の引数の詳しい設定の意味についてはハードウェアマニュアルやリファレンスマニュアル上述のヘルプを参照してください。

時間経過待ちループ
タイマは、カウンタとPR値が一致した後、カウンタがリセットすると同時にTxIFフラグをセットします。このフラグを常に見ておき、何回セットされたかをカウントして指定時間の経過を判断します。
for (i = 0; i < num; i++) {
	while (!_T1IF) ;  // フラグ待ち
	_T1IF = 0;        // フラグクリア
}
今回はタイマ1を使用しているので_T1IFを見ます。_T1IFがセットされればwhileから抜け、次の行で0にリセットします。これを指定回数繰り返します。

タイマ停止
CloseTimer1();
最後にタイマを止めます。

ウェイト関数の使用(LEDの点滅)

main()関数内の無限ループ内でウェイト関数( msecwait() )を使用しています。

while(1){
	//一時停止
	msecwait(1000);				//1秒停止
	//LED点滅
	LED1 = (LED1 + 1) & 0x01;		//LED1出力切り替え
	LED2 = (LED2 + 1) & 0x01;		//LED2出力切り替え
}	
msecwait()の引数に1000を設定して1000ms=1s一時停止をしています。

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2012年01月03日 21:02
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。