何故このチップはINTRCヒューズで動かないのですか?
殆どのチップは内部オシレータを持っています。
特に12CXXXファミリはマイクロチップ社の工場出荷時に同じ周波数を提供するために
各チップにオシレータ・カリブレーション定数を持っています。
このカリブレーション定数はRETLW命令としてプログラム・メモリーの最終番地にあり
Wが返されるカリブレーション定数です。
CCS Cコンパイラは適切にこのカリブレーション値を得る最後のプログラム・アドレス
を呼んでそれをロードします。
従って迂闊にイレースしますとこのカリブレーション定数も消去されプログラム・メモリーの最終番地にあるRETLWも消去されてしまいます。
良くコンパイラが最後のプログラム・アドレスまでジャンプしてカリブレーション値
がそこにあるとわかっていなくて変な位置までジャンプするのでコンパイラが
間違っていると考えますがそうではありません。
もし、カリブレーション値を消去してしまってCCS Cコンパイラで新しい値を追加した
い場合はFAQのこちらをご覧下さい。
CCS Cコンパイラでのキャリブレーション値を持ったチップの扱い:
問題:本来、チップが持っております。プログラム・メモリーの最終番地にあるべき
カリブレーション・データは保たれておりますでしょうか?
例えば、12F675等のチップは工場出荷時にカリブレーション値を持っています。
これがイレースされますと正常に動作(デバッグ等)出来なくなりますので
下記の手順でカリブレーション・データをチップに書き込んで下さい。
※コードの記述:コンフィグレーションで内部RC発振モードを選択されますと
コンパイラの方で自動的に処理しいてくれますので特別なコードは必要ありません。
ICD-U40,U64, Mach Xでは下記の様な機能があります。
● プログラム・メモリーに1ワードを書き込みます。
PIC18ではもし値が1バイトに該当してもすべてのワードにフィルされます。
PIC18ではアドレスもワード配列でなければいけません。
下記のカリブレーション値の書き込みの際にも使用できます。
例:PIC12F675の場合は表示された値(例:3474)をAddress(Hex)に"3FF"を
Value(Hex)に"3474"と入力の上、WriteボタンをクリックしますとPIC12F675の
プログラム・メモリーの最終番地に7434と書き込まれます。
※データシートを参照して下さい。
●ICDを持っていないチップのカリブレート:
12F675,12F629,16F630,16F676 等のチップのためにキャリブレーション定数を
測定して求めます。例えば、誤ってイレースした時などにこの値は
プログラム・メモリーアドレスの最後の位置にアセンブラのリターン命令と共に
この値を書き込んで元に状態に戻せます。
このキャリブレートの操作終了後はINTRCモードでの発振周波数が最適に
キャリブレートされた状態になります。
しかし、一旦電源をOFFにするとキャリブレートしてない状態に戻ります。