pic16f145x_family

last updata : 2018/04/10

MLA pic16f145x_family HID Bootloader 修正箇所

桜

2018年の桜

熊本の八重桜

Microchip Libraries for Applications

略してMLAです。 参考になるプログラムが数多く入っていますので使う方も多いと思います。

ただし、100%動作するとは限りません。 バグがあることはあります。

今回、PIC16F145xのHID Bootloderを作るときに遭遇しました。 正常に書き込んでいるのに、ベリファイエラーになる。 典型的な?バグですね。

一寸厄介なのは、PIC側の問題なのかPC側の問題なのか? ネット上を調べてみても情報が見つからない。 PIC16F145xの記事自体も少ない。 なんか面倒そうだ。

対象のMLA

MLA v2017_03_06 (2018/04/10現在最新)

以降修正される可能性はあります。

問題個所は…

先に、互換HID Bootloaderを作っていきました。 PIC18Non-JのBootloaderをベースに変更したので短時間で、USB通信可能になっていたからです。

テストプログラムも作って在ったので比較すればと。

結果 UserID や ConfigurationWord が読み出せない点が問題でした。 問題が分かれば、修正箇所も直ぐに探し出せました。

395        TmpAddr = ((uint32_t)PacketFromPC.Address / 2);
396        PMADR = TmpAddr;
397
398        //Read every byte of flash memory that the PC app is requesting
399        for(i = 0; i < PacketFromPC.Size; i++)
400        {
401            if(TmpAddr >= CONFIG_WORDS_START_ADDRESS)
402            {
403                PMCON1bits.CFGS = 1;   // Read from config not Flash
404                PMADRH=0;
405            }

BootPIC16F145x.c 400行付近抜粋

一目瞭然 401行目が問題です。

TmpAddr は、Word 処理用にアドレスが1/2されています。 401行目の比較は、Wordアドレス と Byteアドレスを比較していますので絶対に真になりません。 あとUserIDの方が小さいので、比較対象をUserIDのアドレスにする必要があります。

335         case PROGRAM_DEVICE:
336             //Check if host is trying to program the User ID bytes (or config ...
337             if(PacketFromPC.Address >= USER_ID_ADDRESS)
338             {     
339                 //Check if the host is trying to program the config bits
340                 if(PacketFromPC.Address >= CONFIG_WORDS_START_ADDRESS)
341                 {

BootPIC16F145x.c 340行付近抜粋

401行目の修正は、337行目のIF分と同じにします。

401            if(TmpAddr >= CONFIG_WORDS_START_ADDRESS)

下記に書き換える

401            if(PacketFromPC.Address >= USER_ID_ADDRESS)

これだけで、ベリファイエラーは無くなりました。。

xc8 フリー版でコンパイルするには

何時もの如くPRO版でないとコンパイルできません。 そこで、修正します。

BootPIC16F145x.h

44      #define APP_SPACE_RESET_VECTOR           0xC04
45      #define APP_SPACE_START_ADDRESS          0xC00
45      #define APP_SIGNATURE_ADDRESS            0xC00
46      #define APP_SIGNATURE_VALUE              0x6D
47      #define APP_VERSION_ADDRESS              0xC02

各アドレスの0x900~0x904を変更します。 0xB00でもギリギリ入るのですが、余裕をもって0xC00に指定ます。

main.c

703     #ifdef __XC8__
704     //    #if _HTC_EDITION_ < 2   //Check if PRO, Standard, or Free mode
705     //    #error "This bootloader project must be built in PRO mode to fit ..."
706     //    #endif
707     #endif

xc8のPRO版未満エディションをエラーにしていますので、コメントアウトしています。

HardwareProfile.h

34      //#if defined(__16F1459)|| defined (__16F1454)
35      //    #define LOW_PIN_COUNT_USB_DEVELOPMENT_KIT
36      //#else
37          #define YOUR_CUSTOM_BOARD
38      //    #advisory "You need to add platform specific settings for your ..."
                                               :
45      //#endif

ハードウェア(ボード)の選択部分ですがデバイスで固定されています。(変だ?) 自由に選択できるのが普通かなと。

#define LOW_PIN_COUNT_USB_DEVELOPMENT_KIT または #define YOUR_CUSTOM_BOARD のどちらか一つを選んでください。

自分で作ったボードならYOUR_CUSTOM_BOARDを選んでこのファイルの下方にあるハードウェア設定を変更することをお勧めします。

リンカ設定

xc8のリンカ設定を変更します。

Codeoffset

ROM rangesを変更する。

ROM rangesを「default,-C00-1FFF」に変更します。

これで、コンパイルするとPIC16F145xのHID Bootloader マイクロチップ版が出来上がります。

免 責

情報は出来るだけ正確に書くつもりです。ただこの記事を見て作ると思ったときは、 個人の責任において作業を行なってください。 データの喪失や機器の損傷が有っても、一切の責任は取れません。