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


PIC−USBIO using BASIC

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

[第47回]



●テストプログラムを直しました

今回も引き続きPICUSBIOボードの紹介をするつもりでした。
ところが今回紹介する予定のボードのテストプログラムを作るために以前のボード用に作ったテストプログラムを利用しようとしたところ、プログラムにまずいところがあることに気が付いてしまいました。
ひょっとしたら、と思って過去記事を確認したところやっぱり思った通りでした。
下は[第45回]でPICUSBIO−06のテストをしたときの出力画面です。

そのときは気が付かなかったのですがよく見るとBポートの入力データ(左側)とCポートの入力データがずれています。
ND80Z3.5の82C55から同時に出力してそれをPICUSBIO−06で同時に入力したのですから左と右の値は同じになるはずです。
しかしどうやら左(Bポート)の値は1つ前の値のようです。
これはおかしい、ということでプログラムをあらためて確認してみました。
特におかしいところはないように思えたのですがさらによくプログラムの流れについて検討してみたところ考えが足りなかったことに気が付きました。
上で2つのデータを「同時」に出力して「同時」に入力した、と書きましたがそれは間違いでした。
ND80Z3.5側のプログラムは
60 OUT $81,A%
70 OUT $82,A%
ですから厳密に言えば「同時」ではなくてはじめにBポートから出力して、次にCポートから出力する、ということになります。
わずかですがCポートから出力されるデータはBポートから出力されるデータよりも少し遅れて出力されることになります。
一方PICUSBIO−06側のプログラムは
20 b=in(1):c=in(2)
ですからこちらもCポートから入力されるデータはBポートから入力されるデータよりも少し遅れて入力されることになります。
どちらもCポートのデータはBポートのデータよりも少し遅れることになります。
ですから遅れるほうのCポートを基準にして
30 IF A=C GOTO 20
というようにしたのですが、ここに考えの足りないところがありました。
図で説明します。

図の上側が今回の問題のタイミングを図で表したものです。
IN(2)はIN(1)にわずかに遅れて実行されます。
IN(1)とIN(2)がたまたま上のタイミングで実行されたとします。
このときIN(1)の入力値は”2”で、IN(2)の入力値は”4”です。
このときにIN(2)の入力値は”2”から”4”に変わったことになります。
そこでプログラムの30行
30 IF A=C GOTO 20
のIFが成立しなくなってプログラムはその次の40行のPRINT文の実行に移ります。
このときIN(1)の値はまだ”2”のままなのでPRINT文を実行した結果はIN(1)とIN(2)の値がずれて表示されることになります。

この問題を解決するにはどうすればよいか?
しばし試行錯誤をしたりして少し悩んだのですが、解決法は意外と簡単で図の下側のようにIN(1)とIN(2)の実行順序を逆にするだけでよかったのでした。
図の下側のタイミングではIN(2)の値が変わったときにはIN(1)の値は必ず同じように変わっています。
しかし図の下側ではIN(2)のあとIN(1)が実行される前にOUT $81が実行されてIN(1)の値がさらに変化することはないのでしょうか?
それは大丈夫なのです。
IN(2)、IN(1)が実行されてPRINT文が実行されたあとで行番号60の出力(ND80Z3.5へのエコーバック)が行なわれますから、そのときまでND80Z3.5の82C55の出力が変わることはありません。

ということでプログラムを下のように直しました。

20行の実行順序を逆にしました。
そのほかはもとのプログラムのままです。

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

今度は間違いなく左右の値が一致しました。

PIC−USBIO using BASIC[第47回]
2022.9.2upload

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