標準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

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