Darkside(リンクエラー修正しました)

2019年11月8日(金) 22:11

I2Cバグまみれ

 電流電圧センサーが怪しく感じたので、外してI2Cバスをオシロに掛ける。すると、クロックが正常なのに対して、データーが不安定。5Vプルアップなのに、しばしば5Vオーバーしている。しかも、不規則。訳が分からない。

 そこで、そもそも5Vオーバーの電圧がどこで生成されているのか?
 回路の要所をチェックし、調べる。すると、プルアップ先が5Vではなかった。

 5Vは三端子レギュレーターの5V出力から取っていたのだが、配線は三端子レギュレーターの入力に接続されていた!
 単純な、配線ミスである。すぐに修正した。

 プルアップ先が5Vではなく、バッテリー電圧になっちゃってたのだ。これで、PICのGPIOが破壊された可能性がある。電流電圧センサーにも5Vではなくバッテリー電圧が供給されていたのだが、こっちは36Vまで入力可能なので何の問題もない。
 仮に一部パーツが破損したとしても、被害範囲は小さい。気を取り直し、動作試験を続行する。

 これでI2Cが仕事するようになるかと思ったが、まだおかしい。液晶ディスプレイへのデバッグ出力ができない。何も表示されない。
 そこで、LCD表示も停止してやる。電圧に関してはセンサーから取得した値を送信機に送り返すので、送信機のLCDを見れば正常動作しているかどうか分かる。

 何と、I2Cバスのアクセス衝突が発生していないはずなのに、電圧が0Vになっている。

 I2Cバスが働いていない場合は、全ビットが1になる。全ビットが0に固定されるというのは、明白にそれとは異なる現象である。I2Cバスが働いた上で、L固定・・・あっ!

 ようやく、根本的なミスに気付いた。
 I2Cバスには複数デバイスがぶら下がれるが、そのためにはバスに接続するGPIOはオープンドレインでなければならない。ところがPICのI2Cはソフトウェアで実装しているため、ハードウェアであるGPIOは通常のトーテムポールだ。つまり、I2Cバスを使用していないPICは、I2CバスにLを出力しちゃっているのである。

 ソフトウェアI2Cのプログラムを確認すると、I2Cバスを利用している時以外はクロックを入力に切り替えている。オープンドレインではなくても、ピンを入力にすればバスの電圧に影響を与えない。しかし、データーは出力のままだった。これで、I2Cを使用していないPICによってデーター線がL固定され、すべて0が取得されるようになっていたのだ。

written by higashino [Sタンク 1/16] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

Comments

TrackBacks

Darkside(リンクエラー修正しました)

Generated by MySketch GE 1.4.1

Remodelling origin is MySketch 2.7.4