ようこそNICのホームページへ(なが〜い試運転中 from 2001/5/12)   
HP パソコン 健康 落語 海外 思うまま 電子工作


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フォルダとファイル構成です

 ページ上部に移動します

1.LEDを点滅させる

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 コメントアウトした



 ページ上部に移動します



2.早速コンパイルとリンクしてみる

 ビルドしてみるとリンカーのところでエラーがでる。  どうもよくわからない。 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
などのように直した。


 ページ上部に移動します

3.PICに書き込んでみる

秋月電子の18F2550ボードに書き込んでみる 道具は1年前に買ったPICKit3を使った。


書き込み用に作ったボードに18F2550ボードを載せ、PICKit3に繋ぎコードをUSB端子につなぐ。
18F2550ボードはまだ電源が通じていない。
Programmerメニュー→ Select Programmer→PICkit3を選択 ランプが2つ点灯

MPLABIDE V8.63を立ち上げると自動的にPICKit3を認識し、 PICKit3の3つ目のランプが点灯。

プログラムmcpをロードして、ビルドする。
programmer → Settings → Powerタブ → Power target circuit from PICKit3をチェック  → OK
これで書き込み対象の18F2550ボードに電源が入る。
後は、Programmer → Programで書き込み完了。


以下はそのときのMPLAB IDEの画面です。

MPLAB IDEで使うファイルの構成です
PICKit3をUSB端子につなぐ。
programmer → Settings
programmer → Settingsを実行するとこの画面が出ます
Powerタブ
Power target circuit from PICKit3をチェック
OKボタンを押すとこの画面、再びOKボタンを押す
ここで電源をOFFにしてみます
Power target circuit from PICKit3をチェックを外す
再び電源をONにした後でプログラムを書き込みます
Programmer → Program

プログラムが書き込まれました
電源をOFFにして、USBコードを抜くとこの画面になります
LEDを付けてブレッドボードの実験です
18F2550の11,12,13番ピン(RC0〜RC2)に接続です
うまくプログラムが書き込めました。


 ページ上部に移動します

4.サンプルプログラムを走らせてみる LED点滅と文字出力     putrsUSBUSART() 使用

     サンプルプログラムは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チップとは何が違うのだろう。



 ページ上部に移動します



5.サンプルプログラムを走らせてみる キーボードからの入力に対して文字を出力     putrsUSBUSART() 使用(ROM領域)



電子工作のテスト工場さんのページからコピーしたソースです。 キーボードからの入力に対して特定のLEDを点灯、消灯させ、かつ文字を出力する プログラム。 うまくいきました。


サンプルプログラムを修正したソースを載せます。
user−n1−ok.c


 ページ上部に移動します

6.サンプルプログラムを走らせてみる   キーボードからの入力に対応したセンサーのAD変換を使うことと結果出力  putsUSBUSART() 使用(RAM領域)



紆余曲折、試行錯誤がありました。うまくいった結果を載せます。 ファイル名の数字をみても試行回数が見て取れます。

アナログ温度センサーLM35DZを3個付けた基盤を作り実験です
下に見えるブレッドボードからはみ出した基盤が温度センサーです。
接続は18F2550の2,3,4番ピン(AN0〜AN2)に接続しています。
シリアルポートにアクセスしてAD変換値を読み取った時の表示です。 0,1,2を入れるとそれに対応した温度センサーの値が返ってきます。 それ以外の文字を入れるとinput errorを返します。
サンプルプログラムを修正したソースを載せます。
user−n12−ok.c


プログラムの上部はほとんどコメントです。 UserInit()とProcessIO()が修正部分です。


気づいた細かな点はすこしづつ追記する予定です。



 ページ上部に移動します



7.サンプルプログラムを走らせてみる      デジタル温度センサー LM−74−CIM5を購入し SPIを試す     SPI関数を利用(2011/12/30) 



デジタル温度センサーLM74−CIM5は秋月電子には無いので HPで検索して、マルツから購入。一個283円(当然送料は別)でした。 一方でSOP8(1.27mm)からDIPへの変換基板は秋月電子から購入 9枚セットで100円でした。

半田付けができるか迷いましたが、やってみると結構できました。 基盤のPIN1つにハンダを盛り付け、これを最初に仮固定して ハンダ付けしました。

画面左の小さな基盤がデジタル温度センサーのLM74−CIM5です。 V+とGND以外は3本の配線です。接続は以下のとおり
LM74ピン1(SI/O)2(SC)4(GND)7(CS)8(V+)
18F2550ピン 21(SDI)22(SCK)23(RB2)


シリアルポートにアクセスした結果です。25℃程度が表示されています。
最初の0.0は配線間違いでセンサーに電源が入っていなかった状態です。
29℃は指でセンサーを触り、温度を上げた状態です。


サンプルプログラムを修正したソースを載せます。
user−nt1−ok.c




 ページ上部に移動します

電子工作へ     HomePage