前回ArduinoUNOを使った書き込み機で、PIC18F14K50のコンフィグビット0x30002番地に0x01を書いたのに読出したら0x21になってしまう件を書きました。
違いはbit5が0か1かで、このbitはデバイス上で何にも割り当てられず、データーシートによると割り当てが無いbitは0として読み出される筈なのに1が出てきているという謎でした。
因みにHID版ブートローダーをビルドするとこの番地は0x01ですがMCHPUSB版ブートローダーでは0x21になっています。この違いがなぜあるのか、特にMCHPUSB版をビルドすると割り当てのないbitがなぜ立つのかは気になりますが、これについてはその内調べたいと思います。で、その前に今回はArduinoに載せたスケッチがバグっているのか、またはPICKit3が何か細工をしているのかを確かめたくて波形を見てみました。
といってもわが家のオシロスコープは古くてこの出力をピンポイントで見るのは困難です。そこであるところからAnalogDiscovery2を借りてきました。
そしてまずArduinoUNOで0x30002番地を読み出す瞬間の波形がこれ。
上段の波形がクロックでこの下りエッジで下段のデータを読み取ります。データはLSB側から出てくるので左右反転すると00100001=0x21と読めます。やっぱりデバイスから0x21が出ているんですね。
次にPICKit3で読み出す瞬間も見てみます。こちらはクロックがだいぶ早いですがやはり同じ様に0x21が出ています。
・・・という事でArduinoに書いたスケッチでもPICKit3でも波形的には’0x21’が出ています。なのにPICKit3の画面には’0x01’と表示されているのは恐らく使用していないbitを無条件に0として表示しているのだと思います。
Arduino用スケッチはどういう対策するのが正しいのでしょう?
使っていないbitなので書き込んだのと違う値が読めるのは当然と考えれば「ベリファイからこのbitは除外」が正解なのかな。でも単に読み出して表示する時には「読んだ通りに表示」しないと紛らわしい気がします。
表示する値とベリファイする値が異なるのは気持ち悪いけど「ベリファイ時は未使用bitを除外し、表示の際は読んだ通りに表示」かな。
というか、そもそも未使用bitなのであまり深く考える必要もないか・・・。