PIC16F145xでUSB Bootloaderを!

PIC16F145xのUSB Bootloaderなんてメモリ食いすぎて使い物にならないかなと思ってたが、必要に差し迫られることなったのでやってみることにした。というのも、ラムネケースMIDIインタフェースをつくっていて、実はMIDI INのディスクリプタを消し忘れていたことに後で気がついて、ファームを書き換えようと思ったら。。。。ん、外せない!!非常に分解しにくい!!つまり、ファームの書き換えが非常にやりにくいことにあとで気がついて、後の祭りとはこのことかーと思い知らされた訳だ。この写真をみてもフタのフチがヘロヘロになっているのがわかるだろう。あそこがなかなか外れないのだ。誤飲防止?さすが子供向けラムネ菓子!!

IMG_7944

ということで、こいつを分解しなくてもファームウエアを書き換えるためには、USB経由で書き換えるしかない(今更だけど)!ということでいつものごとく、MicrochipのMLAのライブラリを確認すると、昔はなかったPIC16F145x用のUSB Bootloaderが追加されているではないか!ということで、やってみることにする。

今回使用するMLAは、この記事を書いている時点で最新の2016-11-07バージョン(USB v2.16)(2017/3/23加筆:なんとこの記事を書いた翌日にMLAが2017-03-06バージョン(USB v2.17)にアップしてるし・・・w しかし、ファイル比較でPIC16F145xに関するものに1文字のアップデートもないことを確認した)である。今後、多少バージョンアップがあるかもしれないが、基本的におさえるべき所は決まっているので、今後のことも考えて備忘録として取っておくことにした。というのも、正しく機能させるためにはいくつかのハードルがあって(俗に言うハマりどころ)かどうかわからないが、あまりネット上に情報があまりないのも事実(日本語、英語)なので、激安USBデバイスを作りたい人の参考になればと思う。

要点は以下の通り、

  1. PIC16F145xにはチップにバグがあり、リビジョンA5以上でないとBootloaderが機能しない
  2. XC8のPRO版(高い!!!)が必要!と書いてあるが、Free版でもできる!ただし面倒で制限あり
  3. Bootloaderを起動するためにスイッチが必要
  4. ソースコードに不備があり、PIC16F1455では動作しない(F1454,F1459はOK)

1.チップのリビジョン確認
PIC16F1454,1455,1459の初期ロットにはメモリ書き換えのバグがあり、プログラムからプログラムROMの書き換えができないらしい。ということで、リビジョンA5以上のチップが必要。PICkit3などでチップにアクセスするとリビジョン番号(1005h以上が必要)が表示されるので、要確認。

2.XC8のFree版でなんとかする
MLAではXC8のPRO版を使って1kwちょいでBootloaderを作るようになっている。プロジェクトの設定から何から何までこれで設定されているので、これを打破すべくFree版でいけるようにしてみることにする。MLAでは、0x900以内に収まるようにコンパイルされることになっており、随所でこの0x900という数字が使われている。今回はFree版で実行するためにプログラムの大きさを調べ、それに合わせて各種設定を変えることで対処することにする。
今回使用したXC8 v1.41では、Bootloaderの大きさは0xAFCとなった。そこで、キリのいい数に切り上げてBootloaderの大きさを0xb00として元々0x900のところを0xb00で置き換えることにする。今後、ソースやコンパイラが変わることでこの値は変える必要があるが、致し方ないところとなる。また、ユーザプログラムの領域もかなり減るが背に腹は変えられない(PRO版お試し期間でコンパイルする手もあるがw)。具体的な変更点については後述する。

3.Bootloaderの起動用スイッチが必要
USB接続した時に、Bootloaderモードなのか、ユーザプログラムモードなのかを判別するためのスイッチが必要となる。MLAではRA3がこれに当てられている。リセットではなくInputとして使用する。RA3は元々OUTPUTや他の機能には使用できないので、このポートを使うことは順当と言えよう。

4.ソースコードの不備の修正
PIC16F1455やLFシリーズを使用するときはソース中の#ifdefで抜けているチップをチェックしておく必要がある。特にF1455では54や59は指定されているのに55だけ抜けている箇所があり、結果としてポートの設定ができないため、動作不良となるところがある。今後のバージョンで修正されるとは思うが、使用するチップが正しく設定されているかは一通りチェックしておいた方がよさそう。具体的な変更箇所については後述する。

今回Bootloader化するにあたり、最低限必要な回路は以下のようなものになる

bootloader

