« 2009年3月 | トップページ | 2009年5月 »

2009年4月の4件の記事

2009年4月26日 (日)

STM32基板にもJTAGインターフェース

薄紙をはがすように見えてくる(4/21/09)
 ARMプロセッサーの構造が少しづつ少しづつ理解できるようになってきた。これまでチンプンカンプンだった雑誌の記事が意味のあるものになってくる。GNUを使ったSTM32基板のプログラム開発の記事(DWM誌2008年6月号4章)など、最初は全く理解できなかったが、周辺の情報が増えたので少しづつ具体的なイメージが湧いて手順が見えるようになってきた。薄紙をはがすように全体が見えてくる。これはこれで楽しいものである。

 スタートアップルーチンが必須であることも、この記事にちゃんと書いてあった。スタートアップルーチンから、Cソースのmain.cにどうやって制御を渡すのかわからなかったが、ソースを調べると例外割込みベクターにあることがわかり、全体の流れがはっきりしてきた。CPUが複数の動作モードを持ち(やっと本格的なコンピューターになってきた)、メモリリソースの割り当てが柔軟に出来るようになっているため、無理にCで書くよりアセンブラーで書いたほうが手順がわかりやすいということも何となくわかる。

 ただ、完全にわかったわけではないから、現在のソースやスクリプトをどう変えて行けば、ターゲットマシンでうまく動くのかという具体的な手順はまだまだ見当がつかない。暫くは有りものを手探りで使っていくしかない。

 8ビットマシンのAVRから、いきなり32ビットのARMに移行しようというのだから少し無理があることは確かだ。本来の次のステップは16ビットマシンのH8なのだろうが、H8では設計が古すぎ、SPIが250khzどまりでは話にならない。H8/3069Fの900ページを超すデータシートも1/3まで印刷して勉強していたが、最終的なゴールを動画あたりまでとすると、どうも先行きがない。この際は、ちょっと無理をしてでも32ビットマシンにしておいた方が良いだろう。雑誌のオマケ基板でなBb_revb_top_numbered_2く、直接ARMを買うにしても今はそう高くない。

もう少しでBeagle BoardのRev Cを注文しそうになる(4/22/09)
 以前の記事(2/26)にも書いたハイエンドのCPUボードの新版がもう市場に出ていることを知った。ARMの情報収集をしていて迷い込んだ2ちゃんねるのサイトに出ていた。結構アンテナを立てていたのだが、なかなか普通のサイトでは出てこない。時々はこのサイトもチェックしておく必要があるようだ。

 この新版のRev Cは、基板に場所があるだけのUSBのホストインターフェース(写真の8)や、その他の不具合がほぼ解消されており、RAMが倍増して256MBになっているが値段は149ドルBb_revc_top_numberedと前のままだ。日本円では¥17000ばかりで手に入る。日本ではDigiKeyのサイトから買え、すでに買った人のレポートまである。

 このボード何しろLinuxが軽々動きXwindowまで動くグラフィック機能を内蔵している。一時期Linuxにはまっていた がた老AVR研究所としては、今のことを放り出しても手に入れたい強烈な物欲にかられる。しかし、今はARMのJTAGインターフェースまで買って2つのARM基板を動かそうとしているところだ。それどころではない。

 それでもいつのまにか気がついてみるとPCの画面は、物欲の悪魔に誘われてDigiKeyのサイトになっている。「Linuxが動くからUSB経由で、インターネットもHDD接続も自由自在。お家サーバーとしては省電力で実用性は抜群」と悪魔がささやく。DigiKeyの発注画面を前にしてもう少しで注文のクリックを押すところまで行ったが、やっとのことで思いとどまった。

