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 |