PICでUSBを!(知識ゼロからのスタートです)
PIC18F14K50のUSB機能を100%自前のソフトで制御する試みです。しかもアセンブラで!
当記事は2009年12月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 2011.7.12

前へ
次へ
目次へ戻る
ホームページトップへ戻る
☆PIC18F14K50

PIC18F2550では大きすぎて、計画中のTK80互換マイコンボードND80ZVには組み込めそうにないことがわかりました。
USB機能内蔵のPICにはPIC18F4550、PIC18F2550のほかに20pinのPIC18F14K50があることはちょっと前から知っていました。しかしUSBに関する部分がPIC18F2550とはかなり異なっているようです。
案の定しっかり泥沼にはまってしまいました。

[第76回]

●PIC18F2550テスト回路図です

前回は時間がなくなってしまいましたので、回路図をお見せすることができませんでした。
回路図と言いましてもたったこれだけの簡単なものです。

[第59回]で使った回路に、MCLRのプルアップ抵抗と、4MHzクリスタルを追加しただけです。

●CPUクロックを変更してテストしてみました(32MHz)

前回はCPUクロックを48MHzに設定して動作テストを行いました。
前回([第75回])説明しましたようにPIC18F2550は、PLL回路を使う場合は、USBを使う、使わないにかかわらず、CONFIGの設定によって、16、24、32、48MHzのいずれかのCPUクロックを選択することになります。
なおこの場合には外部から供給するクロックか、または外付けクリスタルの値は、4、8、12、16、20、24MHzに限られます。
また外部から供給する場合に限って48MHzも与えることができます。
参考までに、前回テストした48MHz以外のクロックも設定してテストをしてみました。

まず最初は32MHzです。
前回のプログラムから変更するのは、CONFIGの部分だけですから、その部分だけをお見せすることにいたします。
いまのところ簡単な動作テストをするだけで、まだUSBは使いませんから、USBのためのクロックの設定はなくても構いません。
そこで前回のプログラムのCONFIGの設定からUSBDIV=2は外しました(USBを使わないなら、この設定はあっても無くても動作に変わりはありません)。

;
	CONFIG PLLDIV=1,CPUDIV=OSC2_PLL3,FOSC = XTPLL_XT,WDT=OFF,LVP=OFF          
;

なお、USBを使わないのですから、FOSC=XTPLLにしてもよいはずではないか、と思うのですが、FOSC=XTPLLにすると、アセンブルエラーが表示されてしまいます。
USBは使わないけれども、USBでXTを使う、という設定部分を外すことはできません(後ろの_XTがその部分です)。

CPUクロックを変更するために、書き換えたのは、CPUDIVです。
前回は、CPUDIV=OSC1_OSC2でした。この設定ではPLL回路から出力される96MHzの1/2の48MHzがCPUクロックになります。
前回もお見せしましたが、P18f2550.incのその設定に関する部分を参考までに下に再掲いたします。

;   CPU System Clock Postscaler:
;     CPUDIV = OSC1_PLL2   [OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]
;     CPUDIV = OSC2_PLL3   [OSC1/OSC2 Src: /2][96 MHz PLL Src: /3]
;     CPUDIV = OSC3_PLL4   [OSC1/OSC2 Src: /3][96 MHz PLL Src: /4]
;     CPUDIV = OSC4_PLL6   [OSC1/OSC2 Src: /4][96 MHz PLL Src: /6]

今回は、そこをCPUDIV=OSC2_OSC3にしましたから、96MHz/3=32MHzがCPUクロックになります。

下はそのように変更したテストプログラムを実行中のRA0(PORTAのビット0)からの出力波形です。


前回も説明しましたが、PIC18F2550は、CPUクロックの4クロック分が、命令の1マシンクロックになります。
PICの命令は1または2マシンクロックで実行されます。
今回はCPUクロックが32MHzになったはずですから、1CPUクロックは1/32μsecです。
1マシンクロックはその4倍ですから1/8μsecです。
今回のプログラムでは、RA0の出力は3マシンクロックごとに1と0が交互に反転して出力されます。
するとHまたはLの期間は、3/8=0.375μsecになります。
375nsecです。
計算通りの出力結果になっています。

●CPUクロックを変更してテストしてみました(24MHz)

同様にして、今度は、CONFIGのCPUDIVの設定を、CPUDIV=OSC3_OSC4に変更しました。

;
	CONFIG PLLDIV=1,CPUDIV=OSC3_PLL4,FOSC = XTPLL_XT,WDT=OFF,LVP=OFF          
;

96MHz/4=24MHzがCPUクロックになります。

下はそのように変更したテストプログラムを実行中のRA0(PORTAのビット0)からの出力波形です。


今回はCPUクロックが24MHzになったはずですから、1CPUクロックは1/24μsecです。
1マシンクロックはその4倍ですから1/6μsecです。
RA0の出力は3マシンクロックごとに1と0が交互に反転して出力されますから、HまたはLの期間は、3/6=0.5μsecになります。
今回も計算通りの出力結果になりました。

●CPUクロックを変更してテストしてみました(16MHz)

今度は、CPUDIV=OSC4_OSC6に変更しました。

;
	CONFIG PLLDIV=1,CPUDIV=OSC4_PLL6,FOSC = XTPLL_XT,WDT=OFF,LVP=OFF          
;

96MHz/6=16MHzがCPUクロックになります。

下はそのように変更したテストプログラムを実行中のRA0(PORTAのビット0)からの出力波形です。


CPUクロックは16MHzになったはずですから、1CPUクロックは1/16μsecです。
1マシンクロックはその4倍ですから1/4μsecです。
RA0の出力は3マシンクロックごとに1と0が交互に反転して出力されますから、HまたはLの期間は、3/4=0.75μsecになります。
今回も計算通りの出力結果になりました。
CPUをつくろう!第503回(2010.5.20upload)を再編集

PICでUSBを![第76回]
2011.7.12upload

前へ
次へ
目次へ戻る
ホームページトップへ戻る