PIC18F14K50+HIDブートローダ~その2~

前回ArduinoUNOを使った書き込み機で、PIC18F14K50のコンフィグビット0x30002番地に0x01を書いたのに読出したら0x21になってしまう件を書きました。
違いはbit5が0か1かで、このbitはデバイス上で何にも割り当てられず、データーシートによると割り当てが無いbitは0として読み出される筈なのに1が出てきているという謎でした。

因みにHID版ブートローダーをビルドするとこの番地は0x01ですがMCHPUSB版ブートローダーでは0x21になっています。この違いがなぜあるのか、特にMCHPUSB版をビルドすると割り当てのないbitがなぜ立つのかは気になりますが、これについてはその内調べたいと思います。で、その前に今回はArduinoに載せたスケッチがバグっているのか、またはPICKit3が何か細工をしているのかを確かめたくて波形を見てみました。

といってもわが家のオシロスコープは古くてこの出力をピンポイントで見るのは困難です。そこであるところからAnalogDiscovery2を借りてきました。

AnalogDiscovery2

そしてまずArduinoUNOで0x30002番地を読み出す瞬間の波形がこれ。
上段の波形がクロックでこの下りエッジで下段のデータを読み取ります。データはLSB側から出てくるので左右反転すると00100001=0x21と読めます。やっぱりデバイスから0x21が出ているんですね。

Arduinoで読み取る瞬間(0x21と出ている)

次にPICKit3で読み出す瞬間も見てみます。こちらはクロックがだいぶ早いですがやはり同じ様に0x21が出ています。

PICKit3で読み取る瞬間(こちらも0x21と出ている)

・・・という事でArduinoに書いたスケッチでもPICKit3でも波形的には’0x21’が出ています。なのにPICKit3の画面には’0x01’と表示されているのは恐らく使用していないbitを無条件に0として表示しているのだと思います。

Arduino用スケッチはどういう対策するのが正しいのでしょう?
使っていないbitなので書き込んだのと違う値が読めるのは当然と考えれば「ベリファイからこのbitは除外」が正解なのかな。でも単に読み出して表示する時には「読んだ通りに表示」しないと紛らわしい気がします。
表示する値とベリファイする値が異なるのは気持ち悪いけど「ベリファイ時は未使用bitを除外し、表示の際は読んだ通りに表示」かな。

というか、そもそも未使用bitなのであまり深く考える必要もないか・・・。

PIC18F14K50+HIDブートローダ

PIC18F14K50にArduino+9V電池方式でHIDブートローダを書込んでみたらベリファイでエラーが出ました。
コンフィグビット0x30002番地に0x01を書いたのに読出したら0x21になっています。

300000+    0  1  2  3  4  5  6  7  9  9  A  B  C  D
書込値 :00 32 01 1e -- 00 01 -- 03 c0 03 e0 03 40
Arduino読:00 32 21 1e 00 00 01 00 03 c0 03 e0 03 40
PICkit3読:00 32 01 1e 00 00 01 00 03 c0 03 e0 03 40

PICKit3で読むと0x01ですがArduinoだと0x21になるのです。
違いはbit5が0か1かですが、このbitはデバイス上で何にも割り当てられていません。PIC18F14K50のデーターシートによると割り当てが無い番地は0として読める事になっているのでPICkit3の結果が正しくArduinoの結果が間違いです。

しかしArduinoのスケッチを見ていますが特に問題なさそうに見えます。またこの番地のこのbit以外は問題が発生していないのも納得がいきません。因みにデバイスを交換しても変化なしでした。

書込み自体はできており問題なく動作はするのですが・・・謎です。