準備が整ったのでピンヘッダとPICKIT3をつなぎました、
さてこれでプログラミングOK・・・と思ったのですがまたしてもプログラムフェイルが発生。これは悩みました。
まず考えたのがICSPを行う際のターゲット回路側の制約です。信号ラインにコンデンサがぶら下がっていたり周辺回路がつながっているとその影響で信号が鈍り、プログラミングに失敗するというのは確かにわかります。ですが今回の回路は信号ピンは開放されていて影響を与えるものはありません。
しかしPICKIT3の内部等価回路の図を見ていた時、これは!と気づきました。
microchip社のデータシートによるとICSP用信号のPGCとPGDにはPICKIT3側に4.7kΩのプルダウン抵抗が入っているとあります。一方ターゲット側はアプリケーションのオシレータして使うとき出力ピンを保護するため2.2kΩの抵抗が直列に入っていますが、この抵抗が入ったままICSPしようとしていました。入力は高インピーダンスなんで影響はないだろうと思っていたのです。
ICSPの際、PGDラインは双方向ですがPICKIT→ターゲットの時はよいとしても、ターゲット→PICKITのときは信号レベルが2.2kと4.7kで分圧(約70%)されてしまうことになります。CMOS入力の閾値ならばHと認識できるレベルだとは思いますが、念のため2.2kΩをショートしてICSPをしてみると、これでなんと成功です。
信号線に抵抗を入れてはいけない。意外な盲点でした