赤外線リモコンの検討(製作編2)

f:id:torusanada98:20210814202110j:plain

製作編2

DACユニットを改造し、赤外線受信ユニットの実装を完了します。

DACユニット改造1

最初にarduino UNOに装着しているバニラシールドを改造します。改造内容はIR信号と電源、GNDの配線追加です。

f:id:torusanada98:20210814202137j:plain

現状、I2C用のレベル変換IC以外は端子台しか実装されていませんが、実装スペースはあまり残っていません。マイコン基板とのクリアランスが小さい為、実装できないエリアもあるため、端子台実装候補エリアは右上の一択の状況です。

f:id:torusanada98:20210814202201j:plain

3本の配線ですが、すでに被覆線を使って配線されている状態の為、GND配線のみジャンパ線で、5Vと受信信号配線は被覆線を使用しました。

f:id:torusanada98:20210814202223j:plain

ここまでの改造で一度動作確認を行います。追加搭載した端子台にステレオミニジャックを接続しました。

f:id:torusanada98:20210814202246j:plain

機内のarduino UNOに実装するとこんな感じです。

f:id:torusanada98:20210814202307j:plain

ステレオミニジャックに赤外線受信モジュールを接続して、DACユニットの電源を入れました。リモコン受信、キー操作、再生音ともに問題ありません。

DACユニット改造2

次はリアパネルへのジャック取り付けと機内配線を行います。リアパネルの取り外しは地味に大変なので、多少リスクはありますが、完成状態で穴あけ改造を行います。穴径は約7mmです。小型のL字定規を使って適当な位置に印をつけました。

f:id:torusanada98:20210814202347j:plain

加工に入る前に、機内の基板へアルミ片が飛ばないように、紙で簡単にガードをしました。

f:id:torusanada98:20210814202402j:plain

加工完了後に紙を取り去って、掃除機でアルミ片を吸引する予定です。次は、ポンチで位置出しを行うところですが、組立状態を考慮して代わりにφ2mmのビットを使ってマニュアルで穴あけを行いました。ある程度窪みができたところでドリルで穴あけしました。最後はφ7.2のビットで穴あけしましたが、若干広げる必要がありやすりで拡大して取り付け可能な状態となりました。

f:id:torusanada98:20210814202426j:plain

次は配線を行います。ステレオミニジャックへの配線は細かな作業となるので、先に半田付けして電線を穴に通してジャックを固定しましいた。使用した電線は2芯シールド線で、シールドをGNDに、赤の被覆線を5Vに、黒の被覆線をIR信号線としました。

f:id:torusanada98:20210814202539j:plain

反対側は長さを調整して端子台に接続しました。

f:id:torusanada98:20210814202601j:plain

これで改造完了です。リアパネルはこんな感じになりました。

f:id:torusanada98:20210814202623j:plain

動作確認

動作確認はこれまでの確認と同様に、真空管ヘッドフォンアンプにバランスヘッドフォンを接続して音を聴きます。ステレオミニジャックに、HDMI切替機の付属品を流用した赤外線受信モジュールを接続して、受信モジュールをユニットの手前に置きます

f:id:torusanada98:20210814202646j:plain

電源オンして、初めにキーの動作を確認しました。問題なかったので続いてリモコン受信確認を行います。これも問題ありません。最後に音を聴いてみます。正しく再生できていて、アッテネーション機能も問題ありませんでした。これで改造完了です。完成時の機内配線はこんな感じです。

f:id:torusanada98:20210814202710j:plain

次回は、改造完了したDACユニットをマルチアンプシステムに組み込んで使ってみます。最後にリモコン機能追加のまとめも行います。

 

つづく(まとめ編)

赤外線リモコンの検討(製作編1)

f:id:torusanada98:20210814070435j:plain

製作編1

リモコン機能を移植したソフトをDACユニットに書き込み動作確認を行います。

移植ソフト動作確認

