PICでUSBを!(知識ゼロからのスタートです)
PIC18F14K50のUSB機能を100%自前のソフトで制御する試みです。しかもアセンブラで!
当記事は2009年12月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 |
2011.7.13 前へ 目次へ戻る ホームページトップへ戻る |
☆PIC18F14K50 PIC18F2550では大きすぎて、計画中のTK80互換マイコンボードND80ZVには組み込めそうにないことがわかりました。 USB機能内蔵のPICにはPIC18F4550、PIC18F2550のほかに20pinのPIC18F14K50があることはちょっと前から知っていました。しかしUSBに関する部分がPIC18F2550とはかなり異なっているようです。 案の定しっかり泥沼にはまってしまいました。 |
[第94回]
●PIC18F命令の’a’パラメータ
前回、前々回でBSRで指定したメモリバンクをアクセスするときには、アセンブラ命令の末尾の’a’パラメータに’1’を指定する、という説明をいたしました。
たとえば
movwf UEP0,1
のように表記します。
もしここで’a’パラメータに’1’を指定しないで、PIC16Fでの普通の表記と同じように
movwf UEP0
のように表記すると、それはPIC18Fでは
movwf UEP0,0
と表記したのと同じことになります。
つまり’a’パラメータはデフォルトでは’0’ということのはずなのですが…。
PIC18F14K50のDataSheetを読んでみますと、それとは全く逆のことが書いてあります。
[出典]PIC18F14K50DataSheet
上はPIC18F14K50のDataSheetからの引用ですが、PIC18F2550/4550でも全く同じです。
ここでは movwf を取り上げましたが、メモリをアクセスする他の命令でも書いてあることは同じです。
こんなに堂々と書いてありますと、多分私の解釈が間違っているのだろうなあ、と思ってしまいます。
If ’a’ is ’1’,the BSR is used to select the GPR bank(default).
うーん。この default って、’a’を省略するとa=1になるよ、という意味ですよねえ。
この文章には、当初、ずいぶん悩まされました。
でも、今はもう無視してしまうことに決めました。
実際にアセンブラにかけてみると、’a’を省略した場合には、a=0になることを確認していますから。
論より証拠と申します。
何回かお見せしています、PIC18F14K50のUSBテストプログラムをアセンブルした結果(部分)で説明をいたします。
00024 ; 00000A 00025 usbreset 00000A 010F 00026 movlb 0f 00000C 0E16 00027 movlw 16 00000E 6F53 00028 movwf UEP0,1 000010 0E15 00029 movlw 15;ping-pong buffer set for EP0(out) only 000012 6E61 00030 movwf UCFG 00031 ; 000014 EC1C F000 00032 call setbd0 00033 ; 000018 0EFF 00034 movlw 0ff 00001A 6E82 00035 movwf PORTC 00001C 0E48 00036 movlw 48 00001E 6E64 00037 movwf UCON;clear bit4,for SIE enbl 000020 00038 loop_ucon 000020 A864 00039 btfss UCON,4;if SETUP detect 000022 EF10 F000 00040 goto loop_ucon 00041 ; |
0110111a ffffffff |
と書いてあります。
UEP0のアドレスはF53で、その下位8ビットがそのまま命令の下位8ビットになっています。
上位バイトのビット0が’a’パラメータです。
ここに’1’を指定しましたから、命令コードは6Fになります。
ところで、そのほかのmovwf命令はどうなっているでしょうか。
movwf UCFG
movwf PORTC
movwf UCON
のいずれも、’a’パラメータを省略しています。
PIC16Fでの表記法のままです。
では、マシン語に翻訳されたコードはどうなっているでしょうか。
いずれも上位バイトは6Eです。
つまりこの結果からは、’a’パラメータを省略すると、a=0を指定したとみなされる、ということがわかると思います。
そうですよねえ。
これが逆だったら、面倒でたまりません。
まあ、このプログラム例では、
movwf UEP0以外は
movwf UCFG,1
movwf PORTC,1
movwf UCON,1
でも
movwf UCFG,0
movwf PORTC,0
movwf UCON,0
でも、どちらでもよいのですけれど。
BSRに0Fを入れていますから、そういうことでよいのですけれど、別のバンクをアクセスするために、BSRに0F以外の値をセットすると、システム用のワークレジスタ(SFR)をアクセスするためには、いちいち命令の末尾に’0’をつけなくてはならなくなってしまいます。そりゃあ大変なことです。
そう考えますと、’a’パラメータを省略すると、a=0が指定されたことになる、っていうのは、まことに有り難いことです。
でも、そうすると、あの default って、一体何なのでしょうか。
うむむ。
謎ですなあ。
CPUをつくろう!第523回(2010.6.13upload)を再編集
PICでUSBを![第94回]
2011.7.13upload
前へ
目次へ戻る
ホームページトップへ戻る