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


PIC−USBIO using BASIC

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

[第41回]



●82C55の入力サンプルプログラム

今回はPIC−USBIOの82C55の入力サンプルプログラムです。
入力といっても前回まで書いてきましたINPUT命令などのことではありません。
PIC−USBIOの82C55のハードウェア入力のサンプルプログラムです。
PIC−USBIOの82C55からデータを出力するサンプルプログラムは[第36回][第37回]でルーレットプログラムとして紹介しました。
82C55は出力だけではなくて入力も行なえる双方向のI/Oデバイスです([第34回]参照)。
出力のサンプルプログラムは簡単なのですが入力プログラムはちょっと面倒です。
スイッチを何個かつけてそれをON、OFFするというようなプログラムなら簡単ですが余り面白くありません。
何かもう少し面白いサンプルプログラムができないものか。
先日から時折考えていたのですがちょっとしたアイデアを思いつきました。
すでに説明していますようにPICUSBIO−01は82C55を搭載しています。
ND80Z3.5などの当社マイコンボードの多くも82C55を搭載しています。
各ボードの82C55の入出力を外部回路に接続するために26pinのフラットケーブルを使います。
その26pinコネクタの信号端子配列は全て同じ仕様になっています。
PICUSBIO−01の82C55の入出力信号用も26pinのフラットケーブルコネクタを使っていてその信号端子配列もND80Z3.5などのI/O入出力信号の端子配列と同じにしてあります。

そういうことならば。
ND80Z3.5とPICUSBIO−01の26pin入出力コネクタをフラットケーブルで接続して、ND80Z3.5からデータを出力して、それをPICUSBIO−01の82C55に入力して、そのデータを表示するプログラムを作ったらちょいと面白いものができそうです。
こんな感じです。

左がPICUSBIO−01です。
右がND80Z3.5です。
このND80Z3.5は試作品なのでレジストがありません。
もう10年も前に作ったボードなのですが壊れないので今でもこうやって使っています。
もちろん製品版のND80Z3.5のプリント基板はグリーンレジスト仕様です。
余談になりました。
右側のND80Z3.5の82C55入出力コネクタと左側のPICUSBIO−01の82C55の入出力コネクタを26pinフラットケーブルで接続しています。
ND80Z3.5の82C55からデータを出力してPICUSBIO−01の82C55にそのデータを入力します。
下はND80Z3.5で82C55にデータを出力するプログラムを実行しているところです。

簡単なプログラムですがPICUSBIO−01側で受け取ったデータを表示し易いようにちょっと工夫しています。
ND80Z3.5の82C55はAポート〜Cポートを全部出力に設定しています。
10行のOUT文です([第34回]参照)。
今回のプログラムではAポートしか使いません。
AポートからSINウェーブを出力します。
SINウェーブは+1〜−1の範囲の値をとりますがそれを0〜240の範囲の値に変換してAポートから出力します。
8ビットですから0〜255までの値を出力できますが、PICUSBIO−01側のプログラムでその値を表示するために都合が良いように240までの値にしています。
ND80Z3.5のZB3BASICは実数型の計算ができますから1度きざみでも0.1度きざみでも細かい値まで計算可能です。
しかしそれでは値の変化が緩やかになりすぎてサンプルとしては不適当ですからここでは5度きざみにしました。

PICUSBIO−01側のプログラムです。
logfile piciolog\08182109.txt open
*** pic i/o ***
>/load intest.txt
loading intest.txt ...5lines read ok
*convert*
>list
   10 out $83,$9b                                                             
   20 a=in($80)/3                                                             
   30 if a>=80 a=79                                                           
   40 print spc(a);"*"                                                        
   50 goto 20                           

