2015年6月23日火曜日

Device - HID - Custom Demos を試してみる

秋月電子の PIC18F4553 仕様USB対応マイコンボード[AE-USBPIC44]を使用してヒューマンインターフェース(HID)クラスを試した。
C:\microchip_solutions_v2013-02-15\USB\Device - HID - Custom Demos
フォルダにある、Firmware からコピーして使った。修正点は次の通り。

  1. デバイス指定変更
    HardwareProfile.h の
      #if defined(__18F4550)
         #include "HardwareProfile - PICDEM FSUSB.h"
      ↓
      #if defined(__18F4553)
         #include "HardwareProfile_PICDEM_FSUSB.h"
  2. ファイル名を修正した
    HardwareProfile - PICDEM FSUSB.h

    HardwareProfile_PICDEM_FSUSB.h
  3. usb_device.cの#include を修正
    #include "../USB/usb_device_local.h"

    #include "usb_device_local.h"
  4. ただし、MPLAB X-IDE, コンパイラ指定は C18 
3.の変更は、インクルードファイルを、マイクロチップソリューションから自前のフォルダへコピーして使用したためのもの。(2015/6/27 修正ファイルと内容を訂正)
ビルド成功後、PIC18F4553 に焼き込んで試した。スイッチとLEDの配置が、基板とプログラムでは異なるが、プログラムの方に合わせた。
  • RD0, RD1 に LED を接続 (秋月の基板は RE2 )
  • スイッチは RB4, RB5 (秋月の基板は RE0, RE1 )
C:\microchip_solutions_v2013-02-15\USB\Device - HID - Custom
フォルダにある、DemosGenericHIDSimpleDemo.exe
を起動する。パソコンと基板を接続すると、すぐにこのサンプルプログラムで動作確認できた。パソコン側は何もする必要は無く、インとアウトが出来ることがわかった。
  • Connect ボタンで接続
  • Toggle LED(s) で二つ同時に点灯消灯する
  • RB5 と GND をショートすると
    State: Not Presses -> Pressed になる(下図の状態)



2015年6月18日木曜日

Microchip Solutions から自前のフォルダへ

【マイクロチップソリューションフォルダから自前のフォルダに再作成してトライ】
秋月電子の PIC18F4553 仕様USB対応マイコンボード[AE-USBPIC44]のデモ「MPLABを使った使用例2」がビルド成功したので、PIC側のプログラムを自前の開発用ワークフォルダの下に作成してみることにした。以下に作業内容を示す。