移植ソフトは、マイコン基板単体でリモコン受信確認までできているので、問題はないとおもいつつDACユニットのマイコン基板へ転送して、まずはキー操作への影響が無い事を確認します。電源オンするとデモ表示は問題ありません。ヘッドフォンの音がおかしいです。モノラルで中抜けの音です。どうやらDAC ICへのコマンドが正しく発行されていないようです。最初に原因として思い当たった点は、ライブラリ間の競合です。DACユニットのソフトウェアではI2C処理用のLCD表示用のを使用しています。リモコン受信用のソフトウェアはタイマー割り込み用のを使用しています。試しに、リモコン受信処理ソフトを無効化してみました。

f:id:torusanada98:20210814070501p:plain

写真はライブラリをコメントアウトしていますが、このライブラリで定義された関数も全て無効化しています。改めてソフトを転送して音を聴いたところ、正常再生する事が確認できました。しかし、次の障害発生です。本体のキーが機能しません。ソースを見直したところ、位相切り替えキー用ポートとリモコンの割り込み処理モニター用ポートが競合している事がわかりました。割り込み処理モニター用ポートを4に変更したところ、本体のキー機能は復活しました。作成した回路図ですが、PBをデジタルI/Oポート、PAをアナログI/Oポートとしていたようです。PB4に割り込み処理モニター出力を変更した回路図を作成しました。

f:id:torusanada98:20210814070528p:plain

リモコン受信ソフト修正

samplecode05まで戻ってソフトを移植用に再修正を行います。新たなsamplecod06では以下の修正をします。

・130msウエイトをMsTimer2を使わずにMain loop内に実装

・Int0をトリガ条件をFALLINGからLOWに変更

・キーコードの受け渡し変数keyのグローバル変数

最初はInt0処理の修正です。

f:id:torusanada98:20210814070609p:plain

修正は単純で、130msタイマー用にInt_WTにミリ秒単位の初期値を保存するだけです。次はMain処理です。

f:id:torusanada98:20210814070628p:plain

Int0が無効時に130ms経過を判断してInt0を有効化しています。わざわざMsTimer2を使って複雑にする必要は全くありませんでした。やれやれ。写真は正常時の受信波形とディーガリモコン受信時の波形です。

f:id:torusanada98:20210814070745j:plain

f:id:torusanada98:20210814070757j:plain

f:id:torusanada98:20210814070806j:plain

どちらも問題なく応答しています。

再移植

demo13のソフトに上記で修正したリモコン受信ソフトを再移植します。具多的な対応は以下のとおりです。

・Samplecode06を移植

・Main loopにInt0処理を追加

・Int0処理モニタ出力ポートをPB4に修正

・Ver2.00に変更

写真はMain loopの一番おしりの部分です。

f:id:torusanada98:20210814070840p:plain

2つのDAC ICへアッテネーションコマンドを発行して最後に130msタイマー処理を行っています。上記で再移植したソフトをDACユニットへ書き込み動作確認を行いました。再生音に問題はありません。またキー操作およびその機能にも問題ありませんでした。

受信モジュールの接続

動作確認用にDACユニットのマイコン基板に受信モジュールを接続します。DACユニットのarduino UNOにはバニラシールド基板が乗っていますが、全端子がピンソケットとして乗っているので接続には問題ありません。電源とGNDおよびPB2にピン端子を利用してφ3.5のステレオミニジャックを接続しました。

f:id:torusanada98:20210814070909j:plain

f:id:torusanada98:20210814070920j:plain

これで準備完了です。電源オンしてリモコン受信を試してみました。波形は以下のとおりです。

f:id:torusanada98:20210814070943j:plain

正常に受信できています。アッテネータおよびLCD表示も正常に機能しています。減衰量もダイレクトに指定できるので、操作性も格段に向上しました。まぁ、今までが悪すぎただけですが・・・。これで動作確認は完了です。次回は機内の実配線を行い完成を目指します。

 

つづく(製作編2)

赤外線リモコンの検討(構想編8)

