PIC24Fで秋月のI2C液晶を使ってみる
花岡ちゃんのウィークエンド
前回実験したPIC24FJ64GA002の実験回路に、秋月のI2C接続液晶ディスプレイを接続してみました。基本的なI2Cバスへのアクセスは出来ているので、こんなの簡単…のはずでしてたが、結局丸一日つぶれてしまいましたので、後進の方のために顛末を投稿します。
まず、このディスプレイのI2Cアドレスは0x50(送信するアドレスバイトは1010000X)固定で、EEPROMのベースアドレスとバッティングしています。EEPのチップアドレスA0,A1,A2を000以外にすればいいのですが、なんでまたよく使うEEPと同じにするかなあという感じです。EEPを一つだけ使う場合は、一列に並んだアドレスピンをみんなGNDに落として、000にするのがいちばん簡単ですからね。
とりあえずI2Cバスに接続してプログラムを作りましたが、なにも表示されません。液晶の上段が薄く全点灯しているだけ、I2Cでない普通の液晶に電源をつないだだけの状態のように見えます。シンクロでI2Cバスの波形を見るとACKが返ってこないようです。なんだこりゃということで、いろいろ試してみましたが状況は変わりません。
もしかしたら壊れているのかも? と思って散歩がてら秋月までもう一つ買い出しに。残念ながら新しいものに変えても全く同じです。2個不良というのはまずありません。
そこで、おなじみのPIC16F887の基板で表示プログラム(ただしccscで)を作って試してみると素直に動きます。バスの波形を比べると下のような違いがあります。
上がSDA(データ)下がSCL(クロック)です。16Fだとデータビットの真ん中にクロックが来てますが、24Fだとクロックの立ち下がりとデータの立ち下がりが同時です。ただ、I2Cではコレでもいいはず、data hold time(クロックの立ち下がりからデータ変更までの時間差)の最小値は0です。液晶のデータシートでもそうなってます。
同様の波形をソフトで作り、24Fで試してみるとうまく動きます。このせいなんでしょうか? でもなんか解せません。
さらに色々いじっているうちにようやく原因がつかめました。データを送信する時、送信とACKの受信が終了したことをTRSTATというフラグで見ているのですが、これで送信終了を判断した後、次のデータ送信までに10usほど時間をあけないといけないようです。EEPROMだと問題ないのですがI2C液晶はソフトで通信シーケンスを実装している関係で、データの取り込みに少々時間が必要なようです。波形を変えてうまく行ったのは、クロックの立ち下がり後に5usほどクロックLの時間を作ったことと、ソフトなので処理時間が少し増えたこと、これが相手の読み込み処理のマージンになったためだと思います。
最終的にはi2c_send関数の終了前にforループで遅延を入れることで、PIC24FのハードによるI2C通信でもきちんと働くようになりました。
I2C液晶表示を使った、100msごとカウントアップするタイマーのMPLAB Xプロジェクトを公開します。配線は前回の回路同様です。追試する方はEEPROMを外すか、チップアドレスを変更するのを忘れないでください。
「pic24f_test_2.zip」をダウンロード
« pythonで作ったノードサンプルを実行する | トップページ | PIC24Fに電子コンパスHMC6352をつないでみる »
「花岡ちゃんのウィークエンド」カテゴリの記事
- レーザー距離センサVL53L0Xを複数使うには(2022.05.01)
- 【訂正!】PIC24Fでレーザー距離センサVL53L0Xを使う(2022.04.13)
- PIC24Fでレーザー距離センサVL53L0Xを使う(おしまい)(2022.04.14)
- PIC24Fでレーザー距離センサVL53L0Xを使う(その3)(2022.04.13)
- PIC24Fでレーザー距離センサVL53L0Xを使う(その2)(2022.04.12)
« pythonで作ったノードサンプルを実行する | トップページ | PIC24Fに電子コンパスHMC6352をつないでみる »
コメント