楽々PIC

水田除草と言うブログを書いていますが、PIC関連の記事が意外に人気で驚いています。 PICを使った電子工作に興味を持つ方が多いことを知って、一緒にPICを学ぶブログを作りたいと思いました。 「楽々PIC」は教材と言うよりも少し実用性?のある楽しい道具を作りながら学ぶブログを目指します。

リモコン受信

赤外線リモコン受信7

 「赤外線リモコン6」の続きです。 今回はTIME0で行っている受信終了のタイマー処理と、メイン処理で行っているLCD用仮想V-RAMへの転送(表示)、受信再開処理について説明します。 <PICデバイス=18F1320> 受光モジュールは PL-IRM1261-C438 です。

INT1 割り込み処理は前回までに全て説明しました。 下図は TIMER0 割り込み処理のアセンブラ・ソース( intlow.asm の一部)です。 赤外線リモコンの 32bit データ受信に要する時間はデータによって増減しますが、およそ70msec程度です。 ただし、中には 32bit より多くのデータを送信するリモコンがありますから、150 ~ 200msec 待って受信完了することにしました。 この時間を計る為に 50msec 間隔で発生する TIMER0 割り込みでカウンター irtout をカウントダウン(ゼロでクリップ)しています。 下図の66~67行目がその記述です。 最初に irtout が0であれば何もしないで TIMER0 の処理を終了しますが、そうでなければ irtout をデクリメント(-1)してから TIMER0 の処理を終了します。

intlow_TIMER0


下図は、メイン処理( test4.asm )の一部で、赤外線リモコンの受信コードを ASCII コードに変換して LCD 用仮想 V-RAM に転送して表示しています。

irc1st の bit7 をチェックして受信待ち状態でなければ、irtout が0であることを確認して受信完了と判断します。 受信完了でなければ何もしないで処理を終わります。 (下図127~131行目)

受信完了であれば受信コード( ircd0 , ircd1 , ircd2 , ircd3 )を順に ASCII コードに変換して LCD 用仮想 V-RAM の所定のアドレスに転送します。 tmp1 の値は 03AH です。 上位または下位 4bit を切り出して 30H を加えて16進数 0~9 までの変換を行い、tmp1との比較の結果 16進数 A~F までの値であればさらに 07H を加えて ASCII 変換しています。

test4_vram1

   <<< 途中省略 >>>

test4_vram2

4byte 分の転送後に irc1st の bit0 によって以下いずれかの表示をしています。
 (1) irc1st (bit0) = 0 の時アルファベット小文字の o
 (2) irc1st (bit0) = 1 の時アルファベット大文字の N

以上で、赤外線リモコン受信の説明を終わります。


以下で、一連の記事で紹介したソース・ファイル(プロジェクト)をダウンロード出来ます。
LHA書庫です。
 http://jyosou-robot.livedoor.biz/pic/RRP1320-0/RRP1320-0-4.lzh


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


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



赤外線リモコン受信6

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

下図は赤外線リモコンの信号(INT1端子)の例で、下図リーダー信号に続くデータ信号の立ち下がりで発生する INT1 割り込み処理について説明します。

30CE51AE

INT1 割り込み処理の最初に割り込みフラグをクリアして、TIMER0の値の一部( bit3 ~ bit15 )を切り出した後で、 irc1st の bit7 , bit6 を参照して下図の codess を CALL します。 詳しくは「赤外線リモコン受信4」参考にして下さい。

下図は、赤外線リモコンのデータ信号立ち下がりエッジで CALL されるサブルーチンのアセンブラ・ソース( ircr.asm の一部)です。

測定開始時刻と測定終了時刻の大小を比較して以下の2つに分岐します。
 (1) 終了時刻>開始時刻の時には codes0
 (2) 終了時刻≦開始時刻の時には codes1 (最後の図)

データ信号の長さを求める部分の構造はリーダー部と同じですから、前回記事を参考にしてい下さい。

ircr_codess


ircr_codes1

reader2 で最初に 32bit の受信コードをシフトして、先に求めたデータ信号の長さによって以下2通りに ircd3 の最下位ビットを書き換えます。
 (1) データ信号の長さ < 約 1500usec の時 ircd3 ( bit0 ) = 0
 (2) データ信号の長さ ≧ 約 1500usec の時 ircd3 ( bit0 ) = 1

測定開始時刻を更新して受信 bit 数カウンターをデクリメント(-1)します。 デクリメントの結果、受信 bit 数カウンターが0になった時は INT1 割り込みを禁止します。 リモコンによって 32bit を超えるデータを送信する製品がある為、既に受信した 32bit 情報を保護する目的で割り込みを禁止しています。

RETURN 後の処理は前回と同じです。

