RS−232Cポートに接続する汎用ライタ


▲▲ トップページに戻る    ▲ 前のページに戻る

この回路は1995年初めから製作・使用 しています。また、本ドキュメントは1995年にPC-9801のワープロで書いたものをWindows用にコンバート したもので、図表等おかしなところもありますがご容赦ください。

ライタ回路

 プリンター・ポートと異なりRS−232Cポートは機種間の相違が少なく、ほとんどのパソコンに装備されています。しかしながら、パソコン側に特別な制御プログラムを必要とするようでは、汎用性が低下します。そこで、パソコン側ではパソコン通信などに使う汎用の通信ソフトにより、ライタとアスキー形式でコマンドやデータをやりとりすることにしました。よって、RS−232C回線の制御、コマンド解釈、プログラミング制御などライタ側の負担は大きくなります。これらの制御を行うためPIC16C84を使用しています。また、オブジェクト・ファイルのデータ・フォーマットも市販のクロス・アセンブラの利用も考慮しインテルHEXフォーマットとしました。
 ライタの回路図を図1に示します。

RS−232C用ドライバ/レシーバにはADM232LJN(アナログデバイセズ)を使用しましたが、これはMAX232CPE(マキシムジャパン)の上位互換品です(外付けコンデンサの容量が異なりますので注意が必要)。制御に使用するPIC16C84のクロックはボーレートを考慮して4.9152MHzを使用しています。パソコンとライタ間の通信プロトコールは調歩同期モード(スタート・ビット1、データ8ビット、ストップ・ビット1、パリティなし、XON/XOFFあり)を使用し、ボーレートは1200bpsとしました。電源回路やMCLR端子へのVPP印加回路はプリンター・ポート用ライタと同じです。RS−232C用のコネクタは基板取付けタイプの25ピンのDサブコネクタです。なお、パソコンのRS−232C端子とライタの接続はモデム・ケーブル(通常、外付けモデムには付属しています)を使用します。もちろんクロス・ケーブルも使えますが、結線が異なりますので注意して下さい。
 写真1に穴明き基板で製作したライタを、写真2に感光基板により製作したライタを示します。

写真1

写真2
ライタに組み込んだPIC16C84の制御プログラム

 PIC16C84にはシリアル・ポート用の専用回路が内蔵されていないため、RC−232C回線の制御は全てソフトウェアにより行う必要があります。特に調歩同期モードでは、送信側と受信側は同期していないため、データの受信処理が難しくなります。PIC16C84には外部割込みピンとタイマ割込みがあるため、RXDを外部割込みピン(RB0)に接続し、当初これら二つの割込みを併用することを考えましたが、結果的には外部割込みは使用しませんでした。リスト1に制御プログラムの ソース・リスト(インテルHEX形式のOBJファイルも付属)と図2に制御プログラムのフローチャートを示します。

プログラムは非常に長いので全ては説明できませんが、要点について簡単に説明します。

1)分岐処理
 PIC16C84は分岐命令が少なく、レジスタの値により分岐先を変更したい場合に困りますが、リスト2のようにPCLレジスタへの加算命令とGOTO命令を利用することで解決可能です。このとき、加算後のPCLレジスタの値がFFhを超えないように注意する必要があります。
リスト2 レジスタ値による分岐処理

