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