STM32基板でもJTAGコマンドが動いた(4/24/09)
 LPC2388基板がzusさんのサイトの助けを借りてEclipse上でロード/デバッグができるようになった。しかし、去年のARMの付録基板Cortex-M3(STM32F103)は取り残されたままである。同サイトにはこのSTM32基板の方の開発環境の設定ガイドもあるが、殆ど同じ手順を繰り返すことになっており経験値の向上には余り役に立たない感じがした。

 そこで、別の手順でオープンソースの開発を勉強することにする。雑誌のSTM32基板にはUSBからファームが書き込めるライター(Dfu)があらかじめROMに焼かれており、これを残した形で開発環境を作って行きたい。STM32用のサンプルプログラムは沢山あるが、殆どがこのライターを消してしまう。JTAGインターフェースを買ったのであまりこだわることはないのだが、書き込みの手段は複数残しておきたいからだ。

 調べるうち、このあいだのDWM誌2008年6月号4章のGNUの記事のサンプルプログラムがDfuを残して動くようになっていることがわかった。UARTもついていてちょうど良い。これを手始めにSTM32のGNU開発を進めることにする。

 Eclipse上ではなく、DOS画面からgnuツールのコマンドを入れていく。サンプルプログラムはWINARMのgnuツールでビルドしているが、こちらはCodeSourceryである。記事のコードを雑誌社のウェブから落とし、その改修のためMakefileを改めて詳細に見る。おや、このMakefileは相当コンパクトに出来ているのでわかりやすい。

 Makefileは、昔Linuxにはまって、カーネルビルドを繰り返した頃に少し勉強したが、このすさまじい変数置換と、恐ろしいまでのネスト構造に圧倒されて完全に理解するところまでは行けなかった。AVRでは、AVRstudioに任せてMakefileをさぼっていた。そんなに沢山のモジュールで構成するわけでもない組み込みコンピューターでMakefileを使うのは大げさすぎると思ったからである。

 改めて、基本から勉強し直す。先生はウェブにころがっているMakefileの入門記事である。その結果、沢山の派生機能はあるが、基本はそう複雑ではないことがわかった。暗黙的なルールというのがあるということ(単純なコンパイルではオブジェクトファイルだけの記述で良い)を、遅まきながら始めて知った。これが今までリストを見て良く理解できなかったところだった。

 今度のMakefileは簡単なものだったので変更するところはすぐわかった。要するに$CCとしているコンパイラーのパスを、/usr/local/arm-tools/bin/arm-elf-gccなどから、今度のgnuツールの置いてある\gcc\arm-none-eabi-gcc.exeなどに替えるだけで良さそうである。Makefileが入っているディレクトリ内のファイルはすべてあまさずコピーして持ってくることが肝腎なようだ。ひとつのMakefileはカレントディレクトリの中で完結しているからである。St32

 DOS画面上でmake allする。エラーもなく素直にビルドできた。JTAGはまだ動いていないので、例のDfuでUSBから基板に書き込む。うむ、うまく書き込めたようだ。これでジャンパーをオープンしてリセット(USBコードぬきさし)するとUART端末に数字がでるはずだ。PCのTera Termを立ち上げたが、つながっているはずのUSBの仮想端末が見えない。当然何も動かない。何か大きな勘違いがあるようだ。

St32jtag 記事を読み返す。ありゃりゃあ、プログラムのUART1というのはUSB経由の仮想UARTじゃない。別のピンに出ている普通のUARTのことだ。お馬鹿な勘違いである。基板はまだ何も実装していないので、ICピンコードでブレッドボード上のUSBシリアル変換基板と空中接続し、2本のUSBケーブルを基板とシリアル変換基板につなぐ。よーし、TeraTerm画面に何か出た。ボーレートを合わせると、動いた。動いた。LEDのON/OFFもキーボードから出来た。うむ、これで一歩また先に進んだ。

Ocd Eclipseへの持込みも、一旦新規プロジェクトを起こしてから、ファイル一式をフォルダーに放り込み、「refresh」すると、プロジェクトにすんなり入ることもわかった。快調、快調である。調子に乗って、STM32基板のマザーボードを作り、JTAGの20ピンソケットも実装する。今度はzusさんのサイトのSTM32開発環境の記事を参考に、JTAGまわりのソフトを整える。OCDを動かしてみた。問題なく動いた。少し勉強が進んだので、TelnetでOCDに入り、色々なコマンドを試す。視界をさえぎっていた霧が晴れて、段々周りが明るくなってきた感じである。

| | コメント (0) | トラックバック (1)

2009年4月21日 (火)

ARM基板にJTAGからのファーム書き込み成功

