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

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

今までの説明はPIC18F4550を使って行なってきましたが、PIC18F4550は40pinのICでサイズが大きすぎます。ピン数が多いだけにI/Oポートも十分あるのですが、USBインターフェースとしての用途に限定すれば、そんなに沢山のI/Oは必要ありません。
そこでこれからはPIC18F2550を使って説明をしていくことにしました。

[第62回]

●CONFIGの続きです

今回は前回に続いて、CONFIGについて説明をいたします。
前回はPIC16F88のCONFIGの設定例もお見せしました。

        __CONFIG _CONFIG1,_CP_OFF & _LVP_OFF & _WDT_OFF & _INTRC_IO
        __CONFIG _CONFIG2,

PIC16F88はCONFIGレジスタが1個ではなくて、CONFIG1、CONFIG2の2個あるために、このようなちょいと面倒な書式になってしまったのでしょう。 すると、同じ書式でやるとなると、PIC18F2550では大変なことになってしまいます。
PIC16F88はCONFIGレジスタが2個だけだったので、そのような書式でも、まあいいか、と思えますけれど、PIC18F2550のCONFIGレジスタは、前回もお見せしましたように、こんなにたくさんあるのです。

; The following is an assignment of address values for all of the
; configuration registers for the purpose of table reads
_CONFIG1L        EQU  H'300000'
_CONFIG1H        EQU  H'300001'
_CONFIG2L        EQU  H'300002'
_CONFIG2H        EQU  H'300003'
_CONFIG3H        EQU  H'300005'
_CONFIG4L        EQU  H'300006'
_CONFIG5L        EQU  H'300008'
_CONFIG5H        EQU  H'300009'
_CONFIG6L        EQU  H'30000A'
_CONFIG6H        EQU  H'30000B'
_CONFIG7L        EQU  H'30000C'
_CONFIG7H        EQU  H'30000D'

これを全部PIC16F88の書式でやるとなると、うわあ、勘弁してほしいなあ、という感じになってしまいます。
多分そのあたりの理由からなのでしょう。
PIC18FでのCONFIGの表記はPIC16Fとはがらりと変わって、スッキリしたものになりました。
それが、前回もお見せした、下のような書き方です。

CONFIG FOSC=INTOSC_EC,WDT=OFF,LVP=OFF,MCLRE=OFF

CONFIGレジスタ名は書かなくてよい、ということのようですから、これは楽です。
CONFIGレジスタのパラメータは、書き込み前に消去すると、デフォルトの値が設定されます。
もっと正確に言いますと、消去すると全てのビットが’1’になりますから、個々のパラメータで’1’の時に選択される設定が、消去後のデフォルトの設定になる、ということです。

ですから、各パラメータで、’1’のときに選択される設定のままでよいものについては、わざわざCONFIG文で設定してやる必要はありません。
また、そのプログラムでは使わない機能についての設定は、どちらになっていてもいいわけですから、その場合にもあらためて設定をする必要はありません。

結局、どうしても設定しておかなければいけない、というものだけを設定することになります。
当然、それはプログラムによって異なってきます。
今回は簡単なテストプログラムですから、設定しなければならない項目はわずかです。

●FOSC

FOSCはシステムクロックに関する設定です。
システムクロックについての詳細は、PIC18F2455/2550/4455/4550DataSheetに書いてありますが、CONFIGにおける具体的な書き方については、p18f2550.incを参照します。

;   Oscillator Selection bits:
;     FOSC = XT_XT         XT oscillator, XT used by USB
;     FOSC = XTPLL_XT      XT oscillator, PLL enabled, XT used by USB
;     FOSC = ECIO_EC       External clock, port function on RA6, EC used by USB
;     FOSC = EC_EC         External clock, CLKOUT on RA6, EC used by USB
;     FOSC = ECPLLIO_EC    External clock, PLL enabled, port function on RA6, EC used by USB
;     FOSC = ECPLL_EC      External clock, PLL enabled, CLKOUT on RA6, EC used by USB
;     FOSC = INTOSCIO_EC   Internal oscillator, port function on RA6, EC used by USB
;     FOSC = INTOSC_EC     Internal oscillator, CLKOUT on RA6, EC used by USB
;     FOSC = INTOSC_XT     Internal oscillator, XT used by USB
;     FOSC = INTOSC_HS     Internal oscillator, HS used by USB
;     FOSC = HS            HS oscillator, HS used by USB
;     FOSC = HSPLL_HS      HS oscillator, PLL enabled, HS used by USB

