なんじゃらほい(2019/02/15 Fri 19:45) [ 編集 ] [ 返信 ]
お二方ともお久しぶりです。
何かうまく行ってないようなので、色々と原因を考えてみたのですが、あがっているデータを見る限りでは、特定困難だと思います。
実際にラッチ不良が起きたときのラッチICの波形をロジアナなどで捉えられれば、はっきりするのでしょうが、アマチュアの電子工作ではそうも行かないのは歯がゆいですね。
症状と発生状況と発生頻度を見る限り、ラッチタイミングの問題だろうとは思いますが、思いつく原因と発生頻度が一致しません。
私が思いつく原因なら「発生確率は桁不定で50%近く」になりますが、どうやらそれよりも大幅に低い模様です。
とはいえ、現状まだ問題を抱えていて、思いつく原因があるのなら、それを元に対策を考えてみようということでざっとやってみました。
思いついている原因はLE端子に加えられているクロック信号の、ラッチ実行スイッチによる不適切な途切れではないかと。
それを図にしました。
で、対策はクロックを断続的にして、不適当な途切れが起きないようにしてみる。 ということです。
原因がはっきりしない段階で、無責任な口出しをして他人の手を煩わせるのは気が引けますので、断続的にクロックを生成するプログラムを書きました。(スイッチ部を工夫すればラッチ操作も同時にできそうです・回路図参照)
以下はそのHEXです。マイコンは16F87です。(回路図は原因考察図の下にあります。)
:020000040000FA
:10000000831660308F000F308600BC30850081176A
:1000100007309C008312850186010030AD00BA20B4
:100020002E08A6000130AD00BA202E08A70018281F
:10003000851B1828EC20851B1828EC20851B182808
:10004000EC20851B12282708A80005193D288519D2
:100050004928051A55280618612886186D2806199A
:100060007928861985282528A80B2528851F362854
:10007000EC20851F3628F22018280530A900051D20
:100080002728A90B3F28851491208510051946289B
:1000900025280530A900851D2928A90B4B28051402
:1000A000912005108519522825280530A900051E24
:1000B0002B28A90B5728051791200513051A5E2830
:1000C00025280530A900061C2D28A90B63288617B2
:1000D0009120861306186A2825280530A900861C59
:1000E0002F28A90B6F28061791200613861876284B
:1000F00025280530A900061D3128A90B7B28861666
:10010000912086120619822825280530A900861D0F
:100110001828A90B872806169120061286198E2802
:1001200034282608AA00D020AA0B9328080083169A
:1001300003178C189928831203132D0883120317B1
:100140008D00831203132E08831203178C0083166D
:1001500003178C130C158B1355308D00AA308D00AE
:100160008C14831603178C18B3288B170C11831269
:10017000031308002D08831203178D00831603173D
:100180008C130C14831203170C0883120313AE0094
:10019000080000000000000000000000000008004F
:1001A0001330A100000000000000A10BD2280000C5
:1001B000000008006430A300000000000000000000
:1001C000000000000000A30BDC2808003230A4006F
:1001D000D020A40BE82808006430A400D020A40B91
:1001E000EE2808002830A500E620A50BF42808001A
:1001F0006430A500E620A50BFA280800C930A50048
:08020000E620A50B002908000F
:02400E00503F21
:02401000FD3F72
:0642000015000A00000099
:00000001FF
やっていることは、クロック生成スイッチが押されたら、10mS毎に再チェックを3回行い(チャタリング対策)、それでもSWがONなら、アクティブになっている桁をサーチ。
検出された桁が再度アクティブか複数回チェックし、OKなら、一定時間該当ポートをONにし、時間が過ぎたらOFFにします。
同じ桁の多重処理を防止するために、桁信号がLOになるまでループします。
LOになったら別のアクティブな桁がどれかをスキャンします。
それを指定回数繰り返します。
クロック生成スイッチはNC/NO端子のあるモーメンタリー(押したときだけ動作する)スイッチの方が操作性は良さそうです。
「クロックを送る回数」は最低は「各桁1回」で問題ないはずですが、スイッチによっては数十ミリ秒のチャタリングが起きる可能性があるので、6桁×9〜10回(処理時間最大180mS)行い、その後クロックの生成を停止します。
クロックの生成が終了したら、スイッチの解放待ちループを行い、その後200mSのウェイトが入っています。
モーメンタリーSWを使いパルス生成とラッチを同じスイッチで同時に行う場合は「1秒押し」という感覚でやるとうまく行くはずです。
押し時間があまり短いとクロック送出中にスイッチがオフになりラッチ不良となる可能性があります。
押し時間が短いなら、送りターン回数が少ない方がラッチ不良の可能性が少なくなります。
ポートのON時間(ラッチパルス長)はHEXの最後から2行目の15(HEX)で100μ秒×HEXの値です。
H'15'なら10進では20なので、現在の値は2mSです。
連続送信ターン数はHEXの最後から2行目の0A(HEX)で10進数では10で10回です。
パルスの時間も、送り回数ターン数もEEP領域を書き換えれば変更可能ですが、チェックサムが行の最後にあるので、そちらも変更しないとエラーで書き込めなくなります。
計算方法は過去ログにありますが、簡単に言うと「1増やしたらチェックサムから1を引く」です。
http://mpga.jp/akizuki-fan/index.php?mode=article&id=2638&page=1