まっさらな付録基板にはJTAGから書き込めない(4/18/09)
 LPC2388付録基板にUSBソケット、JTAGソケット、ジャンパーピンをとりあえずハンダ付けして、いよいよ実験を開始した。OlimexのTINY-USB-JTAGケーブルのOpenOCDでの認識はDOS画面で認識を確認した。Eclipseに持ち込む。このデバッグコマンドのスクリプト入力が結構大変である。殆ど意味を理解しないまま、フラッシュ書き込みと、デバッグ開始のスクリプトを言われるままウェブ画面からコピーしたりして入力する。A4201806

 zusさんの解説サイトの指定どおり、OpenOCDをEclipseの中で立ち上げる。うむ、ちゃんと正しいメッセージが出ているようだ。次はフラッシュの書き込みである。ここで迷ったのが、CPUモードをISPモードにするジャンパーピン(JP2)の設定である。ファームをJTAGインターフェースからフラッシュに書くのだからISPモードではないと思うが、サイトには何の説明もない。リセットをいつするのかの指定もない。

 わからないときは何も考えずにやることだ。JP2をオープン(通常状態)にし、JP1(リセット)を押した後、フラッシュ書き込みをEclpseから指定した。しかし出てきたメッセージはどうも、ウェブに出ている正常終了のメッセージではない。フラッシュを書き込んだというメッセージが出ない。

出てきたメッセージを訳がわからないまま、一応追っていく。どうも以下のところからおかしい。

cpsr: 0xa00000f3 pc: 0x7fffe152
timeout waiting for SYSCOMP & DBGACK, last DBG_STATUS: 0
Runtime error, file "target/lpc2388.cfg", line 52:
in procedure 'mt_internal_rc' called at file "command.c", line 456

load main.elf
Error erasing flash with vFlashErase packet

メッセージ通り解釈すると、mt_internal_rcというプロセスでRuntime errorが起き、
main.elfというターゲットのバイナリをロードできないと言っている。vFlashErase packetというのがわからないが恐らく消去コマンドの名前だろう。このあと連続するエラーメッセージは、プログラムが書けていないためによるものと思われる。不思議なことにJP2をショート(ISPモード)させてリセットしたあとのISPモードでも同じ結果がでる。

 こうなるとこの先どうしたら良いのかもうわからない。いきなり大量の情報を放り込まれて頭の中は完全に飽和状態である。他のサイトもあたってみるが、思わしい手がかりはない。解説サイトのインストールの手順をその通りやったか詳細に確かめてみるが、どこも間違っていない。完全に暗礁に乗り上げてしまった。

 やれやれ、こうなったら一つ一つ要素を確認していくしかない。まずJTAGインターフェースがOCDのもとで動いていることは別の環境(DOS)で確かめられている。基板はどうだ。仮想シリアルのUSBが動いていることは、PCがCOMポートを認識しているので間違いない。本体のCPUはどうか。そうだ。雑誌の記事には別のライターでプログラムを書き込む手順が出ている。これでCPU周りを確認してみよう。

 早速、FlashMagicという書き込みプログラムをサイトからダウンロードし、雑誌のサイトからテストプログラムのバイナリーを落としてシリアルで書き込むことにした。順調にファームウエアが書き込まれた。リセットしてみる。おお、LEDが点滅を始めた。CPU周りもOKなようだ。 A4201812

 ここで何となく予感がひらめいた。このままもう一度Eclpseを立ち上げてJTAGを動かせばうまく行くのではないかという予感である。何の根拠もないが、昔こんなことがあったような記憶がある。 やるだけやってみよう。 JTAGケーブルをつなぐのももどかしく、Eclipseからフラッシュ書き込みを指示する。おや、出てくるメッセージが違うぞ。うまくいったかどうかはわからないが前とは別のメッセージだ。これは期待が持てる。

 出てきたメッセージを見直す。沢山の経過と警告のメッセージのあと、
wrote 1232 byte from file main.elf in ...... というファームが書き込まれたことを示す行を発見した。やった。やった。うまく書けたようだ。リセットしてみる。見事、LEDが点滅し始めた。思わずガッツポーズが出る。

 勘があたった。最初のシリアルライターのファーム書き込みで何かCPUの状態が変わったのだ。理由はまだ良く分からないが、AVRのフューズビットのようなものがARMにもあってCPUの環境が変わり、書き込みがOKになったような感じだ。Jtagload

 ここ一週間かかりきりになっていたARMの開発環境がやっと所定どおり動き始めたようだ。念のために、こちらのソースに少し手を入れてLEDの点滅間隔を短くし、ビルドし直して書き込む。よーし、JTAGで書き込んだ後は点滅が早くなった。間違いない。新しくファームがJTAGを通して書き込まれている。

 Eclipseのデバッグモードに入る。これも問題ない。ちゃんと指定のところで止まる。レジュームボタンを押すと点滅を再開する。いやあ嬉しい。まだ分からないことだらけだがとにかくARMでの新しい第一歩である。