これに基づいてMLAのBootloaderの具体的な変更箇所は以下のとおりである。ちなみにPIC16F1454でも55でも59でも同じである。すでにMPLABX用のプロジェクトが作成されているので、これを読み込んでおく。接続の様子を示すLEDの位置はどこでもよいが、この例ではRC2にしてある。

・プロジェクトの設定でユーザプログラム領域を使用できないように設定しておく
Project Properties–>XC8 global options–>XC8 linker–>Option categories:Memory modelの”ROM ranges”で使用しないアドレスを指定する。先述2で述べたようにBootloaderの大きさが大きくなるので、今回の例では”default,-B00-1FFF”となる。
あらかじめこうしておけば、もしもXC8のバージョンなどが変わってこの範囲にBootloaderが収まらないときはエラーとなるのでわかる。

・demo_src\BootPIC16F145x.h
先述2関連で、ユーザプログラム格納域の設定があるので0x900の部分を0xb00のように変える。ちなみにユーザプログラムは0xb04からで、0xb00からの4ワードには関連データが格納される
#define APP_SPACE_RESET_VECTOR        0xb04
#define APP_SPACE_START_ADDRESS        0xb00
#define APP_SIGNATURE_ADDRESS        0xb00
#define APP_VERSION_ADDRESS            0xb02

・demo_src\HardwareProfile.h
内蔵OSCを使用するので以下を有効に
#define USE_INTERNAL_OSC

先述4関連で、なぜかF1455の定義が抜けているところがあるので追加しておく
#if defined(__16F1459)|| defined (__16F1454)|| defined (__16F1455)

USB接続した時に点滅するLEDとしてデフォルトではRC0が割り当てられているので、ハードに合わせて変更(この例ではRC2にLEDを接続)
#define mLED1       LATCbits.LATC2
#define mLED1Tris   TRISCbits.TRISC2

Bootloaderとして起動するときにONにするSWが接続されているポートを指定する。先述3のようにデフォルトではRA3であり、初期化が必要ないので処理はなし。必要があれば変更
#define mInitSwitch2()      {}
#define sw2 PORTAbits.RA3
#define mDeInitSwitch2()    {}

・demo_src\main.c
コンパイラがPRO版でないとエラーが出るようになっているのでコメントアウトしてエラーにならないようにする
#ifdef __XC8__
#if _HTC_EDITION_ < 2   //Check if PRO, Standard, or Free mode
//    #error “This bootloader project must be built in PRO mode to fit within the reserved region.  Double click this message for more details.”
#endif
#endif

以上の変更で作成されるBootloaderは、当方で調べた限りF1454でも55でも59でも同じHEXファイルを出力する。将来的にはバージョンアップなどで#ifdef系の変更があれば違いが出るかも知れないが、今のところバイナリコンパチということになる。ちなみにそのHEXはこれ。いつものように拡張子をHEXにして使用のこと。ほぼ99%はマイクロチップのコードなので商用利用には注意のこと。

これをチップに書き込むにはさすがにUSB接続では無理で、PICkit3などのライタが必要となる。書き込むために最低限必要な回路は以下のとおり。

bootloaderwriter

一旦Bootloaderを書き込めば、ユーザプログラムはUSB接続で書き込めるのでICSPなどの端子を用意する必要はないのでポートは使いたい放題!

ユーザプログラムをBootloader対応にするには一工夫必要である。Bootloaderを使用した場合、ユーザプログラムはBootloaderの後方に配置されるのでリンクの設定を変更する必要がある。主な変更点は2カ所あり、以下のようにいずれもMPLABXのプロジェクトの設定である。

1. Project Properties–>XC8 global options–>XC8 linker–>Option categories:Additional optionsの”Codeoffset” を指定のアドレスにする。今回の例では0xb04となる

2. Project Properties–>XC8 global options–>XC8 linker–>Option categories:Memory modelの”ROM ranges”でユーザプログラムが使用しないアドレスを指定する。今回の例では”default,-0-B03″となる

これらの変更を施し、ビルドすればBootloader対応となる。逆にBootloader対応プログラムをそのままPICkit3なおで普通に書き込んでの動作は当たり前だが保証されない。

ユーザプログラムの書き込みは、まずSWを押しながらUSB接続し、MLAに含まれるHIDBootloaderを起動し、ユーザプログラムを読み込み、書き込む。ユーザプログラムの大きさは約2/3に限られるが、書き換えが楽になるのでよっぽど大きなプログラムでない限りはBootloaderを使用した方がよいと思われる。

広告
  1. 2017年 3月 22日

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。