コメを噛め

コメを噛め

rerofumi の電子工作メモ

Archive for 7月, 2007


hatena bookmark

波形合成だけでCPU負荷を食いつぶしてしまうのは流石にまずいのでいくらかの高速化を考えてみる。
高速化といえばアセンブラで最適化を目指す方向で。

基本的には、発声させる波形データを加算合成するだけなのだが、加算後の値が上限を超えないように制限する必要がある。(サチュレーション)
V850 には飽和加算と飽和減算の命令があるのだけれども、(当然ながら)32bit レジスタに対して行われる。さらに、音声データは8bitで 0時 0x80、+1 0x81, -1 0x7f といったデータである(データ、出力共に)。レジスタ内では 0 時 0x00000000 で +1 は 0x00000001、-1 は 0xffffffff なわけだから、飽和加算・減算の命令を使おうとするとその前後でレジスタ拡張と値のシフトをする必要がある。これが結構手間となる。

そもそもで、CPUが32bitでデータが8bitなのだからいっぺんに4データを処理できるんじゃないの?という話がある。それができたら単純に4倍速だ。
でまあ、そういったパッキングビットに対し、論理演算を重ねて飽和加算・減算をするアルゴリズムというのはちゃんと存在している。グーグル先生に「飽和加算」と訪ねると即座に見つかる情報だ。

Read the rest of this entry »


hatena bookmark

テレビ出力の方が一息ついたので今度は音声の出力。
V850ES/JG2 には DAコンバータが 2ch ついていて、こいつらのセトリングタイムが 100kHz くらいは余裕であるので音声の出力に使える。
でも、電圧的には Vdd 範囲でも電流がほとんど得られないのでスピーカーを駆動させるためにはどうしてもオペアンプを通す必要があるわけだ。


コードの茂みの奥で見えにくいけれども DIP8ピンのICが刺さっている。これはオペアンプではなくて PSoC(CY8C27134)。
PSoC のアナログ部分を使ってゲイン値のプログラム可能な簡易アンプとして使おうという作戦。ついでにローパスフィルタも付けちゃえ。
他に部品が要らないのでラクチンラクチン。実験には最適。
流石にパスコンぐらいは付けないと、スピーカーから盛大なノイズが聞こえるけれどもね。


基板にまとめた。
ついでにタクトスイッチを二つつけて、ソフトウェアでゲイン値を変更できるようにする。簡易ボリュームやね。
PSoCのプロジェクトファイル
psoc_amp_070714.zip
V850側の音声ドライバは、DMA を使って DAC にデータを流し込む方式。
カウンタ TP2 を使って 8kHz のトリガを使い、DMA はそのトリガが来たら 1byte を DAC のレジスタへ転送をする。
一般的な音声ドライバの構成。

わかりにくいので図にするとこんな感じ。複数CH の重ね合わせができるように作ったのだけれども、どうしても 1声しかでなくてしばらく悩んでいた次第。どうやら、音声を合成してバッファに用意する部分の処理が重くて、メインに戻って来れていないのが原因だったらしい。コンパイラの最適化をかけることでなんとか回避。
そのうち高速化を考えるにしても、今のところは気をつけて使う様にすれば良いか。
サンプルソースコード
audio_drv_070714.zip
サンプルでは P4.0〜P4.2 に繋いだスイッチを押すと、エアキャップ(プチプチ)をつぶす音が出る様に作ってある。でも、タクトスイッチのクリック音の方が大きくて全然楽しく無い罠。
音声データは 8kHz MONO の wav ファイルの内、波形データ部分を取り出したものを ROM に焼き込んで、それをならしている。


だんだんゴテゴテとしていくけれども、これで必要な要素は揃った。

hatena bookmark

今日は電子工作関係でいくつか買い物をした。


アルインコの安定化電源。
これまでは秋月の 5V スイッチングアダプタで工作を行ってきたけれども、なんとなくまともな電源が欲しくなったので無線機器用の安いところを購入。DM-310MV を選んだのは出力電圧の変動域が 1〜15V と 5V 以下も OK だったので。そんなに電流は要らないのでシリーズ型(トランス)で十分。


スペックではわかりにくい奥行きを CDケースとの比較で確認しよう。


ちなみにこれまで使っていた 5V スイッチングアダプタ。これでも十分といえば十分ではある。


はんだコテ台のクリーナースポンジ。消耗品。
そろっとぼろぼろになってきたので交換しようかと。


鈴商で売っている 384x192pixel の液晶パネル。VRAMが載っていないのでマイコンからは扱いにくく、PLD とかで CRTC を作らないとならないのだけれども、今ならそのへんもできなくはない事なので。
simさんの周辺で盛り上がっているのがうらやましくなって買ってきた次第。
今のところ、何を作ろうといった案は無いですが。


