なんでも作っちゃう、かも。

Arduino/Make/フィジカルコンピューティング/電子工作あたりで活動しています。スタバの空きカップを使ったスタバカップアンプなど製作。最近はもっぱらArduinoと3Dプリンタの自作に興味があります。

V850付録基板でOgg Vorbisプレイヤー(12)

Posted by arms22 on 2007年07月12日 0  0

Ogg Vorbisプレイヤーの再生処理を割り込み使った1バイトずつの転送方式からDMAを使った自動転送に変更しました。DMAを使うことで割り込み処理のオーバーヘッドをなくすことができます。
※相変わらず22KHz-16bit-stereoデータのデコードは再生に間に合っていませんが。。

DMAを使った再生処理は次のようになっています。

1.FIFO空き確認
2.OggVorbisファイルをデコード
3.デコードしたデータをFIFO(内蔵RAM)にコピー
4.FIFO(内蔵RAM)のアドレスをDMAの転送元アドレスに設定
5.DMA転送カウント数を設定
6.DMAが止まっていたらDMA転送開始
7.TQ0カウント開始
8.DMA転送完了割り込みでFIFOのリードポインタを更新
9.'1'から'8'をOggVorbisファイルの終わりまで繰り返します

FIFOのサイズは片チャンネルあたり4096バイトです。1回のDMA転送で1024バイト転送します。1024バイトの転送毎にDMA転送完了割り込みが発生します。DMA転送完了割り込みでFIFOのリードポインタを更新し、転送済みのデータを破棄。FIFOに空きを作ります。

DMAの設定は次のようになっています。

チャンネル転送元転送先起動要因
DMA0Lch内蔵RAMDA0CS0INTTQ0CC0
DMA1Rch内蔵RAMDA0CS1INTTQ0CC1

LチャンネルにはDMA0を使用、RチャンネルにはDMA1を使用します。
DMA0の転送先にはDACの出力レジスタDA0CS0を設定、DMA1にはDA0CS1を設定します。
DMA0の起動要因はINTTQ0CC0を設定、DMA1にはINTTQ0CC1を設定します。

TQ0はインターバルタイマに設定します。
TQ0CCR0に再生サンプリング周波数で一致するように値を設定します。
TQ0CCR1にはTQ0CCR0からDMAの読み書きサイクル分11cycleを引いた値を設定します。

現在のOggVorbisPlayerのソースコード http://xfind.hp.infoseek.co.jp/electric/oggplayer/OggVorbisPlayer_7_12.zip

Ads by Google

Leave a reply






管理者にだけ表示を許可する

該当の記事は見つかりませんでした。