« MMC(SDカード)をMega168で | トップページ | 今度はフォトカプラ2つが犠牲 »

2008年8月31日 (日)

LCDを待ち時間なしで動かす

電源逆差しでRTCがお亡くなり(5/11/08)
 SDカードのプロジェクトが一段落したので、工作室を整理しながら、今までやり残していた作業を少しづつ始めている。電力ロガーのセンサーの出力がACであることがわかっていたので、ブリッジダイオードでDCにして手元にある電気機器を測定したり(これが意外に直線性が悪く補正が必要か)、遊びに買ったLEDマトリックスのトランジスタアレイ(TP62083)の定格を調べて、基板の構成を考えたりしていた(最終的には4文字くらいの電光掲示板にしたい)。

 先の話はともかく、前から気になっていたのが、I2Cを使ったLCDドライバーで表示しているデジタルクロックである。1秒タイムアウトですっかり丈夫になったドライバーだが、一晩置くと、表示が止まっていたり、2行ダブって表示されたり、まだ実用レベルとは言いがたい状況である。LCDの表示がダメなのか、I2Cが空振りしているのかわからない。

 UARTをつなぐと何事もなく表示が始まるので、デバッグの手段が見つからず放置してあった。懸案が片付いたこともあってアイデアが浮かんだ。そうだEEPROMにログを記録しておき、それを後から見れば良い。幸いメインチップはTiny861なのでフラッシュは余裕があるし、EEPROMは512バイトもある。節目でデータを書きタイムスタンプを書き込んでおけば直前の状況がつかめる。

 思いついたら実行に移さないと気がすまない性分である。早速、奥に置いてあったLCDデジタルクロックのブレッドボードを取り出し、秋月で買った3個めのRTCモジュールを差して久しぶりに動かす。問題なく動く。AVRstudioのプロジェクトをLCDのメインに移し、eepromのルーチンを組み込み始める。

 組み込み始めてから、LCDドライバーの方も換える必要がでてきて結局ドライバー側もファームウエアを書き換える。ISPケーブルが2つのボードを行き来し神経を遣う。何とか双方のファームを書き直し、データの取り出し部まで書かずにとりあえず動かし見る。

 これが、動かないのである。まあ、すぐ動かないのには慣れている。少しづつこれまでのルーチンを入れながら動かすことにする。まず、LCDドライバのケーブルをはずし、これまでのステップを全部コメントアウトしRTC部分だけ動かしてみる。なに!これも動かない。そんな馬鹿な。念のためRTCモジュールをSDカードのボードに差してみると問題なく動く。

 少し考えて原因がわかった。LCDドライバーへのコマンドをコメントアウトしていないので、ここでI2Cがハングしている。モジュールが原因でないので元のモジュールを戻し、LCD関係をスキップするファームを書き換えて電源ON。

 まだ、動かない。えー、どうしてとモジュールを見たら、何と逆に差している。大抵のICはたすきがけの位置にVccピンとGNDピンがあるから逆ざしは致命的だ。この間10数秒。慌てて電源を切り、元へ戻すが遅かった。レジスタは読めるが書き込めない。そのうちreadも出来なくなった。

 ちょうど車の物損事故のときの気分と良く似ている。怪我をしたり、たいしたお金を失ったわけでもないのに、無性に自分が腹立たしく気分が納まらない。車と違って外見は全く変わりがないので余計口惜しさがつのる。 やれやれ、また秋月に行って買ってこよう。いや余り早く行くとまた必要もないものを買ってしまいそうである。もうすこし後にしよう。

