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

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

Xfind 0.8.7 リリースしました。

Posted by arms22 on 2007年07月23日 6  0

Xfind 0.8.7 リリースしました。
今回のリリースはいくつかのバグフィクスとほそぼそとした機能の追加がメインです。
※appcast経由でアップデートを行うと失敗してしまうので、
今回は手動アップデートをお願いいたします。。

XfindはMacOSX用の2画面ファイル管理ソフトです。
右と左に2つのファイル表示画面をもっていて、右画面から左画面、 左画面から右画面へのファイル操作を想定して作られています。
基本操作はすべてキーボードのみで行えます。
マウスが嫌いな方、キーボードだけでMacを操作する人にぴったりです。

ダウンロードはこちらから
http://xfind.hp.infoseek.co.jp/downloadcenter.shtml

Xfind希望、要望、バグ報告はこちら
http://arms22.blog91.fc2.com/blog-entry-92.html

主な変更点
・シンボリックリンク作成機能追加(lキー)
・ウィンドウ移動機能追加(cmd+~ cmd+`)
・日付フォーマット変更(時分表示)
・Windowsで圧縮したZIP書庫を解凍できない不具合を修正
・ドライブ間の移動がコピー動作になる不具合を修正

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

トランジスタ技術 2007年 8月号 dsPIC基板

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

トランジスタ技術 2007年 8月号、本日発売です。
本誌には16ビットPICマイコンdsPIC30F2012を搭載した基板が付いてきます!
搭載しているdsPIC30F2012の最高動作周波数120MHz!
内蔵メモリはフラッシュ・メモリが12Kバイト、SRAM が1024 バイト。

dsPICについてはこちらが参考になります。
http://adsp2191.hp.infoseek.co.jp/misc/017_dspic.shtml

OggVorbisPlayer用の外付けDACにしようかしら。。


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

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

Tremorを最適化して22KHz-16bit-monoデータを再生させることができた。22KHz-16bit-stereoはまだデコードが追いつかない。
今回行った最適化はov_read8関数の作成と幾つかの処理をインラインアセンブラにした。
ov_read8関数はov_readの改造版で符号なし8bitデータを返す関数だ。バッファに値をコピーする前に符号あり16bitデータを8bitデータに変換してコピーする。バッファ容量の節約と処理時間の節約に繋がる。
インラインアセンブラはasm_arm.hを参考にMULT32/MULT31_SHIFT15/CLIP_TO_15/CLIP_TO_8の4つの関数をインラインアセンブラ化した。※CLIP_TO_15関数はov_read8関数では使用していない。変わりにCLIP_TO_8関数を使用している。CLIP_TO_8関数はCLIP_TO_15関数に加算とシフトを追加した関数。
今回のインラインアセンブラで書いてて一番面白かったのはCLIP_TO_15関数だ。
CLIP_TO_15関数は入力値を符号あり16bitの最大値、最小値に飽和処理してくれる。C言語で書くと次のようになる。

if(x>32767)x=32767;
if(x<-32768)x=-32768;
return(x);
Tremorはもう少し賢くて次のようなコードで書いている。
int ret=x;
ret-= ((x<=32767)-1)&(x-32767);
ret-= ((x>=-32768)-1)&(x+32768);
return(ret);
しかし上の二つのコードはV850でコンパイルするとどちらも条件分岐を含んだコードを生成する。 V850の飽和加算、飽和減算を使えば上記のコードは条件分岐なしで書く事ができる。
int tmp;
asm volatile("mov	0x7fff8000, %1?n?t"
                   "satadd	%1, %0?n?t"
                    "sub	%1, %0?n?t"
                    "satsub	%1, %0?n?t"
                    "add	%1, %0?n?t"
                    : "+r"(x), "=r"(tmp)
                    :
                    : "cc");
return x;
satadd/satsub命令は飽和処理付きの加算/減算命令で、演算結果が正の最大値0x7fffffffを越えたときは0x7fffffffを、負の最大値0x80000000を越えたときは0x80000000をレジスタに格納する。
正側の飽和処理はsatadd命令で入力値xと0x7fff8000を加算し、その結果から0x7fff8000を引く。するとxが0x7fffを超えていた時は0x7fff、xが0x7fff以下ならxがそのまま返る。
負側の飽和処理は正側の逆で、satsub命令で入力値xから0x7fff8000を減算し、その結果に0x7fff8000を足す。するとxが0x8000を超えていた場合は0x8000、xが0x8000以下ならxがそのまま返る。

今回の成果物OggVorbisPlayerのソースコード
http://xfind.hp.infoseek.co.jp/electric/oggplayer/OggVorbisPlayer_7_1.zip

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