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

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

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

Posted by arms22 on 2007年06月24日 0  0

FLASH上においたOgg Vorbisファイルをオープンして、デコード、再生するところまでできた。

用意したデータはmacosxのシステムサウンド「Submarine」をiTunesで44KHz-16bit-stereoから16KHz-16bit-monoデータに変換し、Ogg Drop Xエンコーダで.oggファイルに変換したものを使った。Ogg Drop Xエンコーダで変換する時、ビットレートは最高のVBR Quality 10を指定した。

ov_readで読み込んだデータは符号ありの16bitデータなので符号なしの8bitデータに変換する必要がある。読み込んだ値に32768を足して8bit右シフトしてDA0CSxに書き込む。

16KHz-16bit-monoだとデコードは再生に間に合っている。けど22KHz-16bit-monoだと少しデコードが再生に間に合わない。今はTMQ0の割り込みを使って再生しているので割り込みの負荷が大きい(62.5usに1回割り込みが発生)。これはDMAを使って再生を行えば再生の負荷は減らせる。それにTremorの最適化の余地もまだ残してあるので、22KHz-16bit-stereoぐらいまでは再生できるようにしたい。

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

sp850esで指定ブロックから書き込む

Posted by arms22 on 2007年06月24日 0  0

sp850esで2ブロック以上書き込むとwriteエラーになる件はまだ解決していません。。今までは書き込みに失敗したらまた最初から書き込みをやり直していました。しかし何度も失敗を繰り返していつまでたっても書き込みできませんでした。そこでsp850esに指定ブロックから書き込みを開始する機能を追加しました。この機能を使って書き込みに失敗したブロックから書き込みを再開します。
-block=で書き込みを開始したいブロック番号を指定します。

% ./sp850es -port=/dev/tty.SLAB_USBtoUART -dev=3716 -freq=5000
-bps=38400 -block=1 OggVorbisPlayer.hex

指定ブロックから書き込みを開始する機能を追加したsp850es
http://xfind.hp.infoseek.co.jp/electric/oggplayer/sp850es.c.zip

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

Posted by arms22 on 2007年06月20日 0  0

TMQ0の一致割り込みでDMA0,1を起動させようと思っていたのだが、1つの割り込み信号で複数のDMAの起動してはいけないという注意書きがあった。
またDMAのリード→ライトには11cycle必要なのでDA0にライトしてからDA1へライトするまでに最大550ns(20MHz動作時)の遅延が発生する(無視しても問題ないかもしれない)。
そこでDAxのリアルタイム出力機能を使ってこの遅延をなくす方法を検討してみる。

リアルタイム出力機能はDA0CSxに書き込んだ値がINTTP2CC0信号(DA0),INTTP3CC0信号(DA1)で出力される。
しかし1命令ずつしか命令を実行できないマイコンでTMP2,TMP3を同時に起動することはできない。
INTTP2CC0信号とINTTP3CC0信号を同時に発生させるには少しプログラムを工夫しないといけない。

TMP2を起動してからTMP3を起動するまでのカウント数をコンペアレジスタから予め引いておけばINTTP2CC0信号とINTTP3CC0信号を同時に発生させることができるかもしれない。

こんな感じでどうだろう、、

static USHORT RealTP3CCR0;

void TMP2AndTMP3SyncedStart(void)
{
    register USHORT tp3ctl0,tp2ctl0;
    RealTP3CCR0 = TP3CCR0;
   /*此処は要検討 カウントクロックをfxxとした場合、
     単純に命令実行クロック分の遅延になる?*/
    TP3CCR0 = RealTP3CCR0 - 1;
    tp3ctl0 = TP3CTL0 | 0x80;
    tp2ctl0 = TP2CTL0 | 0x80;
    ClrIORBit(TP3CCIC0,0x40);
    __DI();
    TP2CTL0 = tp2ctl0;
    TP3CTL0 = tp3ctl0;
    __EI();
}

void MD_INTTP3CC0( void )
{
    /* 1回目の割り込みで本当のTP3CCR0レジスタの値を設定する */
    TP3CCR0 = RealTP3CCR0;
    /* Mask interrupt */
    SetIORBit(TP3CCIC0,0x40);
    /* Clear interrupt request flag */
    ClrIORBit(TP3CCIC0,0x80);
}
とここまで書いて、本当にそんなことする必要があるのだろうかと思えてきた。。DMAの起動はINTTQ0CC0とINTTQ0CC1で良いんじゃないかと。

sp850esで2ブロック以上書き込むとエラー

Posted by arms22 on 2007年06月20日 0  0