LCDのビジーフラッグの問題が解決(5/14/08)
 電源逆ざしでICを失い気分が滅入っていたが、久しぶりのクリーンヒットが出て気分は最高である。今年の正月から奥歯にものが挟まったように気になっていた問題が遂に解決された。LCD表示のビジーフラッグを調べて表示するロジックの実装である。

 LCD表示は、AVRを始めてすぐ取り組み、豊富なWebの情報をもとに動かせるようになった。I2Cを使ったLCDドライバーまで作ったが、長時間表示させると調子がおかしい。表示が止まっていたり、2重に表示される。これを解明するためEEPROMを使ったトレースの仕掛けを作ったのだが、これがまだハングするのである。EEPROMには何にも残されていない。I2Cがおかしければ必ず何か証拠が残るようにしてある。こうなると原因はI2CではなくLCDの表示そのものである。

 LCDがハングする原因はLCDの制御が終わらないうちに次のコマンドを送ってしまっている可能性が高い。さらに待ち時間を増やしてみたが同じ。しかし、待ち時間を調整して動かすのは余り嬉しくない。確かに1本信号線は節約できるが、本来のLCDの能力を生かしていないことになる。しかし、LCDのREADを使ってビジーフラグを見る方法は、さんざん試したが、どうやっても動かず、諦めてみんながやっているように時間を待って書くコードにしてしまった。

 データシートによれば、コマンドの処理時間はたかだか60μsなのに、待ち時間は1ms以上必要で、それ以下ではハングアップしてしまう。理屈に合わないが、それだけの待ちを入れれば動いたのでそのままになっていた。

 ハングアップとは直接関係ないが、ちょうど良い機会なので、少し念入りに調べてみた。Webを漁ったが、どのソースも待ち時間を入れているだけで本格的なビジーフラグを見るコードを探し当てることが出来ない。諦めきれず、「LCD」「待ち時間」などのキーワードで調べているうち、あるサイトにLCDを使った製品のPDFがあり、そこには待ち時間ではなく、LCDのビジーフラッグを調べているフローチャートが掲載されていた。このプログラムはビジーを見るために2回READをしている。えー、頭のbit7(busy flag)を調べるだけで良いのに何故2回も読む必要があるのだと思った瞬間、頭を電撃が走った。これだ。LCDの初期化で散々4ビットモードにするロジックを研究したはずなのに、フラグを見るREADを一回しかしていない。

 あとから考えれば、何でもない話だけれど、全くこれに気がついていなかった。そのWeb
を見たのは職場である。帰宅して夕食もそこそこにLCDの試作プロジェクトを立ち上げ、LCD表示基板から石をはずしてブレッドボードにLCDを取り付ける。お世話になったTiny26の余命をすごさせるLCD 表示基板には、こういうこともあろうかとLCD端子をそのまま引き出したソケットがつけてある。

 急いで色々なところからコードをかき集め、待ち時間ではないビジーを見る関数にENABLEをもう一回とデータレジスタを出力から入力、さらに出力に戻す修正を入れる。あれだけ頑固に動作を拒否していた仕掛けが何の問題なく動いた。心なしか速い感じがする。ハングアップする原因は明らかだ。次のREADで下半分が読み出され、関係ないビットをビジーフラグにみなして、それが0なら先に突っ込んでハングアップする確率は50%、奇数回にOKになれば、あとの処理は4ビットづつずれて目茶目茶になる。

 問題が解決したときの最高の気分を味わう。何度経験してもこの気分は何物にも替えがたい。長い間の懸案が片付いたのだ。今までの暗い気持ちが嘘のように晴れ天下をとった気分になる。山登りで頂上に着いたときと同じ爽快感である。

ここにビジーフラッグを見て表示するLCDのドライバーとヘッダーファイルを置きます。
表示速度ははるかに速くなりますが、RW線を所定のポートにつなぐ必要があります。

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

 今夜は旧友との飲み会でへろへろだったけれど、帰って来てすぐPCに向かう。やり残している仕事(?)がある。今まで文字を表示するたびに1msとか1.5ms待っていたルーチンとの性能比較だ。酔いで覚束ない手先でロジアナのプローブを接続し、LCDの最大の文字数32文字を表示させる。何と32文字表示するのに2msかかっていない。10倍以上の速さである。大量に出力すると見た目でもはっきり一気に表示されるのがわかる。今までは一呼吸かかっていた。LCDというのはそういうものだと思っていたが、申し訳ないことをした。LCDに謝らなくてはなるまい。

