PIC18F14K50 (2)

「ライタ」側ではなく、18F14K50 の「応用回路」側の回路図を下に示します。
と言っても、「周辺」としてつながっているのはシリアルだけで、しかも RS232C インターフェース回路は外付けなので、ボード上には抵抗しかありません。
あとは、USB 「B」コネクタとの配線、12 MHz のクリスタル、リセット回路があるだけです。

このリセット回路は、後述するようなパッチを HID ブートローダにあてた場合に機能するように作ってあります。
Microchip 社の Web サイトからダウンロードできる PIC18/PIC24/PIC32 用の USB フレームワーク

「MCHPFSUSB Framework v2.6」

には、C 言語で記述された USB ライブラリと、サンプルプログラムがおさめられています。
このコンパイルには PIC18 ファミリの場合には Microchip 製の「C18」コンパイラが必要となります。
60 日経過後に機能が制限される評価版コンパイラを Microchip の Web サイトからダウンロードできますが、私はまだダウンロード/インストールしていません。
PIC18F14K50 を使用した開発用ボード「Low Pin Count USB Development Kit」用のコンパイル済み HEX ファイルもフレームワークに付属しているので、これを利用することにします。
「Low Pin Count USB Development Kit」には、押しボタンスイッチはひとつしかなく、これは MCLR*/RA3 端子に接続されています。
USB ブートローダでは、このピンの外部リセット機能を禁止して RA3 入力として機能させるようなコンフィグの設定になっています。
そして、

  • ボタンを押しながら USB ケーブルを接続するとブートローダが起動する
  • ボタンを離して USB ケーブルを接続するとユーザプログラムが起動する

ようになっています。
これでは、モード切替のために、いちいち USB ケーブルを抜き差ししなければならず、面倒なので、 MCLR*/RA3 ピンは外部リセット機能を生かし、ブートモードのセンスには別のピンを割り当てることにしました。
とは言っても、「少ピン数」デバイスである 18F14K50 では、ブートモード・センス入力のために貴重なピンが 1 個とはいえ専用に使われてしまうのは困るので、アプリケーション・ブログラムと共用することを考えました。
その結果、6 番ピンの RC4/P1B/C12OUT/SRQ 端子を使うことにしました。
このピンは I/O ポートの RC4 以外の機能は、すべて「出力」専用となっており、アプリケーション・プログラムでも「出力」として使用することになる可能性が高いのです。
アプリで「出力ピン」として使う場合でも、リセット時には高インピーダンスの入力となることが強制されるので、比較的インピーダンスの高い回路としてモード・センス入力部を構成しておけば、リセット時にはモードセンス入力の値を読み出すことができます。
アプリケーション・プログラムで「出力」に設定すれば、低インピーダンスの出力バッファによりドライブされるので、比較的高インピーダンスのモード・センス入力回路は「オーバーライド」されて、接続されている周辺回路の動作には影響を与えなくなります。
また、別の理由として、このピンには ADC 入力が割り当てられていないので、ANSEL/ANSELH レジスタを操作する必要がありません。
オリジナルのブートローダには ANSEL/ANSELH レジスタを操作するコードは含まれていないので、この操作が必要な場合には追加のパッチを当てなければなりません。
具体的には、Microchip の Web サイトからダウンロードできるソフトウェア・ライブラリ

「Microchip Application Libraries v2009-11-18」

に含まれる USB フレームワークである「MCHPFSUSB Framework v2.6」がおさめられているフォルダの中をたどって

・・・\USB Device - Bootloaders\HID - Bootloader

の下の 18F14K50 用の HID ブートローダコンパイル済み HEX ファイル

USB Device - HID - HID Bootloader - C18 - PIC18F14K50.hex

に対する変更箇所を示します。
まず、ブートモード・センス入力の変更箇所は、逆アセンブルした形で示すと、オリジナルの RA3 入力では

0F38 A680     BTFSS   0xf80,0x3,ACCESS

となるのを、

0F38 A882     BTFSS   0xf82,0x4,ACCESS

と変更して、RC4 入力に変えます。
また、MCLR*/RA3 端子に外部リセット機能を持たせるには「CONFIG3H」の「MCLRE」ビットを「1」にします。
具体的な HEX ファイルの変更箇所は、オリジナルの

:0C 0F34 00 0F 0E C1 6E 80 A6 04 D0 07 0E C1 6E 27

:01 0005 00 00 FA

:0C 0F34 00 0F 0E C1 6E 82 A8 04 D0 07 0E C1 6E 23

:01 0005 00 80 7A

に変更します。
ここでは見やすいようにスペースを挿入してありますが、実際の HEX ファイルにはスペースはありません。
この変更したブートローダを (通常の) PIC ライタで書き込みます。
実際のモード切り換えの方法は、USB ケーブルが接続されたままの状態で、

  • ブートローダを起動するには「BOOT」スイッチを押して離す
  • ユーザプログラムを起動するには「RESET」スイッチを押して離す

だけです。
「RESET」スイッチを押すと、RC4 側はプルアップされたままの「H」レベルにとどまり、 RA3 側だけが「L」レベルとなり、リセットがかかります。 RC4 の「H」レベルが検知されて、ユーザプログラムに制御が移ります。
一方、「BOOT」スイッチを押すと、RC4 側、RA3 側ともに「L」レベルとなり、リセットがかかりますが、RC4 側にはコンデンサが挿入してあるので、スイッチを離して RA3 側が「H」レベルになった後も、RC4 側は、しばらくは「L」レベルが持続し、これが読み込まれてブートローダが動作します。
この方式の欠点としては、USB ケーブルが接続されていない、電源 OFF 状態ではコンデンサ電荷はゼロですから、最初に USB ケーブルを接続した場合に、RC4 から「L」レベルが読み込まれて、必ずブートローダが起動してしまいます。