誤動作
Atmega644P基板用に作ったライフゲームは手抜きで初期パターンが固定(グライダーガン)だったので、自由にパターンを設定できるようにしようと思って基板を開発用PCに接続したら、なぜかTeraTermでCOMポートが開けなくなってしまった。
デバイスマネージャで見てみると確かに仮想COMポートが割り当てられているのに、それが開けない。他の通信ソフトを使っても同じで、もちろん他にそのCOMポートを開いているプログラムは存在しない。
FTDIのドライバを最新にアップデートしても状態は変わらずで、変だなぁと思いながら試しにUSBシリアル変換モジュールを基板から抜いてみたら、今度は正常に開けるではないか。なんでだ?
そうなるとAVRマイコン基板側に問題があるとしか思えないんだけど、USBシリアル変換モジュールとAVRの間はVCC、GND、TX、RXの4本でしかつながってないし、導通をチェックしてもショートしているような場所はない。
そうこうしているうちに状態はますます悪化して、USBコネクタを抜き差しするとデバイスマネージャで異様に時間がかかるようになってしまった。しかも今度は仮想COMポートがデバイス一覧に表示されない。
その代わりに何故か「Microsoft Ballpoint Mouse」というデバイスが忽然と現れて、画面上のマウスカーソルがデタラメに動き出すという怪奇現象が(笑)。
AVRのリセットボタンを押したままUSBコネクタを挿すと、今度は何の問題もなく仮想COMポートが認識されるし、そのポートを開くこともできる。ところがAVRのプログラムが走り出してシリアルポートからデータが出力され始めると、とたんにUSBシリアル変換モジュールの動作が怪しくなってしまうのだ。
シリアル通信の速度は115.2kbpsに設定してあったので、試しにこれを19200bpsにまで落としてみると、その症状が出なくなる。速度を38400bps、57600bpsと上げても大丈夫なんだけど、115.2kbpsまで上げるとやはりその症状が出てしまう。
Atmega644P基板には20MHzの水晶発振器を使っていて、シリアル通信のボーレートはそのクロックを元に生成されるから、どうしてもピッタリの値にはならなくて僅かに誤差が出る。
誤差を出さないようにするには、18.4320MHzといった中途半端なクロックを使う必要があるのだ。
115.2kbpsだとその誤差がかなり大きく、-1.4%とかなりギリギリな値になってしまうのが、誤動作の原因ではないのだろうか?ちなみに19200bpsでの誤差は-0.2%、38400bpsは0.2%、57600bpsは0.9%なので、いずれも115.2kbpsよりは誤差が小さい。
これは全くの推測なんだけど、誤差が大きいデータを高速でUSBシリアル変換モジュールに流し込むと、変換チップが誤動作するんじゃないだろうか?それならこの怪奇現象にも説明が付けられる。
でも実際にはあり得ない気がするんだよなぁ。その程度で誤動作するようでは、怖くて使えない。もっと誤差が大きな場合でもちゃんと動いていた覚えがあるし。
良く分からないのでもう少し調査継続。
とりあえず誤差が発生するクロック数でのシリアル通信は、許容範囲内であってもあまり速度を上げないほうが無難だという事は分かった(笑)。
9/28追記
USBシリアル変換モジュールにUSBコネクタを挿して、PCとネゴシエーションしている最中に115.2kでデータを送信すると誤動作する事が分かった。通信誤差とは無関係らしい。
起動から10秒待って送信開始するようにAVRのプログラムを修正したら、115.2kでもあの妙な現象は起きないことが確認できた。
FT232RのPWREN#端子はUSB機器として認識されるとLowに落ちるので、それを監視してから送信開始するようにしたほうが安全かもしれない。
FT232Rのデータシートを見ると、バスパワー時の参考回路としてPWREN#がLowになってから周辺回路に+5Vを供給するようになっているんだけど、もしかしてこれってそういう意味?


コメント