AVRtiny13Aでつくるシリーズ4 I2CでキャラクタLCDを
- 2016/04/01 08:26
- カテゴリー:make:
今回は,tiny13AでI2CのキャラクタLCDを動かすという話です。
またまた秋月ですが,AQM0802という320円のキャラクタLCDがあります。8文字x2行で,大きさは2.5cm x 1cm程度と小型,3.3Vで動作し消費電流も最大1mAとなかなかのものです。
I2Cですから,電源2本と信号線2本の合計4本を配線するだけです。これがtiny13Aに繋がってくれると,随分出来る事が増えそうです。
同じI2Cで叩くSi5351AやaitendoのLCDが動いているんですから,なにも心配などありません。アドレスを変更し,コマンドとデータを送ってやれば,すぐに文字が出てくるさ,と思って軽い気持ちで始めたのです。
ところが,これが悪夢の始まりでした。
いくらやっても動きません。文字も出ません。初期化も出来ていないようです。おかしい,とにかくおかしい。
いろいろいじっても,全然動く気配がありません。配線ミスも疑いましたが,それもなし。このLCDはハンドシェイクをせず,ウェイトで制御しますので,十分なウェイトをあちこちにいれましたが,それでもダメ。
関数を作らず,ベタでデータを流し込んでもダメ。とにかくダメなのです。
いろいろいじっているうちに,初期化だけは出来るようになりました。スタートコンディションに続けてアドレスを送り,コマンドをだだだと流し込むと,とりあえずLCDがぼやーっと動き始めます。
そこからさらにデータを書き込むと,なにやら文字が出るようになりました。でも,化けていたり,出なくなったりと,散々です。
いろいろ試していると,ストップコンディションから次のスタートコンディション,そしてアドレス送信という一連の流れを繰り返さず,続けてデータを送り込めば動く事がわかりました。
この段階で胃に穴が3つほどあいていた私は,向かい風に立ち向かえなくなっていました。もうこれでいい,とにかくデータを流し込もう・・・
しかし無残に,表示は途中で途切れ,そこからはバケバケになってしまいました。
万策尽きた。もうダメだ。俺はもう疲れた。寝る。
悪いことに,オシロスコープが使えない環境で検討をしていたのですが,それはすでにSi5351AでI2Cが動いていたので,I2Cで問題が出るとは思っていなかったからです。
AQM0802特有の問題,もっと言うとLCDコントローラであるST7032の相性問題と考えて,もうこのLCDはあきらめようと思っていたのですが,最後に波形だけ見て終わりにしようとおもったのでした。
自宅にある,使い慣れたバグファインダー,HP54645D。
Si5351AのI2Cにプローブをあて,設定完了までの約1秒間,波形を丸取りです。
そして拡大して波形の詳細を見ていきます。
私はここで,戦慄しました。
まず。I2Cの基本的な概念が実装されていません。I2Cは,SDAの取り込みをSCLのエッジでは行いません。SCLがHighの時に取り込む,レベルトリガです。ゆえに,SDAはSCLがLowの間にしか,動かしてはなりません。
波形を見ると,SDAとSCLが同時に変化しています。これでもなんとか動いているのは,Si5351Aのマージンのおかげでしょう。
スタートコンディションを見ていきます。うん,これはまあ正常です。
次,ACKです。一説によると,ST7032はACKを返す際に,レベルを下げきれないことがあり,これが誤動作に繋がるという話です。しかし,今回はプルアップ抵抗を大きめにしてある(10kΩ)ので,ちゃんとACKが下がっています。問題ありません。
そして次,ストップコンディションです。
・・・え,ストップコンディションが出てないじゃないか。
一応それらしい動きをしていると思われる場所は,最後の部分にありました。しかし,SDAがHighのままになっていて,その状態でSCLがLowからHighになっているのです。
本来なら,SDAは一度Lowになってなくてはならず,そこからHighにならないといけないのですが,ストップコンディションになり損ねています。
どうやら,ストップコンディションを発生させる関数の先頭にSDAとSCLの両方をLowにする記述を忘れているようです。
自宅ではコンパイラもライタもないので,修正はできません。おそらくこうだろうとコードをざざっと書いて,翌日修正をして書き込んで見ると,何事もなかったように文字が出ました。
うれしいと言うよりも,なんだかバカバカしいと思いました。
というのも,このコード,google先生に聞いて出てきた,ある人のコードをそのままコピペしたものだったのです。一応内容は理解したつもりでしたし,なにより動作しているわけですから,ここを疑うことはしませんでした。
そもそも,この方も,海外のあるサイトから持ってきた物だとおっしゃっていて,内容を理解した上でウェイトを調整したと書かれていました。
でもね,内容を理解されたという割には,波形を見たら5分で分かるようなミス,それもストップコンディションというI2Cの基本中の基本シーケンスが動いていないんですから・・・
いえいえ,信じた私が一番悪いのです。
他人を信用せず,全部自分で書こうかと,途中までソフトウェアI2Cを書いていた途中のことでしたが,原因が分かり,修正ができたのですから,もうこのまま使います。
この修正をaitendoのLCDで作った時計にも入れてみましたが,当然問題はありませんでした。これで検証終了。修正版を正式にリリースです。
まとめるとこうです。ストップコンディションが出ていない状態ですので,バスは生きています。しかしホストはスタートコンディションとアドレスを発行します。スレーブはこれがデータかコマンドと解釈するので,意味のある数字なら動くし,ダメなら動かないわけです。
なら,Si5351Aではなぜ動いたのか。これはやっぱり,ストップコンディションが出ていなくても動くようになっていたから,ということでしょう。もしかしたら,SDAもSCLも両方ともが,ある時間以上Highになっているとタイムアウトでバスを解放するようになっているのかも知れません。
aitendoのLCDも修正前状態で動いていましたので,こちらもストップコンディションを無視しているんでしょうね。3つのデバイスのうち,2つが動けば,申し訳ないけど正しく動いていると信じてしまいます。
ということで,なんとかAQM0802を動かす事に成功しました。I2Cの動作も詳細に理解しましたので,決して無駄ではなかったと思うのですが,それでもどかっと疲れが出ましたし,釈然としない物もあります。
今回もはっきりわかったのは,やっぱり波形を見るとすぐに解決するということ,そしてオシロスコープはやはり最強ツールだということでした。
波形を見ずに試行錯誤をしていては,20時間経っても30時間経っても問題が見つかりません。問題が見つからないと対策も打てません。
でも,波形を見れば,本当に5分で問題が発覚,対策も打てます。
そして波形を取るのも,簡単にできると作業が捗ります。I2Cを解析する機能を持ったオシロスコープもありますが,私はそこまではいりません。ただ,見たい部分を確実に取り込める事が大事です。
これはつまり,多彩な条件を設定出来る,キレのいいトリガがオシロスコープの性能を決めるといっていいのですが,それ以外に,長時間丸取りし,あとで詳細を拡大して見ることが出来る機能が,私には必須です。
今のオシロスコープでこの機能がどのくらい装備されているのかわかりませんが,HP54000シリーズはこの機能の走りだったと記憶していて,幸い私が使い始めた54645Dがもつこの機能に,思わずため息が出たことを覚えています。
拡大すると取り直しになるオシロスコープがまだ多く,見たい部分の位置が,先頭からのバラバラの時間になってしまうようなケースだと,もうお手上げだったりします。
少ないチャンスを確実にものにするのが,キレのいいトリガ。そしてそのチャンスを生かし切るのが,MegaZoomです。
最近,安価なオシロスコープが当たり前になってきており,電子工作を嗜む人達の間でオシロスコープを持っていることが珍しくなくなりました。
それはそれでいい時代になったと思うのですが,それらが本当に良いものかどうか,私にはわかりません。良い道具を使えば,良い仕事ができます。それを強く感じた,一連の騒動でした。