PIC18F2550をUSBで使う実験開始 2011/11/30 --> USBがうまく使えない Last update:2014/12/18 Build:2011/12/29
電子工作のテスト工場さんのページや
PICで遊ぶ電子工作さんのページや
バイクサロンさんのページ
などを見ていてUSBが使えるPIC18F2550を使いたいと思っていた。
一年前から18F2550とPICKit3を購入している。
実験をしたいのだが、フレームワークのバージョン1.3が見つからない。
マイクロチップのHPから落ちたようだ。V2.2とか2010_08_04バージョンなどをダウンロードしてみたが 複雑過ぎて手つかず。一年が過ぎてしまった。 最近になって 趣味のブログさんのページ を見つけ、「AN956を探してダウンロードすると、V1.2が入手できます。」とあり、AN956でググってみると ありました!! V1.2をダウンロードできました。 (2014/12/18 追記) リンクが切れてしまいました。1.2のダウンロードページがありません。(2014/12/18 追記ここまで)
以下はMCHPFSUSB1.2を使うことが前提です。 参考までにフレームワーク1.2のCDCフォルダとファイル構成です ページ上部に移動します MCHPFSUSB1.2のcdcフォルダーをコピーして使う。 修正するのは以下の3つのファイル main.c io_cfg.h autofiles\usbcfg.h io_cfg.hのなかに#elif defined(YOUR_BOARD)・・・があり、この部分のコメントアウトを外し自分で定義するか、 または、18F4550の定義を利用して修正するかである。 定義する場合は18F2550用に main.cのヘッダの読み込みのあとへ以下を追加。これは18F4550と同じであった。 /*** Configuration *******/ #pragma config FOSC = HSPLL_HS #pragma config WDT = OFF #pragma config PLLDIV = 5 #pragma config CPUDIV = OSC1_PLL2 #pragma config USBDIV = 2 #pragma config PWRT = ON #pragma config BOR = ON #pragma config BORV = 3 #pragma config LVP = OFF #pragma config VREGEN = ON #pragma config MCLRE = ON #pragma config PBADEN = OFF 次にio_cfg.hでポートPINを変更する。18F4550がベースなので、LED表示がDポートになっている。 18F2550ではCポートに変更する。 /** L E D ***********************************************************/ //#define mInitAllLEDs() LATD &= 0xF0; TRISD &= 0xF0; // 18F4550用 #define mInitAllLEDs() LATC &= 0xF0; TRISC &= 0xF0; // 18F2550用 //#define mLED_1 LATDbits.LATD0 // PIC 18F4550用 //#define mLED_2 LATDbits.LATD1 //#define mLED_3 LATDbits.LATD2 //#define mLED_4 LATDbits.LATD3 #define mLED_1 LATCbits.LATC0 // 18F2550用に修正 #define mLED_2 LATCbits.LATC1 #define mLED_3 LATCbits.LATC2 //#define mLED_4 LATCbits.LATC3 // 18F2550用はLATC3は無い。 次に、autofiles\usbcfg.hの中のUSB電源と外部電源(セルフパワー)の有無のチェックをコメントアウトする。 これをしないと、RA1とRA2の10kΩによるプルアップが必要とのこと。 /* Uncomment only the hardware platform that you are using*/ #define PIC18F4550_PICDEM_FS_USB // この実験ボードを使うことが前提、しかしこれを 18F2550用にアレンジ //#define PIC18F87J50_FS_USB_PIM //#define YOUR_BOARD // 自分で定義する場合はこれを使う #if defined(PIC18F4550_PICDEM_FS_USB) // #define USE_SELF_POWER_SENSE_IO // 2011/12/3 コメントアウトした // #define USE_USB_BUS_SENSE_IO // 2011/12/3 コメントアウトした ページ上部に移動します ビルドしてみるとリンカーのところでエラーがでる。 どうもよくわからない。 user.cはさわっていない。リンカーが対応していないようだ。エラーメッセージを見ると、 リンカーがrm18f4550.lkrとなっている。 18f2550用のリンカーrm18f2550.lkrを探す。 mcc18 V3.38では18f2550_g.lkrとなっていた。 これをrm18f2550.lkrとリネームする。 c:\mpchip\cdc\にコピーする それでもうまくいかない MCHPUSB.mcpを開くとリンカーのところが file_021=rm18f4550.lkr となっておりこれを file_021=rm18f2550.lkr に変更した。 これで18f2550用のリンカーが動くようになった。 これでデモファイルの18f2550版がビルドできた。 いままでcドライブになっていたのでmドライブにコピーし、 MCHPUSB.mcpの中のファイルパスを修正した。 例 dir_bin=M:\data\pic\pickit3\mplabide\MCHPFSUSB1.2\fw\CDC\_output などのように直した。 ページ上部に移動します 秋月電子の18F2550ボードに書き込んでみる 道具は1年前に買ったPICKit3を使った。 ページ上部に移動します サンプルプログラムはLEDが自動で交互に点滅することと、ボタンを押せば、 あらかじめ用意された文がUSBを通して端末に返される user.cにexcercise_01と02を入れて再度ビルド書き込み。 ブレッドボードにLEDとスイッチを2つづつ配置して実験。 ウィンドウズに接続すると、ドライバーを求めてくるので、 cdc¥infフォルダーを指定すると、自動的に認識した。 スイッチを押すと、文字が返される。 また、LEDは自動的に交互に点滅している。 うまくいった。 サンプルプログラムを修正したソースを載せます。 main.c ¥user¥user.c io_cfg.h ¥autofiles¥usbcfg.h です。 io_cfg.hにportb.rb4 rb5をsw2,3として定義している。 io.cfg.hで入出力PINなどを定義しているようだ。 CDCTxService()が出ているが、どこに定義されているのかわからない。 調べると、fw\cdc\system\sub\class\cdc\cdc.h で出てきた 実際は fw\cdc\system\sub\class\cdc\cdc.c で定義されていた。 汎用(いろいろなチップでも使えるよう)にしようと言うことだろうが、 定義が多すぎてどこで定義されているのか さっぱりわからない。includeが多すぎる。 usbでusartを使いたいだけなので usbをcdcクラスで使える関数のみ定義してくれた方がわかりやすいと思うのだが・・・ MCHPFSUSBバージョン1.2のデモ版の 18F2550用に修正する方法に2つの方法がある。 1.18F4550のデモーボードを一部修正して利用する方法 2.YOUR_BOARDを選択して必要な記述を追加する方法。 18F4550の記述がほとんどそのまま使えることから 最初は1.の方法が簡単と思える。 なれてくれば、2.の方法 もっとなれてくれば、必要最小限の記述を自分ですることだろう。 ソースの変更は前述の3つ そのほかに、デバイスの変更 18F4550→18F2550 リンカーの変更 rm18f4550 →rm18f2550 rm18f2550が無かったので、C18コンパイラーのリンカーの中に (L:\Program files\Microchip\mplabc18\v3.38\bin\LKR\の中) 18f2550_g.lkrがあり これをリネームした。 別にリネームする必要は無かったようだ。 リンカーを調べたときいろいろなチップがあることを知った。 18f25j50_g.lkrなどと言う紛らわしいものもあった。 18f2550チップと18f25j50チップとは何が違うのだろう。 ページ上部に移動します
サンプルプログラムを修正したソースを載せます。 user−n1−ok.c ページ上部に移動します
紆余曲折、試行錯誤がありました。うまくいった結果を載せます。 ファイル名の数字をみても試行回数が見て取れます。
user−n12−ok.c プログラムの上部はほとんどコメントです。 UserInit()とProcessIO()が修正部分です。 気づいた細かな点はすこしづつ追記する予定です。 ページ上部に移動します
デジタル温度センサーLM74−CIM5は秋月電子には無いので HPで検索して、マルツから購入。一個283円(当然送料は別)でした。 一方でSOP8(1.27mm)からDIPへの変換基板は秋月電子から購入 9枚セットで100円でした。 半田付けができるか迷いましたが、やってみると結構できました。 基盤のPIN1つにハンダを盛り付け、これを最初に仮固定して ハンダ付けしました。
サンプルプログラムを修正したソースを載せます。 user−nt1−ok.c ページ上部に移動します |