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


PIC−USBIO using BASIC

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
USBインターフェースを内蔵したPICを使ってWindowsパソコンで外部回路を制御するための各種I/O基板の製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第52回]



●PICUSBIO−03

今まで紹介してきたボードはWindowsパソコンのUSB経由で82C55または82C55相当の回路を制御するものでした。
いずれも8ビット×3ポートの基板です。
いずれもPICをUSBI/Fとして使いそのI/Oを使って82C55などのI/O回路を制御するものです。
考えてみればPICのI/Oを使ってI/O回路を制御してその外側にさらに別のI/O回路を置くという二重三重の回路構成であることも否めません。
USBI/Fとして使っているPIC18F13K50のI/Oポートが少ないため82C55クラスのI/OをWindowsパソコンで制御しようとすればそのような回路になってしまうのはやむをえないことではあります。
ともかくPICをUSBI/F用のICだと割り切ってしまえばよいのです。
実際にND80Z3.5などのボードではそういう使い方をしてきています。

しかしもしも8ビット×3ポートものI/Oは必要はなくて数ビットあれば足りるという用途を考えたならば。
それならPICの外にI/O回路を置かずともPIC自体のI/Oで足りるではないか。
今回紹介するPICUSBIO−03はそのような発想から製作したボードです。
PIC18F13K50は20pinのICです。
電源端子やUSB端子、クロック発生回路用の端子などを除き、切りの良いところで8ビット×1ポート(PORTC)と4ビット×1(PORTB)の合計12ビットのI/Oポートのボードになりました。

PICUSBIO−03の写真です。

わずか50mm角の小さなボードです。
今までの基板にならって入出力信号はフラットケーブルコネクタ(16pin)に配しましたが、フラットケーブル用コネクタの代わりに基板接続型のコネクタを使って別の回路基板とかジャノ目基板に直接接続することも可能です。

こちらはPICUSBIO−03の回路図です。

PICおよびその周辺回路以外はなにもないボードです。
8ビット×1ポートと4ビット×1ポートですからちょうど82C55の半分の数のI/Oです。
82C55はCポートが上位4ビットと下位4ビットに分けることができます。
それに対してPICUSBIO−03はPORTBが上位4ビットのみになります。
PIC18F13K50で8ビット全部を揃って使えるのはPORTCのみなのでそういう使い方になりました。
無理に82C55のI/Oポートの呼称にあわせなくてもよいかと思います。
ビット数は82C55の半分に過ぎませんがPIC18F13K50のI/Oポートは1ビットずつ個別に入出力の方向を設定することができます。
その意味では82C55よりもZ80PIOに近いかもしれません。
ただその機能を十分に使おうとするとソフトウェアの機能もアップしなければならなくなります。
それについては回が進むなかで説明をしていくことになるかと思います。

とりあえずは今までと同様にまずはBASICのOUT命令でPICUSBIO−03のI/Oポートからテストデータを出力してみることから始めたいと思います。
I/Oポートの出力テストは昔に作ったLEDボードを接続して行ないました([第35回])。
そのときテストに使ったLEDボードは82C55の出力テスト用に作ったものなのでフラットケーブルは26pinです。
信号線の配列はND80Z3.5などの82C55入出力用コネクタに合わせてあります。
その端子配列は[第43回]でお見せしました。
下に再掲します。


ところが今回のボードは16pinのコネクタです。
端子配列を26pinに合わせることもできたのですが一方が26pinに対してもう一方が16pinなのでかなり差がありますし、そうしたところですっきりした配列にはなりません。
ということで26pinの端子配列は無視をして新しく配列を考えました。
下がPICUSBIO−03の入出力コネクタの端子配列です。

私は単細胞で昔から先のほうまで考えることが苦手です。
とりあえず作りながら考えていこうというタイプです。
今になって少し後悔しています。
これじゃあLEDボードが接続できんではないか?
それにND80Z3.5と接続して入出力のテストをすることもできんではないか?
やっぱりもう一度基板を作り直すか?
結局はそういうことになってしまうかもしれませんが。

せっかく作った基板です。
なんとかこの配列のままでテストができないものか。
基板を作る過程では出力テストについては専用のLEDボードを作ってもよいではないかと考えていました。
たかだか12個のLED(と電流制限抵抗)の回路です。
ジャノ目基板に組んだってしれています。
しかしND80Z3.5との接続テストまでは考えていませんでした。
そのテストはあとになってから思いついたものですから。
フラットケーブルの途中をつなぎ直すとかジャノ目基板に16pinと26pinのコネクタを取り付けてその間を信号が合うように配線するとかというようなことも考えてみました。
昔ならばもうさっそくハンダゴテをにぎって作業に取り掛かったでしょうけれど。
さすがに今はそれほどのエネルギーはありませんし、立ち止まってじっくり考えてみるだけの心にゆとりができてきました。
で。
じっくり考えてみましたら。
おお。
なんとかなりそうです。
26pinの側をひっくり返して16pinと並べてみました。

