P/ECE研究室〜S1C33分室
* Sun Feb 3 19:43:00 JST 2002 Naoyuki Sawa
今回は、16ビットプログラマブルタイマ(以下、16ビットタイマ)を使ってみます。
以前取り上げた8ビットタイマは、チャネル毎にある程度役割が固定されていました。
チャネル毎に、内蔵シリアルコントローラへのクロック供給の組み合わせや、
クロック出力の可・不可、割り込み生成の可・不可、最低割り込み間隔等が異なっており、
CPUの設計段階から、あらかじめ、ある程度用途を想定して用意されたタイマのようでした。
これに対し、16ビットタイマは、チャンネル毎の性格の違いがあまりありません。
チャネル0〜5のいずれも、クロック出力・割り込み生成の機能を持っています。
唯一チャネル0だけが、CPUの暴走監視用タイマや、A/D変換トリガとして利用できる点が異なっています。
専用性の高い8ビットタイマに対し、16ビットタイマは汎用性が高く、使いやすいタイマだと思われます。
しかしながら、単に一定間隔で割り込みを生成するだけなら、8ビットタイマの方が単純で使いやすいのです。
16ビットタイマの特徴は、デューティー比を自由に変化させられる、クロック生成機能にあります。
16ビットタイマの各チャネルの、P/ECEでの用途は、次のようになっています。
チャネル | P/ECEでの用途 | 動作
|
0 | システムタイマ | 1ミリ秒間隔の割り込み生成
|
1 | サウンド再生 | サウンドデータに合わせたクロック出力
|
2 | 未使用(サウンド再生の予備) | 未使用
|
3 | 未使用 | 未使用
|
4 | USBへのクロック供給 | 6MHzのクロック出力
|
5 | 赤外線のキャリアクロック | 38KHzのクロック出力・割り込み生成
|
チャネル2がサウンド再生の予備となっている点が、興味深いです。
BIOS 1.18現在のサウンドドライバソース(snd.c)では、InitSound()で停止処理が行われているだけで、
後はstop_pcm()に割り込みOFFを行っていた形跡(現在はコメントアウト)が残っているのみです。
これだけの情報から推測するに、現在は高速DMAチャネル1の転送終了割り込みが担っている処理を、
以前は16bitタイマチャネル2からの割り込みで処理していたのかも知れません。
あるいは、チャネル1と同じように使用して、ステレオサウンド対応の予定があったのでしょうか?
もしも今後ステレオサウンド対応が行われたとすると、IDMAのリンク機能が有効に使えそうですね。
今回の実験では、チャネル1(サウンド用タイマ)のクロック出力の周波数を操作して、簡単な音を鳴らしてみます。
ちなみにP/ECEのサウンドドライバは、クロック出力の周波数を変化させて、曲や効果音を鳴らしているのではありません。
周波数は一定のまま、デューティ比だけを変化させて、音を鳴らしています。これは、PWMという方式だそうです。
少し話は脱線しますが、僕は、PWMという言葉をP/ECEの仕様一覧で初めて目にしました。
そこで、どういう方式なのか調べるために、Web上の資料などに当たってみたのですが、いまいち理解できません。
FM音源(OPL)の音声合成モードのような、とても特殊で理解しづらい方式なのだろうか?と、あきらめかけたていたところ、
S1C33 Family アプリケーションノート(33Application-J.pdf、96ページ)に、とてもわかりやすい解説を見つけました。
簡単に言うと、「70%の力を1秒間出す」のは、「100%の力を0.7秒間出してあとは休む」のと同じ、といったところでしょうか。
前者がおなじみのPCM方式で、後者がPWM方式に相当します。
PWM方式の利点は、力の制御が0%と100%の二段階だけで済むので、70%などの微妙な力加減を制御する回路が不要になることです。
メガドライブ(スーパー32X)や、ワンダースワンの音源にも、PWM方式が採用されているそうです。メガドライブは意外ですね。
また、音に限らず、モーターの制御などにも利用されている技術だそうです。
PWM方式については、概要を理解したところまでで、まだ実際に試していないので、いずれ実験してみようと思います。
さて、PWMについては今後改めて実験することにし、今回は単純に周波数を変化させて、音程を変えてみることにしました。
ソースはこちら
十字キーの上下で音の高さを変え、左右で音色を変えます。実際に行っている処理で説明しますと、
上下でコンペアBの設定値を変えて周波数を変化させ、左右でコンペアAの設定値を変えてデューティー比を変化させています。
単純ですが、期待通りの動作が確認できます。
今回の実験で、少し収穫がありました。S1C33209/221/222テクニカルマニュアル(s1c33209_221_222j.pdf)の276ページ目には、
「コンペアデータレジスタAとBに同じ値を設定すると、ハザードパルスが出力されることがあります。
タイマ出力を使用する場合は、コンペアデータレジスタAとBを同じ値には設定しないでください。」
という記述があります。「ハザードパルス」という言葉は初耳でしたので、Webで調べてみたのですが、見つけることができません。
もしかして、すごい大音量の雑音とかが出るんだろうか...と少々恐れていたのですが、実際には無音状態にしかなりませんでした。
周辺回路へのクロック供給に16bitタイマのクロック出力を利用する場合は、微妙な「ハザードパルス」でも悪影響があるのでしょうが、
少なくともサウンド出力に関しては、さほど心配することはなさそうです。
そもそも、周辺回路へのクロック供給が目的なら、コンペアデータレジスタを頻繁に書き換えることはないでしょうし、
コンペアデータレジスタAの値とBの値を同じにするような状況はありえないはずです。
今回は一番単純な方法で音を出してみましたが、PWM方式もとても面白そうですね。
いずれ自分でプログラムしてみたいと思います。現在は、snd.cを読んでPWMのプログラミングを勉強中です。
次回は、A/D変換器か、シリアルインターフェイスを取り上げる予定です。
(続きます...)
nsawa@piece-me.org