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

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

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

[第83回]

●PIC18F2550のUSBテスト回路です

PIC18F2550ではUSBにうまく接続できたプログラムをPIC18F14K50に移植すると、USBを全く認識してくれません。
その原因をさぐるために、うんとプログラムを簡単にして動作テストを繰り返していったところ、 前回([第82回])書きましたように、最初のSETUPから見事にこけてしまっていることがわかってきました。

ということで、それではまず、そのテストに使ったプログラムをお見せしまして…。
と思ってあちこち捜してみたのですが…。
やたら書いたり消したり泥沼の中でもがきまわるものですから、いざこうやって説明をしようとすると、どのプログラムでテストしたのか、もう、さっぱりわかりません。

おまけに、そのあたりの適当なテストプログラムに見当をつけて、PIC18F2550に書き込んで、動作テストを再現してみようと思いましたら、もうどんどん作業を進めていってしまったものですから、単純な動作テストができるような回路自体がすでに存在しないという、まことにとほほ…の状態、でここ2日ほど、更新することもままなりませんでした。

あ。いや。もちろんそんなことだけのために2日も空費してしまっていたわけではありません。
やらなくてはならないことや、ぜひともやりたいことなどのために、とにかく忙しかったのです。

で。本日になりましてから、やっと少し整理できる時間をみつけましたので、こうやってUPするところまでこぎつけた次第です。
そこで。
まずはUSBの動作テストに使ったPIC18F2550の回路図です。

上の回路をジャノ目基板に組みました。

今回の説明のために、まずはPIC18F2550の動作テストを再現して、まっとうなプログラムリストをお見せしようとしましたら、そのテストをする基板が、その後にいろいろいじくってしまったものですから、もう、ありません。
そこで、仕方がありませんから、[第59回]で登場した基板に、USBテスト用の回路を追加したのが、この写真です。
この基板は[第59回]で紹介しました後、[第75回]で4MHzクリスタルを追加しました。
さらに[第78回]で、空いていた端っこにPIC18F14K50の回路を取り付けてしまいました。
そして今回はさらにUSBテストプログラムを実行してみるために、さらなる追加を行ったわけです。

こちらが基板裏の写真です。


●PIC18F2550のテストプログラムです

前回([第82回])はテストプログラムのほんの一部分だけをお見せしました。
その時点では、今回の説明に必要な部分だけではなくて、USB接続の最後までを通して実行できるだけの結構長いプログラムしかありませんでしたので、とても全部はお見せすることができなかったのです。

;;;pic p18f2550 USB test program
;10/5/31
;
	#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 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,403
	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

前回([第82回])も書きましたように、これだけでは全く何の役にも立ちません。
でも、とりあえず前回から引き続いての、PIC18F2550ではUSBが認識できるのに、なぜかPIC18F14K50ではうんともすんとも言ってくれません、というお話の説明のためには、このプログラムが必要にしてかつ十分なものなのです。

PIC18F2550にこれだけのプログラムを書いてから、上のテスト基板に実装して、電源を入れます。
するとRC0に接続してあるLEDが点灯します。
それを確認してから、USBケーブルでDOS/Vパソコンに接続すると、ケーブルをつないだ直後からLEDが点滅するようになります。

USBケーブルを接続するまでは、RC0に1を出力して、LEDが点灯したあと、loop_uconのところでループしているだけなので、何の変化もありませんが、USBケーブルを接続するとホストから送られてくるSETUP信号をPIC内蔵のUSBコントローラがキャッチして、その結果UCONレジスタのビット4が1になるので、ループから抜け出して、LEDが点滅をするようになるのです。

このプログラムは短いプログラムですが、それでも見なれないレジスタがいくつか登場します。
UCONについては前回ちょっとだけですが紹介いたしました。
そのほかUEP0とUCFGも設定が必要です。
プログラムにはUEP1も書いてありますが、これは今回のSETUP検出のためには必要はありません。

それからsetbd0というサブルーチンも実行しています。
何をやっているのかさっぱりわからない、と思いますが、そのあたりの説明に入りますと、いきなり藪の中に踏み込んでいってしまいますので、ここではこういう処理が必要なのだ、ということにしておいてください。
いずれ、詳しく説明申し上げるつもりでおりますので。

あ。
UEP0とUCFGについては、いつものように、DataSheetのCOPYをお見せすることにいたします。

●UEPnレジスタ


[出典]MICROCHIP社PIC18F2445/2550/4455/4550DataSheet

UEPnはPICで扱えるエンドポイントの数だけ用意されているレジスタです(PIC18F2550ではn=0〜15)。
といっても全部のレジスタの設定をする必要はありません。
実際に使用するエンドポイントに対するUEPnレジスタだけ設定します。
ただしUEP0だけは必須です。

UEPnレジスタは各エンドポイントの機能を設定します。
説明を読んでもなんだかよくわからないなあ、ということばかりですが、さきほど書きましたように、とりあえず、ここでは深く入らないことにいたします。

●UCFGレジスタ




[出典]MICROCHIP社PIC18F2445/2550/4455/4550DataSheet

UCFGレジスタは、USBのハード的な基本仕様を設定するレジスタです。
bit7とbit6はテスト用ですから普通は0にしておきます。
bit5も使いません。
bit4=1、bit3=0にします。
Full−speedモードで使いますからbit2=1です。
ping−pong bufferってなんだあ?
でしょうけれど、それにつきましても、いずれ後日の説明、ということにいたします。
CPUをつくろう!第512回(2010.6.1upload)を再編集

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

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