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


PIC−USBIO using BASIC

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

[第50回]



●PICUSBIO−10(3)なぜ今までのプログラムではだめなのか

前回は4ビットと8ビットの入出力ポートのデータをつないで見かけ上は12ビットとするプログラムについて書きました。
最初は今までに作ったプログラムをもとにしてそれを12ビットに対応したものに書き直すつもりだったのですが、それでは駄目だと気が付きました。
前回はそのように書いたのですが、そしてその理由も書いたのですがちょっと舌足らずな説明でした。
どうして駄目なのか、書いた本人はもちろんわかって書いたのですが。
前回は時間が無くて肝心のところをはしょって書いたものですから、そのように書いた本人が「いやSTROBEやREADYなどを使わなくてもいけるはず」なんて一度実際に駄目だと確認したことをまた追体験しようとしてしまいました。
誠に歳は取りたくないものであります。
もうこれ以上同じことを考えて残り少ない時間を無駄に浪費しないためにそこのところをしっかりと書いておくことにいたしました。

上位4ビットと下位8ビットを合わせて12ビットの入出力としてそこに8ビットのときと同じように1のビットを左シフトさせるプログラムを作ります。
そこで問題になるのは4ビットのポートと8ビットのポートからの出力が同時には行なわれないというところにありました。
わずかですが時間差があります。
そのことは入力においても同じです。
その時間差のために入力したデータを表示するところで同じ値を複数回表示してしまうという問題が発生しました。
それを避けるためにすでに入力表示済みの値と新たに入力した値を比較してそれが同じならば二重表示になるのでその値は捨ててしまって再度入力し直すというようにプログラムしました。
ところが前回書きましたように12ビットにした場合下位側の8ビットにシフトした値があるときは上位4ビットは0になってしまいます。
逆に上位側にシフトした値がある場合には下位8ビットが0になります。
すると上位側の4ビットも下位側の8ビットも0である期間が連続することになるので「先に入力した値と今回入力した値を比較して同じならばその値を捨てる」ことができなくなってしまいます。
それは上位側の4ビットを見ても下位側の8ビットを見ても同じことです。
「だから今までのプログラムでは駄目なのです」と前回は書いたのでしたが。
その説明には穴がありました。
駄目な理由はそれだけではありませんでした。
もうひとつ大きな理由がありました。
それはすでに過去回に書いているのですが書いた本人がすっかり忘れてしまっておりました。
もう一度。
本当に歳は取りたくないものであります。
そのことについては後で書くことにしまして、そのもうひとつの理由を忘れてしまっていると次のように考えることになります。
「上位側の4ビットを見ても下位側の8ビットを見ても駄目ならば両方を合わせて見ればよいではないか」

そのように考えて書いたプログラムを実行すると下のようになります。
ND80Z3.5のZB3BASICの画面です。

100行でこちらが出力したデータとPICから出力されたデータを比較して下位8ビットの値を比較します。
不一致ならまだPIC側がデータを受け取っていないと判断して再度PICからの値を入力します。
これだけだとすでに書きましたようにオール0の期間はスルーされてしまいます。
そこで次の110行で上位4ビットについて100行と同じことを行ないます。
このように二段構えでチェックすればよいはずです。
130行では下位8ビットの値のビット7が1かどうかを判定し、1ならば上位4ビットの値を0001にして下位8ビットの値を00000000にします。
ここと次の140行で上位4ビットのシフトを行ないます。

PICUSBIO−10側のBASIC画面です。

40行と50行で下位8ビットと上位4ビットの値をそれぞれ比較して値が異なっていれば70行のPRINT文にいきます。
ここもND80Z3.5のプログラムと同様に二段構えでチェックしています。
これならばうまくいくように思えるのですが…。

実行結果です。

上から4行目、13行目、18行目の表示におかしいところがあります。
実はこの問題については[第47回]に書いておりました。
そこに書きましたように下位8ビットの出力と上位4ビットの出力が「同時」ではなくてわずかな時間差で行なわれることが原因でした。
[第47回]では後から出力されたポートの値をチェックするという簡単な方法でこの問題をクリアしました。
ところが今回の12ビット出力のプログラムでは上位、下位のどちらを後から出力してもそのどちらにも連続して値が0になる期間があるために[第47回]の手法はとれません。
それが前回「この方法では駄目だ」と書いた本当の理由でした。
それをすっかり見事に忘れてしまったのでした。
むむむ。
もう一度。
誠に誠に歳は取りたくないものであります。

それで。
まともに動くプログラムについてですが。
今回書くつもりだったところを予定を変更してしまいましたので。
次回に書くことにいたします。

PIC−USBIO using BASIC[第50回]
2022.9.7upload

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