/* ジャンプ・テーブル
#LBL RJAMP
ADDWF PCL, #1 ;W + PCL -> PCL
GOTO LABLE0  ;W=0のときLABLE0に分岐
GOTO LABLE1  ;W=1のときLABLE1に分岐

GOTO LABLE9  ;W=9のときLABLE9に分岐

/* 分岐
GOTO RJAMP
#LBL LABLE0
/* W=0のとき実行する処理ルーチン

#LBL LABLE1
/* W=1のとき実行する処理ルーチン

#LBL LABLE9
/* W=9のとき実行する処理ルーチン

2)受信処理
 4.9152MHzのクロックを使用した場合、PIC16C84のTMR0(タイマ/カウンタ)により毎秒4800回のタイマ割込みが発生(プリスケーラ未使用時)します。この回数はボーレート(1200bps)の4倍となります。図3のように割込み毎にRXD端子(RB0ピン)のチェックを行い、スタート・ビットを発見(図中@)したら、2回後の割込み発生時(図中A)にもう一度RXD端子(RB0ピン)をチェックし、ともにLOWレベルの場合にはスタート・ビットと確認します。スタート・ビットが見つかれば、以後割込みが4回発生する毎にRXD端子のデータを読み込み(図中BC)、バッファに格納します。リード・バッファは8バイトあり、FIFOバッファとなるようにしてあります。データの取りこぼしを防ぐため、4バイト分のデータがリード・バッファに貯まると、XONコマンドを送信し、パソコンからのデータ送信を中断するようにしています。また、リード・バッファが空になればXOFFコマンドを送信するようになっています。

3)送信処理
 送信バッファにデータが入ると、送信処理を開始します。送信処理は上述の割込み周期の4倍でスタート・ビット、データ、ストップ・ビットの各ビットにTXD端子(RB1ピン)に書き込んで送り出すだけの簡単なものです。
4)PIC16C84のプログラミング処理
 リード・バッファに書き込まれたパソコンからのコマンド又はデータによりプログラム用EEPROM(コンフィグレーション・ヒューズを含む)及びデータ用EEPROMの書き込み及び読み出し、プログラム用EEPROMの全消去を行うようになっています。これらの手順は前述のプリンター・ポート用ライタとほぼ同じですから省略します。処理は図2のように受信/送信処理と同じ割込みルーチンで行っているので、割込み周期以内に処理が終了するように、処理内容を細かく分割しています。ライタに書き込むデータのフォーマットは独自形式ではなくインテルのHEXフォーマットです。
 インテルのHEXフォーマットは8ビットCPU用に作らたもので、バイト単位で処理するようになっています。一方、PIC16C84のプログラム用EEPROMは1語14ビットです。このため、1語を上位6ビットと下位8ビットの2バイトに分けています。このため、インテルのHEXフォーマットに書き込むアドレスを2倍にしてあります。この様子を、リスト3に示します。また、データ用EEPROMはプログラム用EEPROMとは別の空間にマップされていますが、便宜的にデータ用EEPROMの先頭アドレスを2100hとしました。市販のクロス・アセンブラが生成するインテルHEXフォーマットを利用する場合は、上記のような規則になっているか確認することが必要です。
リスト3 ライタで使用するインテルHEXフォーマット

(ファイルの例)
:10000000A528000000000000C828820730343134E1
:100010003234333434343534363437343834393494
(途中略)
:0407A0001B0808002A
:084000005000570031003100AF
:02400E0011009F
:104200000D005000490043003100360043003800E3
(途中略)
:104270003A003000300030003000300030000000E4
:00000001FF
使用方法

 ライタとパソコンは図11のようにモデム・ケーブルにより接続します。

ライタにプログラミングを行うPIC16C84を装着した後、ライタの電源をONし、パソコン側の通信ソフトを立ち上げます(ボーレートなどは設定済みとします)。このとき、通信ソフトによっては、
  ”CD信号が常時ONになっています”
などの、メッセージが表示されますが、気にしないで先に進みます。ここで、”P”を入力しリターンすると、ライタからのメッセージが表示され、コマンド待ちの状態となります。コマンドは下記の3種類です。

1)”:”書き込みコマンド
 これはインテルのHEXフォーマットの先頭文字です。よって、書き込みはインテルのHEXフォーマットで書かれたオブジェクト・ファイルをパソコン通信でテキスト・ファイルをアップ・ロードする手順でライタに転送するだけでよく、コマンドをキー入力する必要はありません。書き込みに失敗するとメッセージを表示します。
2)”R”読み出しコマンド
 プログラム用EEPROM及びデータ用EEPROMの全内容を、インテルのHEXフォーマットで読み出します。読み出した内容は、そのまま書き込みにも使えるので、コードプロテクションされていないPIC16C84であればプログラムやデータを複製することが出来ます。
3)”E”全消去コマンド
 プログラム用EEPROMを全消去します。コードプロテクションされたものに再プログラミングする場合に実行します。  各コマンドの処理が終了すると、再びコマンド待ちとなります。PIC16C84を取り外す場合は、必ずライタの電源をOFFにして下さい。
拡張例

ここでは、シリアル接続ライタの拡張例を紹介します。

1)PIC16C6X/7X のプログラミング
 PIC16C84とPIC16C6X/7Xシリーズとは書き込み電圧が同一範囲にあり、かつ18pinタイプであればピン接続も同一となっています。よって制御用PICに書き込むプログラムを変更すれば、PIC16C6X/7Xシリーズのプログラミングが可能となります。
 下記ファイルは、PIC16C6X/7Xシリーズ用に作成したライタプログラムでNiftyで公開したものです。

pic71w07.zip : 詳細は展開される Readme.docを参照ください。
2)18pin及び40pin用PICへの改造
 下記写真3に示すのは、18pin(PIC16C84/F84/C71等)のPICと40pin(PIC1664等)のPICをプログラミングするために改造したものです。

3)高速書き込みへの挑戦
 ここにも紹介しましたように1995年に製作したシリアル接続ライタは通信速度が1200bpsでした。これではあまりに遅すぎるとのご要望があり、高速化を進めてきました。

 下記ファイルはNiftyで公開してきたライタプログラムです。(回路の変更を伴うものもあります)

  1. pic4w21.zip : 4倍速書き込み版、4800bps(安定しています)
  2. pic8w56.zip : 8倍速書き込み版、9600bps、PIC16F84を16MHz駆動
参考・引用文献

  1. 吉田功、PC98シリーズのハードとソフト、トランジスタ技術SPECIAL、No.45、CQ出版、1994
  2. 山田剛、マイコン開発システム用LMフォーマット、インターフェイス別冊付録、1988年1月号、p.32、CQ出版

▲▲ トップページに戻る    ▲ 前のページに戻る