やることが多すぎる(5/20/08)
 難問が解決して、少し気が抜けてしまった。何しろやりたいことは山ほどあるので、何かやりだしても、他のことに気が散ってなかなか先に進まない。こういうときは手作業が一番落ち着く。アイテムラボから買った変換基板にMega128の実装を始めた。実は、変換基板をユニバーサル基板につけるピンヘッダーを1000ピン(\1500)も買ってある。

 なぜこんなに買ったかというと、秋葉原などで売っているICピンヘッダーは金メッキなどの高いものしかなく、Mega128の64ピンだけで\300以上かかり変換基板分を入れるとチップの値段に近づいてしまう。

 表面実装はやってみたいが、基板を自作しない限り安定した配線は望めない。それにブレッドボードがとても使い勝手が良いので、このボードを基本にすべての工作を進めて行きたい。で、変換基板なのだが、いくらなんでもチップの値段に近いところまでかけてやるのはいただけない。これだと64ピンでも\100以下ですむ。

 少し飲みに行けば\5000やそこらはあっという間に使ってしまうが、電子工作になると途端にみみっちくなるのは不思議だ。消費感覚と言うのは相対的なものなのだろう。0.8ミリピッチのTQFPの半田付けはこのあいだ大騒ぎして済ませてある(4/29)。ブレッドボードにつけるための小さなCPU基板に64ピン分のソケットをつけ、ここへ変換基板を差し込む。まだ用途の決まっていないときの基板の位置決めは難しい。QFPのピン配置に慣れていなく、しかもMega128は電源ピンが3組もあるので電源とファーム書き込みのISPピンの配線だけでも結構頭を捻る。ついでにパスコンにこのあいだ買ったチップコンデンサーをピンの間に半田付けし悦にいる。

 出来上がってチェックしたら、あろうことかチップコンデンサーをつけたところだけ1ピンずれていた。マーフィーの法則である。2ミリに満たないチップコンデンサーのとりはずしが簡単ではないことをいやというほど知らされる。ウェブでチップパーツの取り扱いに大げさな注意があったのを笑っていたが確かに笑い事ではない。くしゃみをすれば間違いなく部品はあっというまに吹き飛び、見つけることは殆ど不可能だ。

 半田まみれになりながら何とかチップコンデンサーの移動は終わった。テスターで容量が定格にあることを確認し胸をなでおろす。まあ、1ヶ\2なのだけど、部品を動かす前に壊してしまうと言うのは抵抗がある。生きとし生けるものというが、職人の感覚では道具、部品、材料すべてに命が宿っている気がする。無機質な要素を集め、工夫し、汗を流して、何か動く命があるかのようなものにすることが無性に楽しい。

 Mega128が動いた。Gataro研のフラグシップである。今のところSDカードとNICチップをつけてインターネットのマイクロサーバーのCPUになる予定である。A5211285

 手を動かしだすと止まらなくなった。やりかけになっていたボタン電池をつけたRTC基板もついでに完成させてしまう。これでブレッドボードにつける変換基板がらみの小さなユニットは、作り始めた順番に、DCアダプタ基板2ヶ、NIC基板、SDカード基板、RTC基板の5つになった(NIC基板は電源コントローラに実装済み)。これにMega128のCPU基板が間もなく加わる。

|

« MMC(SDカード)をMega168で | トップページ | 今度はフォトカプラ2つが犠牲 »

電子工作」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1089557/23390414

この記事へのトラックバック一覧です: LCDを待ち時間なしで動かす:

« MMC(SDカード)をMega168で | トップページ | 今度はフォトカプラ2つが犠牲 »