f:id:torusanada98:20210812200954j:plain

構想編8

DACユニットのソフトウェアにリモコン受信サンプルコードの移植を行います。

移植機能詳細

以前の記事で、DACユニットのアッテネータ制御機能を実装する方針としていましたが、具体的な機能を明確にします。写真はキット付属のリモコンです。

f:id:torusanada98:20210812201017j:plain

使用するキーは、VOL+, VOL-, 0, 1, 2, 3の6つのキーです。それぞれのキーコードは以下のとおりです。

f:id:torusanada98:20210815073920p:plain

処理の欄は、DAC ICのATT用パラメータの数値を示しています。この一覧表を作成していていまさらながら、サンプルコードの仕様は独自仕様である事に気づきました。フレームフォーマットのタイミングは共通ですが、カスタマコードおよびキーコードの扱いが異なっています。

f:id:torusanada98:20210812201057p:plain

単にサンプルコードの処理の仕様かもしれませんが、必要な機能が実装できればいいので深追いしない事にします。

移植

Main処理以外は、作成済みのサンプルコードをそのままコピーします。コピー箇所がわかるようにコメントも追加しました。下記が宣言部2カ所とセットアップぶ及び関数部のコピー部分です。

f:id:torusanada98:20210812201121p:plain

f:id:torusanada98:20210812201134p:plain

f:id:torusanada98:20210812201145p:plain

f:id:torusanada98:20210812201155p:plain

最後はMain処理の作り込みです。Main処理中のIR処理のフローは以下のとおりです。

f:id:torusanada98:20210812201222p:plain

これを実際の処理に落とし込みました。

f:id:torusanada98:20210812201237p:plain

これで移植完了です。

デバッグ準備

久しぶりにDACユニットを引っ張り出しました。確認用に真空管バランスヘッドホンアンプを接続しました。

f:id:torusanada98:20210812201309j:plain

DACユニットのソフト書き換えは、完成後初めてとなります。さっそく天板を外してマイコン基板にUSBケーブルを接続しようとしましたが、トランスと干渉してUSBケーブルの端子が挿さりません。仕方がないので、トランスの固定ねじを外してトランスを移動し、むりやりUSBケーブルを接続しました。

f:id:torusanada98:20210812201332j:plain

最初にLCD表示処理を関数化したVer1.01を書き込んでベースのソフトウェアの動作確認を行います。コンパイル後の書き込みでエラーが発生しました。

f:id:torusanada98:20210812201352p:plain

メッセージは「ser_open(); can't open device "\\.com4":指定されたファイルが見つかりません。」です。ネットで検索しましたが、ピンとくる書き込みが見つかりませんでしたが、1つだけ「バスパワーの供給電力不足」目にとまりました。書き込み時の状態ですが、DACユニットの電源をオフしていますが、USBケーブルを接続するとバスパワーによりマイコンから電源供給されてLCDが正常表示されていました。試しにバニラシールド基板を外して改めて転送をしてみました。

f:id:torusanada98:20210812201419j:plain

予想が的中し、書き込みする事ができました。arduino UNO基板自体はPCから正常に認識されていますが、書き込みを行うと処理により消費電力が増えて正常動作しなくなったようです。書き込み後の動作は問題ありませんでした。

LCD表示色の変更

せっかくなのでLCDの表示色の変更をしてみます。具体的にはRGBのバックライトレベルの変更です。現状は各色ともに255のフルパワー点灯させています。製作当時は、とにかく白の表示をさせるという事で何も試さずに全色255設定にしました。試しにBLUEのみ255で他を消灯してみました。こんな感じです。

f:id:torusanada98:20210812201442j:plain

写真では表示が見えていますが、視認性が悪いため採用できません。いろいろと試しましたが、全色150が良さそうです。表示は若干暗くなりましたが、コントラストは上がった感じです。次回は移植ソフトウェアの動作確認を行います。

 

つづく(製作編1)

