ファームウェアの大まかな構成を決める

さて、909クローンのハイハットを鳴らすにはファームウェアを書かないといけません。さっそくプログラミングに入りたいところですが、仕事で書くソフトウェアでも設計しないでいきなり書くと必ずひどい目にあいます。先に進みたくて焦りますが設計に時間を少し割いたほうが良さそうです。

下図は予定しているファームウェアの大まかな構成です。このほかに設定値の記憶など全体を統括する部分も必要になりそうですがとりあえず設計の大筋に影響は出なさそうなので後で考えることにします。図を眺めているうち、プログラムを書く前にタイマの割り当てを考える必要があることが見えてきました。

図の下段は楽器への入力、入力はスイッチ、MIDI、シーケンサの三種類です。中断は主に設定・制御部分で、上段は出力部分です。ファームウェアといえばタイミング制御の塊です。制御するのにタイマが必要な機能ブロックを赤く塗りました。PWM はタイマを使って動かすものなので当然必須です。トリガー発生部は、サービスマニュアルから、各楽器のトリガー幅は 2ms にする必要があることがわかったので、それを制御するために 500 Hz 周期のタイマーが必要です。ADC は値の読み取り自体は専用のタイマを使うのでタイマの割り当てには入りませんが、三入力あって順次切り替えないといけないのでタイマが必要。多分 10ms 間隔ぐらいで切り替えれば十分ですから、100 Hz のタイマが必要としておきました。スイッチは、チャタリングキャンセルのためにタイマが必要です。これも 10ms ぐらいの間隔があれば良いので 100 Hz としました。シーケンサはさらに遅くてかまわないと思いますが、問題なのはテンポを変えるために周波数を可変にしないといけないこと。何か工夫が必要です。

最後は、問題の PCM です。これはやはりサービスマニュアルから、データは約 30 kHz サンプリングで再生すれば良いことがわかりましたが、D/A コンバータの制御のため、この倍の周波数にしておいた方がプログラムが書きやすいので 60 kHz のタイマが必要としておきます。さらにもう一つ問題があります。ハイハットのピッチは可変なので、この PCM 用のタイマも周波数可変にしなくてはいけません。そうすると、 PCM 用のタイマは独立した専用のものが一つ必要そうです。

ATMega64 に内蔵されているタイマは、0, 2 (8 ビット)、1, 3 (16 ビット) の四個です。このうち実は、PWM に使うものは、出力がピンと直結しているため、選択の余地がありません。ここでまずタイマの割り当てが強制的に決まります。PWM 出力ののポート割り当ては以下の表のとおり

PORTPWMTimerPurpose
PB4OC00 (8 bit)Snare Drum Velocity
PB5OC1A1 (16 bit)Snare Drum Tune
PB6OC1B1 (16 bit) Bass Drum Tune
PB7OC2/OC1C2/1 (16 bit) Bass Drum Velocity
PE3OC3A3 (16 bit) Hi-Hat Velocity
PE4OC3B3 (16 bit) Rim Shot Velocity
PE5OC3C3 (16 bit) Hand Clap Velocity

なんと、タイマ 0, 1, 3 と三つのタイマが必要です。PCM には可変の専用のタイマがどうしても必要なので、残ったタイマ 2 を割り当てるとして、他の機能ブロックには専用のタイマは置けません。ですが、PWM のクロックは固定なので分周すれば他のブロックのクロックにまわせそうです。というわけで、構成は以下のように、タイマ 0 から出るタイミングを分周して他の機能ブロックに使わせようと思います

Comments

No comments yet. Why don’t you start the discussion?

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください