USB PICのブートローダー1

NO IMAGE

この頃、USB PICのお勉強を復活し、ちょっぴり賢くなってきた今日この頃。今まで、「USBフレームワーク」なる言葉にたじろぎ、ブートローダーに玉砕し、USBプログラミングは難しいものなのだと思い込んできた。

「USBフレームワーク」なる言葉は、簡単に言ってしまえば、USBプログラミングを簡単にできるようMicrochipが用意したプログラムの雛形(お手本)なのだ。この中に、USBがらみのの関数が記述されており、Microchip推奨のデモ基板を使えば、あまり深く考えなくても実験できるようになっているというわけ。

USB PICの「ブートローダー」は、マイコンのメモリ内に常駐し、USBによりプログラムメモリの内容を書き換える物。

そこまではいい。が、ブートローダーを使うのに、かなり嵌ってしまった。しかも、秋月電子で売られている18F2550マイコンボードでやろうとしていたので、余計だ。

結論から言って、お手本集の中にあるHID-Bootloaderには、18F2550用がなく、色々工夫する必要があったのだ。

1.HID-Bootloaderのリンカスクリプトに記述のあるp18f4550.libの箇所をp18f2550.libに修正(リンカスクリプトのアドレスは、18F2550でも18F4550の物がそのまま使える)。

2.18F2550にはポートDが存在しないため、その辺を適宜違うポートに書き直す(ポートDはBootloaderを起動させるためのボタンもあるため)。

3.HardwareProfile.hの

#if defined(__18CXX)
#if defined(__18F4550)
#include…

の箇所を

#if defined(__18CXX)
#if defined(__18F4550) || (__18F2550)
#include…

というように修正。

4.main.cのコンフィグレーションを行っている箇所に18F4550の物があり、それをコピーして、__18F4550→__18F2550に修正。さらに、#pragma config MCLRE=ON の箇所を、#pragma config MCLRE=OFFに修正(MCLRE/RE3のポートを使ってBootloader切り替えとするため。RE3を使わなければ、ONのままで可)。

5.io_cfg.hの#if defined(PIC18F4550_PICDEM_FS_USB)…に記載のある#define mInitAllLEDs() LATD &= 0xF0;TRISD &= 0xF0;をコメントとし、#define mInitAllLEDs() LATB &= 0xCF;に修正。
#define mLED_1 LATDbits.LATD0
#define mLED_2 LATDbits.LATD1
の箇所を
#define mLED_1 LATBbits.LATB4
#define mLED_2 LATBbits.LATB5
に修正し、#define mLED_3と#define mLED_4をコメントにする。
#define sw2 PORTBbits.RB4を#define sw2 PORTEbits.RE3に修正。これは、18F2550にPORTDがないため、RE3(MCLR端子兼用)を使って、ブートローダーの切り替えに使おうということである。

これだけやれば、エラーも出ず、Bootloaderのプログラムは0x000~0X0FFFのメモリーアドレス内に収まってくれるはず。

▼今回こいつが結構役に立った。

【送料無料】PICで動かすUSB

【送料無料】PICで動かすUSB
価格:2,940円(税込、送料別)