液晶搭載マイコン・モジュール (7) サウンド機能追加
(※これまでの関連記事はカテゴリーの「液晶搭載マイコンモジュール」をご覧ください。)
やはり何をやるにしても音がないと寂しい。ということで、液晶搭載マイコン・モジュールに、簡単ではありますが、サウンド機能を追加しました。
まずはハードウェアから。圧電スピーカを取り付けました。取り付け後のイメージは下の通りです。
■ハードウェアについて:
CPUモジュールの仕様書と「すぐ使える!液晶搭載マイコン・モジュール」。(CQ出版社殿の特設ページにリンクします。)の回路図から、このモジュールが2chの16ビットカウンタ(コンパレータ付き)T16E.ch0、T16E.ch1を持っていることが分かりました。今回はそのうちのch1を使用します。
接続はわりと簡単です。T16E.ch1の出力はCPUのP04端子に接続されており、その端子はモジュール基板のCN1の5ピンに配線されています。そこで、そのCN1-5ピンとGNDの間に圧電スピーカをはんだ付けします。GNDはCN1-10ピンから取れます。
(下は接続の様子です。)
半田付けの後は、ケースの内側にホットボンドで固定しました。
以上でハードの準備は完了です。
■ソフトウェアについて:
まずT16E.ch1の出力を有効にします。T16.ch1の出力と汎用IOのP04がCPUの同じピンを共有しており、デフォルト設定ではP04が優先になっているためです。
コードは以下の通りです。main.cのハードウェア初期化ルーチンに入れています。
/*---------------------------------------------*/
// TOUT4 output enable
P0_PMUX_P04MUX = 1; // TOUT4 select
P0_IO_P0IO |= 0x10; // P4 output enable
P0_IEN_P0IEN &= 0xEF; // P4 input disable
次にT16E.ch1カウンタの初期設定をします。
コードは以下の通りです。これもmain.cのハードウェア初期化ルーチンで行います。
// T16E ch1 setting
T16E_CLK1_T16EDF = 0x09; // CLK = PCLK/2048 = about 16KHz
T16E_CTL1_INITOL = 0; // Initial level = LOW
T16E_CTL1_SELFM = 1; // fine mode select
T16E_CTL1_CBUFEN = 1; // Comparison enable
T16E_CTL1_INVOUT = 0; // No invert output
T16E_CTL1_CLKSEL = 0; // internal clock select
T16E_CTL1_OUTEN = 1; // Clock output enabled
T16E_CTL1_T16ERST = 1; // counter reset
T16E_CTL1_T16ERUN = 0; // Timer stop
これで初期設定は完了。以下のようにしてT16E.ch1のコンパレータA,Bによって周期とDutyを設定、タイマーをスタートすれば音が出るようになります。
T16E_CB1_T16ECB = 周期;
T16E_CA1_T16ECA = 周期/2;
T16E_CTL1_T16ERST = 1; // counter reset
T16E_CTL1_T16ERUN = 1; // Timer start
ドレミファソラシドの音を発するサンプルプロジェクトを作りましたのでアップします。
(今回手を加えたのはmain.cだけです。)
「SOUND.zip」をダウンロード (DL後に開発環境C17WBIFからImportしてください。)
音は以下のような感じです。
※※注意事項※※
@ このソフトはCQ出版社殿が「液晶マイコン基板特設ページ」で提供されているサンプルコードを
流用して開発されています。
A 個人での使用、改変、流用は自由です(大いにやってください。)が、外部公開する場合は
@のように必ず流用元を明記してください。
B このサンプルコードを使用して万一発生した直接的、間接的ないかなる内容の損失に対しても、
流用元及び当Blogの管理人は一切の保証責任を負いません。
今回のものは”取り合えず鳴らしてみました”レベルですが、これができれば色々発展が可能です。できれば昔のBASICのようなPlay文での演奏や、タイマーと組み合わせたBGM機能などに手を出していきたいと思います。
以上
にほんブログ村 ←記事が面白かったらクリックしてやってください。
コメント