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

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

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

[第78回]

●PIC18F14K50のテストプログラム

お待たせをいたしました。
本日はようやくPIC18F14K50のプログラムの説明に入ります。
PIC18F2550のプログラム([第75回])とほぼ同じ動作をするプログラムをPIC18F14K50用に書いてテストをしてみました。
あ。CPUクロックは異なります。
まずは内部発振クロックの16MHzを試してみました。

;;;pic p18f14k50 test program
;f14k50test1
;10/5/21
;
;
        #include<p18f14k50.inc>
;cpuclock=16MHz internal oscillator
;
        CONFIG FOSC = IRCCLKOUT,WDTEN=OFF,LVP=OFF;not WDT          
;
        org 00
        movlw 77;clock=16MHz
        movwf OSCCON
        clrf ANSEL;PORTA,PORTC are digital
        clrf ANSELH;PORTB,PORTC are digital
        clrf TRISA;porta=out
        clrf TRISB;portb=out
        clrf TRISC;portc=out
;
        movlw 1
loop
        xorwf PORTC
        goto loop
;
        end

PIC18F2550はI/Oが多いので、その点は気楽に使えたのですが、PIC18F14K50はI/Oの数が少なくて、おまけにそのI/O端子も他の複数の機能と多重に共用しているために、自由度がかなり小さくなっています。
PIC16FナンバーではPORTAの一部とPORTBがI/Oとして使えるものが多かったのですが、PIC18F14K50ではPORTAだけではなくてPORTBも8ビットは揃ってなくて半端しかありません。特ににPORTAはほとんど使えません。
PIC18F14K50で8ビット揃っているのはPORTCだけです。
PIC18F14K50の端子図は[第72回]でお見せしましたが、下に再掲いたします。


PIC18F2550ではPORTAのビット0からパルス出力を行いましたが、上記の理由から、PIC18F14K50ではPORTCのビット0からパルス出力を行いました。

前にも書いたことですが、PICのCONFIGの書き方がもうメチャメチャ不統一です。
なんでこんなことになるのでしょうか?

今回は内蔵発振回路を使い、CPUクロックの1/4の周波数のクロックをCLKOUT端子から出力する設定です。
CONFIGの指定は、FOSC = IRCCLKOUTです。
でも同じことをPIC18F2550では、FOSC =INTOSC_ECと書きます。
ねえ。メチャクチャですよね。

そうそう。PIC18F2550では、ウォッチドッグタイマーをOFFにする設定はWDT=OFFでしたが、PIC18F14K50ではWDTEN=OFFと書かなければエラーになってしまいます。
もー、いい加減にしてほしい、と言いたくなってきます。

内蔵発振回路のクロック周波数は、OSCCONレジスタで行います。

[出典]Microchip社PIC18F1xK50DataSheet

今回は16MHzクロックを選択しますから、IRCF<2:0>=111です。HFIOFS=1、SCS<1:0>=1xにします。

PIC18F14K50のI/O端子で、アナログ入力(ADコンバータ入力)と共用になっているものは、POWER ON後はアナログ入力が選択されます。
ですからそのままではI/Oポートを使うことができません。
I/O端子をデジタルで使うかアナログで使うかの設定はANSELレジスタ、ANSELHレジスタで行います。


[出典]Microchip社PIC18F1xK50DataSheet


[出典]Microchip社PIC18F1xK50DataSheet

これはPIC18F2550ではADCON1レジスタで設定していました。
ほんとにもうっ、って言いたくなりますねっ。

●PIC18F14K50のテスト回路図です


PIC18F2550のときと同じで、必要なパーツは抵抗とコンデンサが各1個だけですから実に簡単です。

●ジャノ目基板に組み付けました

なにしろ抵抗とコンデンサが各1個ですからいとも簡単にできてしまいます。

20pinのIC1個分のスペースさえあればいいので、以前にPIC18F2550のテストに使った基板の端っこの空いているところを利用してしまいました。
右端にタテ向きになっているのがPIC18F14K50です。
真中の28pinソケットはPIC18F2550用です。

こちらは基板の裏側です。


●RC0からの出力波形です

プログラムを実行中のRC0からの出力波形です。


CPUクロックは内蔵発振の16MHzです。
上側(CH1)はCLKOUT(pin3)から出力されているCPUクロックの1/4のクロック(4MHz)です。
下側(CH2)はプログラムによってトグル出力されたPORTCのビット0の波形です。
PORTCのビット0は3マシンクロックごとに1と0が交互に出力されます。
CPUクロックが16MHzということは、1クロックが1/16μsecということです。
PICの1マシンクロックは4CPUクロックですから、1/4μsecです。
そしてその3マシンクロックは、3/4μsecになります。
750nsecです。
計算通りの出力が得られています。
CPUをつくろう!第507回(2010.5.24upload)を再編集

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

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