「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。
ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ
前回(https://www.softech.co.jp/mm_050907_firm.htm)の技術レポートではシリアル通信の基礎を説明しました。
今回はマイコンでシリアル通信を行う場合に注意する点を説明します。
設計時に先輩社員が後輩に教えるような、書籍には記載されていない内容としました。
データを受信または送信する場合にCPUの割込み機能を利用します。
割込みとは、実行している処理を中断して、割込み処理として登録されている処理を実行します。
データを受信または送信したタイミングで割込みが入るように設定することで、ソフトを処理するタイミングに依存せずに強制的に受信または送信処理を実行することが出来ます。
通信における割込み処理を作成するときはCPUの負荷を考慮する必要があります。
以下の条件で具体的に検証します。
9600bpsというのは1秒間に9600ビットを受信できることになります。
上記より1ビットの受信には104.2 μS必要になり、1バイト(11ビット)の受信には、1.15mSかかります。
通常のシリアル通信では次のデータの受信完了前に直前のデータを受信する必要があるため、受信完了から1.15mS以内に受信データを処理しなければ、次の受信データに上書きされてしまいます。(オーバーランエラーとなります)
また、マイコンの中には5チャンネルのシリアル通信機能を持っている種類があります。
これは、5チャンネルのデータを平行して受信できるため、受信割込みが5チャンネル同時に発生することが考えられます。
5チャンネルのデータを同時に受信するためには、1チャンネルあたりのソフトウェア処理時間は229.2μS(1.15mS÷5ch)以内にしなければなりません。
ただし、割込み処理を229.2μSで設計すると、受信を続けている間は通常処理が実行出来なくなります。
システムの性質により違いがありますが、例として割込み処理の負荷を50%にしようとした場合は、114.6μS以内でソフトウェアの処理を実施する必要があります。
では、114.6μSとはどのような時間になるのでしょうか?
ソフトウェアの処理時間はCPUやクロック、コンパイラに依存します。
20MHzで動作するCPUがアセンブラの1命令を平均して4クロック程度で実行できると仮定すると、1命令の実行時間が200nSになります。
C言語の1行がアセンブラの5命令程度で構成される場合は、C言語1行あたりの実行時間は1μSかかり、割込み処理は114行以下にする必要があります。
上記の例では、受信割込みだけに着目していますが、実際には送信割込みなど、他の割込みも同時に入る可能性があり、9600bpsのデータを受信する割込み処理を作る場合は、全ての割込み処理の合計時間が1.15mS以内にならなければオーバーランエラーが発生します。
通信は1バイトでもデータ抜けが発生すると、その対象のフレーム全てが無効なデータになってしまうため、設計にはCPUの処理能力や割込み処理時間に注意する必要があります。
通信を設計する場合は、ノイズなどの影響を受ける前提で、エラー処理とエラー回復処理に重点をおく必要があります。
パリティーエラー、フレーミングエラー、オーバーランエラーなどはLSIのレベルで検出できるため、LSIの検出内容を利用して、エラーチェックが出来ます。
ソフトを設計する際には、上記以外のエラーも考慮する必要があります。
例として以下のような内容があります。
受信フレームを解析する場合に、BCCまたはCRCチェックによりデータを正しく受信できたことを確認します。
ここで、固定長のデータであればエラーチェックコードの場所が特定できますが、可変長のフレームの場合は、フレーム長やコマンドの種類からエラーチェックコードの場所を特定する必要があります。
ただし、フレーム長やコマンドが正しく受信できた前提が必要になるため、エラー検出の方法としては不十分になり、この部分を補うために、別な対策を通信仕様に追加する必要が出てきます。
このように、フレームやプロトコルの設計段階でエラー処理を十分に考慮していなければ、その対策のために複雑な通信仕様になってしまい、思わぬ不具合を誘発する原因になります。
同期通信を行う場合に見落とし易い点として、クロックのズレが発生した場合の対策です。
同期通信の場合は8ビットのデータを送るために、8ビット分の同期信号が出力されます。この同期信号がノイズにより1ビット増減した場合に送信側と受信側の同期信号のカウンタにズレが発生します。
このズレはLSIレベルでは検出できないため、ソフトウェアで検出する仕組みが必要になります。エラーを検出した場合は、LSIの初期化を行って、同期信号のズレを解消する必要があります。LSIを初期化しなければ、送信側と受信側のLSIのカウンタが永久に合わないため、通信が成り立たなくなります。
このように、同期通信の場合はデータだけでなく、同期信号がノイズに影響された場合も考慮して設計する必要があります。
シリアル通信は、処理の負荷や異常処理を考慮しなければLSIを制御するだけで難しい技術ではありませんが、例として挙げたような内容を検討し始めると、経験的な知識が必要になり、奥が深い技術です。
例を挙げて説明しましたが、「RS-232C」と聞いて、いつも使う簡単な技術と考えず、システムの信頼性を上げるためには、CPUの能力やシステム構成などシステムの設計段階で十分に検討しなければならないことが分かって頂けると思います。
(T.O.)
関連ページへのリンク
関連するソフテックだより