マイコン工作実験日記

Microcontroller を用いての工作、実験記録

なんとかレジスタを読み出せた

2009-04-27 12:45:45 | CMOSカメラ
レジスタの読み出しすら満足にできないでいたCMOSカメラですが、なんとかダンプできるところまでこぎつけました。



MCU側から見ると、I2Cでのカメラから読み出しデータが送られてこないようにみうけられていたので、I2Cのクロック速度を落としてみたのですが、症状は変わりませんでした。カメラに供給している24MHzのクロックを半分の12MHzにしてみてもダメでした。しょうがないので、MCU側のMCKクロックを半分の50MHz弱に落してみたところ、なんとかレジスタダンプができるようになりました。実は、これでもまだ時々読み出しに失敗することがあります。なんか、ハード的な原因のようにも思えます。いいかげんな配線をしているのがいけないのかなぁ?

ハード側からの調査は、テスタであたることくらいしかできないので、手詰まり状態。しょうがないので現状でだまし、だまし使っていくことかにしようと思います。とにかくカメラからの画像を見てみたいですから。

レジスタが読めない

2009-04-23 00:42:32 | CMOSカメラ
実験ボードに載せたOmnivisionのCMOSカメラ OV9650ですが、I2Cでのレジスタ読み出しの段階で苦戦中です。最初のつまずきの原因は勝手な思い込み。レジスタ番号を指定して、その値を読み出せばいいので、てっきり次のように書き込みに続いて読み出しをするシーケンスでいいハズと思って、これまでに書いたコードを流用していたのですが、ちっとも読み出せませんでした。



よくよくデータシートというかOminivisionのSCCBの仕様書を読んでみると、レジスタ番号を指定したら、いったんStopを送出する必要があることが判明。Tech Toysのサンプルプログラムを確認したら、ちゃんとそのようなシーケンスになっていました。

この問題を修正したところ、ちゃんと読みだせるようになったように思えたのですが、連続していくつかのレジスタを読みだそうとすると途中で必ずデータが読み出せなくなってしまいます。うーん、何が悪いのか。。?

カメラ実験ボード

2009-04-21 01:35:02 | CMOSカメラ
購入したCMOSカメラの動作実験用のボードを作成しました。画像のモニタはQVGA LCDで確認することにします。このLCDを何枚も持っているわけではありません。LPC2388につないだものと同一の物です。必要に応じて載せ換えて使うことにします。



肝心のカメラはボードの裏側です。カメラ基板は2.0mmピッチでしたので、サンハヤトの基板ICB-013をカットして使ってみました。カメラモジュールは、3.3V, 2.5V, 1.8Vの3電圧が必要ですが、カメラ基板上に2.5Vレギュレータが搭載されているので、3.3Vと1.8Vの2電源の供給が必要です。そこで、この秋月基板側に1.8Vのレギュレータも追加してあります。



カメラは、AT91SAM9260に直結されています。AT91SAM9260は、ISI (Image Sensor Interface)というインタフェースをもっているのが特徴のひとつであり、今回はこのインタフェースを使ってみようじゃないかというわけです。つなげ方は下図のとおり。似たような名前の信号線をつなげればいいだけという、簡単な配線です。クロックとしては24MHzを供給。AT91SAM9260でUSB用クロックの生成に使っているPLLBを分周して24MHzを生成し、PCK1から出力させます。

カメラの制御はI2Cを使っておこないます。映像信号は、VSYNC/HREFでフレーム同期をとり、PCLKに同期した Y7..Y0 の8ビットで送られてくるということのようです。



さて、このボードを作ってLCDを載せるとSAM-BAがUSBで起動しなくなってしまい、ちょっとあせってしまいました。LCDをGPIOでつなげるのにPBをデータラインとして使っているのですが、PB5はデバックシリアルのRXD0としても利用されるピンです。どうやら、LCDがつながっているとSAM-BAはシリアルポートで動こうとするようです。この問題を回避するために、最初の写真の基板下側に見えているスライドSWを追加してやりました。PB5とLCDの配線をこのスイッチで切ってやると、SAM-BAがUSBポートで動いてくれます。

LCDは何の問題もなく動いてくれましたが、カメラの方で苦戦中です。。

おもちゃ箱

2009-04-18 20:38:14 | CMOSカメラ
香港のTechToysから、おもちゃが届きました。



