標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第646回]
●PIC18F14K50のHIDプログラム(Enumerationその1)
前回までで、PIC18F14K50がUSB接続によりUSBホストコントローラから送られてくるSETUPトークンパケットを検出するところまでを説明いたしました。
いよいよこれからEnumerationの手続き動作に入ります。
いきなり相当にこみいったプログラムになってしまいますので、どこからどのように説明していったものか、ちょっと迷ってしまいます。
とにかくまずはその部分のプログラムリストをお見せすることにいたします。
最初はUSBホストコントローラから送られてくるDEVICE DESCRIPTORの送信要求コマンドを検出して、それに応えてDEVICE DESCRIPTORを送るところです。
;connected to USB looptop clrf UIR movlw 08 movwf UCON ; call setupck bnz checkbd2 ;"setup" received call senddvck;"80"+"06"? bnz setadcheck ;(1)"GET DESCRIPTOR('80'+'06')" received movf db3,w sublw 1; 1 or 2? 1:dev.descriptor 2:config descreptor bnz sendconf ;send DEVice DSCRPTR movlw 12 cpfseq db6 call resetADDR call setbd2 call setbd0 call setbd1 goto looptop ; resetADDR lfsr 2,0f5c;UADDR clrf INDF2 return
上のプログラムリストの中で、checkbd2、setadcheck、sendconfへの分岐命令がありますが、それらは次のステップへの分岐です。
いずれ説明が進んでいく中で説明をすることになると思います。
下は上のプログラムの中でCALLしているsetupckサブルーチンです。
setupck movlw 08 movwf UCON;clear bit4,for SIE enbl lfsr 0,200 btfsc INDF0,7 goto ck_bd1 lfsr 1,220 goto setupck1 ck_bd1 lfsr 0,204 btfsc INDF0,7 goto notsetup lfsr 1,228 setupck1 movf INDF0,w andlw 3c sublw 34;PID="1101" SETUP bz setupck2 call setbd0 call setbd1 notsetup bcf STATUS,z return ;(1)"setup" received setupck2 movf POSTINC1,w movwf db0 movf POSTINC1,w movwf db1 movf POSTINC1,w movwf db2 movf POSTINC1,w movwf db3 movf POSTINC1,w;dummy db4 movf POSTINC1,w;dummy db5 movf POSTINC1,w movwf db6;send request data bytes call setbd0 call setbd1 bsf STATUS,z return
setbd0、setbd1、setbd2の各サブルーチンは[第642回]で説明をしています。
いきなりこんなリストが出てきたら、さっぱりわからんぞー、と言われてしまいそうです。
ですから、どうやってどこから説明をしていこうかと悩んでいるのです。
とにかく少しずつ説明にとりかかるしかありません。
このリストはND80ZVに搭載しているPIC18F14K50のプログラムをもとにしたプログラムリストですから、実際に動作することを確認済みのものです。
ですけれど、今こうやって説明をしようとあらためてリストを見てみますと、なんだか怪しげなところが目についてしまいます。
ですので、あらためて確認をしながら少しずつ説明を進めていくことにいたします。
とりあえずは上でお見せした通りのプログラムリストなのですが、説明を進めていく中で、プログラムを変更することになるかもしれません。
●UIRレジスタ
まず最初はclrf UIRです。
UIRは、PIC18F14K50のDataSheetの説明では USB INTERRUPT STATUS REGISTER と書かれています。
USBの割り込みのステータス(状況、状態)を保持するレジスタです。
どこかで書いたと思うのですが、PIC18F14K50のHIDプログラムではUSBのための割り込みは使っていません。
PICから見たUSBの処理プログラムはイベントドリブン的な動作になりますから、普通は割り込みで処理することを考えるかと思います。
しかし割り込みはよほどうまくプログラムを考えないとトラブルのもとになります。
使わないで済むのでしたら使わないほうが得策です。
ということで、USBについては割り込みは使っていません。
それならばなぜ clrf UIR なのか、ということなのですが。
それを説明する前に、とにかくUIRについて、PIC18F14K50のDataSheetを見てみることに致しましょう。
[出典]Microchip社PIC18F14K50DataSheet
ここで注目すべきは、
Once an interrupt bit has been set by the SIE,it must be cleared by software by writing a ’0’.
という文章です。
わかりますよね。
SIE(PIC内蔵USBコントローラ)によってセットされたビットは、ソフトウェアによって ’0’クリアしなければならない、と書いてあります。
ですから、 clrf UIR なのです。
しかし割り込みを使っていないのになぜ?
それは、Note 2:に書かれていることのためです。
Clearing this bit will cause the USTAT FIFO to advance.
と書いてあります。
これはbit3のTRNIFの注記です。
むむ。
だんだんややこしくなってきて、ますます説明に窮します。
ともかく、そうしますと、今度はUSTAT FIFOについて見てみなければなりません。
ですけれど、ちょっと時間も無くなってしまいましたので、この続きはまた次回にすることといたします。
2010.10.26upload
前へ
次へ
ホームページトップへ戻る