簡単なテストのためのサンプルプログラムですからたった5行のプログラムです。
こちらの82C55もAポートだけしか使いませんがND80Z3.5の82C55がAポート〜Cポートの全ポートを出力に設定していますからこちらの82C55はAポート〜Cポートの全ポートを入力に設定します。
10行のOUT文です([第34回]参照)。
20行でAポートから入力した値を3で割ったものを変数Aに入れます。
つい習慣で82C55のアドレスに$80〜$83を使ってしまいました。
PICUSBIO−01の82C55はI/Oアドレスの末尾2ビットだけが有効なので$83でも$03でもどちらでも構いません。
ところでなぜ/3なのかというと、このあとでPRINT文でデータを簡易グラフとして表示するためです。
画面の横幅が80字なので0〜240までの入力データを3で割って最大値を80にするためです。
ただND80Z3.5でも簡単なプログラムで出力値を約240以下にしていますのでひょっとすると80より大きい値になるかもしれません。
それと簡易グラフ表示に’*’を使いますからその分の1文字を引いて最大値を79にしています。

プログラムを実行しました。
>run
                                                                              *
                                                                            *
                                                                          *
                                                                      *
                                                                    *
                                                              *
                                                            *
                                                        *
                                                     *
                                                  *
                                              *
                                           *
                                        *
                                        *
                                    *
                                 *
                             *
                          *
                          *
                       *
                    *
                    *
                 *
                 *
              *
              *
           *
         *
         *
       *
       *
     *
     *
   *
   *
  *
  *
 *
 *
*
*
*
*
*
*
*
*
*
*
*
 *
 *
  *
  *
   *
   *
     *
     *
       *
       *
         *
           *
           *
              *
              *
                 *
                   *
                       *
                          *
                             *
                             *
                                 *
                                        *
                                           *
                                              *
                                                  *
                                                     *
                                                        *
                                                              *
                                                                 *
                                                                      *
                                                                        *
                                                                          *
                                                                             *
                                                                              *
                                                                               *
                                                                               *
                                                                               *
                                                                               *
                                                                              *
                                                                             *
                                                                            *
                                                                          *
                                                                        *
                                                                      *
                                                                    *
                                                                 *
                                                              *
                                                            *
                                                        *
                                                     *
                                                  *
                                              *
                                              *
                                           *
                                        *
                                    *
                                 *
                                 *
                             *

最小値と最大値の近辺がちょっとフラットになっていますが、もとの実数値を整数値に変換してさらにそれを0〜79の範囲の値に押さえ込むためにその近辺の値に無理が出るためです。
全体を見るとSINウェーブになっていますでしょう。

横80字表示のPRINT文を使う簡易グラフとしてはまあこんなものですが、もう少しましなグラフにするにはどうしたらよいでしょうか。
[第7回]でデータをCSV形式のファイルとして記録する機能について書きました。
CSV形式ですからあとでそれをEXCELで開くことができます。
入力データをCSV形式で記録して、それをEXCELで開いてグラフ表示してみたらよいのではないでしょうか。

そのようにプログラムを作成して実行しました。

今度はPRINT文で画面に表示するのではありませんから3で割る必要はありません。
入力したデータをそのままファイルとして記録します。
サンプルですから500データもあればよろしいでしょう。

作成したファイルをEXCELで開いてグラフ表示しました。


今回はPICUSBIO−01の82C55の入力プログラムのサンプルとしてこんなものを考えてみたのですが、よくよく考えてみるとこれはデジタル値の入力というよりもむしろアナログデータの入力サンプルに近いものになっています。
データをND80Z3.5のZB3BASICで作ったのでこういう値を作成できたのですがそのような計算値ではなくてPICUSBIO−01の82C55のコネクタに入力される信号データとしてこういうものを考えるならばコネクタの先にADコンバータ回路を接続することになります。
そこまで考えると82C55をPICUSBIOでコントロールするという当初の目的とは別にPICそのものに内蔵されているADコンバータを制御できるような機能も付加してみたくなってしまいます。
せっかくそのように思いついたのですからそういう機能のボードもいずれ作ってみることにいたしましょう。

PIC−USBIO using BASIC[第41回]
2022.8.19upload

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