MPLAB X-IDE v3.00 、microchip_solutions_v2013-02-15 です】
  1. 自分用のフォルダを作成しファイルをコピー
    microchip_solutions_v2013-02-15\USB\Device - CDC - Basic Demo\Firmware
    の中身ををそのまま自分用ワークフォルダにコピー
  2. プロジェクトを次のようにインポート
    MPLABX -> Inport -> MPLAB v8 Project から
    USB Device - CDC - Basic Demo -  C18 - PICDEM FSUSB.mcp
    をインポートする
  3. MPLABX -> Project Properties から
    PIC18F4550 -> PIC18F4553 に変更
    Compiler は C18, Shift-JIS を選択して、一旦終了する
  4. ここで、Miising Files が14個有りでエラー終了
  5. main.c と HardwareProfile.h の書き換えは済ませておく
    MPLABを使った使用例2に従って
  6. Projects ツリー Header Files 右クリックメニュー Add Existing Item から
    HardwareProfile - PICDEM FSUSB.h
    HardwareProfile.h
    usb_config.h
    の三つ(ワークフォルダ内にある)を登録
  7. Projects ツリー  Source Files に必要な
    main.c
    usb_descriptors.c
    の二つを上と同様に登録
  8. Header Files 右クリックメニュー New Logical Folder から
    [USB Stack] のロジカルフォルダを作成する
  9. Source Files の下にも上と同様に [USB Stack] を作成する
  10. [USB Stack] に登録するファイルは、ワークフォルダとは分けて別にフォルダを準備して、そこへコピーした(他でも使うと思われるので)
  11. C:\microchip_solutions_v2013-02-15\Microchip\Include\USB から
    usb.h
    usb_ch9.h
    usb_common.h
    usb_device.h
    usb_function_cdc.h
    usb_hal.husb_hal_pic18.h
    C:\microchip_solutions_v2013-02-15\Microchip\USB から
    usb_device_local.h
    usb_device.c
    C:\microchip_solutions_v2013-02-15\Microchip\USB\CDC Device Driver から
    usb_function_cdc.c
    をこの"別の"フォルダへコピーする
  12. [Linker Files] は、
    C:\Program Files (x86)\Microchip\MPLABX\v3.00\mpasmx\LKR から
    18f4553_g.lkr をコピーしてワークホルダへ貼り付けてから、登録した
  13. プロジェクトプロパティからインクルードパスを設定する
    C:\Program Files (x86)\Microchip\mplabc18\v3.45\h
    C:\microchip_solutions_v2013-02-15\Microchip/include
    と、自分のワークフォルダへのパスの三つ
  14. 右の成功したプロジェクトのプロジェクトツリーと見比べて同じ構成になるように [USB Stack] に登録する
  15. ここでビルドしてもエラーになった
  16. HardwareProfile - PICDEM FSUSB.h をHardwareProfile_PICDEM_FSUSB.h
    へ名前を変更(右クリックメニューで Rename を使う)
    空白があるとダメみたい
  17. ここでビルドしてもエラーになったら(途中でビルド失敗していたら)、build フォルダに残っている o ファイルを消す
    (正しい方法なのかどうかは不明ですが)
  18. ビルド成功
  19. PICへ書き込むと、PCと通信可となる(6/20確認)
  20. ワークフォルダ内の要らないファイルを削除
メモリ使用量
  • Data 702/2048byte
  • Memory 5802/32768byte で、そこそこ使われる

【あとがき】
要は、右図の様にマイクロチップソリューションの中と同じプロジェクトツリーの構成にすればいいのだけれど、この作業は紆余曲折あった。
まだ道半ばも、いじってみれるところまで来た。
  • XC8へ移行できていない
  • CDCクラス通信でつながったに過ぎない

【あとがき2】2015/06/26
コピーする作業より、要らないフォルダを全て消してフォルダのリネームしたほうが手っ取り早いかも。「マイクロチップソリューション」のZIPファイルを残しておけばいいだけ。

【あとがき3】2015/06/27
ヒューマンインターフェース(HID)クラスのテスト後、インクルードパスの修正箇所を出来るだけ減らしたいので、フォルダ構成、コードの修正箇所を見直してみた。またまたビルド失敗を繰り返すハメになって、試行錯誤(私の悪い癖)ではだめだと思いきちんと、コピー元、コピー先のファイル一覧表を作るなどして頭を整理してみた。
  • マイクロチップソリューションのフォルダのパスがあると中途半端にうまくいってしまてNG
  • 別のテーマの usb_config.h を登録してしまい、定数が定義されていないエラーが解決できずてこずった
  • usb_descriptors.c も同様で、テーマ別のフォルダに置かれているファイルには注意
    (同じ名前で多数存在する)
  • パスは、自分のワークフォルダとUSB共通ファイル用フォルダ、関数用に MPLAB X-IDE、の3つでOKだった

The programmer could not be started: Could not acquire hardware tool communications resources:

あれやこれや書き込んで試したりしているうちに
上のメッセージが出て、ICD3 で書き込めなくなった。

Project Proparties
ICD3->Reset

で元に戻った。

秋月PIC18F4553仕様USB対応マイコンボード「MPLABを使った使用例1」を
デバッグモードで少し使ってみた。

2015年6月17日水曜日

PIC18F4553 USB対応マイコンボードを使ってみた

【MPLABを使った使用例2を試す】
本来の目的だった、購入した秋月電子の PIC18F4553 仕様USB対応マイコンボード[AE-USBPIC44]をパソコンからUSBで使う、を試した。
「MPLABを使った使用例1」が済んだ後、MPLAB X-IDE 導入の大きな回り道をしてしまったが
「MPLABを使った使用例2」の方は説明書に従い、一部異なる部分があったが、書き込みまでは難無く終わってしまった。
ただし、データ通信用のマイクロUSB-Bケーブルが届くまで待つことになったが。

【CDC Basis Demo の書き込み/MPLAB X-IDE v3.00】
  1. microchip_solutions_v2013-02-15 -> USB -> Device - CDC - Basic Demo -> Firmware
    の中から
    USB Device - CDC - Basic Demo -  C18 - PICDEM FSUSB.mcp
    をインポート(C18で)した
  2. Project Properties から
    PIC18F4550 -> PIC18F4553 に変更
    Compiler は C18
  3. ここまででは、ビルド成功しないので、以下は秋月の説明書に従う
  4. main.c の書き換えは、秋月の説明書と少し様子が違ったが
  5. void UserInit(void)に以下の接続ピンの定義を追加
        TRISEbits.TRISE0=1; //aki
        TRISEbits.TRISE1=1; //aki
        TRISEbits.TRISE2=0; //aki
        #define aki_sw1 PORTEbits.RE0 //aki
        #define aki_sw2 PORTEbits.RE1 //aki
        #define aki_LED PORTEbits.RE2 //aki
  6. void ProcessIO(void)に以下のスイッチとLEDオンオフ部分を追加
        if(aki_sw1 == 0)
    .............................
            aki_LED = 1;
        }
        else
        {
    >         stringPrinted = FALSE;
            aki_LED = 0;
        }
  7. インポートして書き込むHardwareProfile.hを指示通り変更
  8. リンカーの書き換えC:\Program Files (x86)\Microchip\MPLABX\v3.00\mpasmx\LKRから18f4553_g.lkrを追加してrm18f4550 - HID Bootload.lkrはリムーブする
  9. ここでビルド成功する
  10. 基板のJpをUSBバスパワーに切り替えてICD3を接続、書き込み成功

【PC側は】
C:\microchip_solutions_v2013-02-15\USB\Device - CDC - Basic Demo
\PC Software Example\VCsharp 2005\BasicCommunication\Csharp Simple CDC Demo\obj
\DebugCsharp Simple CDC Demo.exe を実行する

【PCとつないでみた】(2015/6/20)
  • USBケーブルを挿すとPC側は自動的にドライバがインストールされた
  • Csharp Simple CDC Demo.exe を起動
  • com ポートは 3 が表示された
  • connect ボタンを押すと、Connected と PC側に表示
  • 基板の sw2 を押すと、PC側に Botton Pressed と表示
  • PC側から 123 と 入力してSend Data ボタンを押すと 234 と返してくる
以上で動作確認終了。

2015年6月15日月曜日

MPLAB X-IDE, XC8 への移行(3)

【中規模のC18版プログラムを移植してみた】
実際は MPLAB X-IDE, XC8 への移行(2) よりこちらに先に手を付けたが、手におえず中断。移行(2)の成功後再度試した。しかし、うまくいかない。そこで、テンプレートに、本文を張り付けていく方法を試し、両者を比較した。

【テンプレートを使って移植】
これなら、ビルド成功から始まる。本文のコピペとビルドを繰り返す。全て貼り付け終わって、ビルドも成功した。両者の差分をとっても大きな違いは見つからず、リンカや環境の設定に不具合点がある事が確定。
ビルド不成功の原因は後述。

