Microchip Libraries for Applications(MLA)のv2018-11-26(以下単に、MLAと書きます)に用意されているサンプル・プロジェクトを、自分の作成した回路にあわせて、どの様な方法でまとめるのかについて解説します。一例として、PIC16F1455の項で示した「USB シリアル変換器」のファームウェアを作って行きます。そして、ファームウェアは他の方へ配布できる形にまとめます。なお、使用したMPLAB Xはv5.10のもので、XC8はv2.05のものです。
使用するPIC回路は、PIC16F1455の章にのせてあるものですが、水晶発振子(16MHz)とコンデンサー(C3とC4の22pFのコンデンサー)は必要ありません。Active Clock Tuning機能を使って内部クロックでPICを動作させるので、必要ないのです。さらに、この回路でPICにファームウェアを書き込んでしまえば、もう書き込み用の配線は必要がなくなります。ファームウェアを書き込んだPICを使い、それ用の新たな基板を作れば写真の様にコンパクトになります。
以下の図は、MLAのフォルダー構成です。
apps(apprications)フォルダーには、Microchipが用意しているファームウェアが入っています。また、bsp(board support packages)フォルダーには、Microchip社で販売しているPICボードにおいて、発光ダイオードとスイッチなどをPICのどのピンに割り当てているかを決めるためのファイルが入っています。
新しいファームウェアを作るときに、どのフォルダーの場所で作るかは、好みの問題です。ここでは、appsフォルダー直下に作ります。また、回路を自作したときには、その回路に合わせたbsp環境を整える必要があります。
以下の図は、bspフォルダーの中身です。
矢印で示したlow_pin_count_usb_development_kitフォルダーの中に、pic16f1459フォルダーがあります。このフォルダーはPIC16F1459用ですが、これを利用します。このフォルダーを、すぐ上の図で示したbspフォルダーにコピーします。そして、以下の図のように、フォルダーの名前をpic16f1455と変えます。
ここでは、MLAにある多数のプロジェクトの中から、必要なもの1つだけを抽出します。
1.appsフォルダーを表示させ、そこから、usb\device\cdc_serial_emulatorフォルダーを見つけます。このフォルダーが今回のプロジェクトの元になっているフォルダーです。このフォルダーを、appsフォルダーの中にコピーします。
2.上図のcdc_serial_emulatorフォルダーの中は、以下の図のようになっています。
ここでutilitiesフォルダーは不要なので削除します。残っているfirmwareフォルダーを開くと次の様になっています。
このフォルダーの最初から2番目にあるlow_pin_count_usb_development_kit_pic16f1459.xフォルダーを使います。このフォルダーはPIC16F1459用ですので、この中身をPIC16F1455用に書き換えて行きます。まずは、このフォルダーの名前をpic16f1455.xに変えます。そして、このフォルダーとdemo_srcの2つのフォルダー以外の6つのフォルダーは不要なので削除します。
3.bspとappsフォルダーの中に、それぞれ作成したpic16f1455フォルダーとpic16f1455.xフォルダーは、もともと別の所にあったフォルダーです。コンパイラがファイルを探す道筋をパスと言いますが、フォルダーのある場所を変えたので、このパスを変える必要があります。パスは、上図のpic16f1455.xフォルダーの中のpic16f1455\nbproject\configurations.xmlというファイルに書かれているので、秀丸などのテキスト・エディタ・ソフトで、これを編集します。
テキスト・エディタにて、以下の作業をします。
①すべての../../../../../../を../../../../に置換します(上記項目1の所で、cdc_serial_emulatorフォルダーを2つ上のフォルダーにコピーしたため../を2つ消した)。
②すべてのlow_pin_count_usb_development_kit/を何もなしで置換する。すなわち削除する(bsp環境の整備の所で、pic16f1459フォルダーをlow_pin_count_usb_development_kitフォルダーの1つ上のフォルダーにコピーしたため)。
③すべての1459を1455で置換する(bspフォルダーとして、bsp\pic16f1459フォルダーを指定し、使用するpicをpic16f1455としたため)。
以上編集が終わったら、ファイルを上書き保存します。編集後のファイルはconfigurations.zipです。
以上の作業で出来上がったプロジェクトはPIC16F1459用です。これをPIC16F1455用のものにして行きます。この作業には試行錯誤が必要で、あと、少しの経験と勘が必要です。
1.MPLAB Xを立ち上げます。そして、プロジェクトを読み込みます。プロジェクトの読み込みは、メニューからFile→Open Projectを選択することから始まります。以下の図を参照。
2.以下の図のように、Open Projectダイアログ・ウィンドウが現れます。そこで、ファイルの場所と書かれたコンボボックスの右にある▼を押すと、Cディスクが現れるので、それをマウスでクリックします。
3.フォルダー・ツリーが表示されるので、microchip、mla、v2018_11_26、apps、cdc_serial_emulatorと、次々と、マウスでダブル・クリックして選択し、以下の図のようにします。
4.firmwareと書かれたフォルダー・アイコンの左側にある”四角で囲われた+記号”をマウスでクリックすることにより、ツリーを展開します。以下の図のようになります。
5.ここで、pic16f1455.xの箇所をマウスでダブルクリックすることで、プロジェクトの読み込みが始まります。プロジェクトを読み込みが完了したときのプロジェクト・ウィンドウは以下の図のようになります。
一応、[PROJECT CONFIGURATION]ドロップダウンボックスに、使用するPICとして、 LPCUSBDK_16F1455が表示されていることを確認ください。ただ、表示はPIC16F1455となっていますが、プロジェクトの中身(ファイルの一部)はまだPIC16F1459用のものなので、それをPIC16F1455用のものに改造して行きます。
以下、赤字で書くものはMPLAB Xのプロジェクト・ウィンドウ関連のもので、青字で書くものはcdc_serial_emulatorフォルダー構成関連のものです。
6.今回使用しないファイル(Microchip社が販売しているPICボード用の特有なファイル)をプロジェクトから登録解除します。対象となるのは
7.UARTの入出力ピンを決定しているファイルを探します。uart.hの中で次のように定義されていることが分かりました。なお、uart.hの場所は、Projectsウインドウに表示されているフォルダー・ツリーを展開して御自身で見つけてください。
#define UART_TRISTx TRISBbits.TRISB7
#define UART_TRISRx TRISBbits.TRISB5
#define UART_Tx PORTBbits.RB7
#define UART_Rx PORTBbits.RB5
この部分を、PIC16F1455 (14ピン)の項で示した回路に合わせて書き換える必要があります。回路を見ると、RC5ピンがRXで、RC4ピンがTXとなっています。したがって、
#define UART_TRISTx TRISCbits.TRISC4
#define UART_TRISRx TRISCbits.TRISC5
#define UART_Tx PORTCbits.RC4
#define UART_Rx PORTCbits.RC5
と書き換えます。
8.uart.hの中で、// Use following only for Hardware Flow Controlというコメント がついていますので、「このファームウェアではハードウェア・フロー制御するかしないかをどこかで決めているな」とすぐ考えつきます。今回は、ハードウェア・フロー制御をしないので、上記コメント文の下の8個の#define文をすべてコメント文にします。次に、ハードウェア・フロー制御するかしないかを決めているところを見つけます。usb_config.hの152行目のUSB_CDC_SUPPORT_HARDWARE_FLOW_CONTROLを定義するかどうかで決めていました。今回はハードウェア・フロー制御をしないので、#define USB_CDC_SUPPORT_HARDWARE_FLOW_CONTROL文をコメント文にします。
9.入出力ピンでデジタル信号を扱う場合、必ず、そのピンをデジタル用(アナログピンではなく)としなければいけません。それを、どこかで決めているはずです。探すと、usart.cの50行目にありました。
ANSELBbits.ANSB5 = 0; // Make RB5 pin digital
です、これをコメント文にして、
ANSELC = 0x00;
をそのすぐ下に付け加えます。これでRCピンがすべてデジタル用のピンに設定されます。
10.PIC16F1455は外部クロックを用いるか、Active Clock Tuning機能を使って内部クロックを用いるかを選択できますので、これもどこかで決めているはずです。探してみると、system.cの中のUSE_INTERNAL_OSCを定義するかどうかで決めていることが分かりました。今回は内部クロックを用いると宣言しましたので、
/** CONFIGURATION Bits **********************************************/
の前に
#define USE_INTERNAL_OSC
の1行を追加します。
11.先にも書きましたが、ボタン:スイッチや発光ダイオードは使用していませんので、system.cの94行目近くにある
LED_Enable(LED_USB_DEVICE_STATE);
BUTTON_Enable(BUTTON_DEVICE_CDC_BASIC_DEMO);
の2行をコメント文にします。
以下、クリーン・ビルドを実行し、その時Outputウィンドウに表示されるエラーやワーニング(警告)に対処して行きます。エラーやワーニングは、「...」で始まります。沢山のエラーやワーニングが出ますが、一番最初のものだけに注目して行きます。クリーン・ビルドを実行するには、下図のように、クリーンビルド・アイコンをマウスでクリックします。
12.クリーン・ビルドを実行すると
../../../../framework/usb/src/usb_device.c:281:: advisory: (1510) non-reentrant function "_USBDeviceInit" appears in multiple call graphs and has been duplicated by the compiler
のような(1510)ワーニング(要注意事項)が出てきます。これは、メインルーチンと割り込みルーチンの両方で、メインルーチンで定義された関数(APP_LEDUpdateUSBStatus等)を使用しているので、メインルーチンで定義された関数(APP_LEDUpdateUSBStatus等)を複製して(duplicated)割り込みルーチン用のものを作ったという注意です。無視してかまいません。ワーニングに引き続き
:0:: error: (499) undefined symbol:
_APP_LEDUpdateUSBStatus(dist/LPCUSBDK_16F1455/production\pic16f1455.x.production.o)
というエラーがでます。これは、APP_LEDUpdateUSBStatus関数が定義されていないというエラーです。この関数が使われるところを、プロジェクト全体から検索します。そのために、まず、どのファイル(修飾子がcのファイル)でも良いので、ファイル名の所をダブルクリックして、そのソースコードを表示させます。ソースコード上でマウスで右クリックをすると、次のようなサブメニューが出てきます。そこで、Find in Projects...を選びます。
すると、以下のようなFind in Projectsダイアログが現れますので、Containing Text:ボックスのなかに、例えば、上記エラーのAPP_LEDUpdateUSBStatusなる部分をコピー&ペーストし、Findボタンを押します。
検索結果は、Search Resultsウィンドウに表示されます(下図参照)。
結局、登録されているusb_eventsファイルにて、APP_LEDUpdateUSBStatus関数が3か所で使用されていることがわかります。表示されているAPP_LEDUpdateUSBStatus()という文をダブルクリックすると、この関数を使用しているソースファイルとその箇所が以下の図の様に表示されます。
ここで3つのAPP_LEDUpdateUSBStatus()文をコメント文にします。
13.再度、クリーン・ビルドを実行すると、
エラーがでず、BUILD SUCCESSFUL (total time: ?s)なる表示がOutputウィンドウで確認できれば、おしまいです。
1. 作成したファームウェアを他の方に配布するために、不必要なファイルを消去します。まず、\microchip\mla\v2018_11_26\apps\cdc_serial_emulator\firmware\pic16f1455.xを開けます。
2. build、debug、distの3つのフォルダーを消去します。そして、上図に見えるnbprojectフォルダーを開けると、次の図のようになっています。
ここで、以下の図のように、privateフォルダーとconfigurations.xmlファイルとproject.xmlファイルだけを残して、後はすべて消去します。
3. 以上で、必要の無いファイルやフォルダーを消去し終えました。作成したファームウェアを配布するために、新しいフォルダーを作ります。例えば、以下の図のようにytsフォルダーを作ります。
そして、このフォルダーの中にappsフォルダーとbspフォルダーを新たに作ります。appsフォルダーの中には、microchip\mla\v2018_11_26\apps\cdc_serial_emulatorフォルダーを、またbspフォルダーの中にはmicrochip\mla\v2018_11_26\bsp\pic16f1455をコピーします。
4. ところで、パーソナル・コンピュータとPIC回路を初めて接続するとき、デバイスドライバーが必要となります。デバイスドライバーと、そのインストーラは、microchip\mla\v2018_11_26\apps\usb\device\utilities\windows_driver_installer_tool\bin\cdc_installerフォルダーにあります。これをyts\apps\cdc_serial_emulatorフォルダーの中に入れます(下図を参照)
ytsフォルダーをzipファイル(yts.zip)にして、それを配布します。そして、配布先には、解凍して出てくるytsフォルダーの中身をmicrochip\mla\v2018_11_26フォルダーの中にコピー(あるいは移動)するよう、指示します。
すでに出来上がっているファームウェア(MLAの中にあるものも含む)を配布する他の方法として、パッケージ化というものがあります。プロジェクト・ウィンドウに表示されているプロジェクト名の所をマウスで右クリックすると、サブメニューが現れるので、以下のようにPackageを選択します。
すると、appsフォルダーの下に作成したcdc_serial_emulatorが対象プロジェクトであれば、cdc_serial_emulator\firmware\pic16f1455フォルダーの中に、USB Device - CDC - Serial Emulator.zipができているはずです。これがパッケージ化されたプロジェクトです。これは、スターンド・アローン(自立:プロジェクトに必要なファイルがすべて入っており、どのフォルダーの場所に置いてもきちんと働くという意)ですので便利です。試す価値はあります。だた、短所もありますので、本解説では、パッケージ化は使用していません(好みの問題)。 戻る