信号処理 入門

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