- キャリブレーションとは校正という意味です。
- 工場出荷時に事前設定されたデータです。
- 12F629, 12F675, 16F630, 16F676 などはこのデータを保持しています。
- 使用する PIC にキャリブレーション・ビットがあるか確認をお勧めします。
- この設定は主に内部発振の精度を補償するためのものです。
- たとえば、12F629 ではこのキャリブレーション・ビットによって内部クロック 4MHz を 5%以内の精度に保つことができます。
- 実はプログラムを消去すると、キャリブレーション・ビットも消去され、失われてしまいます。
- それでは困るので、通常、PICライタが消去前にキャリブレーション・ビットを読み出し、 消去を行った後に、再度書き戻すようにしています(PICerFT もそのようになっています)。
- とはいっても消去に失敗するとまれにキャリブレーションデータを失うことがあります。
- ですので、キャリブレーション・データは読み出してメモしておくことをお勧めします。
- PICerFT の場合、ブランクチェックを実行すると、キャリブレーション・データを表示するようになっています。
- なお、コードプロテクトするとプログラム領域は0として読み出されプロテクトされますが、 同じプログラム領域にあるキャリブレーションデータだけは例外でプロテクトされません。
12F629の例 10F206の例 成功!
calib=3494
device=0F83
fuse=11FF成功!
fuse=0FFF
calib=0C14
- キャリブレーション・ビットは通常14ビットで構成され、プログラムメモリの最終アドレスに配置されています。
- 実はこのデータは retlw XXh という命令形式で格納されています。
このデータを有効にするためには次のようにプログラムします。
12F629の例 10F206の例 14ビット 12ビット アドレス 3FFh に 3494h
これは retlw 94h に相当アドレス 1FFh に 0C14h
これは movlw 14h に相当
12F629の例 10F206の例 bsf STATUS, RP0
call 3FFh
movwf OSCCAL
bcf STATUS, RP0ORG 000h
movwf OSCCAL
bcf OSCCAL, FOSC4
- PICerFTでDetectするとキャリブレーション・ビット情報を表示します。
- あらかじめキャリブレーション・ビット情報をメモしておくと、プログラム時に設定することができます。
- このようにメモしておけばキャリブレーション・ビットを失うことはありません。
- これによりPICerFTの書き込み時の照合で発生するエラーも回避できます。
- 原因はHEXファイルにキャリブレーションのデータはないにも関わらず、実際のPICにキャリブレーションのデータがあるため、照合でエラーを発生します。
12F629の例 10F206の例 ORG 3FFh
retlw 94hORG 1FFh
movlw 14h
- MPLAB XC8での設定方法です。XC8(ver 1.34)で動作確認済みです。
- main関数の前のグローバル領域で設定します。
- movlw 14h=0xC14です。
10F222の例 #asm
psect osccal,abs,ovrld,delta=2
ORG 1ffh
movlw 14h
#endasm
int main()
- MPLAB XC8ではデフォルトでOSCCALの設定が有効です。
- startup.asで定義されています。
- 少し中身をのぞいてみます。PIC10F222の例です。
- Reset Vectorは1FFです。ここからプログラムがスタートします。
- HEXファイルにはReset Vectorに命令はありません。
- 実際のPICにはReset Vectorにキャリブレーションである命令があります。
- プログラムがスタートするとワークレジスタ(W)に0x14というデータを代入します。
- プログラムカウンタ(PC)はプログラム領域の最後に到達したので、ゼロ番地に飛びます。
- OSCCALのある領域をアクセスするために、FSR=0x00を代入します。
- OSCCALにWを代入します。ここでキャリブレーションが設定されます。
- 仮にキャリブレーションが失われても、0xFFF=XORLW 0xFF命令が実行されるだけなので、精度が悪いだけで動作に支障はありません。
- むしろ中途半端な命令がReset Vectorに残っていると支障がでます。
©2003-2015 All rights reserved by Einstein.
- 12F629 と 12F675は少々特殊で、コンフィグレーション・ワードの一部にキャリブレーション情報が含まれています。
- ややこしいですね。
Bit 13-12: BG<1:0>: Bandgap Calibration bits 00 = Lowest Bandgap voltage ... 11 = Highest Bandgap voltage
- PICライタではこの情報を失わないよう消去の際、このキャリブレーションを読み込み、再設定を行っています(PICerFTも同様)。
- Fuse 11FFh の場合、Bit 13:12 は 01 となります。
- MPLAB でプログラム時には、このキャリブレーション情報はわかりません。
- そのため、PICerFT は アドレス 2007 で書き込みエラーになります。
- これを回避するためには、一度、コンフィグレーション・ワード内のキャリブレーション情報を読み出して値を特定し、 コンフグレーション・ワードに指定することで書き込みエラーはなくなります。
例、 __CONFIG H'11FF' & _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT