PIC[4] MAPLAB Snap

Snapを購入した経緯(背景)

これまでの環境

使用PIC:PIC12F1822
書込みツール:PICkit3
運用方針:
通常は LVP運用
万一に備えて HVP(12V)対応回路も設計済み
LVP / HVP 両対応基板構成

発生していた課題

PICkit3で:
3.3Vが安定して出ない
「Connection Failed」「Failed to program device」が頻発
MCLRが引き込まれて動作不安定になるケースあ
結論として:
PICkit3は世代的に古く、USB・電源まわりの信頼性が低下
将来運用に不安が残る

導入目的

PICkit3の代替として、現行サポートされている書込みツールへ更新
LVP運用を安定させたい
将来の開発環境の健全化
万一のHVP復旧手段は自作治具で対応する方針
→ その結果、MPLAB Snap を購入

MPLAB Snap

① 初期症状(購入直後)
(以下、前回まとめと同じ)
SnapをUSBに挿すとACTIVE LEDが一瞬点灯してすぐ消える
Windowsで安定認識されない
IPEで:
Toolは見えることがある
Power / Voltage設定が出ない
こんなエラー:

You have entered an invalid value (null) for the Voltage Level ... Connection Failed.

② Snap ファーム更新(復旧ポイント)
Snapのファームを書き直し

MAPLAB IPEの advance mode →Tools→Hardware Tool Emaghency Boot Firarmware Recovery を選択

MAPLAB Snap を選択

やり方は書いてあるので、そのままやればOK。

Snap をリカバリーブートモードに切り替えるには、次の手順を実行します。

Micro-B USB ケーブルを Snap に接続します。
 USBケーブルのもう一方の端は、PC に接続してください。

ピンセットまたは曲げた細いワイヤを使って、ジャンパ J3 の2つの穴を約1秒間ショートさせます。
 その後、ピンセットまたはワイヤを外します。

少なくとも10秒待ってから、Snap から USB ケーブルを抜きます。

すぐに USB ケーブルを Snap に再接続します。

これで Snap は リカバリーブートモード に入ります。
この状態では Snap の両方の LED は消灯したまま になります。


ACTIVE LEDが常時点灯するように復帰
USB認識が安定

③ Invalid Device ID エラー発生

Target Device ID (0x3fe0) is an Invalid Device ID. Snap tool cannot detect external power
通信フェーズには進んだが、電源・信号条件が不正

④ 配線・電源まわりの修正
ICSP VDDを浮かせていた → ターゲット3.3Vへ接続
MCLRが未プルアップ → 10kΩでVDDへプルアップ

⑤ IPEでの書込み成功

Programming/Verify complete *** Hold In Reset mode is enabled ***
消去・書込み・Verifyすべて成功

⑥ IDE側の挙動(参考)
MPLAB X IDE 6.25 で Program フローが不安定
BUILDは成功している
実害はなし(書込みはIPE運用で対応)

現在の安定構成

ICSP VDD ← ターゲット3.3V
GND共通
MCLR:10kプルアップ
Snap FW更新済み
書込み:IPE使用

今回の学び

プロジェクトフォルダPATHに日本語入れると失敗する。(結構重要)
SnapはVDD検出必須(浮かせ不可)PICCKIT3も同じ
MCLRは必ずプルアップ
SnapはACTIVE LED挙動で健全性判断できる
FW再書込みで復旧する事ができる。
IDEよりIPEの方が安定な書き込みができるみたい。
書込エラーになったら一回SnapやPICKIT3を抜いてみるのも効果あり
LVP OFFのPICを戻すにはPICKIT3は有用なので、用意しておくといい。ただし、最新IDEでは動かないので、PICKIT用にMPLAB X 5.45を入れておく。以下は空のソースコード。Eraseするなら、IPEから。

#include <xc.h>

#pragma config FOSC = INTOSC
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config MCLRE = ON
#pragma config CP = OFF
#pragma config CPD = OFF
#pragma config BOREN = ON
#pragma config CLKOUTEN = OFF
#pragma config IESO = OFF
#pragma config FCMEN = OFF

#pragma config WRT = OFF
#pragma config PLLEN = OFF
#pragma config STVREN = ON
#pragma config BORV = LO
#pragma config LVP = ON

int main(void)
{
    while(1){
    }
}