シンプルだけど、しゃれた箱です。Tech Toy Insideというコピーが結構気に入りました。

中身は、これ↓です。1.3M CMOSカメラ。19.9USDなり。6.0USDの送料で、EMSで届けてくれました。



CMOSカメラ本体だけなら、Sparkfunであつかっているものが安くて良さそうなのですが、配線が大変そうです。このTechToysのカメラは変換基板が付いているので、自分で基板作れないわたしのような者にとっては、大変助かります。ただし、残念なことに、この基板のピンのピッチは2.0mmになっています。そのせいか、写真のようにピン・ソケットも付属していました。

いちおう、レジスタ説明の付いたデータシートがありますし、サンプルのソフトも公開されているので、なんとかなるのではないかと思って購入してみた次第です。でも、レジスタの説明といっても一行程度の記述しかないので、ほんとに使いこなせるかどうか不安なところです。

時計表示

2009-04-15 12:47:42 | Weblog
せっかくLCDをつなげてみたLPC2388なので、RTCから取得した日付/時刻を表示させてみました。いちおう、コロンは1秒周期で点滅させています。一秒毎の割り込みで画面更新という具合。いちおう、コロンは1秒周期で点滅させています。一秒毎の割り込みで画面更新という具合。



RTCは便利なのですが、この基板はVBATが3.3Vにつながってしまっており、電池でバックアップできないのがツライですね。電源入れる度に手動で日付/時刻を設定するのが面倒です。

何か新しいことをやってみたいと思いつつも、ネタの準備が整わずにいます。SDカードやEthernetをつなげてみたい気もするのですが、この基板に追加するかどうか思案中。

RTTを使ってみる

2009-04-12 16:55:01 | ARM9
LPC2388でRTCを使ってみたので、AT91SAM9260のRTTも使ってみることにしました。RTCとちがって、RTT(Real-time Timer)では時刻情報を保持するのは、32bitのタイマ・カウンタひとつだけです。日付と時刻を表示するには、ソフトでこのタイマ値を変換してやる必要があります。

RTT機能自体はAT91SAM7にもあったのですが、内蔵RC発振器によって動作するため、時刻精度が悪く使う気になれませんでした。AT91SAM9260では32Kの外部水晶を使って動作するうえに、電池でのバックアップもできるので、これを実験してみることにしました。



日付と秒数の変換にはnewlibのmktimeを利用しています。Unixのtime_tでは1970年1月1日(EPOCH)からの秒数を数えているので、RTTのカウンタをこの秒数に合わせておき、毎秒インクリメントさせるのが一番素直で簡単です。しかし、RTTのカウンタであるRTT_VRは Read-onlyのレジスタであり、RTT_MRを介してリセットすることはできても、任意の値に設定することはできません。そこで、次のような方法を採ることとしました。

  • 日付/時刻を設定した時にRTT_VRをリセットする。日付/時刻に対応するEPOCHからの秒数を求め、それを電池でバックアップされるレジスタに保存する。
  • 日付を表示する際には、バックアップ・レジスタの値にRTT_VRの値を足したものを、変換して表示する。

これで、めでたく電源を切っても時計は電池でバックアップできるようになりました。

ちなみに、AT91SAM9260には電池でバックアップできるレジスタは、4つ(16バイト分)しかありません。LPC2388には2KBもバックアップ可能領域があるようですが、おまけ基板では電池バックアップができないのが残念なところです。


LFNサポートを試してみる

2009-04-09 00:14:20 | Weblog
MMnet1002でUSBが使えるようになったのに気を良くして、続いてSDカードのドライバとFatFsも移植することにしました。ちょうど先日R0.07がリリースされ、長いファイル名(LFN)への対応が追加されたようなので、こいつを拾ってきて試してみました。



コードページの指定もできるようになっているので、SJISを指定してやって組み込んでやることで、上記のように日本語のファイル名も表示できるようになりました。LFNのためのバッファやEコード変換表が必要になるため、メモリの必要量は増大しますが、MMnet1002ではメモリ容量を心配する必要ないので、気楽に試せます。変換表だけでも64Kほどになるので、フラッシュへ書き込むと結構時間がかかるところですが、MMnet1002の場合にはテキスト領域もSDRAMに配置していますので、SDRAMへ直接ダウンロードしてしまえば、あっというまに転送終了。フラッシュ書き込みの待ち時間がないと、ずいぶんと気持ちがいいもんだと改めて感じます。

