2015-07-14 17:32 | カテゴリ:PIC応用回路
PICと気圧計の接続が難航していました


デロリアン製作と並行して、PICに液晶表示器とGPSと気圧センサーを繋いで、ポータブルケースにまとめようという計画を進めていました。
GPSの接続はi2c規格のシリアル通信で、上手くデータを読めるところまできました。
手持ちの気圧センサーもi2cインターフェスなので、ついでに接続しようと思い、回路に組み入れました。


DSC01094.jpg


中央の四角いGPSセンサーの右の赤いLEDが光っている小さなチップが気圧センサーです。

色々調整して、8バイトの気圧計内部の補正係数を読み出す段になって、どうしても安定した読み出しができません。
読み込むたびにデータが変わります。
なぜか???

考えられるポイントは、

1、i2c通信のラインに入れたプルアップ抵抗値が合わない。(WEBで見ると結構シビアみたいです)
  私は、4.7KΩにしています。

2、気圧計の内部動作速度がi2cの読み出しに追いついていない。

3、i2cのドライバー関数が適合していない。

4、その他、あるいは上記の複合要因

です。

まったく動作しないわけではないので、(2)を疑い、随所にDelay関数を入れてみましたが、もう一つスッキリしません。
次に、(1)のプルアップ抵抗を10KΩに変えてみました。が、変化ありません。
うーん。
そこでもう一度i2cドライバーソフトの(3)をチェック。
そもそも、以前製作したアセンブラのソフトをXC8言語に置き換えたものなので、ひょっとして、間違いがあるかも。

ありました、チェックするビットの0と1を間違えていました。
やったー!
それでテストしてみると、おー、ちゃんと安定して読み込めます。
これでOKと思っていたら、どうも最初のデータのみいつも「ゼロ」だと気づきました。
これは変です。

ここからの解決が長かったです。

以前製作したアセンブラを持ち出して、それで動作させてみると、ちゃんと動きます。
これはソフト以外に問題があるとは思えません。

そこでもう一度、XC8のプログラムをじーっと見ていくと、、、、

ありました!!
i2cのSTOP関数の( )が一箇所記述してありませんでした。

i2c_STOP() とすべきところを i2c_STOP となっていました。

これでもほとんど動作するんです。
でも、ちょうど、最初のコマンドを発行した後にデータを受け取り、その後に再度 i2s START していましたので、ケースによっては動作したのでしょう。

DSC01093.jpg


ここを直したら全然問題なく動作しました(笑)
液晶表示器に係数がちゃんと表示されています。
これで安心して、デロリアンの塗装仕上げに入れます。

管理者のみに表示する