昨日の1ビットの設定ミスによる挙動不審は解決したが、なぜ、あのような不可解な現象が起きたのか。放っておくのも気持ち悪いので、原因を解析してみた。
PIC16F1823のデータシートを再度熟読。不具合の原因が特定できた。ただし、発生した現象の解析は、かなり困難なことも判明。
データシートには、以下のように記述されている。昨夜は、「熟読」とか書いていながら、ちゃんと読んでないのがばればれじゃん。。。。
『Timer1 オシレータは、Timer1 周辺モジュール専用の水晶振動子オシレータです。T1OSO/T1OSI ピンに接続した32.768 kHz の水晶振動子によるタイマ動作向けに最適化されています。Timer1 オシレータは、T1CON レジスタのT1OSCEN制御ビットで有効にします。』
T1OSCEN制御ビットを「1」にセットすると外部に接続された水晶発振子が有効になる。ちなみに、32.768kHzというのは、クォーツ時計を構成するときに利用される周波数。その発振子を接続するのために、PIC16F1823のRA4、RA5の2つの端子が使われる。右図で左端のT1OSOがRA4、T1OSIがRA5の端子ピンに対応する。
ところが、私の回路では、RA4は利用していないが、RA5はLCDモジュールのRS信号出力に使っている。これは、LCDにデータを送る際に書き込みを行うストローブ信号を制御するもの。これが正しく動作しないと、LCDにコマンドやデータを正常に書き込むことができない。この原因によって、初期化が正常に行われないという状況に陥っていたということ。
しかし、それだけだと、テスト用プログラムで初期化を行った後は、おかしいながらも何となくデータが表示されていた理由が説明できない。この現象を解析するのはかなりむずかしい。
発振子を利用するときは入力設定だが、RSで利用するときは出力設定となる。同じライン上で入力と出力がぶつかることになり、ハード的には下手すると壊れてしまう状態だが、実際には発振子は接続されていないため入力信号はないため、破壊は免れ、出力信号がライン上に現れると考えられる。しかし、チップ内ではこのラインは、入力回路として内部ロジックに接続されており、インピーダンスは低く、電流が内部ロジックに吸い込まれるため、十分な電圧幅にスイングできない状況と思われる。
ここから後は、裏付けがないので、あくまでも推測。
LCDの初期化は、最も重要でミスが許されないため、正しく動作させるために、十分な電圧幅の信号でないと受け付けないようマージンが小さく設計されているのではないか。これに対し、以降のデータの受信は、多少のエラーは表示が乱れるかもしれないが、データを受信することに重点を置き、マージンが小さい設計が行われているのではないか。
LCDのデータシートからは、読み取ることが不可能なためあくまでも想定でしかないが。これ以上の解析は、高度な計測機器を持たない個人にはちょっと難しいところだ。
このあたりまでにしておく。完全理解とまではいかないが、不具合の発生原理は、何となく理解できるところまでたどり着けたことで、気持ち悪さは解消された。ノウハウとして引き出しにしまっておこう。
(プロ) クリアのタイミングは大丈夫ですか?小規模オールインワンのマイコンはイニシャルクリアもケチった回路を内蔵したりしています。要は自分に供給される電圧を見て自前でクリアするのですが、何らかの配慮がなければ、必ずしも周辺回路が動作可能となるタイミングと、マイコンのクリアが解除され起動するタイミングは同期しません。
(私) 師匠、いつも貴重なコメントありがとうございます。気付きにくいポイントに対する指摘、いつも感謝してます。
ミッドレンジクラスのPICは、低電圧によって内部リセットがかかるタイミングを1.9V(Lo)と2.7V(Hi)という2段階設定できるようになっています。電源電圧低下時には早めにリセットがかかるように設定しています。基本は、CPUの制御が失われた場合に、電源ラインを閉じるように設計しなければならないと思っているのですが、電源不安定時等の動作は、都度確認しないといけませんね。
そろそろ、きちんと直流配電盤を作らなければと思い、直流ブレーカも入手しました。交流に比べて種類が少ないですが、富士電機と日東工業のものを購入して試そうと思っているところです。
今後も、いろいろと教えてください。よろしくお願いいたします。