概要
前回2電源の実験をしてみました。今回はそこで疑問に思った回路を深堀りして実験してみたいと思います。
基本の双方向回路(動かない)

Timeline | IO4外部入力 | IO4 LED | IO8 LED | IO8外部入力 |
1 | – | LOW | LOW | – |
2 | HIGH | HIGH | HIGH | – |
3 | – | HIGH | HIGH | – |
前回動かなかった回路です。PIN6(IO4)をHIGHにするとPIN13(IO8)がHIGHになります。ここまではいいのですがPIN6(IO4)がLOWになってもHIGHのままになってしまいます。
PIN6(IO4)の端子をLOWにしても両方のPINがHIGHになっているってことは、両方とも出力モードになっているということです。本来PIN6(IO4)かPIN13(IO8)のどちらかが入力で、どちらかが出力である必要があります。
出力をPORに変更(動かない)

回路的には下の端子がHIGHのときだけ、出力を行いますのでPORを接続しても最初の回路と同じ動きのはずです。線が減ったけれど、見やすくはないですね。

ラベルに変換してみましたが、特に見やすくはならないですね。
排他制御を入れてみる(動かない)

LUTで対象信号がHIGHで、反対側がLOWのときだけOUTがHIGHになる回路を追加しました。
Timeline | IO4外部入力 | IO4 LED | IO8 LED | IO8外部入力 |
1 | – | LOW | LOW | – |
2 | HIGH | HIGH | HIGH | – |
3 | – | HIGH | HIGH | – |
あれ、同時にHIGHにならないはずの排他制御なのですが、結果変わらず同時にHIGHになっています。

無駄に複雑化してみます。値が再計算しないのかなと思ってOSCのクロックをLUTにいれています。OSCの値は無視していますが、状況かららず。
謎の動作をしている場合には他のPINに出力を出してみるのに限りますね。
Timeline | IO4外部入力 | IO4出力選択 | IO4 LED | IO8 LED | IO8出力選択 | IO8外部入力 |
1 | – | LOW | LOW | LOW | LOW | – |
2 | HIGH | LOW | HIGH | HIGH | HIGH | – |
3 | – | HIGH | HIGH | HIGH | HIGH | – |
どうやらHIGHになったときには正常に排他処理できていますね。外部入力をなくしたところでお互いにHIGHになっています。なんで?

さらに内部構造を確認。動作的には同じですね。明示的な入力をしたときには正しい動きになりますが、入力がフローティングのときに両方HIGHになってしまいます。
厳密にはLEDがあるのでプルダウンなのですがだめです。
シミュレーターで実行

最初の回路でちょっとシミュレーターを動かします。

想定通り動いていますね。

思うところがあって、抵抗を入れてみました。

おっ、なんか実際の回路に近い結果がでました。この現象が回路で起こっていたみたいです。いろいろ抵抗値を変えて試したところ690Ωでは大丈夫ですが、691Ωだとだめでした。

拡大すると上記の波形でした。PIN6の出力を切っていますが電圧が落ちる前に次の判定でPIN6がHIGH入力判定されて、PIN3がHIGHに、、、

正常に動いていると思われる690ΩでもLOWに落ちた直後はちょっと嫌な波形になっていますね。学習ボードはプルダウンですが、LED経由で2kΩなのでこの条件に合致していると思われます。
対策例

バッファを入れた、前回動いた回路です。抵抗値は2kΩにしています。

結果は正常に動いているようにみえます。ばたばた動いていた出力有効信号がバッファを通過することで、遅延して伝達されているのでたまたまフィルタ的に動いているだけな気がします。
まとめ
んー、たしかに端子にたまった電荷ってすぐには抜けないよね。。。単純なデジタルで考えていると、実際の回路だとこんなことが起こるんですね。対策的には排他制御じゃなくって、フィルタが必要になりそうですね。
コメント