マイコン・メモ
RX220でメロディを鳴らす
ホームページに戻るトップページに戻る前ページに戻る次ページに進む最終ページに進む
32ビットマイコンRX220の、マルチファンクションタイマパルスユニット(MTU)を使ってメロディを鳴らす方法を、これまで製作したものを基に紹介します。
■参考資料■
 ・RX220グループ ユーザーズマニュアル ハードウェア編 :ルネサス エレクトロニクス
1.ビープ音でメロディ

 マイコンRX220によるビープ音の発生方法を こちら で紹介いたしましたが、そのビープ音によってメロディを鳴らす方法を紹介します。
 メロディと言っても音源はビープ音ですし、音量も変えられませんが、タイマーや時計などの警報やお知らせ機能などに使えると思います。
 スピーカー駆動回路は、下図のようにビープ音の発生と同じものです。ただ、出力端子としてMTU0のMTIOC0A端子を使う点が違います。
※ 図にあるマイコンボードは、64ピンのRX220(R5F52206BDFM)を搭載した、秋月電子通商で販売しているマイコンボードを想定しています。
メロディ出力用のスピーカー駆動回路

2.マルチファンクションタイマパルスユニット(MTU0, MTU3)を使う

 RX220には、6本(6チャンネル)のマルチファンクションタイマパルスユニット(MTU0~MTU5)があります。
 ここで紹介するメロディ発生では、それらの中からMTU0とMTU3の2つを使います。具体的には、MTU0を音の高さ(周波数)を決めて波形出力するため、MTU3を音の長さを作成するために使用します。
 以降でMTU0とMTU3の使用レジスタを簡単に説明します。なお、MTU0, MTU3それぞれに多数のレジスタがありますが、ここで説明されていないレジスタは初期状態のままとします。

 タイマスタートレジスタ(TSTR)は、こちら でも説明していますが、タイマカウンタ(MTUn.TCNT,n=0~4)を動作/停止させるレジスタです。各MTUの設定は、このレジスタによってタイマカウンタを停止した状態で行います。ちなみに、MTU0を動作/停止させるにはb0のCST0を、MTU3を動作/停止させるにはb6のCST3を操作します。
MTUのタイマスタートレジスタ
 タイマカウンタ(MTU0.TCNT,MTU3.TCNT)は16ビットのアップカウンタで、以降で説明するタイマコントロールレジスタで設定したクロックでカウントします。
 タイマジェネラルレジスタ(MTU0.TGRA~TGRF, MTU3.TGRA~TGRD)は、アウトプットコンペアモードまたはインプットキャプチャモードで使用する16ビットレジスタで、メロディ発生ではMTU0,MTU3共にアウトプットコンペアモードで、それぞれTGRAだけを使用します。
MTU0,MTU3のタイマカウンタとタイマジェネラルレジスタ
 タイマコントロールレジスタ(MTU0.TCR, MTU3.TCR)は、タイマカウンタの動作を設定します。
 タイマカウンタTCNTのクロックは下表に示す内部クロックから、MTU0はPCLK/4 (=6.25MHz, =160nS)注1 、MTU3はPCLK/1024(=24.4140KHz, =40.96uS)注1を使い、両者ともTGRAのコンペアマッチでTCNTがクリアされるようにします。クロックエッジ選択は、MTU0,MTU3共に初期状態の「立ち上がりエッジでカウント」のままです。
注1.PCLKは、システムクロック(ICLK)と同じ25MHzであるものとします。
MTU0,MTU3のタイマコントロールレジスタ
 タイマモードレジスタ(MTU0.TMDR, MTU3.TMDR)は動作モードを決める設定です。
 メロディの発生は波形出力なので、「PWMモード1」または「ノーマルモード」を使用します。またTGRA~TGRDは、初期状態の通常動作とします。
MTU0,MTU3のタイマモードレジスタ
 タイマI/Oコントロールレジスタ(MTU0.TIOR, MTU3.TIOR)は、入出力端子MTIOC0A/B, MTIOC3A/Bの動作を設定します。
 MTIOC0A端子から指定の音(周波数)の波形を出力するには、MTU0.TGRAをアウトプットコンペアレジスタモードで使用し、I/OコントロールAを「初期LOW出力、コンペアマッチでトグル出力」設定にします。これで、コンペアマッチが発生する都度、波形出力(MTIOC0A端子)の 'H' , 'L' が反転されるので、音となる矩形波が出力できます。つまり、コンペアマッチの周期(=MTU0.TGRAの値)で音の高さ(周波数)が決まります。
 ただし、起動時からメロディを鳴らすわけではないので、最初はI/OコントロールAを「出力禁止」にしておきます。
 MTU3.TGRAもアウトプットコンペアレジスタモードで使用し、指定した時間後に割り込みを発生させ、波形出力をOFFすることで音の長さを作成します。したがって、I/OコントロールAの設定は「出力禁止」にします。
 MTIOC0B端子, MTIOC3B端子は使用しないので、I/OコントロールBの設定はMTU0.TIOR, MTU3.TIOR共に「出力禁止」です。
MTU0,MTU3のタイマI/Oコントロールレジスタ
 タイマ割り込み許可レジスタ(MTU0.TIER, MTU3.TIER)は、タイマジェネラルレジスタによるコンペマッチ発生時の割り込み許可/禁止の設定です。
 メロディ発生ではMTU3の「TGR割り込み許可A」のみ許可にし、その他の割り込みは初期状態のまま「割り込み禁止」です。