【C18 版のファイルとの相違点(修正した部分)】【XC8 v1.34】
マイクロチップ社の「移行ガイド」に出てくる分
  • ポインタストレージ修飾子 near, far, rom が不要
  • 関数バリアント strcpypgm2ram は、strcpy へ修正
  • eeprom はプラグマが不要
    推奨する方法に書き換えた
  • 割り込みもプラグマの指定、ベクタアドレス指定は不要
    関数名に void interrupt RRRRR(void) と interrrupt を付加
    (ただし動かして確かめたわけではない)
  • strcpypgm2ram -> strcpy
    ROM領域と区別しなくて済む
その他、定義済みと思われる
  • #include <stdbool.h>
    で true=1, false=0 と定義されている
    enum で TRUE, FALSE を定義していたが統一した
  • #define NULL 0 ・・・使ってはいけない
  • CLEAR も使ってはいけない
その他、ワーニング
  • itoa(ival, asc); -> itoa(asc, ival, 16);
    C18の場合と引数の数と並びが違うので修正が必要
  • warning: (765) degenerate unsigned comparison
    warning: (757) constant conditional branch
    のメッセージ。ゼロ以上かの分岐条件に使われる変数だからか? signed を明記
(標準の文字型は C18 ではsigned char XC8 ではunsigned char)
(XC8 User's Guide APPENDIIX A に関数ごとの修正個所が有り)

その他、テンプレートに倣った変更
  • ハードウェア定義の h ファイルに入れていたが、コンフィグは c ファイルに別に作成した
  • テンプレートに従って、クロック周波数の定義を追加した
  • 中身が空の関数は警告メッセージが出るので、すべてコメントアウトした
  • ヘッダファイルを細かく分ける必要は無いのでまとめた
(ディレイはライブラリファンクションがあり、Delaysをインクルードしなくてもいいが、今回はそのまま使った)

バグが見つかる(今更・・・)
  • warning: (758) constant conditional branch: possible use of "=" instead of "=="
  • おっしゃる通り "==" でないとならない、C18では見逃されていた
メモリ使用量(XC8はフリー版)
  • 2011年出荷時(C18ライセンス版)の記録 ROM: 4260byte. RAM: 365byte
  • ビルド後 Data 212byte, Memory 6247byte・・・・コードは1.47倍に増

【落とし穴1.ソースファイル名に使われていたかっこを取ってOK】
プロジェクトをオープンした時、Output の Project Loading Warning タブを開くと

Warning: Project "QQQQQ" refers to file "C:\...\QQQQQ(io).c" that contains spaces or odd characters in its name or its path.

と、オープンした時点で出ているではないか!
  • [ that contains spaces or odd characters ] は、フォーマットで解決済みと思い込んでいた
  • テンプレートから作成したプロジェクトの方には、かっこは使っていない
  • QQQQQ(io) -> QQQQQ_io に修正
【落とし穴2..P1ファイルのあるフォルダ内を全て消したらOK】
Output のエラーメッセージは、

No Rule to make Target....
  • Build フォルダに 更新されていないファイルが残ったままなので消してみた
  • <No Rule to make Target....>が消え、ビルド成功!

【インポートについて】
  • 手順
    New Project  -> Microchip Embedded -> Exiting MPLAB IDE v8 Project
    Next->.mcp ファイルを開く
    Select  Compiler, Select Project Name and Folder, Encording Shift-JIS を選択
  • インポート後フォーマットを適用して、余計な空白を消す
  • この時点で比較用コピーを残しておくとよい
【フォーマット】
  • Source -> Format または、ソース上で右クリック
  • { の配置が変わる(素直に従うことにした)
  • C18ではOKだった余計な空白が詰まるみたい
  • インデントも変わるが、必ずしもそれが正しい位置とは限らない
    一行で完結している while や、struct など
【テンプレートから始める】
  • File ->New Project -> Samples\Microchip Embedded\PIC18 C Template
  • これなら、必ずビルド成功から始められる・・・「急がば廻れ」
【フォント指定】
  • Tools -> Option -> Font & Colors
  • 最初に日本語フォントに設定しておくこと
  • テンプレートから作成したプロジェクトは、これで失敗
    インポートした方は読み込み時に指定したのでOK
【全体の使用感】
  • Microchip 固有の strpgm2ram のような関数が無くなって、より標準へ近づいた
  • コンフィギュレーションの発生機能が付いた(資料と見比べなくて済む)
  • IDEの機能も増え、使い勝手も向上している(はず)
  • メニュー構成や字句が変わっていて戸惑う
  • デバッグ作業はしていないが、ワンステップ上がった気にさせてくれる

2015年6月11日木曜日

MPLAB X-IDE, XC8 への移行(2)

【C18版を移植してみた】
いきなり他人のプログラムを修正しようとしても、どこから手を付けたらいいのか分からないので、完成品のプログラムの中から規模の小さいものを移植してみることにした。
  1. プロジェクト作成から、既存プログラムの読み込み
    File -> Inport -> MPLAB IDE v8 Project -> フォルダを指定
    これで、指定したプロジェクトフォルダに、XC8出力用のフォルダが作成される
  2. インクルードファイルの置かれたフォルダを設定する
    File -> Project Properties -> XC8 Compiler -> Include directories
    C:\Program Files (X86)\Microchip\xc8\v1.34\Include を指定
  3. <p18fxxxx.h>でインクルードしているデバイス指定を xc.h に変更する
    【例】#include <p18f2321.h> を #include <xc.h>
  4. ビルドをかけるとエラーが出てくる
    ここで、フォーマット変換をかけて余計な空白を削除しておいたほうがいい
    (後で修正点比較用に、この時点でのコピーを保存しておくとよい)
    (フォントを日本語表示できるものにしておくこと)
  5. プラグマを使ってある部分を修正
  6. rom 修飾子が不要なので削除する(文字列定数に多用。他に、near、far、も)
作業としては、主に宣言や定義部分の修正が必要だが、関数[ srrcpypgm2ram ]の様に、ROM エリア絡みは関数名を変更する必要有り。

2009年出荷時(C18)の記録
  • ROM:1190byte. RAM:284byte 
だったものが、ビルド後
  • Data 30byte, Memory 1486byte
無料版コンパイラだからなのか、生成されたバイナリコードは1.25倍になった。

2015年6月8日月曜日

MPLAB X-IDE, XC8 への移行

パソコンからリレーをオンオフしたくなる案件がでたので調べてみた。USBを使いたい。
  1. FA用のUSBインターフェイスのIOユニットでは数万円してしまう
  2. 基板なら数千円
  3. インストール済みのPICなら千円程度
案件の方は受注はならなかったが、上の 3. の場合だと他にも使い道があるので、これを機会に再度(前回はUSBメモリ)試してみることにした。安さにつられて秋月電子の PIC18F4553 仕様USB対応マイコンボード[AE-USBPIC44]を購入した。
C Compiler C18 の再インストール以来、久しぶり。これを機会に X-IDE にしなければ、となってMPLAB 8.92 と共存させようとするも
  • Languaeg ToolSuite に Microchip MPLAB XC8 が表示されない
アンインストール、インストールを繰り返してもダメで、こだわる必要がないと思い始め、
  • MPLAB X-IDE へ移ることにした
紹介されている手順に従って、サンプルプログラム「MPLABを使った使用例1」は、「SAMPLE.c」の内容をコピーするだけで無事すんなりと、書き込み成功し完成した。
  • 書き込み器が、ICD3 なので変換アダプタが必要となり、ここに手間取った(右写真)
  • 秋月電子通商のキット、[AE-USBPIC44] は、何もインストールされているわけではないのでプログラムが必須
  • 「使用例1」は、MPLAB X と XC8 Compiler の組み合わせのソフト例(PIC18F4553用)
  • 完成すると、sw1 または sw2 を押し続けるとLEDの点滅周期が変わる