標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第512回]
●PIC18F2550のUSBテスト回路です
PIC18F2550ではUSBにうまく接続できたプログラムをPIC18F14K50に移植すると、USBを全く認識してくれません。
その原因をさぐるために、うんとプログラムを簡単にして動作テストを繰り返していったところ、
前回([第511回])書きましたように、最初のSETUPから見事にこけてしまっていることがわかってきました。
ということで、それではまず、そのテストに使ったプログラムをお見せしまして…。
と思ってあちこち捜してみたのですが…。
やたら書いたり消したり泥沼の中でもがきまわるものですから、いざこうやって説明をしようとすると、どのプログラムでテストしたのか、もう、さっぱりわかりません。
おまけに、そのあたりの適当なテストプログラムに見当をつけて、PIC18F2550に書き込んで、動作テストを再現してみようと思いましたら、もうどんどん作業を進めていってしまったものですから、単純な動作テストができるような回路自体がすでに存在しないという、まことにとほほ…の状態、でここ2日ほど、更新することもままなりませんでした。
あ。いや。もちろんそんなことだけのために2日も空費してしまっていたわけではありません。
やらなくてはならないことや、ぜひともやりたいことなどのために、とにかく忙しかったのです。
で。本日になりましてから、やっと少し整理できる時間をみつけましたので、こうやってUPするところまでこぎつけた次第です。
そこで。
まずはUSBの動作テストに使ったPIC18F2550の回路図です。
上の回路をジャノ目基板に組みました。
今回の説明のために、まずはPIC18F2550の動作テストを再現して、まっとうなプログラムリストをお見せしようとしましたら、そのテストをする基板が、その後にいろいろいじくってしまったものですから、もう、ありません。
そこで、仕方がありませんから、[第486回]で登場した基板に、USBテスト用の回路を追加したのが、この写真です。
この基板は[第486回]で紹介しました後、[第502回]で4MHzクリスタルを追加しました。
さらに[第507回]で、空いていた端っこにPIC18F14K50の回路を取り付けてしまいました。
そして今回はさらにUSBテストプログラムを実行してみるために、さらなる追加を行ったわけです。
こちらが基板裏の写真です。
●PIC18F2550のテストプログラムです
前回([第511回])はテストプログラムのほんの一部分だけをお見せしました。
その時点では、今回の説明に必要な部分だけではなくて、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
前回([第511回])も書きましたように、これだけでは全く何の役にも立ちません。
でも、とりあえず前回から引き続いての、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ってなんだあ?
でしょうけれど、それにつきましても、いずれ後日の説明、ということにいたします。
2010.6.1upload
前へ
次へ
ホームページトップへ戻る