CONFIGの表記については、今まで説明してきましたように個々のPICのincファイルを参照すればよいのですが、PIC18については、Microchip社の「PIC18 CONFIGURATION SETTING ADDENDUM(DS51537F)」にPIC18のCONFIGについてPIC品名毎にまとめられていますから、それを参照することもできます(Microchip社のホームページからダウンロードできます)。
記載内容はincファイルと同じです。


[出典]Microchip社PIC18 CONFIGURATION SETTING ADDENDUM

今回は動作テストをするだけでUSBはまだ使いません。
内蔵オシレータ(Internal oscillator)を使います。
incファイルまたはPIC18 CONFIGURATION SETTING ADDENDUMを見ますと、4通りあることがわかります。
今回はクロックが発振していることを確認するために、RA6へのクロック出力モードを選びます。FOSC=INTOSC_ECです。
このモードでは内蔵発振周波数の1/4の周波数がRA6から出力されます。
PICはクロック発振周波数または外部から入力されたクロック(FOSC)の周波数の1/4が命令のクロックになります。

システムクロックのソースをクリスタル発振にするのか、内蔵発振によるのか、あるいは外部からクロックを入れるかなどの設定については、説明しましたようにCONFIGで設定しますが、内蔵発振を選択した場合の、発振周波数はプログラムで設定をします。
その設定についてはまた別の項目で説明をいたします。

●WDT

WDTはウォッチドッグタイマーのことです。
ウォッチドッグタイマーがセットされていると、何らかの理由でシステムがハングアップしてしまったようなときに、それを検出して自分でリセットしてくれます。
ウォッチドッグ(watch dog)は直訳すれば番犬です。
CPUがちゃんと動作しているかどうか常に見張っていて、CPUが寝てしまったりすると、ガブリと噛み付いて起こしてくれるというわけです。

ウォッチドッグタイマーはCONFIGでON(有効)/OFF(無効)の設定と、CPUが起動してからリセットが働くまでの時間を設定します。
時間はpostscalerの値×4msで、4ms〜131.072secの間で選ぶことが出来ます。

ウォッチドッグタイマーONの設定にすると、CPUが起動した直後からカウントを開始します。
そのままにしておくと、設定時間が来るとリセットされてしまいます。
そうしないためには、プログラムの中(とくに繰り返し実行されるループの中など)で、clrwdt命令(clear WDTの意)を繰り返し実行することで、WDTカウンタをクリアするようにしておきます。

プログラムが正しく実行されている間は、WDTカウンタがクリアされますから、CPUリセットはされませんが、何らかの原因でCPUがハングアップしてしまうと、clrwdt命令が実行されなくなりますから、設定時間経過後にCPUリセットが働きます。 

今回は簡単なテストプログラムですから、WDTはOFFにしておきたいと思います。
p18f2550.incでWDTの設定を見ますと、次のように書いてあります。

;   Watchdog Timer Enable bit:
;     WDT = OFF            HW Disabled - SW Controlled
;     WDT = ON             HW Enabled - SW Disabled

しかしこれだけでは、PIC18F2550の消去後のデフォルトがONなのかOFFなのかがわかりません。
そこで、PIC18F2455/2550/4455/4550DataSheetで確認をしてみます。



[出典]PIC18F2455/2550/4455/4550DataSheet

CONFIG2Hのビット0(WDTEN)がWDTの設定のためのビットです。
このビットが1のときにWDT enabled、0のときにWDT disabledとなっています。
WDTENの上の記号を見ると、R/P−1と書いてあります。
readable/programmableで、消去後の値(Value when device is unprogrammed)は1になっています。
ということは、消去後は1つまりWDT=ONの設定になるということです。

ですから、WDTを使わない設定にするためには、WDT=OFFを書いておかなければいけません。
ここを省略すると、WDT=ONが設定されたことになってしまいます。

●LVP