赤外線リモコンの検討(構想編7)

f:id:torusanada98:20210810175813j:plain

構想編7

DACユニットのソフトへの組み込みの検討を行います。

DACユニットソフトウェア構成

リモコン受信処理を組み込むDACユニットのソフトウェアの構成を確認します。図は現行のソフトウェアのジェネラルフローチャートです。

f:id:torusanada98:20210810175852p:plain

大きく3つの部分で構成されています。イニシャル処理は、必要な設定とデモ表示を行います。キー検出処理は、3つあるキーの検出のみを行います。キー処理はキー検出処理で確定したキーオン情報に従ってDAC ICへのコマンド発行および表示処理を行います。

リモコン受信処理組み込み

現状のDACユニットソフトウェアのジェネラルフローチャートに赤外線リモコン受信処理を組み込みます。

f:id:torusanada98:20210810175927p:plain

Main loop中には、従来の処理に影響を与えないように独立してIR処理を追加しました。従来のキー処理に相当します。それ以外に、外部割り込みのInt0処理でリモコンの受信処理を行います。2重受信防止用のタイマー処理の為にタイマー割り込みMsTimer2処理も追加しました。この処理の中でInt0を有効にしているわけではないので、わざわざMsTimer2を使わずとも同様の機能実装ができる事に気がつきましたが、現時点ではこのままとします。それでは変更した処理のフローを整理します。最初はイニシャル処理です。

f:id:torusanada98:20210810175951p:plain

ここではMsTimer2のライブラリ登録とIR受信の為の入力ポート設定およびデファインを行っています。次は追加した外部割り込みInt0処理です。

f:id:torusanada98:20210810180015p:plain

処理の最初でInt0割り込みを無効にして、Int0の多重割り込みを禁止します。Leader検出をしたら32bitの受信処理を行い、カスタムコードチェックを行ってキーコードを確定します。キーコードの受け渡しはグローバル変数で行います。次はMsTimer2処理です。

f:id:torusanada98:20210810180039p:plain

Int0が有効の場合は処理をぬけます。無効の場合は、130msのウエイトを置いてInt0有効化フラグをセットします。最後はIR処理です。有効なIRコードがある場合、ATT処理と表示処理を行います。Int0が無効の場合は、130msウエイトの状況を判断してカウントアップした場合は、Int0を有効に戻します。

DACユニットソフトウェア移植準備

移植にあたり、キー処理フロー中のATT処理を事前に確認します。写真が現行ソースの抜粋です。

f:id:torusanada98:20210810180106p:plain

先頭のKTSTはキーステータスでATTキーが押された事が確定すると0x64になります。AT変数に現状のDAC IC用のATTパラメータが保存されていて、1回押すごとに値を-2しています。DAC ICへのコマンド発行は関数化されています。その下はLCD表示用に処理がべた書きされています。この処理はIR処理でも行うため、関数化します。

f:id:torusanada98:20210810180212p:plain

byteデータを引数とするAT_disp関数です。この関数を使う事でMain処理では、この関数をコールするだけですみます。

f:id:torusanada98:20210810180318p:plain

続いて、リモコンサンプルコードで取得したキーコードをMain処理への受け渡しできるようにします。リモコン処理は割り込み処理なので、キーコードをグローバル変数で受け渡しします。下記が現状のリモコンサンプルコードです。

f:id:torusanada98:20210810180343p:plain

キーコードはローカル変数keyの格納されています。事前にkeyをグローバル変数宣言して使用します。

f:id:torusanada98:20210810180359p:plain

具体的にはget_ir_key関数を使ってキーコードを格納するkey変数のint宣言を削除しています。そのかわりに、ソースの先頭でint key;でグローバル変数宣言を行っています。次回は移植を行います。

 

つづく(構想編8)

赤外線リモコンの検討(構想編6)

f:id:torusanada98:20210808221833j:plain

構想編6

DACユニットへ赤外線リモコン受信機能の実装検討を行います。

