※この回路は1994年末から1995年初めにかけて製作・使用 したもので、現在はライタ回路及び使用できるPC-9801シリーズもありませんので、サポートできないことをお断り しておきます。また、本ドキュメントは1995年にPC-9801のワープロで書いたものをWindows用にコンバート したもので、図表等おかしなところもありますがご容赦ください。
●ライタ回路PIC16C84内蔵のEEPROMは基板上に実装された状態でもプログラミングできるように工夫されています。これはインシステム・シリアルプログラミング(ISP)モードと呼ばれ、図1のように接続してシリアル方式でプログラミングを行うものです1)。●ライタ制御ソフトこのとき使用するピンは下記の3本とVDD、VSSピンです。
1)RB7(DATA):デ−タの入出力
2)RB6(CLOCK):クロックの入力
3)MCLRピン:書き込み電圧(VPP)を印加するとプログラミング・モードになります
このようにISPモードでは使用するピンが少ないため、プリンター・ポート(使用可能な出力ピンは9本、入力ピンは1本)でも特別な工夫無しにライタが製作できます。
ISPモードを利用して製作したライタの回路図を図2に示します。図中に示したプリンター・ポートの番号はプリンター側(セントロニクス端子)のものです。よって、IBM PC/AT互換機などでもセントロニクス端子に接続可能なものであれば、後述するパソコン側の制御ソフトを変更すればこの回路がそのまま使えると思います。次に、回路の説明を兼ねてライタ製作の注意点について述べます。
プリンター・ポートとPIC16C84の間には3ステート・バッファ(74HC126)を挿入しています。これは、RB7(DATA)ピンが双方向で使われるためです。RB7(DATA)ピンが入力モードとなる場合には、プリンター・ポートのD7ピンにより3ステート・バッファをイネーブルとし、同D0ピンの信号がRB7(DATA)ピンに与えられるようにします。一方、RB7(DATA)ピンが出力モードとなる場合には、3ステート・バッファをディスイネーブルとし、RB7(DATA)ピンからの出力を妨げないようにします。また、RB7(DATA)ピンからの出力はバッファを通して、プリンター・ポ−トのBUSYピンに入力するようになっています。RB6(CLOCK)ピンは入力に固定されているためバッファを使用する必要はありませんが、74HC126にある4組のバッファを余らせることもないので、3ステート・バッファを常時イネーブルとして使用しました。MCLRピンへの書き込み電圧(VPP)の印加は、プリンター・ポートのD2ピンにより制御するようになっています。MCLRピンはプリンター・ポートのD2ピンがHIGHレベルの時にVPP、LOWレベルの時に8.2kΩの抵抗でGNDにプル・ダウンするようになっています。プリンター・ポートのD2ピンもバッファを通してあり、これで74HC126のバッファを無駄なく使い切っています。プリンター・ポートの出力ピンには10kΩの抵抗が挿入されていますが、これは誤配線や回路デバッグ時に誤ってプリンター・ポートの出力バッファを壊さないための用心です。同様に、RB7(DATA)やRB6(CLOCK)ピンとバッファの間にも10kΩの抵抗が挿入されていますが、これも誤配線や制御ソフトのミスなどで出力が衝突した時に回路を保護するためのものです。電源回路は9V出力の006Pタイプの電池を2個直列にしたもの又は+15V程度の出力電圧を持つACアダプターから、三端子レギュレータによりVDDとVPPを作っています。PIC16C84の作動電圧範囲は2.0V〜6.0Vと広いのが特徴ですが、プログラミング時はVDDを4.5V〜5.5Vに保つ必要がります。また、VPPは12.0V〜14.0Vとなっています。VPPを作りだす方法には色々あると思いますが、今回は78L12のCOMピンにダイオード(1S1588)を2本直列に接続して出力電圧を1.5V程度(ダイオードの順方向降下電圧×2)かさ上げし、VPPを13.5V程度としました。PIC16C84のプログラミング時に消費される電流はVDDが最大50mA、VPPが最大1mAです。このため、5V用の三端子レギュレータに78L05(100mA出力)を使用することも考えられますが、18V程度の電圧を5Vまで落としますから、三端子レギュレータの内部損失が大きく(エネルギー効率が悪い)、79L05のようなTO92パッケージでは放熱が十分でないと考え、TO220パッケージの78M05を使用しました。一方、VPPの方は消費電流が小さいためTO92パッケージの78L12で十分です。ライタにPIC16C84を装着する場合には、電源がOFFとなっていることを確認しなければなりません。そのため、LEDにより5V電源の状態を表示するようにしています。
写真1に製作したライタを示します(※:写真はありません)。使用した基板は72mm×67mmの大きさのユニバーサル基板です。PIC16C84用のICソケットにはゼロプレッシャー・タイプのソケットを使いたいところですが、今回は抜き差しが比較的容易な板バネ・タイプのものを使用しました。プリンター端子にはパネル取り付けタイプのアンフェノールの36ピン・コネクタ(メス)をL字金具(パーツ店などで売られています)により基板に取り付けました(基板に直付けできるコネクタもありますがピン配列やピッチが特殊なものが多く、普通のユニバーサル基板では利用できないようです)。製作に要する費用はACアダプターとPIC16C84を除けば2000円以下で済むと思います。
ISPモードでは表1に示した命令によりEEPROMのプログラミングを行います。命令は6ビット長のコードで、書き込み命令や読み出し命令ではデータが付加されます。データは14ビット長ですがLSBとMSBに0が付加され16ビット長となります。命令やデータの送受信は図3のようにRB6(CLOCK)ピンとRB7(DATA)ピンを用いた同期シリアル通信により行われます。命令コードやデータはLSBより順に送受信します。●使用方法
このように、RB6(CLOCK)ピンに与えるクロックに同期して送受信を行いますから、処理速度の遅いBASICインタプリタを制御に使用しても問題ありません。今回使用したのはMS−DOS版のN88−BASIC(インタプリタ)ですが、特殊な命令は使用していないので他の言語への書き換えは容易だと思います。 リスト1にライタ制御プログラムを、図4に各部のフローチャートを示します。次に、各部分の説明と注意点について説明します。
1)初期化
プリンター・ポートをOUT命令により直接操作し,MCLR端子をGNDレベルにするためD2ピンをLOWにします。PC−9801ではプリンター・ポートのデータ・ピンはI/Oアドレスの40h番地に、BUSYピンは42h番地のビット2にマップされています。続いて、処理の選択となります。なお、クロス・アセンブラが出力するオブジェクト・ファイルやEEPROMから読み出したデ−タを格納するファイル名およびパス名は固定されていますが、もちろん変更したり、INPUT文で指定するようにしても構いません。2)プログラム用EEPROMのプログラミング
フローチャートを図4(a)に示します。まず最初に、MCLRピンにVPPを印加しプログラミング・モードにします。次に、PIC16C84内部のプログラム・メモリ用アドレス・カウンタを0000hに初期化するため、プログラム・メモリへのデータ・ロード命令を実行します。データ・ロード命令の後には14ビット長のプログラム・コードを伴いますが、ここではダミー・データを使います(書き込み命令を実行しないので、EEPROMへの書き込みは行われません)。同時に制御ソフト内でアドレス・カウンタの値を記憶するアドレス・ポインタも初期化します。次に、オブジェクト・ファイルを1行づつ読み込みます。このオブジェクト・ファイルのデータ・フォーマットを図5に示します。
アドレス・ポインタと書き込むデータのアドレスが一致しない場合には、両者が一致するまでインクリメント・アドレス命令を実行します。 命令及びデータの書き込み手順を図4(b)に示します。命令は6ビット長でLSBから順に書き込みます。次に、14ビット長のデータを書き込みますが、データの前後に0を付加し、全16ビット長のデータをLSBから順に書き込みます。最後に、書き込み命令によりデータをEEPROMに書き込みます。EEPROMへの書き込みが終了するまで10ms以上の時間が必要です。この待ち時間はソフトウェア・ループ(FOR〜NEXT)によって実現していますので、機種によってループ回数を変更する必要があります(リスト1はPC−9801RA21/RA51を使用した場合です)。ループ回数はリスト2のようなプログラムを実行し、実行時間が10s以上となるように決めます。書き込み終了後、データ・リード命令によりプログラム用EEPROMからデータを読み出します。
リスト2 ループ回数を決めるプログラムデータの読み出し手順を図4(c)に示します。読み出したデータと書き込んだデータが一致しなかった場合にはエラーを表示しプログラムを終了します。なお、プログラム用EEPROMの書換可能回数は最小で100回程度しか保証されていませんので注意が必要です(例えば、インクリメント・アドレス命令の実行を忘れると、簡単に保証回数をオーバーしてしまいます)。
10 INPUT "N=",N
20 PRINT TIME$
100 FOR I=1 TO 1000
110 FOR J=1 TO N :NEXT J
120 NEXT I
130 PRINT TIME$
140 GOTO 10
なお、リスト1のプログラムではEEPROMのデータを読み出し、ファイルに書き出すことも可能となっていますが、これは図4(a)からプログラム・メモリへの書き込み命令をスキップするだけですから、説明は省略します。3)コンフィグレーション・ヒューズのプログラミング
PIC16C84のプログラム・メモリの2000h〜2003h番地にはID情報を格納するエリアが、2007h番地にはコンフィグレーション・ヒューズがマップされています。この領域への書き込み手順を図4(d)に示します。最初に、アドレス・カウンタを2000hとするためコンフィグレーション・ヒューズへのデータ・ロード命令を実行します。ただし、書き込み命令は実行せず、EEPROMへの書き込みはしません。
次に、ID情報とコンフィグレーション・ヒューズのデータを書き込みますが、ここではプログラム用EEPROMへのデータ・ライト命令を使用します(コンフィグレーション・ヒューズへのデータ・ロード命令はアドレス・カウンタを2000hとするために1度実行するだけです)。同様に、読み出しもプログラム用EEPROMからのデータ・リード命令を使用します。4)データ用EEPROMのプログラミング
フローチャートを図4(e)に示します。最初に、MCLR端子をGNDに落としてから再びVPPを印加し、PIC16C84をリセットします。データ用EEPROMへのデータ・ロード命令やデータ・リード命令を用いる他は、上記2)のプログラム・メモリ用EEPROMへの書き込みとほぼ同じ手順です。5)プログラム用EEPROMの全消去
コンフィグレーション・ヒューズのコード・プロテクション機能を有効とした場合には、プログラム用EEPROMに記憶されたデータは読み出しも書き込みも不可能となります。コード・プロテクション機能を解除するには、プログラム用EEPROM(コンフィグレーション・ヒューズも含まれる)の全消去が必要となります。全消去の手順を図4(f)に示します。最初に、リセットをかけ、コンフィグレーション・ヒューズへのデータ・ロード命令を実行して、アドレス・カウンタを2000hにします。その後、コンフィグレーション・ヒューズのアドレス(2007h)に達するまで、インクリメント・アドレス命令を実行します。そして、図4(f)に示した順に消去命令を実行します。なお、データ用EEPROMは消去されません。
ライタは図1のように接続します。接続はPC−9801及びライタの電源をOFFにして行います。次に、オブジェクト・ファイルを指定のディレクトリに用意し、N88−BASICを立ち上げ、制御プログラムをRUNし、ライタにPIC16C84を装着して、最後にライタの電源をONにします。後は、メニューに沿って実行するだけです。 回路図(図2)を見れば判りますが、PIC16C84の逆挿入などを検出する保護回路は内蔵されていませんので装着は慎重に行って下さい。逆挿入した場合、PIC16C84は壊れてしまいます。■参考・引用文献