LVPは低電圧プログラム書き込みモードです。
PICはMCLR端子に約+13VのVPP電圧を加えることで、プログラムを書き込みます。
+13Vというのは、一般のTTLなどのロジックICの絶対最大定格を超える危険な電圧です。
PICプログラマを使って書き込みを行っている分には特に問題はないのですが、回路基板にPICを実装してしまってから、プログラムを書き直したりする場合には、VPPが他の回路に流れないための工夫が必要になってきます。
そのようなときに、LVPモードが選択されていると、+13Vではなくて、+5Vで書き込みをすることができるようになります。
それは便利なようですが、その代わりに、RB5がI/Oではなくて、programモードの指定のために使われてしまいます。
うっかりしていると、RB5を普通のI/Oと思って回路を作ってしまい、あとでPICが動作してくれなくて悩んでしまうことになりかねませんから、私は普段このモードは選択していません。

で、このLVPの設定も、p18f2550.incで調べてみますと、下のように書いてあります。

;   Single-Supply ICSP Enable bit:
;     LVP = OFF            Single-Supply ICSP disabled
;     LVP = ON             Single-Supply ICSP enabled

しかしこれだけでは、先ほどのWDTと同じで、PIC18F2550の消去後のデフォルトがONなのかOFFなのかがわかりません。
そこで、またPIC18F2455/2550/4455/4550DataSheetで確認をしてみます。


[出典]PIC18F2455/2550/4455/4550DataSheet

CONFIG4Lのビット2(LVP)がlow voltage programming(single−supply ICSP)の設定のためのビットです。
このビットが1のときに低電圧書込みモードON(enabled)、0のときに低電圧書込みOFF(disabled)となっています。
LVPの上の記号を見ると、R/P−1と書いてあります。
readable/programmableで、消去後の値(Value when device is unprogrammed)は1になっています。
ということは、消去後は1つまりLVP=ONの設定になるということです。

ですから、LVPを使わない(通常のVPPで書き込む)設定にするためには、LVP=OFFを書いておかなければいけません。
ここを省略すると、LVP=ONが設定されたことになってしまいます。

●MCLRE

MCLREはpin1をMCLR(リセット)端子として使うか、RE3入力端子として使うかの設定をします。
PIC18F2550に限らず、この端子は普通はMCLRとしてVDDに接続して使います。
外部からリセットしたいときなどは、抵抗でVDDにプルアップしたうえで、そこにRESET信号を入れるかPUSHスイッチを接続するなどして使います。
そのような定番の使い方のほかに、この端子をリセット回路から切り離して、I/O端子として使うモードもあります。
その場合にはリセット回路は内部でVDDに接続され、外部からリセットすることはできません。
わざわざそのようなモードを選択するメリットは普通はありません。
しかしI/Oの数がぎりぎりで、もう1本I/O(ただし入力)が欲しい、というようなときには、RE3を入力端子とすることができることが救いになるかもしれません。

今回はただのテストプログラムなので、MCLRを使わないで、RE3入力を使うという設定にしなければならない理由はありません。しかし実はちょいと考えていることがありますから、せっかくのテストプログラムなので、ついでにこのMCLRを無効にしてRE3入力を有効にする設定も試してみたいと思います。

MCLREの設定について、p18f2550.incで調べてみますと、下のように書いてあります。

;   MCLR Pin Enable bit:
;     MCLRE = OFF          RE3 input pin enabled; MCLR disabled
;     MCLRE = ON           MCLR pin enabled; RE3 input pin disabled

しかしこれだけでは、先ほどのWDT、LVPと同じで、PIC18F2550の消去後のデフォルトがONなのかOFFなのかがわかりません。
そこで、またPIC18F2455/2550/4455/4550DataSheetで確認をしてみます。


[出典]PIC18F2455/2550/4455/4550DataSheet

CONFIG3Hのビット7(MCLRE)がMCLR/RE3の選択のためのビットです。
このビットが1のときにpin1はMCLR入力端子になります。0のときにはpin1はRE3入力端子になります。
MCLREの上の記号を見ると、R/P−1と書いてあります。
readable/programmableで、消去後の値(Value when device is unprogrammed)は1になっています。
ということは、消去後は1つまりMCLRE=ONの設定になるということです。

ですから、MCLR入力を無効にして(RESET回路は内部でプルアップする)、RE3入力を有効にするためには、MCLRE=OFFを書いておかなければいけません。
ここを省略すると、MCLRE=ONが設定されたことになってしまいます。
CPUをつくろう!第489回(2010.4.28upload)を再編集

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

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