(日々の記録)デジタルオシロを買った。非圧縮オーディオの再生はやはり難しい(12/23/08)色々迷ったが、直近の次のプロジェクトは16ビットDACを使ったデジタルオーディオに決めた。DACチップを買ったのだ。他は別の用途にも使える。ターゲットマシンを何にするかも迷ったが、結局やはり使い慣れたAVRにすることにする。いうのは、H8/3069Fの現在のMMCインタフェースのSPIは高速と言ってもデータシートを見ると最大速度が250khzしかない。GPIOで手作りすればもっと早く出来るのだろうが、このままではAVRのCPUクロックの1/2のSPI(最大10Mhz)に比べれば見劣りがする。ARMプロセッサーのSTARMはSDカードを、買ってすぐにつけたが、こいつは当初より映像処理を目的にしているうえ、開発環境がまだ整っていないのですぐには立ち上がれない。必然的にAVRに落ち着いた。ファイルからWAVデータを読んでDACチップに投げるだけのプログラムである。始めは軽く考えていたが、サンプリング周波数44.1khz、データサイズ16ビットステレオという非圧縮のオーディオストリームは、シリアルで流れるとすると1.4Mbpsの速さである。MP3のビットレート192kbpsとか256kbpsという速さに比べると桁違いに大きい。下手をするとファイルを読む早さが間に合わないかもしれない。あわててSDカードのアクセス速度を確かめる。老AVR研のこれまでの実測データは、クロック8MhzのMega168で、読み込みが200KB/秒だ(バッファーサイズ128バイト)。オリジナルのchaNさんのレポートでは、9MhzのMega64でバッファーサイズが2048バイトだと300KB/秒近辺である。PCMオーディオの1.4Mbpsをバイトに直すと176KB/秒。うーむ、微妙なところである。余裕がありそうに見えるが、今度はファイルを読むだけでなくDACチップにデータを送るオーバーヘッドがある。SRAMの小さいMega168ではバッファーを大きく取れず難しいかもしれない。サンプリング間隔は、44.1khzだから22(正確には22.67)μsしかない。こんな短い時間で一回のファイルアクセスを完了することはSDカードでは不可能だ。処理は必然的にこの間隔を越えて動かなければならないが、もし、ファイルシステムがタイムディペンダントな部分を含んでいれば、CPUチップだけで再生しようというこの計画は即、破綻である。ソースコードを念入りに調べる。いやいやソースコードがあると言うのは有難いことである。調べた結果、データの送受はすべて1バイトづつSPIのデータレジスタを経由しており、データの読みこみ、書き込みのチェックはループで待っていることがわかった。AVRのSPIは独立したハードウエアであり、途中で割り込みがかかって処理が中断しても、アクセスが遅れるだけでおかしくなることはない。