やっぱりchaNさんのソースを使うのか(4/20/09)
 ARMの勉強を始めて、やっとプログラムの開発が出来る環境が揃った。LEDの点滅はもう良いだろう。次のステップに進もうと、参考になるプログラムソースを求めてウェブをさまよった。 

 このARMはどうもC言語のソースだけでは動かなく、必ずアセンブラーのスタートアップルーチンが必要なようだ。32ビットマシンなので最初の設定が沢山あり大変だ。これはお手本がないと、とてもまともに動かすことは出来ない。クロックすら所定のスピードにするために何段階かの手順を踏む必要がある。

 これからの腹案としては、AVRの時と同じように、UARTを入れてプロセッサーとお話をし、そのあとIICを入れてRTCを動かしたり、LCDをつけたり、最終的には、SDカードアクセスまで進むつもりをしていた。しかしなかなか手頃なソースが見つからない。

 ところが、このあいだダウンロードさせて貰ったchaNさんのLPC2000試食プログラムのソースを少し調べてみて驚いた。これは私が今からやろうとしているアプリケーションをすべて実現した完全なソースリストだ。

 さらによく見てみたら、スタートアップルーチンだと思っていたアセンブラープログラムは、割込みの制御と複数タスクをディスパッチする簡単なマルチタスクモニターであることがわかった。しかもSDカードの中身をダンプしたりするUARTのモニタープログラムまで入っている。うひゃあ、こりゃもうやることがない。

 折角、32ビットプロセッサーなのだからUARTから始めて少しづつ経験値を高めていこうと思ったのだが、ここにみんな解答が出てしまっている。恐れ入りました。WINARMの環境から、Codesourceryに移さなければいけないが、ここは素直にこのソースリストから必要なコードを少しづつ頂いてARMのお勉強をすることにしよう。

| | コメント (1) | トラックバック (0)

2009年4月18日 (土)

ARMの開発環境を作っている

オーバークロックの石は2.6Vでも動く(4/10/09)
 SDカードのLPCMプレーヤーのプロジェクトは一段落した。今は今後のために現用のリチウムバッテリーの長期テストをしている。満充電のあと、プレーヤーを動かした時間をこまめに記録し、そのときの電圧を測った。LEDをつけていない実装版は、消費する電流が音楽再生中で50mA程度である。バッテリーの容量は、830mAhとあるので16時間は持つ見込みである。ただこの公称の電池容量というのは連続放電であり、現在のテストのように通電と待機を30分くらいづつ繰り返すような使い方だともう少し伸びるかもしれない。Litiumbatt

 久しぶりに方眼紙を取り出し、小学生の実験よろしく電圧をプロットしていく。これはこれで結構はまる(やめられなくなる)。いつ過放電前の3.7V近辺の急峻なカーブがでてくるかわくわくしながら測っていくと時間がたつのを忘れる。 放電開始の4.1Vから電圧は少しづつ下がっていき、定格の3.7Vのあたりはむしろ電圧低下が少ない。あれ、測定間違いかといぶかっていると、突然、堰を切ったように電圧が下がり始める。3Vを下回ったあとは分単位で放電下限電圧の2.5Vに近づく。非常にドラマティックな放電カーブだ。

 結局、持続時間は少しづつ休んで動かしていたため、予想よりかなり長い間電池が持つことが分かった。想定では、17時間足らずの持続時間だったが、実際には19時間以上動いた。しかも20Mhzのオーバークロックの石は電源電圧が3Vでも正常に動く。ただ3Vを下回るとLCDは一気に薄くなり音が歪み始める。さすがに2.6V以下になるとMCUのクロックが動かなくなった。これなら過放電の心配はなさそうだ。とはいえ、音が出なくなることに気がつかなければ過放電させてしまう危険性はある。

