前回までで、PICのI2Cのタイミング条件とLCDモジュールのタイミング条件を確認した。当たり前だが、それぞれの条件を満たすように接続、制御しないと、正しく動かすことができない。どこか一つでも、条件が満たされていなければ、正しく動かないということ。
意外と陥りがちなのが、あまり細かく確認せずに、適当にやってみて動いてしまえばそれで良しとしてしまうこと。しかし、しばらくして、おかしな動きになることがたびたび発生してしまう。季節によって、動作が変わってしまうということは、実は意外と多かったりする。
特にコンデンサの容量は、温度によって変化する。温度補償型のものもあるが、一般に利用する安価なセラミックコンデンサや電解コンデンサは、温度によって結構容量が変動するということは覚えておいてよい。
このブログでも紹介している人感センサーライトは、作ったのが冬場だったのだが、最近、温度が高くなってきたら感度が鈍くなるという現象が出ている。特に、消費電流を抑えるためにデバイスの仕様ギリのところで設計すると、季節によって動かなくなるなんてことも起きかねない。ある程度の余裕を持った設計をすることが、トラブル防止には有効であることを覚えておこう。
ずいぶん話が横道にそれてしまったので元に戻そう。
前回までに整理したPICとLCDのタイミング条件を整理すると以下の図のようになる。
PICでは、baudレートジェネレータに100kHzの場合で79を設定しているため、
Tf + Tlow = Tr + Thigh = 5μs
となっている。
これに対して、LCDの要求は、
Tlow ≧ 5.2μs
Thigh≧ 2.4μs
である。
PICではTfは0.25μs以下だがどんなに小さかったとしても、Tlowは5μsに満たないことは明らかであり、LCDの仕様を満たしていないことがわかる。
それでは、満たすようにするためには、baudレートジェネレータにいくつを設定すればよいか計算してみよう。
Tlowが5.2μs以上でなければならず、Tfが最大で0.25μsなので、
Tf + Tlow ≧ 0.25 + 5.2 = 5.45μs
とならなければならない。
5.45 / 0.0625 = 87.2
よって、SSP1ADDレジスタに88(10進数)、58(16進数)以上の値を設定しなければならない。その場合の周波数は
1 / ( 0.0625 * 88 ) * 2 = 1 / 5.5μs * 2 = 90.9kHz
ということになる。
そこで、動いた条件を確認してみると、
I2C通信LCD苦労してようやく表示成功
SSP1ADD = 0x5F;
では動いていない。
う~~~~む。。。。。。あ・・・・スルーレート制御が100kになっていた。
Tf=0.25
Tr=1.0
Thigh=4.0
Tlow =4.7
Tr+Thigh=5.0
Tf+Tlow =4.95
仕様以内に収まっていそうだ。はて、奇怪なり。もう少し、深く検証が必要そうだ。今日のところは、ここまで。