dsPIC33FJ64GP802で不思議な事象に遭遇したため、メモ書き。
マイコンのデータ表示に使うLCDで秋月やaitendoで販売されているI2C接続のものをよく使用しています。
LCDの価格に差がなく、4ビットや8ビットピンを配置する必要がなく、配線が楽だからです。
好んで使用しているのは
ACM1602NI-FLW-FBW-M01
です。
白い綺麗なバックライトが特徴で他の省エネ薄型I2CのLCDに比べ、
プルアップ抵抗の制限を受けない感じです。
省エネ薄型I2CのLCDはI2Cの駆動電流が少なく、
プルアップ抵抗が小さくても大きくてもうまく通信できない感じがします。
特にスレーブのデバイスを複数繋げるとプルアップ抵抗の制限が顕著でした。
今回はI2CのLCDでdsPIC30FやPIC16F等で使用していたライブラリを
dsPIC33F用に少し修正して利用しようとしたところ、あるトラブルに遭遇しました。
プログラムとしては、
main関数内で
クロックの設定やポートの設定の後、
I2Cモジュールの初期化を行い、
LCDの初期化という流れです。
dsPIC30FやPIC16F等でも使えていたにも関わらず、
うまくLCDの初期化ができないという問題に遭遇しました。
オシロで波形を見るとI2Cのデータやクロックが出ているようですが、
うまく初期化ができていないようです。
送信やACKのタイミングなど調整してみましたが、
うまくいかず・・・
結局、
ポートの初期化の際にI2CでSDAとして使用するRB9を
"input"として初期化するとうまくいきました。
つまり、
TRISB=0b0000000000000000;
から
TRISB=0b0000001000000000;
にすると解決。
データシートにはI2Cモジュール有効と共にIOの設定が上書きされるとありましたが、
他の何かが悪さしているのか上書きされなかったようです。
それでLCDからのACKが無視されてしまったようです。
タイミングが変わるのか、IO設定が上手くいっていないのか、
真因は不明ですが、同じような事象で苦労している方に役立てればと思います。