1BIT I/Oでのシリアル送受信実験

1BIT I/Oでのシリアル送受信実験

[TopPage] -> [PIC] -> [OneLineSerial]  |   [blog]
[初版]  [2版]

1.はじめに
 MPLABのシミュレータは大変よくできているのですが、周辺回路がない状態での動作確認は結構大変です。StimulusControllerを使ってI/O入力のシミュレーションも可能ですが、A/D値等を実機環境で簡単に確認できたら動作確認作業効率が上がります。
 そこで実機環境での動作確認環境の改善のためにシリアル入出力を使った簡単な確認環境を検討します。

 送信と受信で2bitのI/Oを使うのももったいないし動作確認のためには半二重通信で十分なので、1bitのI/Oを使ってパソコン側のRS−232Cインターフェースと接続し送受信できるようにします。

2.RS−232Cの規格
 まずはRS−232Cの規格の再確認ですが

 1.送信側
   最大出力電圧 :±25V以下
   負荷時出力電圧:±5〜15V(3〜7KΩ負荷に対して)
 2.受信側
   入力最大電圧:±25V
   入力スレッショルド:±3V
   入力抵抗  :3〜7KΩ
となっています。(http://www.blackbox.co.jp/tech/1_5_2_7.htmlを参照しました)
 入力スレッショルドは実際には−3V〜3Vの間のどこかにあるはずで(規格上はこの範囲は使用不可ですが)、2〜3V辺りにあるようです。(http://elm-chan.org/docs/rs232c.htmlを参照)

 上記2で入力側のインピーダンスが数KΩなので下図のAの抵抗値をある程度大きなものにする等でTxからのデータがRx側に折り返すことはないはずです。
 このように1bitだけでシリアル送受信ができれば実機でのディバッグ環境が格段に向上します。
             A
  PC側 Tx ───VVVV──┐
                │  コネクタ
                ├──○ ○───→PICのI/Oポートへ
             B  │
      Rx ───VVVV──┘
      GND──────────○ ○───→PIC側GNDへ

3.実現方法の検討
 PCからの送信信号をPIC側の入力ではhighになるレベル内でなるべく低い電圧まで落とし(かつPC側の受信信号へ信号が出ないレベル)、PIC側からの出力信号(ほぼ電源電圧レベル)でのみ、PC側の受信信号へ信号が出るようにうまく電圧レベルを設計すれば、1bit I/Oでのシリアル送受信が実現可能なはずです。

 またPIC側のソフトは割り込みを使わずソフトでタイミングを調整し、入力/出力を切り替えながら19.2kbps(データ長:8ビット、ストップビット:1)で半二重シリアル送受信するように作成します。

4.結果
 最初は抵抗とダイオードを組み合わせたシンプルなものにし、DSUBコネクタケース内に実装することを想定していたのですが、そう簡単にはいかない事がわかりました^^;。
 そこで4ヶ月位前に買っておいたブレッドボードを初めて使い試行錯誤の末、完成しました。今までは空中配線でやっていてブレッドボードは食わず嫌いでしたが、今回使ってみて「なるほど便利なものだなぁ」と思いました。難点はといったら、ブレッドボードにつける素子の足は適当にまげますが、回路が完成し基板に実装する時にブレッドボードで使った部品を当然使いたくなります(何しろ動作確認済みの部品ですから)。
 そうすると足が曲がった部品を基板に取り付けることなり見た目の美観が若干低下します。^^;

 完成した回路図がこちらです。LEDを2個使用していますが、これはレベルシフトのためで表示用ではありません(手持ちの20年以上前の赤色LEDを使用。薄っすらとは光ってますので最近の高輝度タイプならモニタ表示になるかも)

 完成した基板とサンプル波形は次のとおりです。


基板(実装面) 基板(背面) サンプル波形


 サンプル波形はPC側が送信したデータに対して、PIC側が(受信文字コード+1)の文字コードを送信するようなチェックプログラムを作成し、PC側から「h」(68H)を送信し、PIC側が「i」を応答しているものです。
 上側の黄色波形がPIC側 I/O端子上の波形で、紫色の波形がPC側Rxの入力信号です。

 シリアル通信では
    1 ____      ____ ____ ____ ____ ____ ____ ____ ____ ____
          X____X____X____X____X____X____X____X____X____X
    0      Start LSB bit1 bit2 bit3 bit4 bit5 bit6  MSB Stop
のようにシリアライズされます。RS-232C上は更に論理反転されます。

 PIC側電源はニッケル水素電池2個ですので電源電圧は2.4Vを少し超えるくらいの電圧です。
 何故、ニッケル水素2個にしたかと言うと、今検討中の作品は携帯性が必要だからです。実はこの1ビットシリアル通信もこの作品開発のための環境整備です。
 また、PC側シリアルI/FはUSB→シリアル変換ケーブルを使っていますのでドライブ能力はディスクトップPCのものより弱いと思います。PIC側電源電圧が5Vの場合やディスクトップPCのRS−232Cでは未検証ですが、おそらく動作するものと思います。他の環境で評価された人(そういう奇特な人はいないでしょうけど)は是非報告してください。
 PIC側電源が5Vの場合を想定してTx信号のレベルシフト幅をぎりぎりの高さ(Tx信号でトランジスタQ2をオンにないためには電源電圧−0.6V以下の必要がある)にしています。

 参考として、今回作成したシリアル送受信部分のソフトウェアがこれです。BKD CC5X Cコンパイラ用ですのでコンパイルされたアセンブラも添付しています。
 アセンブラで作成した方が良かったかもしれませんが、CC5Xはインラインアセンブラの他にアセンブラモドキのステートメントを記述できますので、最近はアセンブラの代用としても使っています(^^)。


【2008/04/19 追記】
 PIC側電源電圧が5Vの場合に対応しました。
 対応内容はレベルシフト用LEDを1個から2個+ダイオードとしVddが5Vの場合と3Vとの場合で、スイッチ切替えするようにしました。 改造した回路図がこちらです。

【2008/12/05 追記】
 回路全体を見直し、超簡略化しました。詳細は下の [2版] のリンクをクリックしてください。
[初版]  [2版]
[TopPage] -> [PIC] -> [OneLineSerial]  |   [blog]