「赤外線リモコン受信3」の続きです。 今回はリモコン信号の最初の割り込みを受けてリーダー信号の受信に備え測定開始時間を設定する部分を説明します。 <PICデバイス=18F1320> 受光モジュールは PL-IRM1261-C438 で INT1 端子に接続されています。

下図は赤外線リモコンの信号(INT1端子)の例です。

30CE51AE

INT1 割り込み処理の最初に割り込みフラグをクリアして、TIMER0の値の一部( bit3 ~ bit15 )を切り出します。
(下図、20~21行目 サブルーチン t0rrc3t の詳細はこの記事の最後に説明します。)

最初の立ち下がりエッジ(リーダー信号の右側)では、切り出したTIMER0の値を測定開始時刻に設定し、「最初のエッジ待ちフラグ」をクリアし、受信タイムアウト監視用のタイマーをセットして処理を終えます。 3番目の図にあるように irc1st の bit6 が「最初のエッジ待ちフラグ」で、クリアすることで次回の INT1 割り込みがリーダー部後端であると判断できます。 (下図31~38行目)

下図25~28行目では irc1st の bit7 , bit6 を参照して、以下3つの何れかに分岐します。
 (1) 最初のエッジ待ち
 (2) リーダー部処理(リーダー部後端)
 (3) データー部処理
また、(1)、(2)の処理では各々 bit6 , bit7 をクリアして次回割り込みに備えます。

下図は INT1 の低位割り込み処理を行うアセンブラ・ソース( intlow.asm の一部)です。 BRA  intlz でレジスター復旧して割り込み処理を抜けます。

intlow_INT1

受信タイムアウトの監視用タイマーは 50msec 間隔で発生する TIMER0 の割り込みでカウントダウンされ、メイン処理に受信完了を知らせます。 TIMER0 割り込みに同期せずに設定しますから、受信タイムアウト時間は 150~200msec の幅を持ちます。

下図は、赤外線リモコン受信関連のラベル定義( symboldef4.asm の一部)です。

symboldef4_irc


下図は、TIMER0 の bit3 ~ bit15 を切り出すサブルーチン( ircr.asm の一部)です。 

ircr_shift

ワーク shiftwh , shiftwl に TMR0H , TMR0L をコピーしていますが、TIMER0 の 16bit 同期読み出しのために必ず下位アドレスを先に読み出します。 その後 16bit データを3回右シフトして、処理の結果不定になる最上位から 3bit をゼロクリアしています。

次回はリーダー部の後端での割り込み処理を紹介します。


赤外線リモコン受信の関連記事インデックスはこちら → 「赤外線リモコン受信


楽々PIC」は楽しい道具を作りながら学ぶブログを目指します。