お試し版の開発環境には乗らない(4/11/09)
 電池テストの傍ら、次のプロジェクトとして考えている雑誌付録で2つも揃ったARMプロセッサーの開発環境を整える情報収集をウェブでやっている。雑誌に必ずついているお試し版の商用のコンパイラーや開発環境は、もとから使う気はない。お試し版は無料だが、フラッシュサイズが限定されており、苦労してインストールしてもすぐに不満が出るのは見えている。A4181800

 これらの正規版が1万円内外なら、やっと慣れた環境を維持するため買ってしまいそうだが、幸か不幸か正規版は、安いものでも5万円以上、大抵の製品は十数万円のレベルだ。企業で使うならともかくとてもアマチュアが気楽に買えるレベルではない。雑誌の付録でプロセッサーを手に入れる対象は殆どがアマチュアか学生であろう。お試し版を無料で提供して正規版を買わせる魂胆なら、こんな料金体系は間違っている。余りうまい商法とは思えない。

 ソフトを有料にすれば、サポートに責任が生じる。まともなサポートをすれば、10万円でも下手をすれば元がとれないのは理解できる。割り切ってオープンソースのような無サポートの廉価版を出せば良いのだ。そうすればもっと製品は売れると思う。ウェブに情報が溢れている時代である。ましてやGNUという強敵と戦うには余りにも芸がなさ過ぎる。このままでは有料の開発環境の市場は狭まっていく一方だろう。

 こちらも当初から当然GNUプロジェクトのお世話になることにしていたが、基板を手に入れた頃は、オープンソースの開発環境はソースからビルドするような情報しかなく、少し手ごわいので様子を見ていた。

 ところが、PCMプレーヤーの開発が終わって改めてARM用のオープンソースの開発環境を調べてみて驚いた。いつの間にか沢山の環境の情報がウェブに溢れている。しかも、いわゆる人柱と呼ばれる先駆者がウェブ上でインストールの状況を報告してくれている。ありがたいことである。

 しかし、これが余りにも種類が多く目移りがしてなかなか決まらない。中身は皆同じgccらしいが、ちょうどLinuxが商用ベンダーによって多くのディストリビューションが生まれたように、数多くのプロダクトがでている。どれが良いのかはウェブで見る限りでは良くわからない。

 さらに、ファームを書き込むツールになるともっと種類がある。デバッガーにもなるJTAGインターフェースを使った本格的なものから、単純なパラレルやシリアルライターまでありこれも何を選んでよいのか迷ってしまう。FatFSでお世話になっているchaNさんも、最近、この雑誌の付録基板の応用を紹介されている。何と、自前のプログラマーとシリアルで書き込むライターの回路図まで用意してある。とても簡単そうだ。

 これに強く動かされたのだけれど、定番のJTAGインターフェースをマスターしてみたい気分がまさり、今度は市販の安いJTAGインターフェースを買ってみることに決めた。これも自作できそうだが、不確定要素を減らすためこの際は我慢して既製品を買うことにする。1万円以下というのが私の場合このあたりのトレードオフのようだ。

 それに、統合環境で名高いEclipseも使ってみたかった。で、ウェブの紹介記事の中でも、一番詳しいここの記事(http://homepage3.nifty.com/zus/index.html)を頼りにターゲットを定めて開発環境を作っていくことにした。このページは実に懇切丁寧でとても有難い。このまえのCortex-M3の開発環境まである。

Eclipseでのビルドまで成功(4/12/09)
 オンチップデバッガーのZylinプラグインのインストールにてこずったが(サイトのURLが変っていた上に、一時不安定で超低速のダウンロード)、何とか、Eclipseのコンパイル環境は出来上がった。おそるおそるサンプルのソースをプロジェクトにしビルドしてみる。おお、問題なく成功した。Elfファイルが出来る。ファーム書き込みは、このサイトでは、OlimexのTINY-USB-JTAGケーブルを使うことになっているので今は、これから先は進めない。

 そのかわり、前回のCortex-M3のとき雑誌についていたCD-ROMにある STマイクロのライブラリとデモプログラムをEclipse下でコンパイルしてみた。Makefileとリンカースクリプトは、デモサンプルのものを丸々流用する。しかし、これは通らなかった。

 何故か、関数未定義のエラーが出る。プロジェクト内にはその関数を定義するヘッダーファイルや、ソースファイルが入っているのに認識しない。Makefileは他からの借用で、恐らくライブラリのパスの問題だと思うが、Makefileはうろおぼえの知識しかないので手が出ない。EclipseにはMakefileを作ってくれるモードもあるらしいが、ここも手探りでなんとも先に進めない。まあ、こうやって模索しているうちに少しづつ分かってくるものだ。深追いをしないで、これ以上の追求は諦める。

OlimexのARM-USB-TINYケーブルを買ってきた(4/14/09)
 お世話になっている開発環境インストールのサイトが採用しているJTAGインターフェースを買ってきた。始め通販で注文しようと思ったら、行きつけの千石電商で販売していることを知り、仕事の帰り早速買ってきた。\6825。USBのJTAGインターフェースとしては安価だが、がた老AVR(ARM?)研究所の投資レベルとしては決して少なくない出費だ。

 このTINYの上位機種のARM-OCDと全く同じ仕様と思われるJTAGケーブルの自作記事が2008年6月のデザインウエーブ誌に出ているが、今回は安全策をとった。前にも書いたように自分は余りデバッガーを使わない。人の書いたソースならともかく、自分が書いたコードのデバッグにソースコードデバッガーを持ち出すのは抵抗があるからだ。しかし、今度は新しいチップだ。用心に越したことはない。それに、組み込みの定番のJTAGインターフェースに習熟しておきたいこともある。FPGAのJTAGパラレルインターフェースは自作してファームの書き込みに使ったけれど、それきりになっている。

 TINYという名前通り、DSUB25ピンコネクター程度の小ささで、ケーブル側がUSBソケットBタイプ、ソケット側が20ピンのJTAGインターフェースになっている。早速分解したいところだけれど、Olimexのシールが張ってあって保証が切れることになっている。分解は動いてからにしよう。Olimex

 ターゲットマシンの準備を全くしていないことに気がついた。とりあえずは直近の付録ARMのLPC2388基板を動かすことを考える。この基板、残念なのはせっかくRTC(リアルタイムクロック)用の石がつけられるのに電源が主電源と一緒に配線されてしまっていて、バッテリーバックアップができないことだ。時計はSDカードの書き込みなどファイルシステムには欠かせない情報なのだが惜しい。基板を確かめてみたが、バッテリーバックアップ電源ピンの配線はチップの下のパターンになっており改造は不可能。ピンを切って配線できなくもないが、ルーペを見ながらの半田付けは困難を極めそうだ。

| | コメント (0) | トラックバック (0)

2009年4月 9日 (木)

PCMプレーヤー続き: どのSDカードにも頭出し位置を記憶させる

LTC4054を買ってしまった(4/1/09)
 それにしてもウェブはありがたい。このあいだリチウム電池の充電用ICはショップでは品切れだとLtc4054書いておいたが、ウェブのひょんなところでこのICが行きつけの千石電商でも置いてあることを知った。今急にこのICが必要なわけではないが、こういうものはあるときに手に入れておかないといつなくなるとも限らない。仕事の帰り秋葉原に立ち寄り、店を覗く。

 2Fの半導体売り場のアナログICのところにそれはあった。いやあ、さすがは千石だ。商品名はLTC4054ES5-4.2とある。データシートによればこれが正式の型番のようだ。価格は¥440。通販と変らない値段だ。800mAまで充電できる。ケースから取り出そうとするとこれが豆のような小ささだ。2つ購入する。ついでに秋月電子でSOT23用の変換基板を手に入れる。こいつはこのあいだ見つけた裏表6種類の表面実装のチップをDIPに変換できる基板だ。少し大きいが実験用なら問題ないだろう。Sot23

 意気揚々と家に帰り、基板にあわせてみたら、この基板にはLTC4054のSOT23-5のパターンがない! それにしても、この小ささは尋常ではない。チップ部品とかわらない小ささで、5ピン出ている。ピン間隔は0.95ミリ。くしゃみでもしようなら間違いなく吹き飛んで行方不明になる。これで0.8Aの充電ができるのか。ウェブの製作記事にあるように、大きめのランドにつけて放熱をしないといけないかもしれない。

 秋月の変換基板にSOT23-8というのがあり、真ん中のパタンを合わせてしまえば何とか使えそうだ。問題はこれより電池フォルダーをどうやって作るかである。やっぱりこれまで考えていたように、アクリル板をくり抜く方法が一番確実と思うが、作業量を考えるといますぐという気分にはならない。

16Mhzでは出だしがおかしいファイルがある(4/03/09)Sot23_2
 Mega328のクロックを16Mhzにして、実装版でテストしている。ブレッドボード版でテストしたとき、5枚あるうちの1枚のカードが、最初の曲の再生で、出だしの2秒あたりまでバッファーアンダーランのときのような割れた音ではじまるようになった。間もなく正常に戻るが、あきらかにディスクアクセスが遅れてバッファーの前の音を拾っている感じだ。

 SDカードの抜き差しを何回かやって接触を良くするとこの現象は消えたので、実装版も16Mhzの石に取り替えた。ところが、実装版でも発生した。さらにもう一枚同じような症状が出るファイルが出てきた。必ず、カードの最初のファイルで起きるので、これが原因かと一旦消して別のファイルを書き足し、問題のファイルを移してみるがやはり同じ。20Mhzでは起きない。ファイル読み込みのリトライをやっているのだろうか。

 SPIの速度をクロックの1/2の8Mbpsから、1/4の4Mにするとだいぶ現象は納まったが、まだごく稀に起きるときがある。気持ちが悪い。それもトラブルの発生する音楽ファイルが限定されている。クラスターチェーンの読み込みなどでの遅れならば、ファイルの位置を替えたら変るはずだが、直らないというのも腑に落ちない。電池の消耗量を調べて余り変わらないようだったら、クロックを20Mhzに戻した方が精神衛生上良いかもしれない。

ブログの引越しで大騒ぎ(4/5/09)
 このブログはNiftyを使っている。実は、本来のIDで使えるブログは学校の同窓会のブログに提供しており、研究所のこちらの方はフリー版だ。まあ、ひさしを貸して母屋をとられた形だが、最初はこちらをホームページ形式にするつもりだったので仕方がない。ところがこのあいだNiftyから、6月からブログのアカウントを一元化するという知らせが届いた。フリーならいくらでもアカウントを作れるが、料金を払っているNifty会員には複数アカウントどころか、NiftyのIDでしかブログが作れないというのも矛盾した話である。複数アカウントには追加料金がいる。

 文句を言ってみても始まらない。ただ同窓会のアカウントがひとつというのは大変困る。というのは執筆者を複数にして彼らにブログ専用のIDとパスワードを知らせてあるからだ。一元化されると、私のクレジットカードの支払いから料金体系の変更まで出来るIDを教えないと今の状況を維持できない。みな友人とはいえ、このIDを人に教えるわけには行かない。しょうがないので、同窓会のブログもフリー版に移動することにした。

 これが難儀したのである。2日間かけて何とか引越しを終えたが、写真の移動ができていない。無料で使っているので余り文句は言えないが、このブログの移動は最悪の環境だ。

 最初は、記事の読み出し、書き出しという機能があるのでこれを使えば簡単に出来ると思っていたのだが、記事を読み出してみたら、記事だけで4MB近くある。はじめわけわからずに、これを書き出したら、ファイルサイズが大きすぎると怒られた。

 調べてみたら、何とNiftyのアップロードのファイル容量の最大はたったの1MBだという。SPAMやロボットの横行で制限したらしいが、それにしてもこれでは話にならない。あわててブログのTypePad形式を調べ、ファイルをいくつかに分割して、昨夜なんとか記事だけの移動は成功した。

 写真も出るので、これでOKと思ったのはぬか喜びだった。旧ブログのURLからすべて写真を引っ張ってきていることを発見して愕然となる。何だと、この画像ファイルはどうするんだ。こちらに全部引き取って、リンクの張り直しか。冗談だろう。これでブログの引越しができますなどとは言わないで貰いたいものだ。

 悪態をついてみても始まらない。アップした写真のダウンロードをしようとして、また愕然となった。まとめて画像ファイルをダウンロードする機能がない!参ったである。何か本気でハッキングしてこのディレクトリツリーを全部引き出す方法を考えたくなった。そうでなければ、ひとつひとつの記事のHTMLからファイルを少しづつ抜いてくるしかない。

 気の遠くなるような作業である。記事だけで200本以上あるのだ。写真の画像ファイルは数千枚にのぼるだろう。サムネールがついたり、クリックするときの補助的なタグにもファイルのURLが入っている。つまり数千枚の3倍、万を越すファイルの移動を手でやれというのか。ここを空家にして本来の研究所のブログにしようと思っていたが、これではいつになったら空家に出来るか見当もつかなくなってしまった。

複数のSDカードの演奏位置を覚えこませる(4/8/09)
 通勤の往復にSDカードプレーヤーを持ち歩いている。ヘッドフォンを音が漏れやすいゼンハイザー(PX100)からSONYの安物のイヤホーンに替えているので良い音は楽しめないが、昔使っていたウオークマンなどに較べれば格段の音質で、頭出しが楽なのが良い。すっかり気に入ってしまって、家族から冷やかされている。

 使ってみてすぐ気がついたのが、折角、SDカードの頭出しの場所を覚えさせても、別のSDカードを差し替えると、それが無効になってしまうことである。1枚のときは良いが、何枚もSDカードを差し替えるときは不便で仕方がない。そうか、情報はEEPROMに入れるのだから、何枚SDカードのデータを記憶させても、SRAMを圧迫するわけではない。フラッシュはMega328で32Kもあり有り余っている。EEPROMも余裕の1KBだ。

 思いついたらすぐに体が動くタイプである。早速、SDカードの情報を配列形式で複数個、EEPROMに覚えこませ、全体のファイルサイズ、ファイル数がかわらないSDカードは頭出しの情報を残していく改修にとりかかった。EEPROM上に構造体を定義する手法をウェブで勉強する。構造体の配列を作って、そこへ次々にSDカードの情報を残して行き、一致すれば、そのときの頭出しを使い、SDカードが新しければ、古いものを消して登録する。

 EEPROMの0番地は、リセットなどのタイミングで壊れると言うので、4バイトほどシフトさせてから、配列を置く。ロジックはそんなに複雑でない。これまでのファイルリストと同じような構造だ。昨日の夕方から夕食を挟んで夜10時過ぎには出来上がる。テストしてみた。しかし、全く思うような動きをしない。まあ、プログラムは考えたようには動かないものだ。

 UARTを組み込んでデバッグするのもおおごとだ。EEPROMはAVRispでダンプして見ることが出来る。ダンプさせてみた。なにい、データは一組しか記録されていない。しかもEEPROMの頭から書き込まれている。確か4バイトずらしたはずなのに。それに配列の位置を記録するデータがない。うーむ、わけがわからない。細かいところをつめずにメモを数行書いただけでコーディングを始めると大体こういうことになる。EEPROMの関数の仕様を何度も確かめる。ここは前に間違った順番を教えられて大いにはまったところである。

 結局、その日は解決できなかった。次の日、冷静になって考える。今まで動いていたのだから、EEPROMの関数にしろ、ハードにしろ、いくらEEPROMのダンプがおかしいと言って、この辺がおかしくなることはあり得ない。やはり新しく作ったロジックが間違っているとみるのが順当だ。

 気分を改めて最初からソースリストを見直す。あああ、行をまたがるif文のカッコのあとに;(セミコロン)がついている。何と言うお馬鹿なミス。これを直してやっとSDカードの情報が複数入るようになったが、相変わらず頭出しが出来ない。これも冷静に見直していくうち不備が見つかった。曲を選んでいるときの配列位置の変数の取り扱いがおかしい。該当のSDカードのところに保存されていない。昨夜は頭に血が昇って見つからなかった不具合がものの30分もしないうちに解決してしまった。Pcmplayerv2

 一度書いた手紙はすぐに出さずに一日置けと良く言われるが、デバッグも同じらしい。EEPROMが頭から書かれているのも、コンパイラーは必ずしも定義順にメモリを割り当てるのでなく、大きい順に割り当てていることがわかる。1バイトのカード情報の変数は一番最後に割り当てられていた。前にやったようにアセンブラー的に#defineでアドレスを決め打ちしていかないとEEPROMの思ったところに変数は置いてくれないようだ。

 これでSDカードプレーヤーはより実用的になった。どのSDカードもファイルをいじらない限り、5枚まで(数はいくらでも増やせる)頭出しを覚えていてくれるようになり、選曲が楽になった。ついでに16Mhzのクロックと20Mhzクロックのときの消費電流を測る。待機時で20Mhzのとき19mA、16Mhzのときは18mAで、再生時もそれぞれ56.5mA、55.5mAと殆ど変らない。何だ、これくらいの差だったら、少しオーバークロックだけれど20Mhzで動かしておこう。

ここにV2.1として5枚までのSDカードの頭出し情報を記憶しているバージョンのソースコードを置きます。クロックは20Mhzに戻しました。例によってプロジェクト名は前のバージョンと同じSDPLAY328ですのでご注意ください。

「SDPLAY328V21.lzh」をダウンロード

| | コメント (5) | トラックバック (0)

« 2009年3月 | トップページ | 2009年5月 »