« 2011年4月 | トップページ | 2011年6月 »

2011年5月の3件の記事

2011年5月27日 (金)

雑誌付録ARM基板でSDカードとRTCを動かす

失礼しました。プライオリティが逆でした(5/20/2011)
 このOS、プリエンティティブじゃないなどと言っていたが、こちらの間違いだった。FreeRTOSでのタスクプライオリティは数字が大きいほど優先度が高いのだ。uIPは他のタスクより優先度が高いとばかり思っていたので(実際は普通より低いところで動いていた)、UARTの数字をこれより大きくして、さらに優先度を上げてしまっていた。これではUARTがループウェイトすると、uIPにはCPUが渡らない。同一プライオリティの時しかラウンドロビンでCPUは廻らない。

 設定を逆にしたら、めでたくUARTでどれだけCPUを喰っていても、Webサーバーの処理は遅れないようになった。UARTはセマフォーを使った割り込み待ちを考えていたが、その必要もなくなった。やれやれ、どうも済みませんでした。

S_p5193932

 コマンドシェルは一番低いプライオリティにしておけば、他のタスクの邪魔をしない。ただ、LCDのタスク状態表示には、何かエラーがでている。同じプライオリティのタスクがどこかにあるからだろうか、良くわからない。まだ、このあたりは手探り状態だ。

 とにかく、いつものようにPCのUART端末からモニターとして動くよう、コマンドプロンプトのロジックを作る。まずはエコーバックだ。キーボードから入れたデータをリターンキーで送り返すだけだが、これは、このあと入力データ(コマンド)を解析して各種の作業を行うコマンドシェルになる。

 この辺の開発は、AVRなどと同じなので簡単にできる。ファームを書き直してテストする。うむ、ちゃんとエコーバックされてくる。同時にLEDが点滅し、Webサーバーが順調に2秒ごとにHTTPデータを送り続ける。いやあ、だいぶコンピューターらしくなってきたな。

LPC2388の割り込み環境の設定は難しい(5/23/2011)
 プロンプトまでは快調だったが、その後のFreeRTOSのテストベンチの作業ははかどらない。本来のコマンドプロンプトは、UARTの受信割り込みで処理を開始するのが筋だ。タスクのプライオリティで誤魔化すのは邪道である。しかしUARTの割り込み関数がうまく入らない。

 LPC2388の割り込み関数の指定が良くわからない。現在のソースには、割り込みを使っているUARTが、Buffered UARTとして既にコードが用意されているが、これを動かそうとすると(#ifdefで入れ替わる)、コンパイルエラーになる。

 どうもコンパイラーによって割り込み関数の定義が違うようなのだ。環境変数の__GNUC__を定義すると、割り込みの定義のところの__irqオプションが消えるのでビルドは通るが、このファームではFreeRTOSそのものが全く動かない。他に影響がでているようだ。

 あちこち探し回るが、ソースごとに設定の方法が違っていてどうして良いのかわからない。ChaNさんの雑誌のソースもあるので、ここでの割り込みを調べるが、ここは肝腎なところはすべてアセンブラーで実装されており、残念ながら参考にならない。

 結局、割り込みを使ったUARTは断念することにした。ウェブにあったように、UART受信バッファーを10ms程度のウェイト(OSにCPUを返す)を入れて覗く方式(ポーリング方式)で妥協することにする。UART入力は端末のキーボードからだけなのでこれで何の問題もないのだけれど、何となく気に入らない。それでもこれでLCDでのOSエラーはなくなった。

 同じARMでもNXPの開発環境は、I/Oレジスターのヘッダーファイルが用意されているだけで、アセンブラーのようにせっせと設定していく方法である。STMに較べると遅れているようだ。それでmbedのクラウドIDE方式で一気に飛躍しようとしているのだろうか。そういえばまだmbedは、LEDチカチカを確認しただけで、全く先に進んでいない。こいつはPHY層も含めたイーサネットインターフェースがあるらしいので早くいじってみたいのだが、現在はおあづけである。

LPC2388でSDカードを動かす(5/24/11)
 割り込み環境が思ったように導入できず、少し手詰まりになったので、気分を換えてLAN基板の横にスペースをあけて用意してあったSDカードスロットの実装を始めることにした。アートワークは、これまでの作業の合間に少しづつ描いていて既に完成している。

S_p5273949

 思ったより早くできた。まあ、プルアップ抵抗を5本ほどつなぐだけだけだから大した作業ではない。このあたりのハンダ付けは、汎用基板、プリント基板あわせて10回以上やっている。手馴れた作業である。回路図は、雑誌(インターフェース2009年6月号)記事を使う。もっとも、定数を含めてこれまでに紹介された回路図と殆ど変更はない。MCIモジュール(SDモード4ビットバス)が動くための結線部分が違うだけだ。

 これでLPC2388のLAN&SDカード基板(雑誌付録の拡張基板とほぼ同じ仕様)のハード工作は大体予定通り終わった。SDカードの動作テストを早くやりたいのだが、現在のFreeRTOSのテストベンチに、FatFSを組み込むのは大変だ。

 ねむいさんのFreeRTOS_V6のMakeFileにはFatFSを入れようとした痕跡が残っているが、実際のリソースは入っていない。単に1タスクのファイルシステムだけなら簡単そうだが、FreeRTOSの標準ファイルシステムにするのは、結構大変なはずだ(FatFSそのものはリエントラントなので十分対応可能だが)。

 どうしようか迷ったが、FreeRTOSの1タスクとして入れるのも先に延ばし、雑誌記事のChaNさんの単独システムを先にいれて、SDカード周りの動作だけでも確認することにした(慎重と言うか臆病である)。雑誌のダウンロードサイトから、2009年6月号のソース一式を頂く。以前にご本人のページからダウンロードしてあったソースとFatFSの部分は大きく変わっていないようだ。

 コンパイラーは、WINARMのarm-elf-gccだったが、うちのWINARM環境は自信がないので、いつものようにCodeSourceryのarm-none-eabiに換える。OLED液晶の部分はついていなくても動くと言うことなので、ソースには手を入れない。

 ビルドはリンクしているライブラリもないので、あっさりNo Errorで終了した。しかし、ファーム書き込みは時間がかかる。LFN用の64KBものコードブックをフラッシュに書いているからだ。遅いはずだ。少し待って書き込みは終了した。

 早速、動かしてみる。うんともすんとも言わない。そういえばREADME.TXTにOLEDかファイルモニターの切り替えは、ESCキーを押せとあった。シリアルの速度を合わさないとキーを押してもESCの区別がつかないはずだ。230Kbpsに合わせて、ESCを押す、よーし、Monitorの開始を知らせるオープニングメッセージが出た。手近のSDカードをさしてテスト。うーむ、Disk Errorだ。

 ディスクが入っていないことを示すエラーコードである。さて、動かないとなると最初から腰をすえて調べなければならない。ファームはまず間違いがないだろう。とすると、ハードだが、昔に較べると配線技術は、格段に向上していて最近は配線ミスが殆どない。あっても事前にチェックできている。誤配線よりもっと簡単なところのミスを疑う。

 ここに入っているファームは、ソースコードを見るとSDカードの所在や、ライトプロテクトまでチェックしているフルバージョンだ。まず、これが動いているかどうか調べてみよう。このあたりはSDカードを始めて動かそうとしたとき、散々苦労したところだ。

 CD(カード検出)は負論理なので、このピンはカードを入れたときグランドに落ちていないといけない。テスターで測る。あれえ、グランドになっていない。ややや、このピンはスロット筐体とはつながってる。何だと筐体とグランドピンは浮いているのか。何と、何と、ここは明示的につながないと駄目なのだ。これまでの実装は、このあたりを無視していたことが多いので、分離しているのに気がつかなかった(スロットは秋月で買ったノーブランドの小型のもの)。

Lpc2388_fatfs

 これで動くのではという淡い期待に胸を膨らませながら、筐体とグランドピンをハンダ付けしてテストを再開する。こんなもので動けば楽なもんだけど、そうはうまくいかないだろうな。

 電源を入れる。モニターを出す。初期化コマンドdiを入れる。エラーなし。おっ、動いたか。ファイルリストを出すコマンドを入れる。やった。やりました。お馴染みのファイル名が並んだリストがUARTに並んだ。いやあ、ここも、配線間違いなし。気分が明るい。

 アクセス速度を測る。雑誌の記事によれば、データアクセスは、LPC2388のMCIモジュールを使ったSDカード4ビットバスで、ぶっちぎりの早さ(ねむいさん)だそうだ。測ってみた。すごい。どのSDカードも64KBくらいなら、4MB/sec近辺という猛烈な早さだ。これなら動画も送れそうだ。これは楽しみになってきた。

 このFatFSは、FreeRTOSで動かすという大仕事が残っているが、LPC2388のLAN&SDカード基板はこれで完成した。これまでにかかった費用を計算してみる。PHY層チップ(DP83848C)は1枚こわしたので2枚として¥1200(失敗しなければ¥600)、ピッチ変換基板(アイテムラボ)1ヶ¥180、べたアース基板(サンハヤト)¥250、モジュラージャック(秋月パルストランスLED付き)¥300、SDカードスロット¥150、50Mhzオシレーター¥260、CRは全部で¥100するかしないか、ヘッダーピンソケット¥80くらい(この辺は全て手持ち)。あれこれ合わせて¥2,520。

S_p5273941

 そもそものきっかけ、法外な価格で買うのを反発した雑誌のタイアップLAN&SDカード拡張基板は¥6800だったから、これのほぼ1/3というところか。自分の作業工賃をどう考えるか? DigiKeyのゲタに買ったmbedの¥5400はどう考えるかって? え、まあ、こういうことは聞かないお約束と言うことで。そうかmbedも動かしてやらないといけないな。

FreeRTOSにRTCを入れる(5/26/2011)
 雑誌付録ARM基板LPC2388のLAN&SDカード拡張基板が両方ともうまく動いたので意気が上がっている。矢でも鉄砲でも持ってこいくらいの状態である。調子に乗って、FatFSをFreeRTOSで動かす前に、残っていた課題を片付けることにする。LPC2388のRTC(リアルタイムクロック)機能である。

 この雑誌付録基板は、LPC2388が、バッテリーバックアップのできるRTCを持っているのに、そのバックアップ電源Vbatピンを基板上でVccにつないでしまっており、せっかくの機能が台無しになっている。

 これでは何のためのRTCかわからないと思っていたら、ChaNさんが動画サイトで器用に、0.5ミリピッチのICの足を切ってVbatを独立させている工作を見て、感嘆した。

 当研究所でも、これに刺激され、早くにバッテリーバックアップに挑戦して成功している。しかし、電池をつないだだけで、まだ動くかどうかの確認をしていない。ここは是非試しておきたいところだ。動けば、FatFSのタイムスタンプにも使える。

 今動いているFreeRTOSのソースチェーンには何故かrtc.cは入っているが、どこにもこれを動かすコードは入っていない。ねむいさんのサイトを見てみると、FreeRTOSではなく、単独で実装されているようだ。とりあえず有難くソースを頂く。

 FreeRTOS上では動かなかったのだろうか。ソースを調べていく。そうでもないらしい。ただ、このRTCのコード(rtc_support.cとmain.c)には、割り込みルーチンが入っていて、簡単には入りそうにない。FreeRTOS上の割り込み環境は、結構難しく、UARTの割り込みを使ったコードはうまくビルドできないであきらめている。

 __irqというオプションが割込みハンドラー宣言に入っていて、ここでコンパイルエラーを起こす。ウェブの情報によれば、これをはずして、__attribute__ (((interrupt("IRQ")) に換えると良いというので、そうすると今度は、このオプションはthumbモードではサポートしないとコンパイラーに怒られる。ねむいさんのコードの割り込みにも__irqオプションが入っている。ねむいさんにお助けメールを出したが、忙しいらしく返事は前のようにすぐには戻ってこない。

 出来ないとなると悔しくて余計意地になるのが性分である。色々ウェブをさまよう。解決策は見当たらない。しかし落ち着いて考えてみると、RTCの機能はハードなので、何も割り込みを使わなければ動かないというものではない。では何故割り込みを使っているかというと、1秒ごとにディスプレイに出すためだけのようである。

 ここで閃いた。1秒ごとなら何も割り込みを使う必要ない。OSの元で動いているのだ、別タスクを立ち上げて、1秒ごとにRTCを調べれば良いはずだ。そうか、割り込みを使わないでも出来そうだ。

 思い立った時の手の早さには自信がある。rtc_support.cの割り込み部分を全部とり、見よう見まねで、FreeRTOSの新しいRTCタスクを新設する。このタスクはRTCを初期化して動かした後は、1秒の待ちを入れてUARTに時間を表示する。目覚ましのようなタイマーだってこれで作ろうと思えば作れる。OSにだいぶ慣れてきた。

Lpc2388_rtc

 喜び勇んでビルド。よーし、No Errorだ。ファームを書き込む。UARTを立ち上げる。おおお、初期設定をうながすメッセージがでたぞ。年月日を入れていく。やった。動いた。RTCが時間を表示し始めた。ありゃ、止まっちまった。どうもprintfが大きすぎてスタックがあふれたような止まり方だ。ウェブも止まって暴走している。

 年月日時分秒すべてを出す表示を縮めて再トライ。ついでにタスクのスタックサイズをUARTと同じに広げる。よーし、順調に時間が表示されてきた。バックアップは大丈夫か。電源を切って暫くしてからもういちど動かす。良いぞ、バックアップされている。ほぼ2年ぶりの確認である。いやいや、これで32.767Khzの時計用クリスタルと、コイン電池の顔が立った。

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

2011年5月20日 (金)

FreeRTOSのウェブサーバーが動いた

 連休前から始めた、2年前の雑誌付録ARM(LPC2388)基板につけるLAN基板は、チップ(DP83848C)ひとつを誤操作で失いながら、何とか完成した。電源を入れるとモジュラージャックのリンクやアクセスLEDが点滅しているので、電気物理(PHY)層は動いているようだが、ソフトを何も用意していないので、正常に動いているかどうかはまだ確かめられない。

S_p5173912

Eclipseを思い出すのに大変(5/13/2011)
 前々記事にもあるように、手当たり次第にWebからソースを沢山集めすぎて何にするか迷ってしまった。このLAN基板(PHY層がDP83848)を動かすものだけでも5つ、OSなしのもの2つと、FreeRTOSというOSの元で動くソース3つである。

 LAN基板の動作確認のために未経験のOSも入れるというのは、不確定要素が増えて嬉しくないのだけれど、この基板をカメラ制御のホストにするなど、先の開発のためには、OSが動いていて欲しい。面倒かもしれないが、あえてOSのついている方法を選ぶことにする。

 「ねむい」さんが親切にインストール手順を残しておいてくれているのだが、情けないことにその意味がよくわからない。このソースをうまく入れられる見通しがない。迷ったあげく、結局、正規のサイトが公開している一番新しいV7のデモソースを入れることにした。FreeRTOSも勉強しなくてはならない。

Freertos_web

 FreeRTOSは軽い実装で、殆どの組み込みマイコンで動く移植性が評判のようだ。AVRならMega328クラスでも動くらしい。しかし、まだあまり詳しく調べていない。これからの開発にはUARTなどを使ったモニターコンソールのようなものが欲しいのだが見当たらない。これは自作するしかなさそうだ。

 久しぶりにEclipseを立ち上げて、ソフト開発に着手する。こちらの案内が具体的だったので、これを参考に、FreeRTOS V7のLPC2368のデモソースをプロジェクトにしようとするが(LPC2368と2388はピン数が違うだけで殆ど同じ)、これがうまくいかない。

 情けないことにEclipseの操作法をみんな忘れている。出来合いのソースを使ってEclipseで新しいプロジェクトを作るという作業が出来ない。ウェブに助けを求めるが、Eclipseの情報はあまりにも膨大で的確な回答を得るのは至難の業だ。情報の海に溺れそうになる。

 「import」を使って、所定のディレクトリの上でワークスペースを指定するということを理解するまで大分時間がかかった。 Makefileがあるところをカレントディレクトリにすることで、ソースの中の「unresolved」な変数は殆どなくなった。試しにビルドをしてみる。だめだ。あっという間にエラーで戻ってきた。

 MakeFileの内容とディレクトリーチェーンを何度も確認する。間違っていない。Eclipseには未定義変数を示すエラーは出ていないが、Makeが一瞬に終わってしまう。いろいろなサイト(ここや、ここ)を調べるうち、どうもコンパイラーが、こちらで使っているCodeSourceryと違うことに気がついた。

 MakeFileのコンパイラーの指定を、arm-elf-gccからarm-none-eabi-gccにかえる。よし、少し動いたが、またストップ。今度は何だ。前とエラーメッセージが違う。

error Please uncomment one of the two configPINSEL2_VALUE definitions above, depending on the revision of the LPC2000 device being used.

う、これは、どこかで見たぞ。何だ、何だ、さっき参考にしていたこのページのエラーと同じだ。ディバイスの識別番号を選ばせている。良くわからないが新しい方にして次へ。

no memory region specified for loadable section '.ARM.exidx'
あー、また同じエラーだ。対処法が書いてある。これは楽だ。「ねむい」さんがオリジナルのようだ。

次は?_sbrk,_write,_close,_fstat,_isatty,_lseek,_readのundefinedエラー
これは、今度のソースにはsycalls.cが入っているので出ないはずだ。

 よーし、ビルドが出来た。いやあ、このページのとおりでビルドが通ってしまった。「枯れ井戸Scope」さん、ねむいさんありがとう。 

ねむいさんのバイナリでLAN基板動く!(5/17/2011)
 ビルドは通ったが、このソースにはUARTがついておらずLCDもKeilの評価用ボードについているLCD用ルーチンで、動作確認する術がない。これではもしLAN部分が動かなかった時、手がかりが全くない状態になる。

 迷った挙句、ねむいさんのソースもビルドしてみることにした。ディレクトリーチェーンの様子がわかってきてインストールできそうだ。このソースにはUARTがついているのでこちらを基本にしたい。ただRTOSのバージョンは6で、これがRTOS7.0.0で動くかどうかの不安要素はあるが、ストロベリーリナックスのI2C LCDも動くようになっているので心強い。

 たまたま、OSなしでも動くLPC2388の単独のUARTのバイナリコードが見つかったので、LPC系のシリアルライター、FlashMagicのテストを兼ねて、これを試しに書き込んでみた。よーし、USBを通したUARTが動いた。

S_p5173908

 そうか、ねむいさんのところにはソースだけでなく、バイナリも入っていた。MakeFileが整備されていないのでビルドは通らないが、これをロードすれば、とりあえずLAN基板の動作確認が出来るのではないか。用心のため、このソースについているI2C LCDの実装までしてしまう。これでハードは全く同じになった。

 動かなくて元々である。HEXファイルをFlash Magicで書き込む。200KB以上あるので時間がかかる。何とかエラーなしで書き込めた。いよいよ通電テストである。IPアドレスは何だっけ。ソースリストを確かめる(あとで、ねむいさんのブログの画面写真を拡大するとちゃんと出ていた。さすが、ぬかりがない)。

 このソースはLCDもUARTも別のUSBからのUARTも盛りだくさんの出力が出る。まずは、USBにつながっているUART0から。USBコネクターを差し、TeraTERMを立ち上げる。おおお、字化けはしているが何かメッセージが出始めた。速度を調整して、Tickの回数を示す出力が出た。よし、FreeRTOSそのものはうまく動いているようだ。

 さあ、本題のイーサネットだ。アクセスランプがついたりしてPHY層の部分は何か動いているようだが、上位プロトコルはまだ未検証である。緊張が走る。PCでDOS画面を出し、pingを打つ。

Ws000000

 やりました。やりました。1msでレスポンスが返ってきた。ICMPパケットは通った。さあ、次は、HTMLだ。はやる心を抑えてブラウザーにIPアドレスを打ち込む。おおおー、FreeRTOSのウェブ画面が出た!ひゃっほー、やったぞ。誤配線もなく完全試合だ。2秒ごとにタスクの統計を打ち出してくる。TCP/IPの画面も異常なし。

 いやあ、嬉しい。ねむいさんが折角作ってくれたストロベリーリナックスのI2C LCDは何故か全面LCD点灯(真っ黒)になってしまい調子が悪いが、それを除けばあとは問題ない。

 FreeRTOSの仕組みはまだ殆どわかっていない。まだ何をして良いのかわからない。しかし、とにかくDP83848を使ったLAN基板の100Mbpsのイーサネット・ハードは、これで完全に動いていることが確認された。

 I2C LCDが動かなかったのは別の原因だった。何と雑誌のピンアサインが間違っていたのだ。CN2の38ピンは3.3V、39ピンは5Vとの記載があるが(インターフェース2009年5月号ページ41)、実際はちょうど逆である。3.3Vのはずが、5Vもかかっている。電圧計で確認した。

 サイトには訂正記事が出ているが、こんなところまで調べきれない。電源の間違いは致命的だ。I2C LCDが始め全面点灯するのは過大電圧がかかっていたからだ。もう少しで壊すところだった。プンプン。 隣のピンに移して、I2C LCDも問題なく表示した。サーバーの入力ページから文字を入れてみたが、残念ながらこちらには反映されていないようだ。

ソースビルドに挑戦(5/18/2011)
 仕事から帰って、すぐ工作室にこもる。まだビルドがOKになっていない。動いたのはバイナリーファイルだ。これからこれをいじるのにソースから動かなければ意味がない。V7のソースはビルドできているが、こちらのソースはUARTなどがついておらず不便だ。

 バイナリで動いたねむいさんのソースをベースに開発を進めたいが、このソースはFreeRTOSのV6ベースのようで、V7で動くかどうかは定かではない。最初、試しにビルドしてみたが、makeで殆ど先に行かず門前払いだった。

 しかし、何故上手く行かないのか大分わかってきている。ねむいさんが注釈でFreeRTOSのデモディレクトリに入れるという意味が理解できて来た。要するに、FreeRTOSのソースのディレクトリの構成が、共通部分と機種依存に別れているので、MakeFileを環境に合わせれば良いのだ。バージョンの違いはなさそうだ。

 MakeFileを仔細に調べて、各所で参照しているディレクトリパスを修正していく。すこしづつディレクトリチェーンが合ってきてMakeの時間が増えてきた。おお、最後まで通ったようだ。HEXのファイルサイズを確かめる。少し大きいがほぼ同じサイズだ。これで動くかもしれない。

S_p5193931 ファームの書き込みも順調に済んだ。電源を入れる。よーし、ソースリストに自分が加えた変更どおりのメッセージがI2C LCDに出た。思わずガッツポーズが出る。すべて人さまのソースを借りてのビルドだけれど、これで一山越した。

  ついでにSpeedを示すLEDが点かない不具合を検証する。LEDの方向を間違えていた。これを訂正し、100Mbpsを示す赤のLEDがついた状態を記念撮影する。写真でぼやけたように映っているのは、ハンダ面が表になる基板なのでアクリルの保護カバーをつけたものである。

S_p5173900

 次の課題は、ChaNさんのFatFSの導入とWebからのI/O制御である。ただ、ちょっとみただけでは、FreeRTOSにコードを加える見当は全くつかない。WebServerのソースもファイルシステムを内部的に実現していて難しそうだ。RTCを動かしたいのだが、これもソースリストが余りにも簡単すぎて良くわからない。

 まだまだわからないことだらけだが、これでこのマイコンは、当研究所の4つめのネット対応のマイコンとなった。H8と違ってpingも1msで返って来るし、SDカードのファイルシステムが入れば、今度こそ本格的なWebサーバーに出来る。楽しみである。

FreeRTOSのUARTはいくつもあって(5/19/2011)
 興奮が納まって反省した。人のソースを頂いてそのままビルドし、動いた動いたと喜んでいるだけでは情けない(動くのは当たり前だ)。自分で喜んでいるだけならともかく、ブログで自慢するのも芸のない話だ。少しは創意工夫をした結果を載せるべきだろう。

 と、言うことで、UARTコンソールのための開発を始めることにした。ねむいさんのUARTはprintfを使っているが、入力はない。printfは、syscalls.cにUARTに出す自前の関数を入れて、あとはgccの標準入出力を使っているようだが、このあたりは一番わからないところで、scanfなどは敬遠したいところだ。

 他のサイトの情報によると、FreeRTOSにはUARTの実装にはいくつもの種類があるようで、難しそうだ。NXP社のサンプルソースにはUART関係だけでもserial.c と uart.c がある。バッファーが付いているUARTや、直にデータをとるUARTもある。OSのメッセージキューを使っている方法もある。良くわからない。後閑さんのFreeRTOSのガイドはとてもわかりやすいが、まだFreeRTOSの仕組みが理解できていないので、先に進めない。

 それでも、よくわからないまま、見よう見まねでサンプルソースのuart.cの中のUARTGetchを使って、コマンドプロンプトを出してみる。よーし、データの読み込みのためUARTが止まった。キーボードから一文字入れる。うむ、エコーバックされた。おやあ、ウェブの更新が止まったぞ。おかしい。何のためのOSだ。FreeRTOSはプリエンティティブなOSのはずだ。UARTタスクのループウエイトで他が止まったら困る。

 タスクの優先度が同じなのかもしれない。順位をuIPとUARTで大きく変えてみる(最初から同じではなかった)。しかし、状況は同じだ。OSがプリエンティティブに動いていないのかもしれない。でも調べ方がまだわからない。軽いOSとはいえ、設定するところは山ほどある。

 仕方がないので、これまでAVRでやっていたと同様に、バッファーにデータがあるかどうか調べる自前のUARTGetchar関数をでっち上げ、UARTでは止まらないようにした。

 これで、Webサーバーも動き、LEDも点滅し、UARTもデータを受け取るマルチタスク状態に戻った。しかし、これはUARTが必ず一定時間、vTaskDelay()というCPUを返す待ち時間があるためで、本来のUARTの動きではない。本当は、UARTの受信バッファーにデータの入ることをトリガーに待ち時間が解ける割り込み処理が必要なのだが、FreeRTOSではこれをどうやって実現するかはまだわからない。

 まあ、わからないことは沢山あるが、気ばかりあせっても仕方がない。少しづつ調べていくことにしよう。調べることが沢山あるということは幸せなことなのだ。

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

2011年5月13日 (金)

雑誌付録ARM基板のLANアダプター作成にはまる

アートワークを始める(4/29/2011)
 どういうはずみか、雑誌付録(2009年5月インターフェース誌)のLPC2388基板のLANアダプター基板を作ることになった。先にぶちあげたプロジェクトのテーマ、モーター制御、ロボット制御からみれば全く関係ない開発なのだが、こういう行き当たりばったりはアマチュアの特権である。現役時代の所長の仕事が目的に対して厳密だったので、その反動なのかもしれない。前にも書いたが、運命の赤い糸に結ばれて何かが決まっていくというのが好きである。

 まあ、しいてこじつければウェブサーバーのライブカメラのマシンになり、モーターでカメラの制御をするかもしれないというところか。ソフトの目処はだいたい見通しがついたので、イーサネットPHY層チップDP83848(正規名はDP83848C)のLAN基板の具体的な構成を考える。

 親基板のこのLPC2388基板は、以前、ChaNさんのビデオに刺激され0.5ミリピッチのVbatピンを切って、RTCバックアップバッテリーの実装がしてある。このとき電池CR2032はマザー基板にフォルダーをつけて、コネクターでつないだ。

A7112068

 LAN基板をつけるのにはこの縦型の電池フォルダーが邪魔になる。まずこれをはずし、STM32でやったように、CPUチップの上にカプトンテープで絶縁した表面実装用のコイン電池のフォルダーをつける。いけない。Vbatピンのハンダ付けがとれた。また例の照明付きのヘッドルーペを持ち出して再度ハンダ付けやり直し。何かとても無駄なことをやっているようで、ひとりで苦笑いする。

P5133884 やっと元に戻った。テスターでVbatに3Vがかかっていることを確認し、胸をなでおろす。これだけ手間をかけたのだから、このLAN基板にSDカードまでつけようと欲張ってみた。雑誌の拡張基板と同じ構成である。ChaNさんがLPC2388用のFatFSを作ってくれている。これを利用しない手はない。このためにLAN関係のレイアウトが片隅に寄り余計窮屈になる。べたアース汎用基板は片面基板になるので、親基板とのコネクターを付けるためハンダ面が表側になってしまうが、これは仕方がない。まあSDカードが上に来るのでこれで良しとしよう。

 久しぶりのアートワークを念入りに始める。これが結構はまる。紙を真っ黒にして何回も配線をやりなおす。狭くなっているので大変だ。でも、自分にはこういう工作が何と言っても一番面白い。根がケチなこともあるのだろうが、ありあわせの汎用基板に、あれこれ部品の配置を考えて、きれいな配線を考えることは、キットや出来上がりの基板に部品をハンダ付けしていくより何倍もわくわくする。創意工夫で事態が一気に解決した時の快感がたまらない。部品の配置を換えてみて、配線が少しでも楽になると暫く機嫌が良い。

P5073852

 アートワークの途中で、モジュラー用のLEDを基板につける余裕はとてもないことがわかった。用意しているモジュラージャックは、例の付録のフリースケールのイーサネットマイコンボード(MCF52233)のため、DigiKeyで買ってあったものである(結局、つけないままになっている)。

 こいつはパルストランスはついているが、LEDが入っていない。LEDは、リンクとアクティブ、それに10/100Mbps識別の3つも使うことになっている。パルストランスとLED付きのモジュラーを秋月で買いなおすことにする。

SparkFunにガイガーカウンターキットを発注(4/30/2011)
 すんさんの掲示板にも報告したが、あれこれ迷っていたガイガーカウンターをとうとう発注してしまった。前回のブログ記事に「正しく怖がって欲しいものだ」などと偉そうに書いたが、電子工作をやっているのに身の回りの放射線量も測れないようでは、「安全神話」を信じているだけの、ただの能天気になってしまう。

 「正しく怖がる」ためには、自分なりの判断基準を持っていなければならない。実は、大分昔にもガイガーカウンターを作る寸前まで調べたことがある。秋月のキットも、ストロベリーリナックスのキットも知っていた。ただ値段が、気楽に買って実験してみようという値段ではなかったので、買うところまで行かなかった。

 それで今度の騒ぎである。全世界的にガイガーミュラー管(GM管)が不足しているそうだ。どうせなら、真空管にあたるGM管ではなく、半導体(PINフォトダイオード)のセンサーがあると聞いていたので、自作するなら、このキットがないかと調べてみた。さすがにこれは見つからず、あっても10万以上する完成品しかないことがわかる。

 ウェブを調べると、雨後の竹の子のように、キットや完成品が売り出されている。いずれも5万円以上という結構な値段だ。こういう人の弱みにつけこむ商売は、所長の最も嫌うところである。

 絶対に乗ってやるものかと、心に決めていたのだが、ストロベリーリナックスが再び、以前の価格と同じでガイガーカウンターキットの予約受付を始めた。この良心的な価格設定に好感を持って、思わず申し込んでみた。しかし、申し込んだのが遅すぎたのだろう一回目の入荷数に入れず、見事はずれた(うわさでは、申し込みが3000件以上あったとか)。こうなると意地になるのが性分である。

 検索してみたら、SparkFunでもキットを売り出していることがわかった。今は在庫切れだが、バックオーダーを受け付けている。GM管はストロベリーのものと同じ、LND社のチューブLND712を使っている(価格は$149.95 プラス送料 $30.82 $180.77  円高なので¥14,570)。

Sparkfun_geiger

 日本代理店のスイッチサイエンスにはラインナップされていない。だめもとで、本体のサイトの会員になり試してみたら、外国からも受付をしてくれそうである。勇んで申し込みをすませる。

 次の日、メールが届いた。やっぱりだめかと読んでみたら、「輸出規制国(北朝鮮、イラン、スーダンなど)に売ったり送ったりしないか申告せよ」とのメールだった。

Hello,
On your recent order, you ordered 1 x SEN-09848: Geiger Counter. This item
is export controlled by the United States government. Do you intend to sell
or send this item to anyone in any of the following countries: Cuba, Iran,
North Korea, Sudan, or Syria? Please let me know at your earliest
convenience.

「ご存知のように日本では、大地震で原発が重大事故を起こしているので、自分のところで監視するために使い、外国に売るなどと言うことは絶対無い」とメールを返す。

As you know, we, Japanese have experienced a serious accident of nuclear
plant with a large earthquake. I want to use this item only for myself
in order to watch environmental radiation. So I absolutely do not intend
to sell or send it to those countries.

ほどなく、「注文を受け付けるので手続きせよ」というメールが来た。FAXでクレジット番号を送る。これはOlimexで経験済みだ。自宅のFAXから国際電話をかける。順調に送られた。これでめでたく注文は受理された。いつ商品が来るかはわからないが、まあ安心を買ったような気がして心が軽い。

LAN基板の工作開始(5/4/2011)
 そうこうするうちに、すんさんの掲示板で、千石でGM管を販売しているということを知った。価格は¥3700。少し小さいようだがレーセオン社だから信頼はおけそうである。ただ、もう売り切れているだろうな。 仕事の帰り、秋葉原に立ち寄り、秋月でLED付きのモジュラーを買うついでに、千石でGM管があるかどうか調査した。やはりどの階にも品物はなかった。店員に今さら聞くのもしゃくなので何も聞かずに帰る。

 LAN基板の方である。アートワークがひとわたり完成したので、基板の工作を始める。やっぱり、モジュラージャックの穴あけが一番大変だ。前回はモジュラーの固定用のボスの部分に大穴を空けてみっともない形になった。今度はドリルスタンドもある。モジュラーの接続ピンは2列目がmil規格の丁度半分ずれた形に並んでいるので、ランドとランドの間に1ミリの穴が開けていく。ドリルスタンドのおかげで正確に開けることが出来た。試してみる。よーし、ピンがぴったり入る。ショートしないようにランドを削ってハンダ付けに備える。うーむ、大分うまくなったぞ。

P5073851

 しかし、固定用のボスの穴あけはやっぱり綺麗には空かなかった。汎用基板は既に穴が開いているので、この上にぴったり入る孔を開けることはドリルでは難しい。それでも、何とかLEDのピンも含めてかなり正確に穴があいた。モジュラーはピッタリ基板に取り付けられた。これがつけば工作の山は越える。あとはアートワーク通り、配線をしていくだけである。

 DP83848のクリスタルはまだ謎が残る。オシレーター(発振器)は50MhzがRMII時に指定されているが、水晶発振子(xtal resonater)の場合は、25Mhzしかない。しかし、50Mhzのオシレーターをつけようにも、何故か行きつけの千石、秋月では売っていないのだ(48Mhzとか66Mhzはあるのだが)。まあ、とにかく25Mhzの水晶で組んでみよう。水晶なら手持ちの在庫がある。

黙々とハンダ付けにいそしむ(5/7/2011)
 この連休は、ひたすらDP83848のLAN(PHY層)の基板を作っていた。このまえのENC28J60のLAN基板はオプティマイズのお手本があったが、今度はねむいさんの写真だけが頼りだ。こういう配線は一種のパズルである。幾何学のように補助線一本で一挙解決というのは中々ないが、パーツの位置を90度回転させただけで、嘘のように配線が楽になる時があるので気が抜けない。

P5073850

 アートワークはひととおり終わってはいるが、ハンダ付けの途中でも部分的なアートワークを何度もやりなおし、あれこれ考える。欲を出してLANだけでなくSDカードソケットも付けてやろうと考えているから場所が狭い。思ったより部品が多く、最後は大苦労だった。全部の抵抗を部品面にどうしても置けず、ひとつだけがハンダ面に移動した。

 そのかわり、10/100Mbpsの識別をするチップLEDをつけて(最初は付けない予定)、ちょっと自己満足する。チップLEDを使うのは始めてである。チップLEDのハンダ付けの練習に、チップLEDを基板小片につけて遊ぶ。

 制限抵抗は、ジャンク基板(以前、MACアドレスを貰ったNIC基板、こわしたRTC基板など)から、例の低温ハンダで取得する。チップ部品は意外に普通の半田だけではしぶとく残るが、このハンダだと面白いように簡単にとれる。

P5123862

 久しぶりのハンダ付けを堪能して、ようやくLANのPHY層基板は完成した。お馬鹿なことに親基板のLPC2388基板はまだ何もやっていない。親基板に電源を入れると、LEDが点滅した。ははは、LEDチカチカから一歩も進んでいなかったのだ。

 ソフトが全く準備されていないので、親基板につけても何も動かない。早く動くのを見たいが、しばらくお預けである。何でLPC2388を開発していたのかも忘れている。そうだ、JTAG経由だった。こういうときにこのブログは大変役に立つ。

DP83848のLAN基板完成後に思わぬ落とし穴(5/7/2011)
 やはり、間違えていた。データシートにはっきり明記されていた。LPC2388とつなぐには、50Mhzのオシレーター(発振器)がいるのだ。遠慮せずに「ねむい」さんに聞くべきだった。自分の都合の良い解釈で25Mhzの発振子で組み上げて、ウェブを見ていたら、「LPC2388はRMIIモードでうごくので50Mhzの発振器が必要」という記事を見つけた。

 ええー、そんなことどこに書いてある。いーえ、しっかりデータシートに出ておりました。「50Mhzの発振子では動かない。RMIIのときは必ず発振器にすること」(p21)。やれやれ。

 動かす前からこれである。腹立ちまぎれにすぐ低温ハンダをとりだして、25Mhzのクリスタルとコンデンサーを一気にとりはずす。さて、50Mhzの発振器である。これが秋月や千石などの定番の店にないのだ。マルツにはあるが12ミリ四方の大きなやつで、とてもこの基板のスペースには入らない。しかも¥1000近くする。

 ウェブでカタログはいくらでも手に入るが、みんな卸しやプロ相手の店ばかりで、小売してくれそうな店は見つからない。やっと京セラの表面実装の50Mhz発振器をばら売りするところを秋葉でみつけたが、¥750。「店頭販売はしない」ということで通販なら送料がかかって¥1000以上だ。話にならない。

 思いあぐねていたら、猫が遊んでボロボロになった分厚いDigiKeyのカタログが目に止まった。ああそうだ。ここにあるかもしれない。調べてみる。あった、あった。CTS社という知らないメーカーだが、表面実装の京セラのにそっくりの石が見つかった(OEMかも)。値段はなんと¥265。

 よーし、これでMbedを買うチャンスが生まれた。前から欲しかったMbedである。DigiKeyでは、日本より¥500ほど安い(¥5405)。何かのときの送料無料のゲタがわりにしようと、買うのを我慢していたのだ。

 Mbedと、このオシレーター、それにDC-DCコンバーターLM2735(ストロベリーリナックスの昇圧モジュールに使われているもの、12V500mAまでとれる。¥322)2ヶ、HブリッジドライバーIR2011(内部に昇圧回路を持ち、NMOS-FETだけでHブリッジを作れる。¥311)3ヶ、あわせて¥7515。送料無料ラインを超え、消費税のかからない(¥10000以下)、最も経済的な価格帯である。上機嫌で発注のボタンを押す。

DigiKeyからオシレーター到着。しかしまたまた大変なことに(5/11/2011)
 DigiKeyから早くも品物が届いた。喜び勇んで表面実装の発振器をとりだす。うーむ、横に出ているパッドが小さくて半田付けに苦労しそうだ。mbedはケースから出してみただけ。少しお預けである。

P5133882

 ハンダ付けを慎重に行う。ベタアース基板なので、固定は当然、ハンダ面である。DP83848の位置を50Mhz出力に考慮せずに決めてしまったので、LPC2388へのコネクターまでの距離が長い。気休めに、オシレーターをチップとコネクターの中間位置に置いて少しでも距離を稼ぐ。

 パッドが小さくて、本当にハンダ付けが出来たのか心もとないが、とりあえずは全体の配線は終わった。念のため、VccとGNDの導通テストをする。ありゃりゃ、ショートしている。このテストは、クリスタルの時にやって50KΩ以上だったことを確認している。今度のオシレータ化が原因だ。

P5123860

 あちこち調べ始める。ところが、これが何と、オシレータにしたところを全部外してもショートしている。おかしい。次々にはずして行って、チップ(DP83848)のいくつかあるVcc(48ピン)とGND(47ピン)が残った。こいつがショートしている。えー、ハンダボールでも基板に乗ったのか、拡大ルーペで変換基板上を丹念にチェックする。いや、きれいなものだ。

 遂に、チップをはずす。やっぱりチップでショートしていた。ええー、これはどうしたことだ。思い当たる節がない。まだ電源も入れていない。あっ、そういえば、チップLEDをつけたときに点灯するかどうか、チップLEDの間に3Vの電圧をかけた。チップLEDの一方はI/Oピンに接続され、Vccピンとはプルアップ抵抗を介してつながっている。

 うーむ、これだろうか。この程度でICが壊れてしまうのだろうか。しかし、現実にはチップがショートしている。今のところ、この操作くらいしか原因は考えられない。DP83848は幸い、予備が買ってある。泣く泣く、新しいものに交換する。

100MbpsでHUBが認識した(5/12/2011)
 えらいめにあったが、何とかオシレーター版が完成した。当然のように、VccとGNDのショートはなくなった。それにしても何で壊れたのだろう。まだ狐につままれたような信じられない気持ちだ。配線は完了したが、これで動くのかはまだ全くわからない。簡単に確認する術がない。下手に単独で電源を入れて、こわれたらさっきの二の舞だ。

 親基板のLPC2388はまだソフトが何も入っていないのだ。しかしショックが強くて、すぐ作業を開始する気にならない。色々考えたが、やはりソフトを動かして確かめていくしかない。出来上がった基板を横目にして、LPC2388のソフト開発の手順をゆるゆるとウェブで調べ始める。

 先は長そうだ。気が散ってなかなか先に進まない。意を決して、本体のLPC2388に基板を差し込み、LANケーブルをつないで電源を入れてみた。いずれこれはやらなければならないことである(また大げさな)。ソフトは何も入っていないのでDP83848には電源が入るだけだ。何が起こるかわからないが、もう我慢しきれない。

 おお、薄くモジュラーのリンクLEDが点いた。やった、やった。つながった。接続先のHUBには100Mbpsのディバイスがつながったことを表す緑のLEDが点灯した。時々、アクティブを示すLEDも点滅している。よーし、PHY層の一番下のレベルは動いたようだ。

P5133874

 オシロを取り出して、オシレーターの出力を測定する。お、良いぞ。きれいな正弦波の50Mhzが出ている。やれやれ、ハードの基本部分は凡そ動いているようだ。今までの苦労が報われた感じで、肩の荷がおりた。とりあえず一段落である。

先が長くなりそうなので、このあたりでブログに報告しておくことにする。

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

« 2011年4月 | トップページ | 2011年6月 »