秋葉原の鈴商というとアナログパーツのお店といった印象があり、マイコン工作からは縁遠いところがあるのであまり寄らなかった次第。でも、それはそれなりに面白いデバイスもあるもんだなあと今回思った。
上はビデオメモリ用のデュアルポートSRAM。小さい方が 256KB(64kx4bit)、大きい方が 1MB(256kx4bit)。これがあると今作っているCRTCでRAMのバス調停を行わなくて済むからフルアクセスできるVRAMが作れる。
後はデータシート次第だな、とか思ったけれども案の定入手困難でとほほ。
90年代前半のデバイスだからデータシートも紙の時代だしなあ。

もっとも、256kbit 程度だったら Spaltan-3E のブロックRAMでヂュアルポートにできるから、FPGA を同等のデバイスとしていくらでも使えるわけですが。
—–


hatena bookmark


ちょいと弄る暇が無かったので遅くなったけれども、MINICUBE2 向けのチップ評価基板が届いた。
NECエレでキャンペーンしていた「MINICUBE2アンケート」のお礼として貰えたもの。アンケートはそれなりに誠意を込めて答えたつもり。


V850 をプログラムするために MINICUBE2 を入手した私だけれども、今回 78k0 を選んだのは多足高機能な 78k0 を試す良いチャンスだと思ったので。

早速開発環境をインストールして Hello, world! として基板上の LED を点滅させてみようとする。
通常は Applilet を使って最低限のスケルトンを生成して貰うのだけれども、空のプロジェクトからスクラッチで作成しようとしてちょいと悩む。
V850 の Cコンパイラで #pragma ioreg するとポート名が使える様になるのだけれども、それに相当するのが #pragma sfr というあたりに気がつかなかった。CC78 のヘルプを眺めてもなぜかそれだと気がつかなくてスルーしてしまった様で。
それとワッチドッグが標準で enable なので disable にしたいんだけれども、そのために 0x0080 にオプションパラメータを置いておかないとならないとか、0x0084 のオプションパラメータを設定しないとオンチップデバッグが使えないとかいった辺りもわかりにくかった。このへんは Applilet の出力を参考に、必要なコードを持ってきた方が早い。


そんなこんなでなんとかチカチカできて良かった良かった。
何が必要かはわかったので、以降は普通に使える事でしょ。ソースコード
78k0_led_070711.zipこれまでは PIC や PSoC をそれなりに使ってきたのであまり考えたことなかったけれども、日本語のドキュメントが揃っているというのは実はかなり大きなアドバンテージなんじゃなかろうか>NECのマイコン
(PICでも一部超メジャーなチップは日本語データシートがあったりするけど)
それ故に個人の電子工作向けに入手できる品が少ないというのは残念な感じ。

hatena bookmark

コンフィギュレーションROMを入手するのがめんどくさいので弄ることはないでしょ、とか思っていたDWMのSpartan3E基板。なんとなく Digikey を覗いてみたら、対象のコンフィギュレーションROM(XCF02S)が 550円程度だったので買ってみる事に。
最も、日本からの Digikey 利用は手数料 2〜3000円がかかるので割安感のためには 4個以上買わないとならないのですが。


てなわけで到着。


梱包はこんな感じ。


ブツ。


ハンダ付けの際はルーペが活躍。


まあ、これくらいなら手はんだでもなんとか。
面倒な場合はブリッジ上等な感じのはんだ多めで取り敢えず盛っておいて、はんだ吸い取り線でブリッジを除去しつつ整えていく感じで作業するのがよろしいかと。


無事バウンダリチェーンに現れた。
最初 J1 をカットするのを忘れていて悩んだのは秘密。試しにLEDピカピカテストをコンフィギュレーションROMに書き込んでみた。
これでダウンロード無しに、電源投入そくピカピカなのです。将来的にはこれでなんか作ってみるかねえ。

hatena bookmark

細かい調整も終わり、ひとまず CPLD CRTC も予定通りに仕上がった感じ。
高機能じゃないけれどもね。
cpld_ctrc_070706.zip


表示しながらの画面描画実験。
フラッシュビデオ その1

するするとシャッターの様に描かれていくのは、CRTCとCPUのSRAMバスアービトレーションを行っていないから。
CRTCが画面を描いている時というのは一生懸命SRAMからデータを読んでいる時である。そんなときにCPUから読み書きしようとするとバスが衝突してとんでもないアドレスを表示してしまうことになるし、CPUも思ったところに思ったデータが書けないことになる。
そこで、CRTCがSRAMからデータを読み出している期間はCPUからのアクセスを遮断している。この時、CPUがSRAMにアクセスできるのはCRTCが画面を描いていない時、つまりVBLANK期間だけとなる。
その隙を狙って描画するのだが、このテストコードではその VBLANK期間にだいたい5〜6ラインくらい描いているようだ。
CRTCのENABLEを下げて無効にすると画面は真っ暗になるが、フルタイムでSRAMにアクセスできるので 1枚画をその隙に転送するとか、画面をクリアするとかに使う。


そんな様子を眺めていてもつまんないだろうから、もちょっと見れるように即興でライフゲームを作ってみた。
フラッシュビデオ その2

まあ、ライフゲームを見て楽しいかどうかは人によるとは思うけれども。

一応ソースコード。やっつけ風味。
crtc_life_demo.zip