今もまだ忙しいままなので、PICで遊べる時間は土日の僅かな時間のみ。
本当はバイクに乗ったり、別の事したりしたいんだけど、色々その他の時間を削ってPICに向かう。
まぁ楽しいからなんだけど、PIC16F145xについてはまだまだネットにも情報が不十分なので、色々と躓く事もある。

PIC16F1455にはその他多くのPICマイコンと同様にProgram Flash Memory領域に実行コードを書き込む事が出来る。
Const値もFlash内にあるということで、こちらを書き換える事によってPICマイコンの振る舞いを変える事が出来る。


Flashメモリは実行プログラムから動的に変更する事が可能となっているので、今回のCDIではUSB経由でPCやタブレットから設定値を変更可能な様に設計している。

Flashメモリにデータを書き込む際は手順があり、まず消去、次に書き込みをしなければいけない。
この辺はPIC16F145xのデータシートを見れば書いてある通りにやればいけるはず。
(PIC12F1822の日本語データシートを見た方が楽かも)

データシートに記載のある通りに記述すると、消去は以下の通りに実装する事になる。

PMADR = Addr;
PMCON1bits.CFGS = 0; // Not Config data
PMCON1bits.FREE = 1; // Enable Program Flash Erase Enable
PMCON1bits.WREN = 1; // Enable Program/Erase Enable bit
PMCON2 = 0x55; // Unlock and erase sequence
PMCON2 = 0xAA;
PMCON1bits.WR = 1; // Write Control bit
_nop(); _nop(); // need 2 nops
PMCON1bits.WREN = 0; // Disable Program/Erase Enable bit

結論から言えば上記の通り実装してもフラッシュメモリは消去されなかった。
ここから長い旅。

microchip社から出ているサンプル等を読んで、コードに間違いがない事を確認。
うーん。
更にコンフィグ値等もみて確認するも、問題はなかった。
CPU不良かとCPUを取り替えてみる。
iPhone 017

結果変わらず。

色々と迷いつつ、色々なコードを試してみる。
上記消去プログラムを連続で10回程度回すと、一部のアドレスだけが消去されて0x3FFFとなり、消えている事が分かった。
ちなみにエンハンスドミッドレンジのPICは1アドレスにつき14ビットというやや変則的なもので、最大値が0x3FFFとなる。

100回程度回すとほぼOK。
だけどそんな不確実なワークアラウンドは嫌だ。

ここで想定されるのは、経験上CPUの電圧か、クロックか、、、。 
ここまでで1週間掛かった。

ここで要約エラッタ情報を見てみた。エラッタ情報とは不具合情報の事で、プロダクトのRivision番号毎に判明した問題が記載されている。
PIC16F1455のエラッタ情報は、microchip社のページから得られる。
http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en556969

さて、いざ開いてみると、、、ありました。
「Program Flash Memory(PFM) Self write」
これによると内部クロックならば4MHz以下にせよとの事。

まじか。

取り急ぎコードはこんな感じで修正。

ClrWdt();
OSCCON = 0b11101100;  // Switch to 1MHz x 3PLLPMADR = Addr;
PMCON1bits.CFGS = 0; // Not Config data
PMCON1bits.FREE = 1; // Enable Program Flash Erase Enable
PMCON1bits.WREN = 1; // Enable Program/Erase Enable bit
PMCON2 = 0x55; // Unlock and erase sequence
PMCON2 = 0xAA;
PMCON1bits.WR = 1; // Write Control bit
_nop(); _nop(); // need 2 nops
PMCON1bits.WREN = 0; // Disable Program/Erase Enable bit
OSCCON = 0xFC; // Switch to 16Mhz x 3PLL

これで一応解決したみたい。