mcc18

2009-08  PIC日記  PIC18F2550 PIC18F4550 HIDmon-2550 HIDmon-14K50 sdcc


MicroChip C18 Compilerを使いこなす

  • MicroChip C18 Compiler は評価版と称して事実上無償配布されています。*1*2*3*4*5
  • MicroChip が用意しているUSBアプリケーションフレームワークは、基本的に C18 Compilerでコンパイルできるように記述されています。
  • しかし、普通のMakeが通りません。Makefileも整備されていないようです。

https://raw.github.com/iruka-/ATMEL_AVR/master/web/jpg/PIC/14k50.jpg

  • MicroChip が用意しているUSBアプリケーションフレームワークをsdccに移植するのは茨の道です。MicroChipのバージョンアップに追いつけません。
  • 現状、sdccはCコンパイラとしての基本性能に問題があります。もちろんC18にも問題はあります。
    • 結局、どちらがましか、という議論になると、C18のほうがましであるという結論に達しました。

Audinさんのサイトのまとめ記事が非常に参考になります。


目次


とりあえず、Make環境を整備。

■ ビルド環境の構築の手引き

(1)

まず、WinAVR(GNU Make) をインストールします。

 http://sourceforge.net/projects/winavr/

インストール先は、通常なら C:\WinAVR\ になります。

WinAVR/utils/bin には、make.exe 以外にもunixシェルでよく使用する ls や cat , rm などといったお馴染みのツールのWin32バイナリーが含まれているので、非常に便利です。

(2)

次に、mcc18(Compiler)をインストールします。Standard-Eval VersionでOKです。

 http://www.microchip.com/

URLはその都度変わると思いますが、ここです。

インストール先は、通常なら C:\mcc18\ になります。

  • ---> C:\Microchip\mplabc18\v3.47\ あたりになります。

(3)

続いて、MicroChipのサイトから、下記USBアプリケーションライブラリ、

 MicrochipApplicationLibrariesv2009-07-10.zip

もしくはそれより新しいバージョンを入手してください。

URLはその都度変わると思いますが、ここです。

準備が出来たら、パスを通します。

 ・パスの通し方:
   PATH %PATH%;C:\mcc18\bin;C:\mcc18\mpasm;C:\WinAVR\utils\bin;
               ~~~~~~~~~    ~~~~~~~~ 下線部はmcc18のインストール先に応じて読み替えてください.

適当なバッチファイルを用意して呼び出すか、あるいはWindowsのシステムプロパティ

 -->詳細-->環境変数-->ユーザーの環境変数

PATH に C:\mcc18\bin;C:\mcc18\mpasm;C:\WinAVR\utils\bin を記述します。

インストール時にパスを通してしまった場合は、上記確認のみで結構です。

ダウンロード

  • 内容は千秋ゼミさんのサイトに登録されているHIDBoot-14k50.zip とほぼ同じです。(千秋さん、ありがとうございました。)
  • Makefileを少し変更して汎用性を持たせてあります。
  • ReadMe.txtドキュメントを追加しました。

これでやっとC18が使えるようになります

  • 今まではC18でのビルド方法が全く不明(GUIは苦手です)だったのでどうすることも出来ませんでした。






CDC Serial Emulatorをビルドできるようにしたい。

出来ました。

ダウンロード

  • PIC 18F14K50 をUSB-シリアル変換チップとして使用するためのファームウェアです。
  • そのまま外部PICライターで焼いてよし、HIDmonブートローダーで書き込んでもOKです。
  • コードはMicroChipオリジナルのままなので、19200以上のボーレートでの使用に若干不安があります。(未評価です。どなたか評価してみてください)
  • USBのポーリングとRxDデータのポーリングを交互に呼んでいるだけの構造なので、USBのパケット処理中にRxDデータが2バイト以上来るとハードウェアのUSART FIFOが溢れます。
  • 19200bpsは1秒に約2000文字のレートでシリアルデータが流れますので、2文字時間=1mSすなわちUSBの1フレーム相当になります。USBバルク転送が1フレームに1回は出来るはずなので、19200bpsで溢れることはないでしょう。
  • しかし、その上の57600bpsでは2文字時間=0.3mSになるので、怪しいことになります。
  • RTS/CTS/DTR/DSRなどの端子のサポートがありません。
    • よく調べたらありました。こいつです。この行のコメントアウトを取ります。
      usb_config.h:130:#define USB_CDC_SUPPORT_HARDWARE_FLOW_CONTROL
    • DTRはRB6に割り当てられていました。
    • ANSELHのゼロクリアは行われていました。
    • UART_DTRの制御コードは書かれていました。
    • しかし、RB6はHi-Zのままでした。
    • UART_TRISDTRとUART_TRISRTSを0(出力)にセットするコードがどこにもありません。
  • つまり、ハードウェア・フロー制御のサポートもありません。(接続先のAVRチップなどにもないので、不要と言えば不要です。)
  • あるにはあるのですが、MicroChipのソースのままでは機能しません。
    usb_config.h:130:#define USB_CDC_SUPPORT_HARDWARE_FLOW_CONTROL
  • を有効にしても、バグにより機能しません。
  • CTS,DSRは見てないような・・・。