対象機器選択

今までに製作した機器で、arduino UNOを搭載したものは12chアッテネータとDACユニットです。両機器の運用形態ですが、12chアッテネータは音楽鑑賞時にリスニングポイント手前のテーブルにチャンネルデバイダとともに引っ張り出します。

f:id:torusanada98:20210808221855j:plain

従ってわざわざリモコンを使って操作する必要はありません。一方、DACユニットはスピーカーの間のラックに設置している為、音楽鑑賞時に操作する事ができませんでした。

f:id:torusanada98:20210811191625j:plain

今回は利便性を考えて、DACユニットへ機能追加の検討を行います。

DACユニット機能

DACユニットには、電源スイッチの他に3つのボタンがあります。それぞれのボタンへの機能割付は以下のとおりです。

1)オーバーサンプリング周波数切り替え

2)位相切り替え

3)アッテネーションレベル切り替え

1)と2)は通常使用する事はありません。3)はステップの荒い12chアッテネータを補完するために付けた機能です。通常の0dBで使用しますが、補完が必要な場合、1.0dBステップで最大-3.0dBまでのアッテネーションが可能です。音楽鑑賞時に使用したい場面が多々ありましたが、手が届かないため使っていませんでした。また1つのボタンで機能実装しているため、ボタンを1回押すごとに、0dB→-1.0dB・・・-3.0dB→0dB→-1.0dB・・・変化し、操作性に問題のある実装となっていました。これを機会に赤外線リモコンで操作性の改善も行いたいとおもいます。

DACユニットマイコン回路図

始めに、arduino UNOに赤外線受信モジュールの接続検討を行います。現状のDACユニットのマイコン回路はどうなっているかというと、以下のとおりです。

f:id:torusanada98:20210808221929p:plain

シリアルポートを使ってI2C用のDSDとSCLを準備してLCDパネルとDAC ICを制御しています。PA5~6はSW検出用の入力ポートとして使っています。幸いInt0用のPA2は使用していませんでした。従って単純にリモコン受信モジュールを試験用回路と同様に接続します。回路は以下のとおりです。

f:id:torusanada98:20210808221944p:plain

受信ユニットの組み込み

写真がキットの受信モジュールです。

f:id:torusanada98:20210808222029j:plain

DACユニット完成品への組み込みは大変そうなので、受信モジュールのみ外置きとする事にしました。本体への接続は3極なのでφ3.5のステレオミニプラグを使用します。接続時のリスク回避の為、根本をGND、中間をIR信号、先端を5Vとします。

f:id:torusanada98:20210808222121j:plain

HDMI切替機受信モジュール流用検討

ここまで検討した時点で、現在使用していないHDMI切替機の受信モジュールがある事を思いだしました。

f:id:torusanada98:20210808222151p:plain

写真中のBの部品です。この受信モジュールの端子もφ3.5のステレオミニプラグです。但し接続仕様がわからない為、中継用のケーブルを作成して信号を横取りして確認してみました。

f:id:torusanada98:20210808222315j:plain

初めに無入力時の端子電圧を確認しました。私の考えた仕様と同じで根本がGNDで残りが5Vとなっていました。続いて受信波形を確認します。私の仕様と合わせて、端子中間の信号波形をモニタしてみました。結果は以下のとおりです。

f:id:torusanada98:20210808222338j:plain

予想が的中しました。私の接続仕様で流用できそうです。実際にarduino UNOに接続して受信確認を行ってみました。写真は受信確認風景と受信時のIDE画面および受信波形です。

f:id:torusanada98:20210808222446j:plain

f:id:torusanada98:20210808222504p:plain

f:id:torusanada98:20210808222518j:plain

問題なく受信できる事が確認できました。これでハード面での改造仕様が確定できました。次回はソフトの移植検討を行います。

 

つづく(構想編7)

赤外線リモコンの検討(構想編5)

f:id:torusanada98:20210807184838j:plain

構想編5

