プログラムロード時には非同期プリセットをPICで叩くことでメモリへの展開ができるようになりました。なんですが、今度メモリに展開されたコードをダンプ機能で見てみると、なんか変なところがあります。
以下の出力はPIC上のモニタの中にデバッグルーチンを組込み、強制的に1番地に”0x1234”という1ワードを書いてダンプしてみた状態です。
1番地にコードが確かに書かれましたがその値は”0x1214”。そしてなぜか書き込みをしていない33番地にも同じワードがイメージで現れています。
そのあと、意味のあるプログラムコードを21ワード転送していますが、その後のダンプでは0~20番地に書かれたもののそっくりコピーが32~52番地にもあるように見えます。
0x1234が0x1214になる・・ということは16bitデータのうち、D5ビットが0になるようにマスクがかかっているといえます。またコントローラのPICが出力するバスはデータとアドレスを兼用しているので、アドレス的に見るとD5が常に0だと0~31と32~63番地は等価になってしまう(つまり同じものが見えてしまう)、ということです。
こりゃまたD5ラインにハンダの浮きがあって接触不良だろうとムキになってチェックしたのですが問題なし。あらためてPIC18F4550のマニュアルをみてみました。
D5ラインにアサインしているRB5ピンの機能は・・・
お? 低電圧プログラミング時のPGMピン機能もあるようです。で、コンフィグレーションを見てみるとなんとLVPビットがONになってました。ONだと他の機能はすべて無効化されるとあります。
これではRB5ピンは汎用入出力ピンとして機能しません。
これってHiTec-Cからxc8への移植の時に仕込んだのかと思ったら、最初から間違っていたみたいです。なんですがプログラム長が32ワード以下、コードで見た場合のD5は実効アドレスのD5なので使用するデータのサイズも32ワード以下なら全く動作に問題ないわけで、完全に見落としです。LVPビットをOFFに設定してうまくいきました。