2021年8月12日木曜日

PICでのシリアル受信に一苦労

 現在開発中の案件で、センサーからのデーターをPICで受信するという回路がありまして、
センサーが出す信号は、中身はRS-232C仕様なのだがTTLレベルのシリアル信号。
PICのUSARTに繋ぐだけで、難無く受信できるはずの代物だったのですが・・・・・・

いざ動かしてみると、最初は問題無くデーターを受信できてるものの、
しばらくすると まともにデーターを受信できなくなってしまう。

センサーの出力を見ると、きちんとデーターが出力され続けているので、
PICのUSART側に問題有る模様。

パリティは使われていないのですが、チェックサムは添付されているので、
チェックサム比較を行うコードになっていたので、
試しにチェックサム比較を停止しても状況変らず。
なので、USART自体がデーター読み取りに失敗してる模様。

ところが、何度ソースを見直しても、USARTの設定に問題が見当たらない。
念のためにERRATAを確認しても該当箇所は無し。

途方に暮れつつも、試行錯誤を開始。

結論から書くと、USARTモジュールイネーブルとUSART受信イネーブルを
同時に行うようにすることで、なんとか読めるようになりました。
(たまに読み込みに失敗するので、完全に解決とは言えないのですが)

USARTのモジュールをイネーブルにしたままでも通常は問題無いはず。
最近のPICはUSARTのモジュールをイネーブルにすることで、
TXとRXに使うピンの設定が行われるので、
それを考えるとイネーブルにしたままというのが正解なはず。

データーの送信・受信は、各々イネーブルにする設定ビットが存在しますから、
そちらを操作すれば十分なわけです。

ということで、元々のソースでは、USARTモジュールをイネーブルにした後、
受信イネーブルのビットを操作する、というアルゴリズムになっていました。

ところが これだけ最初に書いたような状況に陥ってしまいました。

USARTモジュールのイネーブルビットと、受信イネーブルビットは、
同じレジスター上に存在します。
そこで、上記2つのビットを同時にイネーブルにするようにしてみたところ、
割りと安定してデーターを受信できるようになりました。

もちろんデーターを1個受信したら、USARTモジュールと受信イネーブルのフラグを
同時書き込みでディセーブルにしてしまいます。

今まで遭遇したことが無い現象なので、困惑しているところ。
シリアルのボーレートが115.2Kと速いのが一因かもしれません。
この案件だとそんな高速通信は必要無いので9600辺りまで落とせればいいのですが、
センサーの設定変更は別なリスクが伴うので、出来れば手を加えたくないところ。

とりあえず、実用可能範囲レベルには読み込みできるようになったので、
これで様子を見てみようかと。

0 件のコメント:

コメントを投稿