割り込みに対応したコードをさらに見直します。

コードの見直し

現状のコードのパルス長の読みとりにはpulseIn()関数を使用しています。この関数にはタイムアウトの設定ができますが、現状は設定していません。ネットで検索すると、デフォルトのタイムアウト時間は1秒との事でした。以下の状況では1秒間処理がMain loopに戻らない事になります。

1)赤外線が点灯したままの状態

2)赤外線が一旦消灯し、再点灯しない状態

という事でタイムアウトを設定する事にしました。下記が赤外線リモコンNECフォーマットですが、Leader長を考慮すると24T以上の時間以上を設定する必要があります。

f:id:torusanada98:20210807184901p:plain

562us x (16 + 8) = 13488us

一旦13500usを設定して確認してみまた。その時の動作波形は以下のとおです。

f:id:torusanada98:20210807184925j:plain

Leader検出前にpulseIn()関数がタイムアウトして正しく受信ができません。タイムアウト時間は13500usに設定しているにもかかわらず9400usでした。この結果から約1.5倍くらいの設定時間が必要となります。試しにタイムアウト時間を20500usに設定したところ正しく受信できるようになりました。どうして誤差が大きいのかpulseIn()関数について調べてみたところ、この関数の時間計測にはマイコンの処理ステップ数を使用しているとの事がわかりました。さらに調べたところ、タイマー割り込みを使用した同等の機能のpulseInLong()関数がある事がわかりました。関数を変更して改めてタイムアウト時間を13500usに設定してみたところ正しく動作する事が確認できました。タイムアウト時間は余裕を見て15000usとします。同様にデータビットの読み込み部分も約5Tに相当する2900usのタイムアウト時間を設定しました。

処理の見直し

Int0で実行される受信処理の最後に、2重受信防止の為に130msのwaitが入れられています。

f:id:torusanada98:20210807184958p:plain

この間、Main loopが走らないのは無駄なので、Main loop内で130msのwaitの実装を検討します。変更の概要は以下のとおりです。

・受信処理のdelay(130)を削除

・かわりにタイマー用のレジスタを初期化して、IR_WF=0(Int0有効化要求なし)

・10msのタイマー割り込み(MStimer2)を設定して以下の処理を行う

 タイマーのカウントアップ

 130ms経過でIR_WF=1(Int0有効化要求有り)&タイマーカウントアップ無効

タイマー割り込みMsTimer2は以前に一度使っているのでおさらいします。仕様概要は以下のとおりです。

・ライブラリMsTimer2.hをインクルードする

・設定はMsTimer2::set(ms, 関数)で行う

・割り込みの有効化はMsTimer2::start()

・割り込みの無効化はMsTimer2::stop()

それでは具体的な実装を紹介します。最初はタイマー割り込み処理IR_wait()です。

f:id:torusanada98:20210807185050p:plain

Int0処理と同様に処理の先頭で多重割り込みを許可します。Int0が有効時はそのままretrunします。無効時はタイマを10msカウントアップして、タイムアップ判定を行います。タイムアップ時はIR_WF=1としてMain処理へInt0有効化を要求します。次はInt0割り込み処理です。

f:id:torusanada98:20210807185118p:plain

delay(130)を単純に無効とするのではなく、必要なフラグ設定を行います。最後にMain処理です。

f:id:torusanada98:20210807185141p:plain

IR_WF=1(Int0要求化要求)を検出するとInt0を有効にします。念のためフラグ処理前後でタイマー割り込み処理を止めています。この対応による効果は以下のとおりです。

f:id:torusanada98:20210807185205j:plain

f:id:torusanada98:20210807185216j:plain

上が修正前で、下が修正後です。受信処理で割り込みが210msCPUを占有していましたが修正により占有期間が66msに短縮されました。リモコン処理後に約15ms割り込み処理が走りますが、Int0無効時の立ち下がりエッジが保存されていて、Int0有効とした時に一旦割り込みを走っているようです。試しにInt0のトリガ条件を立ち下がりからLOWに変えてみました。

