標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第645回]

●PIC18F14K50のHIDサンプルプログラム(追記)

前回お見せしましたPIC18F14K50のHIDサンプルプログラムではPORTA〜PORTCのI/Oポートの向きは全てOUTに設定しています。

        clrf TRISC
        clrf TRISB
        clrf TRISA


ところでこの部分を[第641回]では

        movlw 0b
	movwf TRISA
	movlw 0
	movwf TRISC
	movwf PORTB

というように書いています。
PIC18F14K50のPORTAのビット0、ビット1はUSBのD+、D−と兼用しています。またビット3はMCLRと兼用しています。
そしてPIC18F14K50のPORTAのビット0、1、3はI/Oポートとして使う場合、入出力端子ではなくて、入力のみの端子になっています。
そのため[第641回]ではPORTAのビット0、1、3を「入力」に設定したのですが、そこのところを前回は面倒なので全ビットを「出力」に設定してしまいました。
しかしそのように設定しても特に支障はないようで問題無く動作しました。
PIC18F14K50のPORTAのビット0、1、3はI/Oポートとして使う場合には入力にしか使えませんから、そこを出力に設定しても無意味ということで、それ以上特に支障はないのかもしれません。
PICでは多重に機能を割りつけてある端子によっては、その端子をI/Oとしてではなく別の機能として使う場合であっても、ポートの向きを「入力」あるいは「出力」に設定しなければならないものもありますから、ちょっと気になったのです。
今回気がつくまでは特に気にしないで出力に設定して使っていたのですけれど、それでも何の問題もなかったわけですから、D+、D−、MCLRについては、ポートの向きはどちらでもよい、ということのようです。


●PIC18F2550のHIDサンプルプログラム

USB(HID)のインターフェースを内蔵したPICとしてはPIC18F14K50よりもPIC18F2550の方がポピュラーなようです。
実際PIC18F14K50はちょっと端子が少なすぎて何かをしようとすると、ポートの数が少ないことがネックになるかもしれません。
PIC18F14K50での簡単なHIDサンプルプログラムをお見せしましたので、ことのついでにPIC18F2550のプログラムもお見せすることにいたします。
PIC18F14K50とPIC18F2550とではレジスタのアドレスなど一部に異なるところがあります。
過去記事を確認してみましたら、PIC18F2550についてもPIC18F14K50と同じ動作のサンプルプログラムをお見せしていました。
[第512回]にPIC18F2550を使ったサンプル回路図と、サンプルプログラムがあります。
回路図はPIC18F14K50と同じでUSBから電源を取っていませんが、ここはUSBからVddを取ったほうが簡便です。
USBコネクタの1番ピンから+5Vが出ていますので、そことPIC18F2550のVdd(pin20)を接続するだけです。
できれば100μF程度の電解コンデンサをUSBコネクタのVdd(1ピン)とGND(4ピン)の間につけておくとよいでしょう。
またPIC18F2550の14番ピン、20番ピンのコンデンサに値がありませんが、ここは0.1μF程度のセラミックコンデンサをつけます。

サンプルプログラムはほんの少しだけですが直したほうがよいところがありますので、修正後のプログラムリストをお見せします。


;;;pic p18f2550 USB test program
;10/5/31 10/24
;
	#include<p18f2550.inc>
;cpuclock=48MHz xtal=4MHz
;
	CONFIG PLLDIV=1,USBDIV=2,CPUDIV=OSC1_PLL2,FOSC=XTPLL_XT,VREGEN=ON,WDT=OFF
	CONFIG PBADEN=OFF,LVP=OFF
;
w=0
f=1
c=0
z=2
;
cntr0=0c
cntr2=0d
cntr1=20
;
	org 00
	movlw 0f
	movwf ADCON1;porta,b are digital
	clrf TRISC
	clrf TRISB
	clrf TRISA
;
usbreset
	movlw 16
	movwf UEP0
	movlw 15;ping-pong buffer set for EP0(out) only	
	movwf UCFG
	movlw 1e;in,out enable
	movwf UEP1
	call setbd0
;
	movlw 48
	movwf UCON;clear bit4,for SIE enbl
loop_ucon
	btfss UCON,4;if SETUP detect
	goto loop_ucon
;
loop
	call t1ms
	decfsz cntr1
	goto loop
	movlw 1
	xorwf PORTC
	goto loop	
;
;ep0 out data0(even)
setbd0
	lfsr 1,403
	movlw 05;address high
	movwf POSTDEC1
	movlw 00;address low
	movwf POSTDEC1
	movlw 08;bytes
	movwf POSTDEC1
	movlw 88;STAS(even)
	movwf POSTDEC1
	return
;
;1msec timer
t1ms
	movlw 0a;=10	
	movwf cntr2
t1ms2
	call tm100micros
	decfsz cntr2
	goto t1ms2
	return
;
tm100micros
	movlw 0f0;=240
	movwf cntr0
tm100micros2
	nop
	nop
	decfsz cntr0
	goto tm100micros2
	return
;
	end


PIC18F14K50のサンプルプログラムと全く同じ動作をします。
USBコネクタを接続するとLEDが点滅します。
PIC18F14K50の場合と同じで、このプログラムはただのテストをしているだけですから、USB装置として認識はされません。
パソコン側では「不明なデバイス」になります。
2010.10.25upload

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