USB接続のPICプログラマ

どう制御するか

 以前ちょっと使った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遅延回路
MCLRTX
DATADTR
DATACTS
CLOCKRTS

 はい。かなり無理矢理です。もともとそういう用途で使うものではありませんから、無理矢理は仕方ありません。それではひとつずつ見ていきましょう。

PGM

 これはもう制御線が足りないのでHIGHレベルに固定できるようにしましょう。一応データシートに合わせて電源VDDがかかってから5usec以上後にHIGHレベルになるようにCRで遅延回路を組みました。

MCLR

 リセット信号として使うものです。本来シリアルデータを乗せる信号線TXを無理矢理使うことにしました。TXは初期状態でHIGHレベル、PCでブレーク信号を送るとLOWレベルになります。電源がかかってすぐはLOWレベルが好ましいのでインバータを入れる方がいいかもしれませんが、部品を少なくするために直結にしました。それでも、FT232BMにVCCがUSBコネクタから給電されてしばらくしてからHIGHレベルになるようで、おかげでその前にPICのVDDとPGMがHIGHレベルになっていて、つなぐと即プログラム/ベリファイモードに以降するようになりました。これはこれでよしとしましょう。書き込み処理を開始するときやPC=プログラムカウンタを戻すときはリセットすることにします。リセットは、TXにブレーク信号を送っている間LOWになるので、これを利用します。

DATA

 DATAはPICからのデータ読み込み時に入力になる必要があります。つまり出力は双方向が必要になります。FT232BMでは使えませんので、FT232BMから見て送信時にDTRを制御し、受信時にCTSで端子の状態を確認するようにします。DTRとPICの出力がぶつからないように、DTRには抵抗を介して接続することにします。PIC側が入力時に十分ドライブできる程度で大きい抵抗を選びます。似たような回路で1.5kΩというのを見つけたので、そのままパクりました。

CLOCK

 これはデータ送受信時のクロックです。プログラム・ベリファイモードでは、PICはこのクロックだけで動くようです。RTSをHIGH←→LOWパタパタさせるとクロックが発生します。DTRもRTSも初期状態はHIGHです。でも、プログラム・ベリファイモードに以降するときにLOWになっている必要があります。電源ON=USB接続してすぐはあまり考えないことにして、書き込む前にリセットし、その時にCLOCK・DATA線をLOWにしておくことにします。

 ちょっと強引ですが、ハードウェアはこんな感じで作れそうです。

 ソフトウェアは、FT232BMに用意されている仮想COMポート用のドライバを使用して、各信号を制御していくことにします。汎用のCOMポートドライバにアクセスするだけですので、するべきことと言ったら、COMポートを開いて信号線をHIGH/LOWするだけです。結構カンタンにプログラムが書けそうです。

PIC PICの一年生