3 タイマ(MTU) 岐阜大学大学院 工学研究科 応用情報学専攻 1 割り込み 事象の発生を非同期に受け付ける方法 割り込み要因となる事象が発生すると,CPUが現在の処理を中断して,決 められた割り込みハンドラを自動的に実行 割り込みが発生した時点でPC(プログラム・カウンタ)を退避させ,PCの値を割 り込みハンドラのアドレスに設定 割り込みハンドラに事象に対応した処理を記述 割り込み要因 割り込み端子への外部からの信号 タイマで指定時間が経過した A/D変換器の変換処理が終了した etc… 2 MTU 5チャンネルの16ビットタイマを内蔵 最大16本のパルス入出力が可能 各チャネルごとに8種類のカウンタ入力クロックを選択可能 各チャネルとも次の動作を設定可能 コンペアマッチによる波形出力 インプットキャプチャ機能 カウンタクリア動作 複数のタイマカウンタ(TCNT)への同時書き込み コンペアマッチ/インプットキャプチャによる同時クリア カウンタの同期動作による各レジスタの同期入出力 同期動作と組み合わせることによる最大12相のPWM出力 チャネル0,3,4はバッファ動作を設定可能 チャネル1,2はおのおの独立に位相計数モードを設定可能 A/D変換器の変換スタートトリガを生成可能 3 MTUのレジスタ チャンネルごと タイマコントロールレジスタ(TCR) タイマモードレジスタ(TMDR) タイマI/Oコントロールレジスタ(TIOR) タイマインタラプトイネーブルレジスタ(TIER) タイマステータスレジスタ(TSR) タイマカウンタ(TCNT) タイマジェネラルレジスタ(TGRA, TGRB, TGRC, TGRD) 共通レジスタ タイマスタートレジスタ(TSTR) タイマシンクロレジスタ(TSYR) タイマ3/4共通レジスタ タイマアウトプットマスタイネーブルレジスタ(TOER) タイマアウトプットコントロールレジスタ(TOCR) タイマゲートコントロールレジスタ(TGCR) タイマ周期データレジスタ(TCDR) タイマデッドタイムデータレジスタ(TDDR) タイマサブカウンタ(TCNTS) タイマ周期バッファレジスタ(TCBR) 4 MTUのブロック図 5 時間を計る=数を数える TCNT 0xFFFF 0x0000 3ms 0.7s 時間 24MHzでカウントする場合 65,535(0XFFFF)カウントするのに約0.003秒かかる 93.75kHz(24MHz/256)でカウントする場合 65,535(0XFFFF)カウントするのに約0.7秒かかる 6 クロック 動作クロック 該当モジュール 動作クロック 該当モジュール システムクロック(φ) CPU UBC DTC BSC DMAC WDT AUD ROM RAM 周辺クロック(Pφ) MTU POE SCI I2C A/D CMT H-UDI 実習用基板 システムクロック: 48MHz 周辺クロック: 24MHz 7 カウントクロック カウントクロック チャンネル0 チャンネル1 チャンネル2 チャンネル3 チャンネル4 Pφ/1 Pφ/4 Pφ/16 Pφ/64 TCLKA TCLKB TCLKC TCLKD Pφ/1 Pφ/4 Pφ/16 Pφ/64 Pφ/256 TCLKA TCLKB Pφ/1 Pφ/4 Pφ/16 Pφ/64 Pφ/1024 TCLKA TCLKB TCLKC Pφ/1 Pφ/4 Pφ/16 Pφ/64 Pφ/256 Pφ/1024 TCLKA TCLKB Pφ/1 Pφ/4 Pφ/16 Pφ/64 Pφ/256 Pφ/1024 TCLKA TCLKB TCLK*: 外部クロック Pφ =24MHzの場合 Pφ/256でカウントする場合、 Pφ/256=93.75kHz 8 任意の数までカウントする TCNT TGRAと値が一致したらTCNTをクリア 0xFFFF TGRA 0x0000 時間 コンペアマッチ タイマジェネラルレジスタ(TGR)の値と比較 TGRA, TGRB, TGRC, TGRB 9 コンペアマッチで割り込む TCNT TGRAと値が一致したらTCNTをクリア と同時に割り込みを発生 0xFFFF TGRA 0x0000 時間 割り込みの発生 1. コンペアマッチでタイマステータスレジスタ(TSR)にフラグが立つ TCNT = TGRAのときにフラグがセットされる 具体的には、MTU4.TSR.BIT.TGFA = 1となる 2. TGFAのフラグが立っていれば割り込みを発生する この設定はタイマインタラプトイネーブルレジスタ(TIER)で行う MTU4.TIER.BIT.TGIEA = 1 ←TGFAビットによる割り込み要求を許可 10 タイマコントロールレジスタ(TCR) 各チャンネルのTCNTを制御する8ビットのレジスタ ビット 7 6 5 4 3 2 1 0 ビット名 CCLR 2 CCLR 1 CCLR 0 CKEG 1 CKEG 0 TPSC 2 TPSC 1 TPSC 0 説明 カウンタクリアの要因を 指定 クロックのエッ ジを選択 TCNTのカウンタクロック を選択 カウンタクリア コンペアマッチでクリアするor禁止 クロックのエッジ 立ち上がり,立ち下がり,両エッジ カウンタクロック チャンネル0,1,2:クロックの1/64まで チャンネル3,4:クロックの1/1024まで 11 割り込みハンドラ 割り込みが発生したときに呼び出されるルーチン(関数) 割り込みが発生したときに行いたい処理を記述しておく intprg.cにあらかじめ定義してあるので改造する ここを改造 // 120 MTU4 TGIA4 void INT_MTU4_TGIA4(void){/* sleep (); */} TGFAビットによる割り込み要求(TGIA)があったときに呼び出されるハンドラ 12 TMDR,TIER,TIOR タイマモードレジスタ(TMDR) 動作モードを設定 通常動作,PWMモード,位相計数モード,相補PWMモード タイマインタラプトイネーブルレジスタ(TIER) 割り込み要求の許可,禁止 A/D 変換開始要求イネーブル アンダフローインタラプトイネーブル TGR インタラプトイネーブル タイマI/O コントロールレジスタ(TIOR) TGRの機能を設定 13 スタンバイモード設定 節電の為,MTUやシリアル通信などの内蔵周辺機能は初期状態 で低消費電力状態となっている 使用する場合には最初に有効化する事が必要 MTUの場合 MST.CR2.BIT._MTU = 0; A/D1の場合 MST.CR2.BIT._AD1 = 0; 14 例題1-4-1:LED点滅プログラム 基板に接続されているLEDを一定時間毎に点滅させるプログラム タイマによる割り込みを用いることで,「一定時間」を正確に作り出 す 今回は0.5秒毎に点灯と消灯を繰り返す 今回はインターバル・タイマとしてMTUを使用 仕様 MTUのチャネル4を使用 LEDはポートE15に接続 15 プログラムの流れ(1/2) main関数 LEDのポートの設定 MTU4の設定と起動 TGRAとのコンペアマッチで割り込み マッチ時にカウンタをクリアすることで,定期的に割り込み 割り込み間隔は0.5秒 割り込みハンドラ(int_mtu4_tgia4()) コンペアマッチの状態フラグのクリア LEDの点滅(状態の反転) 16 プログラムの流れ(2/2) init_mtu() main() 初期化 ポートレジスタ設定 (17.1.9) 初期化 MTU4割り込み タイムコントロール レジスタ設定 (11.3.1) init_mtu4_tgia4() MTUの初期化 TGRAのコンペア マッチで割り込み LED反転 while(1) MTUスタート 17 割り込み間隔の設定 割り込み間隔(周波数)を設定する 割り込み周波数はTGRAで設定 TGRAの設定方法 TGRA=(カウンタ周波数/割り込み周波数)-1 -1は,マッチの次のカウント時にクリアされるため 今回の場合:0.5秒(2Hz)で割り込み 93.75kHz(Pφ/256)でカウント(MTU4.TCR.BIT.TPSC = 4;) カウント回数は93.75kHz/2Hz=46875 よってTGRAに46874を設定( MTU4.TGRA = 46874; ) 18 割り込みの使用方法 割り込みハンドラの設定 自動生成されるハンドリングプログ ラムを,自分の関数を呼び出すよう に変更 intprg.c 割り込みハンドラの記述 実際に割り込みで行いたい処理を 記述 レジスタの設定 割り込みの初期マスクのクリア 使用する割り込みの優先度を設定 使用機能の割り込み許可フラグの 設定 … // 120 MTU4 TGIA4 //追加 void int_mtu4_tgia4(); void INT_MTU4_TGIA4(void){ int_mtu4_tgia4(); } //コメントアウト //void INT_MTU4_TGIA4(void){/* sleep();*/} … 機能のスタート 19 タイマ・プログラム例(1/2) MTUの初期化関数 MTU回路の起動 立ち上がりエッジでカウント TGRAのコンペアマッチでクリア クロックサイクルの設定 void init_mtu() { MST.CR2.BIT._MTU = 0; //MTUを起動 //立ち上がりエッジ MTU4.TCR.BIT.CKEG = 0; //TGRAのコンペアマッチでクリア MTU4.TCR.BIT.CCLR = 1; //P_phi/256(93.75kHz)でカウント MTU4.TCR.BIT.TPSC = 4; //93.75khz / 2Hz(0.5sec) - 1 = 46874 MTU4.TGRA = 46874; //カウンタを0に MTU4.TCNT = 0; クロック周波数の1/256の速度でカ ウント 24MHz / 256 = 93.75kHz TGRAの値を設定 0.5秒に1回割り込ませる 93.75kHz / 2Hz = 46875 クリアは一致したカウント値を更新 するタイミングで行われるため, TGRA+1の周期になる //通常動作(16ビットタイマー) MTU4.TMDR.BIT.MD = 0; //TGIA4マッチで割り込み MTU4.TIER.BIT.TGIEA = 1; //MTU4の割り込みの優先度を1に設定 INTC.IPRF.BIT._MTU4G = 1; モード設定 割り込み許可,優先度を設定 タイマスタート MTU.TSTR.BIT.CST4 = 1; //MTU4をスタート } 20 タイマ・プログラム例(2/2) 割り込みハンドラ コンペアマッチ発生により立ったス テータスフラグのクリア LEDの反転 void int_mtu4_tgia4() { //割り込みフラグをクリア MTU4.TSR.BIT.TGFA = 0; PE.DRL.BIT.B15 ^= 1; //LED反転 } メイン関数 LEDポートの設定 割り込みマスクのクリア MTUの初期化関数の呼び出し 無限ループ void main(void) { //初期化 PFC.PEIORL.BIT.B15 = 1; //PE15を出力に設定 set_imask(0); //割り込みマスクをクリア init_mtu(); //MTUの初期化 while (1); } 21 演習1:LED点滅時間の変更 LEDの点滅時間を0.5秒以外にする 1秒,2秒など 変更方法 TGRAの値を変更して,コンペアマッチのタイミングを変更 CKEG,TPSCの値を変更して,カウント速度を変更 割り込み回数を保存しておき,複数回に一度だけLEDの状態を変更 注意点 TGRA及びTCNTは 16bitレジスタなので,65535より大きい値をとることは出 来ない TGRAを倍にして1秒は無理 22 演習2:LED表示方法の変更 LED(PE15)1個による点滅ではなく,4個のLEDを順に点灯 ポートEの11,12,13,14の4個 PE11→PE12→PE13→PE14→PE11→… 注意点 各LEDの入出力設定を忘れない 23
© Copyright 2024 ExpyDoc