次回は受信データをLCD用仮想V-RAMに転送するメイン処理について説明し、一連の説明を終わります。


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


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



赤外線リモコン受信5

 「赤外線リモコン受信4」の続きです。 今回はリーダー信号の後端で発生する INT1 の低位割り込み処理について説明します。 <PICデバイス=18F1320> 受光モジュールは PL-IRM1261-C438 で INT1 端子に接続されています。

下図は赤外線リモコンの信号(INT1端子)の例で、下図リーダー信号と書いた右端の立ち下がりで発生する INT1 割り込み処理について説明します。

30CE51AE

INT1 割り込み処理の最初に割り込みフラグをクリアして、TIMER0の値の一部( bit3 ~ bit15 )を切り出した後で、 irc1st の bit7 , bit6 を参照して下図の readers を CALL します。 詳しくは前回の記事を参考にして下さい。

下図は、赤外線リモコンのリーダー部後端で CALL されるサブルーチンのアセンブラ・ソース( ircr.asm の一部)です。

測定開始時刻と測定終了時刻の大小を比較して以下の2つに分岐します。
 (1) 終了時刻>開始時刻の時には reader0
 (2) 終了時刻≦開始時刻の時には reader1 (最後の図)

8bit を超え 13bit データの大小比較ですから上位 5bit を最初に比較する際に上位同士が同じ値の時の処理に注意が必要です。 reader0 からは 16bit (実際には 13bit 同士)の減算を行ってリーダー信号の長さを求め reader2 にジャンプします。

ircr_readers


reader1 はリーダー信号の間に TIMER0 がオーバーフローした場合にリーダー信号の長さを求める処理です。
16bit (実際には 13bit 同士)の加算と減算を行って reader2 に進みます。 13bit 同士の為、加算時オーバーフローへの対策は不要です。 irctim0h , irctim0l は 「10000H - TIMR0 の設定値」の bit3 ~ bit15 を切り出した値を記録しています。

ircr_reader1

reader2 では先に求めたリーダー信号の長さによって以下2通りに irc1st を書き換えます。
 (1) リーダー信号の長さ < 約4msec の時 irc1st = 00H
 (2) リーダー信号の長さ ≧ 約4msec の時 irc1st = 01H (NECフォーマット)
どちらの場合も irc1st の bit6 , bit7 をクリアするので、次回の INT1 割り込みではデータ信号処理を行います。

最後に測定開始時刻を更新して RETURN で低位割り込み処理に戻ります。 前回の記事にあるように、低位割り込み処理ではこの後レジスター復旧して割り込み処理を終えます。

次回はデータ部での割り込み処理を紹介します。


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


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



赤外線リモコン受信4

 「赤外線リモコン受信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」は楽しい道具を作りながら学ぶブログを目指します。








赤外線リモコン受信2

 Webで調べ、オシロ観察の結果「赤外線リモコン受信」の写真は、INT1 端子に下図のような波形が入力された結果と推測できます。

30CE51AE

NECフォーマットのリーダー信号(リモコン信号の先頭を示す信号)は 13.5msec の波形です。 SONYフォーマットが 3.05msec のようですから、4msec 以上のリーダー信号を受信した時にNECフォーマットと判断します。

データ信号はマーク( 1 )が 2250usec アンマーク( 0 )が 1120usec なので中間の値で仕切ることで判断できます。 SONYフォーマットのことも考えて 1500usec を閾値に選びました。

赤外線リモコン受信用に使えるタイマーが残っていないので、50msec 毎のイベントタイマーに使っている TIMER0 の値を読み出して時間計測します。 出来れば 1byte データーで大小比較する簡単な構造の方が良いだろうと言うことで、13.5msec +アルファの時間で 0FFH になり、01H 相当の時間が100usec 未満となる8bit列を探してみました。 Fosc=8MHz 1/16プリスケーラーで使っているTIMER0 用 16bit カウンター( TMR0H , TMR0L )の bit3 ~ bit10 の 8bit を切り出せば 0FFH で 16.32msec 、01H で 64usec の 8bit タイマーカウンターとして使えることが解りました。 ただしTIMER0のオーバフロー(割り込み)の都度初期値に戻るので注意が必要です。

以上のように、TIMER0 の一部と INT1 割り込みを使って赤外線リモコンの受信を行い、データ信号を読み出せると考えてコーディングに取り掛かりました。


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


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



ダウンロードコーナー
記事検索
アンケートに御協力下さい


アーカイブ
楽々PIC 宛てBlogMail


--- ご了承下さい ---

注意して記事を書いていますが、記事及びリンク先の情報による不利益について、一切責任を負い(負え)ません。
QRコード
QRコード
アクセスカウンター

    Atsuhiro Imai

    バナーを作成


    プロフィール

    jyosou_robot

    • ライブドアブログ