PIC18Fではプログラムコード内に置いたデータを連続して読み出せる機能がついた。
従来データはサブルーチンのリターン戻り値としてわたす命令のため、操作しづらく、メモリ消費も問題であった。
PIC18Fでは新たなレジスタと命令コードによりプログラム内に配置したデータを有効に利用することができる。
有効利用とは、PIC18Fは命令が16ビット幅であるために、8ビットデータが2つ入れることができる。
また、読み出しにはTBLPTR(22bit幅)をポインタとして、TABLATレジスタ(いつもTBLATと書いてしまう..)と通してデータの読み(書き)を行う。
TABLATアクセスにより、ポインタ更新機能が働き、連続したアドレスへのアクセスが簡単にできる。
うん、すばらしいと言うことで、実際にやってみた。
しかし、やはり動かない。なぜ?
いろいろなテストプログラムを作りやってみたが動かない。
この辺の新しいPICの機能に関して、Webにも情報がない。
困った挙句、MicroChipのPIC18F26/45/46K40に関するErrataをチェックした。
あった。
PIC18 CoreのBUGで、NVMCON register(不揮発性メモリコントロールレジスタ)のNVMREG<1:0>に10を入れろとのこと。
本来であれば、プログラム命令なので、レジスタの影響を受けてはだめなはずであるが
この命令実行時にはNVMCONの影響を受けるらしい。リセットでは00となっている。
NVMREG<1:0>: NVM Region Selection bit
10 =Access PFM Locations
x1 = Access User IDs, Configuration Bits, Rev ID and
00 = Access Data EEPROM Memory Locations
やったとばかりに試してみるが、やはりうんともすんとも言わない。なぜ?
さらにもう一度最初から試しを繰り返すことに。
PIC18F46K40であるが、このCPUには省エネ用にIC内部の各機能モジュールの電源を制御できる。
NVMCONということで、ひょっとしてと言うことでNVMの電源を入れてみた。
動いた。
制御レジスタだけではなく、PMD0:PMD CONTROL REGISTER 0のNVMの電源も設定が必要のようである。
PMD CONTROL REGISTERは省エネ面ではこれまでに無いすごい機能であるが、まだいくつか問題があるようで、これが原因でかなり余分に開発時間を消費している。
特にマニュアルのモジュール電源やクロックがブロック図に書かれていないため、どこまで影響があるかとか、入っていると想像される回路が書かれていないために苦労している。