インターフェース付録のLPC2388であればフラッシュが512KBもありますから、コード変換表に64Kくらい使っても何ともないですから、これを使って実験してもいいですね。来月号の記事としてとりあげられそうな気配がありますが。。

CDCを使えるようにする

2009-04-07 00:37:50 | ARM9
ここしばらくLPC2388で遊んでいたので、ひさしぶりにMMnet1002で作業。TOPPERS/JSP sample1まではとても簡単に動かせたので、これまでにAT91SAM7で作成したコードは容易に移植できるだろうという感触を得ました。そこで、次なる機能としてUSBのCDCドライバと、コンソール機能を持ってきました。



これで1本のUSBケーブルでフラッシュへの書き込みとデバック用ポートを兼用でき、RS232Cケーブルが不要になったので、作業しやすくなりました。

GPIOでLCDをつなげてみた

2009-04-05 19:52:23 | Weblog
以前から興味があったLPC2388ですので、ついつい手がででしまいます。昨年使ったQVGA LCDをつなげてみました。



このLCDは RGBデータを5:6:5の16bitパラレルで書き込むことのできるタイプです。昨年、AT91SAMSE256のタッチパネルジャケットで使った時には、SRAMの領域に配置しておき、メモリアクセス操作で使えるようにしました。今回も同じようにSRAM空間に置こうかと思っていたのですが、LPC2388ではデータバスが8bitしか出ていないんですね。そこで、どうせ使わないであろうAddress/Dataバスの出ている P3とP4をFast GPIOとして使ってつなぐことにしました。



配線長を短く抑えるためにユニバーサル基板の表/裏にNXP-ARM基板とLCDを配置したので、ちょっと不格好。その代わり、スペースはたくさん余っているので、また何か追加するかもしれません。LCDにはタッチパネル機能も載っているのですが、とりあえずLCDに関係する部分だけ配線。タッチパネルについては、後で気が向いたら作業することにします。



昨年作成した動作試験プログラムを移植して、いちおうの動作を確認してあります。LPC2388のPWM1を使ってLCDのバックライトにかかる電圧を変化させることにより、輝度調整もできるようにしてあります。Address/Dataバスが出ているポートにはGPIO以外の機能は割り当てられていないので、LCD接続に使っても他の周辺I/O機能は全て生き残っています。ピン数が多いことの利点ですね。

LPC2388 - RTCを使ってみる

2009-04-02 00:20:46 | Weblog
LPC2388での次のお題を何にしようか考えていましたが、ここはやはり「LEDチカチカ」をおさえておこうと思います。しかしながら、雑誌記事のサンプルを動かしてもおもしろくないので、追加実装した32Kクリスタルの動作確認を兼ねてRTCからの割り込みを使ってLEDを点滅させてみました。

RTCの持つCIIR(Counter Increment Interrupt Register)機能を使うと1秒毎の割り込みは簡単に生成できますが、この割り込みでオン/オフすると点滅周期は2秒となってしまい長すぎます。そこで、CISS(Counter Increment Select Mask register)の機能を使って62.5ms間隔で割り込みを発生し、これを8つ数えることで0.5秒を作ることにしました。割り込み処理の中でLEDを直接操作してもいいわけですが、せっかくTOPPERS/JSPを動かしたので、その機能を使って処理することにします。流れは次のとおりです。
  1. RTCの割り込み処理で、62.5ms間隔の割り込み(RTSSF)を8回数えたら、iset_flgを使ってイベント・フラグをセットする。
  2. メインのタスクでは、wai_flgでフラグ待ちをする。
  3. フラグが立ったら、それをリセットするとともに、LEDを反転させる。
Fast GPIOの機能はAT91SAM7とほとんど同じなので、わたしにとってはとってもわかり易いですね。



RTCはカレンダー/クロック機能を持っていますから、どうせならこいつの動作確認もしてみようということで、シリアルポートにコンソール機能を持たせて、dateコマンドを用意してみました。main_taskが上記のようにLEDを反転させるタスクで、console_taskがコンソール機能とそのコマンド処理を実行しています。

AT91SAM7にはこういうRTC機能が無いために いつも秋月で購入したRTCをI2Cでつなげていたので、このRTC機能はとても便利に感じます。