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 |