チャンネルデバイダーのVR制御(構想編8)

f:id:torusanada98:20180701090916j:plain

構想編8

リレー制御ブロックの基本回路を決めたので、それ用のリレー制御ソフト仕様を検討します。

ソフトの構造

現状のソフトはアイドル状態(state0)の先頭で表示処理を行っています。Up/Downボタンが押されると、SW確定時にチェンジリクエストフラグを立てて、表示処理内で表示変更を行っています。当初は、この処理にリレー制御を追加しようと考えましたが、減衰量切り替え前後のミュート処理を考慮して、メインループ中にリレー制御をキー処理とは独立に組み込む事としました。この実装によりキー処理とリレー処理が非同期となるので、うまく実装ができれば良好な操作性が実現できます。

f:id:torusanada98:20180701090936p:plain

ポート制御

リレー制御にはPB0~PB3を使用します。減衰=∞時は全て'L'なので、ポートの設定はPull-Up無しとして、外付け抵抗によりPull-downする事にします。

f:id:torusanada98:20180701091014p:plain

Relay[]配列には、各ATTstateに対応した4bitの数値を設定しているので各bitをそのまま各ポートに出力します。リレーの動作時間のばらつきにより、切り替え時に不定な状態が発生するので、ポート切り替えの前にミュートをかけてから切り替えを行いその後解除する処理を追加します。この処理は減衰量切り替え時のみに必要なので、単純なミュートのオンオフ切り替えでは必要ありません。このリレー制御の状態遷移用にRstate状態変数を設定し、Rstate=0は、無処理とし、リレー制御が必要となった時点でRstate=1として処理を進める事とします。

リレー制御リクエス

繰返しの説明となりますが、ここで言うリレー制御とは、ミュート処理が必要な減衰量切り替えの事で、単純なミュートのオンオフ制御は対象外とします。リレー制御要求はRstate=1とする事で処理をスタートします。キーの連続押しで、リレー制御が途中まで実行されていても、減衰量切り替えが必要となった場合はRstate=1として、かまわずリレー制御を再スターとさせます。Rstate=1とする条件を整理します。

①Upボタン(sw1)確定時。但し、ATTstateが0→1の場合を除く

②Downボタン(sw2)確定時。但し、ATTstateが1→0の場合を除く

f:id:torusanada98:20180703054252p:plain

f:id:torusanada98:20180703093744p:plain

リレー制御

Rstate=1では、ミュートオンしてミュートディレイタイマーを初期化し、Rstate=2とします。Rstate=2では、ミュートディレイタイマを監視し、タイムアップしたらATTリレーを設定変更し、ミュートディレイタイマーを再度初期化してRstate=3とします。Rstate=3では、ミュートディレイタイマーを監視し、タイムアップしたらミュートオフし、Rstate=0としてリレー制御を終了します。言葉でかくとわかりにくいので上記をフロー化します。一部、ミュートディレイタイマを無視して処理を進める条件を追加しています。ミュートディレイタイマーは、とりあえず100msとし、後で調整します。

f:id:torusanada98:20180701091217p:plain

ミュートボタンとの競合

リレー制御の途中にミュートボタンが押された場合の処理について整理します。

1)リレー制御中のミュートオン

リレー制御状態にかまわずミュートオンしmute=1とします。リレー制御はそのまま続行し、最後のミュートオフを行わずに終了します。この判断はmute=1またはATTstate=0でおこないます。

2)リレー制御中のミュートオフ

リレー制御中(Rstate!=0)の場合は、ミュートフラグのみ切り替えて(mute=0)ミュートオフの制御は行いません。リレー制御は続行して、その最後でミュートオフします。言葉で書くと単純ですが、はたして意図どうりに実装ができるでしょうか?これでリレー制御ブロック用のソフト仕様がかたまりました。次回は実際にコーディングし、デバッグを行います。

f:id:torusanada98:20180703093926p:plain

 

つづく(構想編9)