-*-勝手に改蔵-*-勝手に改蔵-*-勝手に改蔵-*-

Serial Emulator : DTR/RTS出力可能版 

ダウンロード

DTR信号をRB6端子に出力します。




PICのボーレート計算式

              48,000,000            12,000,000
baud = ------------------------- = ------------
        4 x ([SPBRG:SPBRGH] + 1)    (UBRR + 1)

https://raw.github.com/iruka-/ATMEL_AVR/master/web/jpg/PIC/baud.png

  • つまり、115200bpsでも分周レジスタは103であり、
  • 230kbps,460kbps,920kbpsくらいまでは楽勝のように見える。
  • UBRR(と勝手に命名)を11にしたときに丁度1Mbps,5で2Mbps,1で6Mbps(!)
  • まだまだいけるじゃん。
  • しかしSerialEmulatorのファームは115200以上はエラー扱いにしている。
  • (つまり115200まではこのファームでいけると言うのか???)






Bootloader-Tips

USB付きPIC18F用のBootLoaderは、今のところ4種類程度存在します。

  • (1)MicroChip純正Bootloader(C18)
  • (2)MicroChip純正HID Bootloader(C18)
  • (3)diolan社がGPLで公開しているHID Bootloader(MPASM)
  • (4)このサイトで公開している HIDmon-2550/HIDmon-14K50(MPASM)

この4者は(残念ながら)互いにプロトコルの互換性がありません。

  • (1)のみ、Windowsへのドライバー組み込みが必要です。(唯一、バルク転送を使用します)
    • (1)以外は、HIDデバイスなのでWindowsへのドライバー組み込み不要です。
  • (2)のみ、ブートローダーのサイズが4kBになります。他は2kBに収まっています。
  • (3)はPIC-18F4455のみサポートで14K50などには対応していません。
    • また、転送プロトコルを暗号化する機能があります
  • (4)は18F2550/18F4550/18F14K50の3種類をサポートしています。
    • bootloader機能以外にPIC BIOS(printデバッグ)機能や、HIDmon(汎用USB-I/O)としても使用できます。






Bootloader-Tips2

アプリを書くときは当然エントリーアドレスと割り込みベクターを使用すると思いますが、 以下のように工夫することで、ブートローダー使用と単独書き込み実行の両対応が可能です。

  • エントリー
    ORG 0
    GOTO 0x800
  • 割り込み
    ORG  8
    GOTO 0x808
    ORG  0x18
    GOTO 0x818
  • 実際のプログラムコード
    0800: プログラムエントリー番地
    0808: 割り込み処理0008のエントリー
    0818: 割り込み処理0018のエントリー
     ・・・・
    3fff: 最大ここまで(18F14k50).
  • ブートローダーは0x0000〜0x800に常駐しています。
  • ブートローダーがアプリを書き込むときは自分自身と重なるアドレスのデータを無視します。
  • PICkit2などの外部ライターで書き込むときは全領域を書き込んでくれます。

実際には、割り込み発生時に1命令だけ無駄なジャンプが発生しますが、そのかわりに公開するHEXファイル は1種類で良いので混乱が少ないです。

ブートローダー(2)を使用する場合のみ、プログラムコード開始番地を0x1000〜に移動する必要があります。






番外編: mcc18をLinuxで動かす。

あまりお勧めできない方法ですが・・・。






参考リンク

(PICマイコンの小部屋)USB開発環境の構築

電気実験室


予定

  • 汎用libusbデバイスのフレームワークもビルドしたい。

*1 これは適切な表現ではありません。
*2 Lite版は無償無期限で使用できます。評価版は60日だけ使用できます。期限の切れた評価版はLite版と同等の機能に格下げになります。
*3 評価版はVerup版が出るたびに古いものをアン・インストールして、インストールしなおすことが出来るので、改版のタイミングから2ヶ月は最適化ありの状態で使用できるといった具合です。
*4 Lite版と、期限の切れた評価版は最適化なしになりコードサイズが2割以上大きくなりますが、
*5 それ以外の制限は無く普通に使用できます。そういった意味では無償配布です。