以前ちょっと使ったFT232BMというICが手元にありました。失敗してもいいようにと、余分に買っておいたものです。これは、USB-SERIAL変換ICで、カンタンにUSB機器を作ることができます。USBとシリアルポートの仲介をするようなもので、RS-232Cと同じ信号線を0〜VCCIO(V)で制御できます。例えばVCCIOに5Vをかけると、0VがLOWレベル、HIGHレベルが5Vになります。本当にRS-232Cと接続する場合にはレベルコンバータが必要ですが、それは今回必要ありません。逆にいうとこのICだけでPICの書き込みができてしまうわけですね。
制御するべき線はDATA/CLOCK/PGM/MCLRの4つ。これを、無理矢理シリアルポートの制御線に割り当てていきます。
信号名 | 割当 | 方向 FT232BM←→PIC |
---|---|---|
PGM | 遅延回路 | → |
MCLR | TX | → |
DATA | DTR | → |
DATA | CTS | ← |
CLOCK | RTS | → |
はい。かなり無理矢理です。もともとそういう用途で使うものではありませんから、無理矢理は仕方ありません。それではひとつずつ見ていきましょう。
これはもう制御線が足りないのでHIGHレベルに固定できるようにしましょう。一応データシートに合わせて電源VDDがかかってから5usec以上後にHIGHレベルになるようにCRで遅延回路を組みました。
リセット信号として使うものです。本来シリアルデータを乗せる信号線TXを無理矢理使うことにしました。TXは初期状態でHIGHレベル、PCでブレーク信号を送るとLOWレベルになります。電源がかかってすぐはLOWレベルが好ましいのでインバータを入れる方がいいかもしれませんが、部品を少なくするために直結にしました。それでも、FT232BMにVCCがUSBコネクタから給電されてしばらくしてからHIGHレベルになるようで、おかげでその前にPICのVDDとPGMがHIGHレベルになっていて、つなぐと即プログラム/ベリファイモードに以降するようになりました。これはこれでよしとしましょう。書き込み処理を開始するときやPC=プログラムカウンタを戻すときはリセットすることにします。リセットは、TXにブレーク信号を送っている間LOWになるので、これを利用します。
DATAはPICからのデータ読み込み時に入力になる必要があります。つまり出力は双方向が必要になります。FT232BMでは使えませんので、FT232BMから見て送信時にDTRを制御し、受信時にCTSで端子の状態を確認するようにします。DTRとPICの出力がぶつからないように、DTRには抵抗を介して接続することにします。PIC側が入力時に十分ドライブできる程度で大きい抵抗を選びます。似たような回路で1.5kΩというのを見つけたので、そのままパクりました。
これはデータ送受信時のクロックです。プログラム・ベリファイモードでは、PICはこのクロックだけで動くようです。RTSをHIGH←→LOWパタパタさせるとクロックが発生します。DTRもRTSも初期状態はHIGHです。でも、プログラム・ベリファイモードに以降するときにLOWになっている必要があります。電源ON=USB接続してすぐはあまり考えないことにして、書き込む前にリセットし、その時にCLOCK・DATA線をLOWにしておくことにします。
ちょっと強引ですが、ハードウェアはこんな感じで作れそうです。
ソフトウェアは、FT232BMに用意されている仮想COMポート用のドライバを使用して、各信号を制御していくことにします。汎用のCOMポートドライバにアクセスするだけですので、するべきことと言ったら、COMポートを開いて信号線をHIGH/LOWするだけです。結構カンタンにプログラムが書けそうです。
PIC PICの一年生