PIC16F87XA 移行ガイド

PIC16F87X と PIC16F87XA の違いについてまとめることにしました。
Microchip の移行資料 DS39591A ではあまりにも内容が貧弱であり、 すぐに移行することは事実上不可能な状況にあります。
結果的に A バージョンがいかに異なっているかを逆に浮き彫りにしてしまいました。
容易に移行することはできないので、A バージョンを甘くみてはいけません。
A バージョンにはチップのバグがあります。詳細は以下のエラッタ資料を参照ください。
チップのリビジョンはチップ内のDEVICE IDの下4ビットに記録されています。
(刻印されている製造番号0242xxx以降がRev.B2です)
特に Rev. B0 は4MHz以上で動作させるとフェッチに失敗することがあり暴走するという致命傷があります。
なお、ここに記載したものが差異のすべてであるとは限りません。

レジスタADCON1にADCS2ビットが追加
AD変換のタイミング調整用にADCS2ビットが追加されている。
AD変換の際にはこのビット操作を忘れずに。これを怠ると期待したタイミングでAD変換できない。
Bit76543210
16F87XACFM---PCFG3PCFG2PCFG1PCFG0
16F87XAACFMADCS2--PCFG3PCFG2PCFG1PCFG0

コンパレータの追加(Comparator)
アナログ電圧の比較モジュールが追加されている。これによりCMCONレジスタが追加されている。
PORTAをデジタルI/Oとして利用するときにはA/D変換モジュール制御の レジスタADCON1のほか、コンパレータ用レジスタCMCON(CM2,CM1,CM0)も忘れずに制御すること。 これを怠るとPORTAが正しく機能しないことがある。
Bit76543210
16F87XAC2OUTC1OUTC2INVC1INVCISCM2CM1CM0

ピン互換(PIN compatibility)
16F87X と 16F87XA はピン互換であって、決して完全互換ではない。
コード互換でもなければ、ソース互換でもない。
勘違いしやすいので注意が必要だ。

(外部)書き込み方式(Programming)
16F84 と16F84A では書き込み方式が同じであったので問題にならなかったが、 16F87X と 16F87XA ではまったく書き込み方式が異なるため、対応しているライターが必要である。
16F87XA を 16F87X として書き込むことはできない。
PIC START Plus ならファームウェアを 3.10 以降にアップデートする必要がある。
もちろん、MPLAB も 16F87XA に対応した 6.0 以降が必要。

自己書き込み方式(Self Programming)
EEPROM のほかプログラムを格納しているFLASH部分も自分で書き換える機能が用意されている。 外部書き込み方式が異なることから想像できるが、この部分も異なる。FLASHの書き込み方法が大きく変更されている。 つまり、この機能を利用している場合、16F87X から 16F87XA用にプログラムを修正しなければならない。
これがソース互換ではない一例だ。

コンフィグレーション・ワード(Configuration word)
PIC の動作を決定する重要な コンフィグレーション・ワード が変更されている。
よもや変更されているとは気づかないでいると痛い目にあう。
これが意味するところは、既存の 16F87X の HEX コードをそのまま利用できないことである
つまり、決して HEX コード互換ではない。
書き込む際には LIST, INCLUDE, __CONFIG の指定を変更して MPLAB で再コンパイルが必要である。
これを怠ると、まず間違いなく正しく動作しない。
ソースファイルを何らかの原因で失ってしまい、HEX ファイルしか残っていない場合の移行は困難を極める。
一旦、逆アセンブルして該当部分を修正する必要がある。
Bit131211109876543210
16F87XCP1CP0DEBUG-WRTCPDLVPBORENCP1CP0
PWRTEN
WDTENFOSC1FOSC0
16F87XACP-DEBUGWRT1WRT0CPDLVPBOREN--
PWRTEN
WDTENFOSC1FOSC0

コードプロテクト(Code Protect)
コンフィグレーション・ワードの変更に伴い、コードプロテクトを利用していた場合は プログラムの再配置が必要になる。これも以外な盲点である。
リロケータブル(再配置可能)を意識して、プログラムを記述していないと 変更が多岐にわたるので、この作業は困難を極める。
CP1CP016F877, 876
11Code protection off
101F00h - 1FFFh code protected
011000h - 1FFFh code protected
000000h - 1FFFh code protected
WRT1WRT016F877A, 876A
11Write protection off
100000h - 00FFh write protected
010000h - 07FFh write protected
000000h - 0FFFh write protected
CP1CP016F874, 873
11Code protection off
100F00h - 0FFFh code protected
010800h - 0FFFh code protected
000000h - 0FFFh code protected
WRT1WRT016F874A, 873A
11Write protection off
100000h - 00FFh write protected
010000h - 03FFh write protected
000000h - 07FFh write protected
上記のように 16F87X はプログラムメモリの後半だけをプロテクトすることができた。 そのため、見られたくないプログラムは後半に置く傾向にあり、 前半を書き換え可能なエリアとしていることがほとんどであった。
ところが、16F87XA では全エリアをコードプロテクトできるようになったものの 前半を書き込みプロテクトするようになった。
つまり、前半に書き換えられたくない、プロテクトされるべきプログラムを配置するように変更された。 これは従来と逆であり、プロテクトすべきプログラムを後半ページから前半ページに 移さなければならないことを意味する。
16F87XA はページを切り替える概念が残っており、ジャンプ命令やコール命令は ページをまたぐときにページ処理がある。
プログラムをページ間で再配置するためにはこれらのページ処理をすべて書き換えなければならない。
つまり始めからページ間を移動することを意識したプログラムでないと莫大な作業が発生し、 ミスも発生しやすく、テスト工数も増えることになる。


(C)2003-2005 All rights reserved by Einstein.
inserted by FC2 system