macosxに移植したELM-Chanさんのsp850esでV850付録基板に2ブロック以上書き込むと3,4割の確率でwriteエラーになる。エラーはデータフレームに対するステータスが規定時間内に受信できないことによるタイムアウトだ。
writeシーケンスを見直して必要なウェイト数を十分確保するように処理を変更したところエラーになる確率が上がった、、だめじゃん。。
verifyを試したところ同様にタイムアウトが発生する。UARTの問題っぽい。

sp850esをmacosxに移植
http://arms22.blog91.fc2.com/blog-entry-74.html

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

Posted by arms22 on 2007年06月15日 3  0

OggVorbisPlayer基板表

OggVorbisPlayer基板裏

SRAMのバスの配線が終わって基板が完成した。
テストプログラムでSRAMのリードとライト動作を確認。
念入りにバイトアクセス、ハーフワードアクセス、ワードアクセスも確認した。
UART経由で結果(OKかNG)を送信する。

Interface6月号のADPCMのサンプルコードをgcc用に移植してオーディオ出力動作も確認した。「あったり~」「ざんね~ん」を繰り返し出力させた。思った以上に音が悪かったのは電源のせいかな?ヘッドフォンに出力しているから音がしゃりしゃりいうのかな。。
アナログ部の電源だけは別にする必要がありそうだ。

SRAMテストプログラム
http://xfind.hp.infoseek.co.jp/electric/oggplayer/sramtest.zip

ADPCMサンプルコード(移植)
http://xfind.hp.infoseek.co.jp/electric/oggplayer/audiosample.zip

参考書籍
Interface (インターフェース) 2007年 06月号 [雑誌]

Design Wave Magazine 2007年07月号 FPGA基板

Posted by arms22 on 2007年06月08日 0  0

Design Wave Magazine 2007年07月号本日発売です。

本誌には以前から予告されていた通りXilinx社のFPGA、Spartan-3EのXC3S250Eを搭載したFPGA基板が付いてきます。
XC3S250Eは25万ゲート相当の論理ブロックを搭載しています、といわれてもぜんぜん規模が想像ができませんが、兎に角いっぱいいっぱい回路を詰め込めるのでしょう。
もうそれを聞いただけでおなかいっぱいです。8~16ビットのマイコンを作れるだけのスペックがあるのかも知れません。
本誌を買った人、全員がオリジナルの8~16ビットマイコンを作ってくれると楽しいかも。

付録基板は3.3vの電圧を供給するだけで動くようです。3.3vレギュレータを実装するパターンとレギュレータ用のコンデンサを実装するパターンがあります。基板上には1.2vレギュレータ、2.5vレギュレータが実装されてます。

付録基板にはプリンタコネクタを実装するパターンはなくJTAGコネクタを実装するパターンしかありません。JTAGジグを持っている人はいいけど、自分でJTAGジグ作るとなるとちょっとおっくうかな。

付録基板のFPGAはSRAMで動作しているのでスタンドアローンで動かしたい場合はコンフィグレーションROMを実装する。付録基板にはコンフィグレーションROM、XCF02SVO20Cを実装するパターンがある。

それはそうとDWMのバックナンバーを見て下さい。
デジャブかと思うくらい記事の構成が同じですw

2003年10月号
http://www.cqpub.co.jp/DWM/contents/dwm0071i.htm
2005年1月号
http://www.cqpub.co.jp/DWM/contents/dwm0086i.htm
2007年07月号
http://www.cqpub.co.jp/DWM/Contents/dwm0116i.htm


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

Posted by arms22 on 2007年06月08日 0  0

アプリレットを使ってV850の周辺機能のレジスタ設定ファイルを作成しました。
gccでコンパイルを通す為にいくつかの修正を加えます。

1.レジスタ定義ファイルの作成
まずgccにはV850のレジスタ定義がないのでレジスタ定義ファイルを作成します。PDFからレジスタ一覧をコピーし型を合わせてヘッダファイルにします。v850es_jg2.hとアセンブラ用にv850es_jg2.incを作成しました。

macrodriver.hを次のように書き換えv850es_jg2.hをインクルードします。

#pragma io → #include "v850es_jg2.h"
crte.sとsystem.sでv850es_jg2.incをインクルードします。
.include "v850es_jg2.inc"

2.アセンブラファイルの修正(crte.s)
mov命令を書き換えます。
TOPPERS/JSPのコードを参考にlea(load effective address)といマクロを作成します。
.macro  lea name, destination
mov  hilo(?name), ?destination
.endm
leaマクロでmov命令を次のように書き換えます。
mov #__ep, ep → lea __ep, ep
省略表記を修正します。
st.w  r0, [r13] → st.w  r0, 0[r13]

mainの引数は要らないので次の行をコメントアウトします。
ld.w  $__argc, r6    -- set argc
movea  $__argv, gp, r7    -- set argv

3.vectorテーブルの作成(inttab.s)
TOPPERS/JSPのコードを参考にjrとnopを挿入するマクロでvectorテーブルを作成します。

4.リンカスクリプトの作成(v850.ld)
TOPPERS/JSPのコードを参考にリンカスクリプトを作成します。vectorテーブルをROMの先頭に配置するようにします。
inttab.sで次のようにセクションを記述し、
.section ".vector", "ax"
.align 4
InterruptHandler  RESET, __start
ReservedHandler   NMI
...
リンカスクリプトで次のように配置します。
MEMORY
{
  IROM(raxi) : org = 0x00000000, len = 256k
  IRAM(wax)  : org = 0x03FF9000, len = 24k
};
SECTIONS
{
  .vector : AT(0)
  {
    *(.vector)
  } >IROM
  ...
gccでコンパイルが通るように修正したソースはこちら。
devdrv.zip レジスタ定義ヘッダファイルも含みます。

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

Posted by arms22 on 2007年06月05日 0  0

OggVorbisプレイヤーに必要なV850の周辺機能をまとめてみました。

機能ブロック用途
BUSCS0外付けSRAM(Tremor用ワークRAM64K)
DACDAC0オーディオ出力L(8bit)
DAC1オーディオ出力R(8bit)
DMADMA0DACレジスタへのデータ転送(内蔵RAM→DAC0)
DMA1DACレジスタへのデータ転送(内蔵RAM→DAC1)
TIMERTMQ0サンプリング周波数(DMA0,DMA1の転送トリガ)
TMM1msインターバルタイマ(速度計測用他)
WTWT0.5s時計タイマ(LED点滅用)
INTINTDMA0DMA0転送完了割り込み
INTDMA1DMA1転送完了割り込み
INTTM0EQ01ms割り込み
INTWT0.5s割り込み
INTUA0RUART受信割り込み
INTUA0TUART送信割り込み
UARTUART0デバッグ用出力
PORTP10ANO0端子
P11ANO1端子
P30UART0 TX端子
P31UART0 RX端子
P32-P35LCD D4-D7
P36LCD RS
P38LCD RW
P39LCD E
P90-P915SRAMアドレスバス(A0-A15)
PCT0SRAMライトイネーブル(WR0)
PCT1SRAMライトイネーブル(WR1)
PCT4SRAMリードイネーブル(RD)
PCT6LED
PDH0-PDH5SRAMアドレスバス(A16-A21)
PDL0-PDL15SRAMデータバス(AD0-AD15)

OggVorbisプレイヤーのシステムの概要は次のとおりです。

1.TremorでOggVorbisファイルをデコードする
2.TremorでデコードしたPCMデータを内蔵RAMにコピー
3.PCMデータのアドレスをDMAの転送元アドレスに設定
4.転送カウント数を設定しDMAを起動
5.DMAはTMQ0の割り込み信号により転送を開始
6.TMQ0の割り込み毎に1byteずつDAC出力レジスタにPCMデータを書き込む
7.DMAの転送完了割り込みで次のPCMデータのアドレスをDMAの転送元アドレスに設定
8.4に戻る

DMA転送中に次のPCMデータをデコードする。
これが間に合うかどうかだな。。

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

Posted by arms22 on 2007年06月03日 0  0

V850回路図

少し間が空いてしまったけど、今回は回路図を作成した。
V850の内蔵RAMは24Kしかなく、Ogg VorbisをデコードするにはRAMが足りないので外付けのSRAMを追加した。手持ちのIS61LV256を2個使って、32K*2=64Kに。
IS61LV256のデータ幅は8ビットなので1つをD0-D7に接続して、もう1つをD8-D15に接続する。
V850にはCS信号の出力機能が無いのでA20,A21からCS信号を生成する。アドレスのデコードには定番の74VHC138を使った。A20=H,A21=Lの時にSRAMが選択されるようにする。

アナログ回路周辺はInterface6月号のADPCMを再生する記事を参考にした。
アンプはLM386を2個用意する。

またV850基板上のレギュレータではSRAM2個を駆動するには出力が足りないので、SRAM用の3.3v電源にTA48033レギュレータを追加した。

さらにデバッグ用にキャラクタLCDをP32~P39に接続する。入力は5VトレラントになっているのでLCDの5V出力をそのまま入力できる。出力もLCD側の入力しきい値が2.2vとなっているのでV850側の3.3v出力で十分'1'判定ができる。これもInterface 6月号を参考にした。

部品はすべて購入して8割ほど半田付けがすんでいる。後はSRAMのバスを接続するだけなのだが、バスの一筆配線が難しくて思うように作業がはかどらない。UEW線を試してみたのだが、うまく被膜が溶けず半田がのらない。むむ。。
バス配線をらくちんに行えるアイテムがあればいいのだが。。

参考書籍
Interface (インターフェース) 2007年 06月号 [雑誌]
Interface (インターフェース) 2007年 07月号 [雑誌]

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