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

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

今までUSBを使ってパソコンと通信をする部分にはFTDI社のFT232RLかまたはFT245を使って、RS232C−USB変換をしておりました。
ところがUSBコントローラを内蔵しているPICがあることを知りました。
PICは232C通信をするためなどに使っています。
それならそのUSBコントローラを内蔵したPICを使えばFT232RLを使わなくても済んでしまいそうです。
FT232RLはなかなかに便利なICですが、ただ難点はフラットパッケージしかないことです。
それを使わなくても済むということならば、ここは一番ぜひとも挑戦してみるべきでありましょう。
さっそくPIC18F4550のマニュアルをダウンロードして読んでみたのでありますが…。

[第6回]

●Windows98とアセンブラ

もう何度も書いておりますように、私はいまだにWindows98を使っております。
WindowsXPは、もっていますけれどほとんど使いません。

そのように書くと、
「まあなんと時代遅れなのだろう。きっと新しいものは使いこなせないんだ。かわいそうに。」
などと思われてしまったりします。

また前回のように、「私はCコンパイラが嫌いだから、PICライターのプログラムをアセンブラで書きます」などと書いたりしていますと、
「いまどきCを使わなくて何ができるというのだろう?多分使いこなせないんだ。かわいそうに。」
とまたまた同情されてしまいそうです。

でもですね。
私は思うのです。
世の中、少し間違ってんじゃないだろうか?

猫も杓子も、なんでもかんでもCプログラミングだなんて、私にはちょいと異常に思えます。
なんだか知らないけれど、みんな、「はじめにCありき」と思い込んでいらっしゃるのではありませんか?

そこで、これから、PICライターのプログラムにとりかかるのですけれど、その前に。
まずは、ちょいと皆様に、「目からウロコ」のお話しをしておきたいと思います(こんなことは8086アセンブラがおわかりの方には当たり前のことなのですけれど)。

前回、MicrochipのサイトからダウンロードしたPICライターのプログラム(AN589ソースプログラム)をBorlandC++でコンパイルしたところ、エラーになってしまいました、と書きました。
「biosprintが未定義」というエラーです。

そのリストには確かにbiosprintは定義されていません。
どうやらヘッダーファイルbios.hにその定義がありそうです。
で、Borlandのヘッダーファイルをさぐってみたら、bios.hというファイルがあって、その中に「_bios_printer()」というのがありましたので、多分これのことでしょう、と書きました。

でも、このBorlandC++にあるbios.hも「抜け殻」で使えないようなのです。
そもそも、このbios.hを見ていると、何でこんなものがいるのかなあ、と考えてしまいます。

で、考えていましたら、「ああ、そうか」
わかりました。

●Cでポートに出力、ってどうする?

前回お見せしたパラレルポートを使用するPICライターの回路ですけれど、当然のことながら、パラレルポートから書き込みパルスを出力しなければなりません。
でも、Cでは、そこんところをどうやるのでしょう?

DOS/Vパソコンのパラレルポートアドレスは378Hです(違うアドレスもあるのですがここでは簡単に)。
そのビット0からPICの書き込みのために連続してパルスを出力するプログラムをC(またはC++)で書くにはどうしたらよいのでしょう?

「XPじゃそんなこと、出来ないよ」
ですね。そこがまた別の問題なのです。

ですけれど、それはちょっと置くことにして、XPより以前のWindows98などでしたらできますから、気にしないで、どうぞCまたはC++で書いてみてくださいませ。

私が不勉強なのかも知れませんが、どうもCにおいては、ダイレクトにパラレルポートにアクセスするのは、一般的な方法ではなさそうなのですねぇ。
どうするのでしょう?

あ。別にCにけちをつけているのではありません(ってしっかりつけてますけれど)。
CにはCの役割があるのです(と思います)。

でもCはオールマイティではない。しっかり不得意なところがある。
近ごろ世間はそこんところを誤解しているのではありますまいか?
なんでもCで書こうとして自縄自縛に陥っているように思えます。

多分、どこかのだれか(たいていはMicrosoftだったりして)が用意してくれた、ヘッダーファイルをインクルードしなければ、何もできませぬ。
でも、それがまた大変で。
これこれをしたいけど、そのためには、なにをどこからもってきて、それをどのように使うのか、それがまた一苦労、なのではありませんか?

能書きはこのくらいにいたしまして。
はい。目からウロコです。

アセンブラならこうします。

左のOUTTEST.TXTがアセンブラのソースプログラムです。
たったこれだけです。
あっけないくらい、簡単です。
インクルードもヘッダーもクソもありませんです。はい。
いきなり書いて、いきなり終わりです(アセンブラって意外と簡単でしょー)。
もちろん、これだけで、ちゃーんと動きます。

MOV DX,378で、DXレジスタにパラレルポートアドレスの378Hを入れます。
次のOUT DX,ALはもう「そのまんま」です。DXで示すポートアドレスにレジスタALの値を出力せよ、です。
次のXOR AL,01はALのビット0のみを反転するために使っています。
そしてJMP LOOPで繰り返します。

右はOUTTEST.TXTをアセンブルして機械語のファイル、OUTTEST.COMを出力しているところです。
ASMというのは、当社のオリジナル8086アセンブラです。
そして一番下のOUTTESTで、今作ったOUTTEST.COMを早速実行しています。

実行の結果をチェックするためにオシロのプローブをプリンタコネクタにつけているところです。


OUTTEST.COMの実行結果です。

パラレルポート(プリンタポート)のビット0からの出力波形です。

ねーえ。こんなに簡単なことですのに、どうしてCなどを使おうとしか考えないのでしょうか?

いかがでしたでしょうか?
目からウロコが落ちましたでしょうか?
(次回に続きます)
CPUをつくろう!第398回(2009.12.13upload)を再編集

PICでUSBを![第6回]
2011.7.8upload

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