MTU0,MTU3のタイマ割り込み許可レジスタ

3.設定例

 下記に、MTIOC0A端子からメロディ出力(音出力)を行う設定例、関数Init_Soundを示します。この関数Init_Soundは、マイコン起動後に割り込みマスク状態で1回だけ実行します。
 なお、先に述べたように下記の設定を行った状態では、MTIOC0A端子は「出力禁止」になっていてメロディもビープ音も出力されません。次項に示すプログラム例にあるように、関数Start_Soundを呼ぶことにより、MTIOC0A端子からメロディやビープ音が出力されます。
 このメロディ出力は割り込みで処理(バックグラウンド処理)されるので、関数Start_Soundはすぐに戻ってきます。
設定例のプログラムリスト
※この関数Init_Soundはプログラム例に含まれていますので、見にくい場合はそちらを参照ください。

 マルチファンクションピンコントローラ(MPC.~)、書き込みプロテクトレジスタ(MPC.PWPR)、機能制御レジスタ(MPC.PmnPFS)、プロテクトレジスタ(SYSTEM.PRCR)、モジュールストップコントロールレジスタ(MSTPCRx)などの働きについては、こちら または「RX220グループユーザーズマニュアル ハードウェア編」を参照ください。

4.メロディ発生の仕組み

 マルチファンクションタイマパルスユニット(MTU0, MTU3)を使ったメロディ出力の動作を下図に示します。図中に「区切りの無音」とあるのは、文字通り区切りを示すもので、音が連続すると音階として聞こえず不自然なので入れています。プログラム例では、自動的に区切りが入ります。
メロディ出力の仕組み説明図
 出力するメロディを指定する方法は、楽譜に相当する音の「高さ」と「長さ」を記したデータを配列にして、そのアドレスをあらかじめ与えておくことによります。
 MTU3.TGRAのコンペマッチ割り込み発生時に、そのデータを順に読み出して一音一音を生成します。つまり、音の切り替えや停止は、MTU3.TGRAのコンペマッチ割り込みで行われます。


5.プログラム例

下記に、マルチファンクションタイマパルスユニット(MTU0, MTU3)を使ってメロディを出力するプログラム例を示します。

 ・メロディ発生プログラム例(ソースファイル)

 ・メロディ発生プログラム例(ヘッダファイル)

注意:必ずしも正常にコンパイルおよび正常に動作することを保証するものではありません。一部のマクロ宣言は省略されています。

このプログラム例にある関数Start_Soundを紹介します。

 BOOL Start_Sound(int nMelodyNum);

 引数nMelodyNumに発生させたいメロディの番号(1,2,99)を与えて呼び出します。つまり、楽譜を与えて自由にメロディを鳴らすのではなく、あらかじめ組み込まれたメロディを選択して鳴らすものです。
 引数nMelodyNumで選択できるメロディは次のものです(正確にはメロディは1つのみ)。
 1,2,99以外の引数は無視され、戻り値がFALSEとなります。
 戻り値がTRUE(≠0)の場合「サウンド発生開始(成功)」、FALSE(=0)の場合「サウンド発生なし(異常)」を意味します。
 先に述べたように、メロディ(ビープ音含む)発生は割り込み処理で実行され、関数Start_Soundからはすぐに戻ってきます。もし、途中で発音を止めたい場合は、関数Stop_Soundを呼んでください。
注意:下記にあるように、終端として"RPT_"を指定した場合は、関数Stop_Soundを呼ぶまでメロディ出力を繰り返します。

 プログラム例にある曲「ロンドン橋」以外のメロディを鳴らしたい場合は、「ロンドン橋」の楽譜データ配列であるMelody_2[]を参考に、下記に示す構造体SOUND_Tに従って楽譜データを作成して、その先頭アドレスを関数Start_Soundの引数で選択できるようにしてください。

 typedef struct {
  WORD NOTES;
  WORD TIME;
 } SOUND_T;
/* 構造体宣言(型WORDは無符号16ビットデータを意味します) */
/* 音の高さ(MTU0.TGRAに与える値) */
/* 音の長さ(MTU3.TGRAに与える値) */


 下記に「ロンドン橋」のデータ配列の一部を示します。データの最後には、繰り返すことを示す"{RPT_, T00_}"か、終了を示す"{STP_, T00_}"を記述してください。

SOUND_T Melody_2[]={
 {SO1_, T08_ + (T08_/2)},
 {RA1_, T16_},
 {SO1_, T08_},
 {FA1_, T08_},
  :(途中省略)
 {RPT_, T00_},
};
/* ←構造体SOUND_T形式の配列 */
 
 
 
 
 
/* ←最後を示す(RPT_は繰り返す、STP_は終了の意味) */

注意:ヘッダファイルSound.hで宣言されている、音の高さを示すマクロ(例えばRA1_やSO1_など)および音の長さを示すマクロ(例えばT00_やT02_など)は、PCLKが25MHzであるときのものです。それ以外では正常な発音ができません。

ホームページに戻るトップページに戻る前ページに戻る次ページに進む最終ページに進む
■■■ 注 意 ■■■
1.ここに掲載された内容(写真,図,表などを含む)の、全てまたは一部を無断で使用しないでください。
2.ここで紹介した手法(構造や仕組み,回路,プログラムなどを含む)を使用したことにより、問題や不利益が発生したとしても一切関知しません。
3.ここで紹介したプログラム例は、正常なコンパイルおよび正常な動作を保証するものではありません。