2018年10月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

カテゴリー

ブログパーツ

無料ブログはココログ

« pythonで作ったノードサンプルを実行する | トップページ | PIC24Fに電子コンパスHMC6352をつないでみる »

2013年2月24日 (日)

PIC24Fで秋月のI2C液晶を使ってみる

花岡ちゃんのウィークエンド

前回実験したPIC24FJ64GA002の実験回路に、秋月のI2C接続液晶ディスプレイを接続してみました。基本的なI2Cバスへのアクセスは出来ているので、こんなの簡単…のはずでしてたが、結局丸一日つぶれてしまいましたので、後進の方のために顛末を投稿します。

Dscn2527

まず、このディスプレイのI2Cアドレスは0x50(送信するアドレスバイトは1010000X)固定で、EEPROMのベースアドレスとバッティングしています。EEPのチップアドレスA0,A1,A2を000以外にすればいいのですが、なんでまたよく使うEEPと同じにするかなあという感じです。EEPを一つだけ使う場合は、一列に並んだアドレスピンをみんなGNDに落として、000にするのがいちばん簡単ですからね。

とりあえずI2Cバスに接続してプログラムを作りましたが、なにも表示されません。液晶の上段が薄く全点灯しているだけ、I2Cでない普通の液晶に電源をつないだだけの状態のように見えます。シンクロでI2Cバスの波形を見るとACKが返ってこないようです。なんだこりゃということで、いろいろ試してみましたが状況は変わりません。

もしかしたら壊れているのかも? と思って散歩がてら秋月までもう一つ買い出しに。残念ながら新しいものに変えても全く同じです。2個不良というのはまずありません。

そこで、おなじみのPIC16F887の基板で表示プログラム(ただしccscで)を作って試してみると素直に動きます。バスの波形を比べると下のような違いがあります。
Waveform
上が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をつないでみる »

花岡ちゃんのウィークエンド」カテゴリの記事

コメント

コメントを書く

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

トラックバック

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

この記事へのトラックバック一覧です: PIC24Fで秋月のI2C液晶を使ってみる:

« pythonで作ったノードサンプルを実行する | トップページ | PIC24Fに電子コンパスHMC6352をつないでみる »