このページではPIC16F84Aのプログラム書き込み仕様( ICSP : In-Circuit Serial Programming )を説明します。
PICへのプログラム書き込みにはライターと呼ばれるツールを使います。
ライター装置およびライターソフトで自動的にICSPの制御が行われるので、通常はこの仕様を細かく知っている必要はありません。
私もいずれはライターを作ろうかと思い、仕様を少し調べてみました。まだ、完全には理解していません。

ICSPの仕様
PIC16F84Aはフラッシュメモリにプログラムを書くようになっています。そのプログラムをフラッシュメモリに書く動作は以下のようになっています。
データの読み書きに使用するピンは以下の5本です。 |
ピン名称 | ピン番号 | プログラム書き込み時の役割 |
ピン名称 | ピンタイプ | ピンの説明 |
RB6 | 12 | CLOCK | I | クロック入力 |
RB7 | 13 | DATA | I/O | データ入/出力 |
MCLR | 4 | VTEST MODE | P | プログラムモード選択 |
VDD | 14 | VDD | P | 電源 |
VSS | 5 | VSS | P | 接地 |
|
I = 入力, O = 出力, P = 電源
プログラム書き込みモードにするためには MCLR の電圧をVHH = +13V にする必要があります。
また、VDD は +5V の電圧をかけます。 |
プログラムの書き込み動作は以下のような手順で行われます。 VDD には事前に +5V が掛けられている必要があります。
ICSPモードへの切り替え
 | (1) RB6、 RB7および MCLR を 0V (Low) にします。 |
(2) MCLRに +13V (VHH) の電圧をかけます。 |
以上でPICはICSPモードになります。 |
プログラムの書き込み/読み出し
 | RB7にICSP制御用のクロックを入力し、RB6でデータの入力または出力を行います。 |
以上でプログラムの書き込み、または、読み出しが行われます。 |
PICをICSPモードで使用するときには通常PICを動作させるクロック発振器は使いません。RB6に入力されるクロックだけで制御されます。
PICが実回路に実装されていてクロック発振器を外せない場合には、電源を入れてPICが動作を開始する時間(約72_秒)より前にMCLRを VHH にする必要があります。そうしないと、PICが動作を開始してプログラムカウンタが更新されてしまい、書き込み開始アドレスが違ってしまいます。
PICをライターにセットしてプログラムの読み書きを行う場合、クロック発振器を付ける必要はないので、この条件はあまり関係ありません。
ICSPの詳細仕様
シリアル信号の制御
PICのデータの読み書きにはRB6(クロック入力)とRB7(データ入出力)が使われます。ですから、データは1ビットつづシリアルに送/受信されます。データの形式は6ビットのコマンドと16ビットのデータが組み合わされています。
プログラムメモリーは14ビットですが、データは最初の1ビットがスタートビットで最後にストップビットが1ビット付いて合計16ビットです。
データメモリの場合、8ビットが必要なデータですが、送/受信はプログラムメモリと同じように16ビットで行われます。スタートビットの次から8ビットが有効で残りの6ビットは無効なデータになります。
データの送/受信は常に最下位ビット(LSB)側から行われます。
データの書き込み、または、読み出しのタイミングはRB6のクロックパルスの立ち下がりで行われます。
ICSPのコマンド
ICSPで使用するコマンドは以下の9種類です。
コマンド |
ビット構成
 | データフィールド |
コンフィギュレーションデータの書き込み |  | 0, データ( 14 ), 0 |
プログラムメモリの書き込み |  | 0, データ( 14 ), 0 |
プログラムメモリの読み出し |  | 0, データ( 14 ), 0 |
アドレスカウンタの更新(+1) |  | なし |
書き換え処理開始 |  | なし |
データメモリの書き込み |  | 0, データ( 14 ), 0 |
データメモリの読み出し |  | 0, データ( 14 ), 0 |
プログラムメモリの全消去 |  | なし |
データメモリの全消去 |  | なし |
ICSPでの処理の流れ
ICSPモードでプログラムの書き込みを行う場合の処理の流れは以下のようになります。
ICSPモードでコンフィギュレーションデータの書き込みを行う場合の処理の流れは以下のようになります。
アドレスカウンターが2000hを越えると最上位ビット(14ビット目)は"1"に固定されます。ですから、コンフィギュレーションデータを書いた後、通常のプログラムメモリの書き込みを行う場合にはPICをリセットし、再び、ICSPモードにセットし直す必要があります。
Microchip社の推奨方法では上記の処理の後にVDDを下限電圧と上限電圧にしてデータを読み込み、全てが正常かをチェックするようになっています。 |
 |