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

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

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

[第84回]

●USBコネクタの端子接続図

USBの基板用コネクタには端子が4本しかありません。
1番がV+で、2番がD−、3番がD+で4番がGNDです。
でもどこが1番でどこが2番なのか、なにしろ4本が正方形に配置されているので見当がつきません。
そこで参考までに、前回お見せした基板裏のコネクタ部分を拡大して、そこに番号を書き込もうとしたのですが。

これがその写真です。

でもなんだかごちゃごちゃしていてわかりにくいので、別に図で示すことにいたしました。
コネクタ(レセプタクルというのだそうです)を裏から見た図です。
上の写真と同じ向きです。

矢印がケーブルを差し込む口のある側です。

●PIC18F14K50のUSBテスト回路です

前回はPIC18F2550のUSB接続テストについて説明をいたしました。
今回はいよいよ問題のPIC18F14K50です。
まずはUSBの動作テストに使ったPIC18F14K50の回路図です。



PIC18F14K50でUSB(Full−speedモード)を使うためには、12MHzのクリスタルを外付けにして、そこから48MHzを得るようにしなければなりません。
その点がPIC18F2550と少し異なっているだけで、接続する端子番号が異なっていることを除いては、PIC18F2550と変わるところはありません。

テストに使った実物のジャノ目基板の写真は[第81回]でお見せしました。
そこでもちょっと説明しましたが、上の回路図では12MHzを外付けしていますけれど、写真では12MHzを74HCU04で発振させて、そのクロックをPIC18F14K50のPIN2(OSC1)に入れています。
なぜわざわざそんなことをしているのかといいますと、現在試作中のZ80版TK80ボードのZ80のクロックと共用できるようにするためのテストも兼ねているからです。

先に作りました特注品のZ80版TK80ボード(ND80ZH)のCPUクロックは4MHzで、今回も当初はそのつもりだったのですが、PIC18F14K50が12MHzでなければならないため、Z80にもその同じ12MHzをもとにしたクロックを供給することにしました。
Z80もハイスピード品があることはあるのですが、そんなものを使うと、82C55がこけてしまいます。
かといって12MHzから4MHzをつくるのはちょっと無理があります。
そこで12MHzを74HCU04で発振させて、PIC18F14K50にはそのまま供給し、Z80にはその1/2の6MHzを供給することにしました。
Z80については6MHzでずっと使ってきていますから特に問題はありません。

余談になってしまいました。
いずれ、Z80版TK80ボードの詳細につきましてもご紹介する予定です。

●PIC18F14K50のテストプログラムです(実は動きません)

前回のPIC18F2550のプログラムをPIC18F14K50用に直したものです。
ちゃんと動きますけれど、USBを認識してはくれません。
問題のプログラムです。

;;;pic p18f14k50  USB test program
;10/6/2
;
	#include<p18f14k50.inc>
;cpuclock=48MHz exclock=12MHz
;
	CONFIG FOSC = ECH,CPUDIV = NOCLKDIV,USBDIV = OFF,PCLKEN = ON,PLLEN = ON,WDTEN=OFF,LVP=OFF
;
w=0
f=1
c=0
z=2
;
cntr0=0c
cntr2=0d
cntr1=20
;
	org 00
	clrf ANSEL
	clrf ANSELH
	clrf TRISC
	clrf TRISB
	clrf TRISA
;
usbreset
	movlw 16
	movwf UEP0
	movlw 15;ping-pong buffer set for EP0(out) only	
	movwf UCFG
;
	call setbd0
;
	movlw 0ff
	movwf PORTC
	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,203
	movlw 05;address high
	movwf POSTDEC1
	movlw 00;address low
	movwf POSTDEC1
	movlw 08;bytes
	movwf POSTDEC1
	movlw 80;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

上でも書きましたように、CPUクロックの12MHzは外部から供給していますから、CONFIGではFOSC=ECHになっています。
12MHzクリスタルを外付けにする場合には、ここをFOSC=HSにします。

それはともかくとしまして、前回のPIC18F2550で動いたプログラムをもとにして、PIC18F14K50で変更しなければならないところを直しただけですから、これでUSBのSETUPを認識してくれない、というのはまさに謎だったのです。

ちなみにPIC18F14K50のために変更したところは、CONFIGのところと、あとはPORTの設定をアナログからデジタルにする設定の仕方の違っているところ(ANSELとANSELH)と、そしてUSB用バッファメモリのアドレスの違いによる変更(setbd0でlfsr 1,203にしている)のみです。

このプログラムをPIC18F14K50に書いて、実行させてみますと、LEDは点灯するのですが、USBケーブルを接続しても、点滅しないで、つきっぱなしなのです。

実は、すでに何回も書いておりますように、PIC18F2550ではまともだったこのプログラムには、とんでもない落とし穴があったのです。

ええ。
はっきりいって、完全に間違っているところがあったのです。
PIC18F14K50に限っては、です。

えらく気をもたせた書き方で申し訳ありません。
まま。もうしばらく、ご辛抱願います。
そこを説明するには、いろいろ準備が必要なものですから…。

とにかく、間違っていたのですよ。
でも、私が読んだ限りでは、PIC18F14K50のDataSheetでもそのことについての「注意書き」はただの一行も無いのです。
注意深く読めば書いてはあるのですけれど、注意書きでも警告でもなんでもないので、そんなの気が付くわけがないじゃないのさ。

とにかくこのプログラムでは、PIC18F14K50に限っては、USBにアクセスできっこないのですから、本来ならば、アセンブラでもそのことは教えてくれなくてはいけないはずなのですが…。
ちゃんとデバイスをPIC18F14K50に指定してアセンブルしたのですよお。
それなのに。



ほら。この通り。

Errors:0

だなんて。
ほんと、しらじらしい。うそばっかり。
CPUをつくろう!第513回(2010.6.2upload)を再編集

PICでUSBを![第84回]
2011.7.13upload

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