これなら。
なんとかいけるんではないの?
ちょうど16pinのPC0〜PC7が26pinのPB0〜PB7に合っています。
ただし奇数番が偶数番に偶数番が奇数番につながります。
そして16pinのPB4〜PB7は26pinのPC0〜PC3に合っています。
こちらはPB4、5、6、7に対してPC2、3、0、1ですからちょっと乱れていますがそれなりに規則性があります。
これならなんとかいけるでしょう。
あとは電源ですが16pinの+5V(pin15、26pinではpin12)を26pinの斜め右下(pin9)に、16pinのGND(pin16、26pinではpin11)を斜め左下(pin10)にたすきがけにしてつなげばOKです。

まずはフラットケーブルの用意です。

片方を16pinコネクタに他方を26pinコネクタにしています。
ちょっと写真では見難いですが26pinの側はケーブルの1番を通常とは逆のpin26につないでいます。

+5VとGNDのたすきがけ配線をするのと上で作ったフラットケーブルコネクタとLEDボードの26pinフラットケーブルコネクタを中継するためのコネクタ基板です。

以前作った増設コネクタ基板を利用しました。

そこまで用意ができたところでいよいよテストです。
PICUSBIO−03をUSB接続したWindows7のBASIC画面です。

とりあえずの出力テストですからダイレクトモードでOUT命令を実行しました。
たったこれだけです。
BASICは実に便利です。
今までの82C55系のボードに合わせるために8ビットのI/Oアドレスを指定してデータを出力するようにしました。
しかし実際には82C55にはAポート〜Cポートとコントロールワードアドレスの連続した4アドレスしかありませんから8ビットのI/Oアドレスの下位2ビットのみでI/Oポートにアクセスするように考えてあります。

ビット表現   16進表現     アクセスポート
xxxxxx00  x0、x4、x8、xC    Aポート
xxxxxx01  x1、x5、x9、xD    Bポート
xxxxxx10  x2、x6、xA、xE    Cポート
xxxxxx11  x3、x7、xB、xF   コントロールワード

PICUSBIO−03ではPORTBとPORTCしかありませんからI/Oアドレスとしては1と2を割り当てることになりますがPIC側のプログラムが少し複雑になります。
どうせ2つだけしかないのですから最下位ビットのみで振り分けるように考えました。
PICUSBIO−03の場合にはI/Oアドレスの最下位ビットが0のときにPORTCにアクセスし、最下位ビットが1のときにPORTBにアクセスします。
ですから上の画面のOUT命令はPORTCに$AA(10101010)を出力し、PORTBに$55(01010101)を出力することになります。
PORTBは上位4ビットしかありませんから実際には$5Xが出力されることになります。

上の画面の命令を実行したときのPICUSB−03〜LEDボードの写真です。


LEDボードの部分のみ拡大しました。

上からAポート、Bポート、Cポートで左端がビット7で右端がビット0です。
点灯と消灯が通常の感じとは逆で勘違いをしてしまいそうですが、’1’で消灯、’0’で点灯します。
Aポートは接続していませんから’FF’で全部消灯しています。
Bポートには実はPICUSBIO−03のPORTCがつながっていてそのビット配列もLEDの通常の並びではありません。
C6 C7 C4 C5 C2 C3 C0 C1
になります。
PORTCには$AAを出力しましたから奇数ビットが1で偶数ビットが0になります。
0 1 0 1 0 1 0 1
です。
’0’で点灯’1’で消灯ですからそのようになっています。
ちょっと面倒ですねえ。
直感的ではありません。
それはともかくとして、PORTBです。
PORTBの上位4ビットがLEDボードのCポートの下位4ビットにつながっています。
C3 C2 C1 C0 には
B5 B4 B7 B6 
がつながっています。
PORTBには$55を出力しましたから奇数ビットが0で偶数ビットが1になります。
0 1 0 1
です。
’0’で点灯’1’で消灯ですからそのようになっています。
なおPC6が点灯していますがこれはLEDボードの26pinコネクタのPC6(pin11)がPICUSBIO−03のGND(pin16)につながっているためです。

16pinコネクタと26pinコネクタの端子配列がぴったり合わないまま接続しているために出力データをLEDで確認するのがちょっと面倒ですがそれでもとにかくOUT命令の通りにPICのポート出力が行なわれていることが確かめられたと思います。
今回はとりあえず出力のみをテストしました。
次回はさらに進んで入力のテストも行ないたいと思います。

PIC−USBIO using BASIC[第52回]
2022.9.12upload

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