1-4 タイマ(MTU) 公開講義(組込みプロセッサによる音信号処理入門) 岐阜県情報技術研究所 田畑 克彦 1 割り込み1 事象の発生を非同期に受け付ける方法 割り込み要因となる事象が発生すると,CPUが現在の処理を中断して,決 められた割り込みハンドラを自動的に実行 割り込みが発生した時点でPC(プログラム・カウンタ)を退避させ,PCの値を割 り込みハンドラのアドレスに設定 割り込み要因 割り込み端子への外部からの信号 タイマで指定時間が経過した (本講座で演習) A/D変換器の変換処理が終了した (本講座で演習) etc… 割り込み優先順位の設定 複数の割り込みが同時に発生した場合に実行する優先度(16レベル)を設 定可能 2 割り込み2 割り込みハンドラに事象に対応した処理を記述 プロジェクトファイルの中の“intprg.c”の該当する関数(割り込み関数)に記 述する この例では、タイマ4割り込み関数 (INT_MTU4_TGIA4)で、実際に実行する 関数(int_mtu4_tgia4)を呼び出している。 3 MTU(Multi function Timer pulse Unit) タイマとは ある時間間隔をレジスタ(TCNT)でカウントし、カウント数によって 様々な動作を実行させる機能。 SH7144Fでは多機能タイマ(MTU)をもつことが特徴 チャネル数は5個(MTU0~4)でチャネルによって設定可能な動作が異なる。 インターバルタイマ(一定間隔で割り込みを発生) (本講座で演習) ワンショットパルス出力(一定時間後に一度だけパルスを出力) トグル出力(設定した周期でパルスを出力) PWM信号出力(設定したパルス幅のパルスを繰り返し出力) (本講座で演習) インプットキャプチャ(外部入力のパルス幅を計測する) 位相計数モード(ロータリエンコーダのパルスをカウント) 他 4 MTU(その他) 5チャンネルの16ビットタイマを内蔵 最大16本のパルス入出力が可能 各チャネルごとに8種類のカウンタ入力クロックを選択可能 各チャネルとも次の動作を設定可能 コンペアマッチによる波形出力 インプットキャプチャ機能 カウンタクリア動作 複数のタイマカウンタ(TCNT)への同時書き込み コンペアマッチ/インプットキャプチャによる同時クリア カウンタの同期動作による各レジスタの同期入出力 同期動作と組み合わせることによる最大12相のPWM出力 チャネル0,3,4はバッファ動作を設定可能 チャネル1,2はおのおの独立に位相計数モードを設定可能 A/D変換器の変換スタートトリガを生成可能 5 MTUのブロック図 6 MTUのレジスタ チャンネルごと タイマコントロールレジスタ(TCR) レジスタの設定記述例: タイマモードレジスタ(TMDR) タイマI/Oコントロールレジスタ(TIOR) MTUx.TCR.BIT.TPSC = タイマインタラプトイネーブルレジスタ(TIER) x:チャネル番号 タイマステータスレジスタ(TSR) タイマカウンタ(TCNT) タイマジェネラルレジスタ(TGRA, TGRB, TGRC, TGRD) 共通レジスタ タイマスタートレジスタ(TSTR) タイマシンクロレジスタ(TSYR) 設定値; MTU.TSTR.BIT.CSTx = 設定値; x:はチャネル番号 タイマ3/4共通レジスタ タイマアウトプットマスタイネーブルレジスタ(TOER) タイマアウトプットコントロールレジスタ(TOCR) タイマゲートコントロールレジスタ(TGCR) タイマ周期データレジスタ(TCDR) タイマデッドタイムデータレジスタ(TDDR) タイマサブカウンタ(TCNTS) タイマ周期バッファレジスタ(TCBR) MTU3(4).TOER.BIT.OExy = 設定値; x:チャネル番号 y:タイマジェネラルレジスタ記号(A~D) 7 タイマコントロールレジスタ(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のカウンタクロック を選択 カウンタクリア コンペアマッチでTCNTをクリアするor禁止 クロックのエッジ 立ち上がり,立ち下がり,両エッジ カウンタクロック チャンネル0,1,2:クロックの1/64まで チャンネル3,4:クロックの1/1024まで 8 TMDR,TIER,TIOR タイマモードレジスタ(TMDR) 動作モードを設定 通常動作,PWMモード,位相計数モード,相補PWMモード タイマインタラプトイネーブルレジスタ(TIER) 割り込み要求の許可,禁止 A/D 変換開始要求イネーブル アンダフローインタラプトイネーブル TGR インタラプトイネーブル タイマI/O コントロールレジスタ(TIOR) TGRの動作を設定 コンペアマッチ時の出力設定、インプットキャプチャの動作 9 インターバルタイマの動作 TGRA TCNT コンペアマッチ 設定した周波数でTCNTがカウント タイマジェネラルレジスタ TGRA~TGRDと比較 マッチした場合,設定しておいた機能を起動 カウンタのクリア(図のTCNT) 割り込み A/Dコンバータの起動 10 スタンバイモードの解除設定 節電の為,MTUやシリアル通信などの内蔵周辺機能は初期状態 で低消費電力状態となっている 使用する場合には最初にその機能を有効化する事が必要 MTUの場合 A/D1の場合 MST.CR2.BIT._MTU = 0; MST.CR2.BIT._AD1 = 0; 11 例題1-4-1:LED点滅プログラム 基板に接続されているLEDを一定時間毎に点滅させるプログラム タイマによる割り込みを用いることで,「一定時間」を正確に作り出 す 今回は0.5秒毎に点灯と消灯を繰り返す 今回はインターバル・タイマとしてMTUを使用 仕様 MTUのチャネル4を使用 LEDはポートE15に接続 12 プログラムの流れ(1/2) main関数 LEDのポートの設定 MTU4の設定と起動 TGRAとのコンペアマッチで割り込み マッチ時にカウンタをクリアすることで,定期的に割り込み 割り込み間隔は0.5秒 割り込みハンドラ(int_mtu4_tgia4()) コンペアマッチの状態フラグのクリア LEDの点滅(状態の反転) 13 プログラムの流れ(2/2) init_mtu() main() 初期化 ポートレジスタ設定 (データシート17.1.9) 初期化 MTU4割り込み タイムコントロール レジスタ設定(データ シート11.3.1) init_mtu4_tgia4() MTUの初期化 TGRAのコンペア マッチで割り込み LED反転 while(1) MTUスタート 14 割り込み間隔の設定 割り込み間隔(周波数)を設定する 割り込み周波数はTGRAで設定 TGRAの設定方法 TGRA=(カウンタ周波数/割り込み周波数)-1 -1は,マッチの次のカウント時にクリアされるため 今回の場合:0.5秒(2Hz)で割り込み 93.75kHz(Pφ/256)でカウント(MTU4.TCR.BIT.TPSC = 4;) Pφは周辺クロックで、本基板の周波数は24MHz カウント回数は93.75kHz/2Hz=46875 よってTGRAに46874を設定( MTU4.TGRA = 46874; ) 15 割り込みの使用方法 割り込みハンドラの設定 自動生成されるハンドリングプログ ラムを,自分の関数を呼び出すよう に変更 intprg.c 割り込みハンドラの記述 実際に割り込みで行いたい処理を 記述 レジスタの設定 割り込みの初期マスクのクリア 使用する割り込みの優先度を設定 使用機能の割り込み許可フラグの 設定 … // 120 MTU4 TGIA4 //追加 void int_mtu4_tgia4(); void INT_MTU4_TGIA4(void){ int_mtu4_tgia4(); } //コメントアウト //void INT_MTU4_TGIA4(void){/* sleep();*/} … 機能のスタート 16 タイマ・プログラム例(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をスタート } 17 タイマ・プログラム例(2/2) 割り込みハンドラ コンペアマッチ発生により立ったス テータスフラグのクリア LEDの反転 void int_mtu4_tgia4() { //割り込みフラグをクリア MTU4.TSR.BIT.TGFA = 0; PE.DRL.BIT.B15 ^= 1; //LED反転 } メイン関数 LEDポートの設定 割り込みマスクのクリア -ルネサスの組込関数を使用。 -ヘッダーとして<machine.h>をインク ルード。 MTUの初期化関数の呼び出し 無限ループ void main(void) { //初期化 PFC.PEIORL.BIT.B15 = 1; //PE15を出力に設定 set_imask(0); //割り込みマスクをクリア init_mtu(); //MTUの初期化 while (1); } 18 演習1-4-2:LED点滅時間の変更 LEDの点滅時間を0.5秒以外にする 1秒,2秒など 変更方法 TGRAの値を変更して,コンペアマッチのタイミングを変更 CKEG,TPSCの値を変更して,カウント速度を変更 割り込み回数を保存しておき,複数回に一度だけLEDの状態を変更 注意点 TGRA及びTCNTは 16bitレジスタなので,65535より大きい値をとることは出 来ない TGRAを倍にして1秒は無理 19 演習1-4-3:LED表示方法の変更 LED(PE15)1個による点滅ではなく,4個のLEDを順に点灯 ポートEの11,12,13,14の4個 PE11→PE12→PE13→PE14→PE11→… 注意点 各LED(PE11~14)の入出力 設定を忘れない 20 補足 複数ビットアクセス時の注意点 バイト(8ビット)やワード(16ビット)単位でアクセスする場合、他 の使用ポートへの設定値に注意する。 例えば、PE11~14を消灯する場合に PE.DRL.BYTE.H = 0xFF; と記述すると、PE8~10, PE15にも”1”が書き込まれてしまう 。 書込前 0 1 1 1 1 1 PE 15 PE 14 PE 13 PE 12 PE 11 PE 10 0 1 PE 9 書込後 1 PE 15 PE 8 1 1 1 1 1 PE 14 PE 13 PE 12 PE 11 PE 10 1 PE 9 1 PE 8 このため、複数ビットアクセスの場合は、マスク処理をして設定値を保持。 PE.DRL.BYTE.H = (0xFF & 0x78)| (PE.DRL.BYTE.H & 0x87); 0x78 0 1 1 1 1 0 PE 15 PE 14 PE 13 PE 12 PE 11 PE 10 0 PE 9 0 PE 8 0x87 1 0 0 0 0 1 PE 15 PE 14 PE 13 PE 12 PE 11 PE 10 1 PE 9 1 PE 8 21
© Copyright 2024 ExpyDoc