f:id:torusanada98:20210807185248j:plain

Int0有効に変えた時の割り込み発生が押さえられました。次回は作成したコードのDACユニットへの組み込み検討を行います。

 

つづく(構想編6)

赤外線リモコンの検討(構想編4)

f:id:torusanada98:20210803072530j:plain

構想編4

サンプルコードを実装用に改変します。

サンプルコード

前回の記事で確認したサンプルコードですが、処理を理解する観点では良かったとおもいますが、DACユニットへ実装する観点で見直してみます。最初に簡単な実験を行ってみます。サンプルコードを関数化(IR_process())し、ダミーのMain loopへ組み込んでみました。Main loopでは100msのダミー処理(delay(100))も組み込んでいます。

f:id:torusanada98:20210803072558p:plain

このプログラムを実行してみました。

f:id:torusanada98:20210803072633j:plain

上の波形が受信モジュール出力で、下がMain loopを走っていいる時に'H'になる信号です。受信完了後のわずかなタイミングのみMain loopを走るのみで、受信処理がCPUをほぼ100%占有しています。原因はsamplecodeのleader受信確認処理です。

f:id:torusanada98:20210803072703p:plain

上記のとおり、Leader確認処理に入ると局所ループ(do{} while文)でLeaderを受信するまで処理を抜けません。まずは試しに、受信処理の最初に受信モジュール出力のチェックを追加して'H'(消灯)時には処理を抜けるように修正してみました。

f:id:torusanada98:20210803072725p:plain

このときの受信波形は以下のとおりです。

f:id:torusanada98:20210803072749j:plain

非同期な受信チェックの為、正しくコマンド受信ができませんでした。これを解決するには受信処理を割り込み処理にするしかありません。

arduino UNO外部割り込み

arduinoでは以前タイマー割り込みを使ってLEDのブリンクをさせた事はありますが、外部割り込みは初めての経験です。arduino UNOの外部割り込み仕様を調べてみました。

・Int0(2pin)とInt1(3pin)が使用可能

・エッジ割り込みとレベル割り込みの計4種類のトリガ条件の設定が可能

・attachInterrupt()で割り込みを有効

・dettachInterrupt()で割り込み無効

・割り込み処理内はデフォルトで割り込み処理は無効

受信処理の割り込み化

上記を踏まえて受信処理の割り込み化を検討します。検討結果は以下のとおりです。

・受信モジュールとの接続はこのままとしてInt0を使用する

・受信モジュール出力の立ち下がりで割り込み処理実行

・割り込み処理の先頭で外部割り込みを無効化(Int0の多重割り込み禁止)

・他割り込み処理有効化(多重割り込み許可)

・先頭の'H'パルス期間がLeaderと不一致の場合return

・一致の場合は、samplecodeの受信処理を実行

・割り込み処理を抜けてから外部割り込み有効化

まずは上記を反映したsetup()とloop()処理です。

f:id:torusanada98:20210803072821p:plain

setup()内でInt0を有効化しています。Main loopの2カ所でIR_WF(外部割り込み無効フラグ)が1の時にInt0を有効化しています。続いて受信用割り込み処理です。

f:id:torusanada98:20210803073135p:plain

上段がLeader検出処理で、下段が受信処理です。処理を抜ける際に、外部割り込み禁止状態(IR_WR=1)としています。下図が実行時の統合環境画面です。

f:id:torusanada98:20210803072958p:plain

早速コンパイルして実行してみます。シリアルモニタに受信コードが正しく表示されています。さらに下図は実行時の波形モニタ結果です。

f:id:torusanada98:20210803073040j:plain

青の波形は、割り込み処理実行中'H'を示しています。これで受信処理がCPUを占有する事がなくなりました。次回はこの割り込み処理をさらに改善検討して、DACユニットのファームウェアへの移植の検討もします。

 

つづく(構想編5)