'$prog &HFF , &H62 , &HDF , &HFF 'ヒューズ設定。(工場出荷状態) ' ' **************************************************** ' * 赤外線リモコン受信 スイッチ出力 変換プログラム * ' * Basic Compiler is BASCOM-AVR * ' * Copyright O-Family 2015. 5. 4 * ' **************************************************** ' ' Ver 0.01 テスト・バージョン。 2015. 2.17 ' Ver 0.02 リモコン送信機の選択をSW2+SW3に変更。 2015. 2.19 ' Ver 1.01 コメントを修正。 2015. 5. 4 ' ' $regfile = "ATtiny85.DAT" '使用するAVRを設定。 $crystal = 1000000 'AVRクロックを設定。 ' $hwstack = 64 'ハードウェア・スタックの容量を設定。 $swstack = 10 'ソフトウェア・スタックの容量を設定。 $framesize = 24 'フレーム領域の容量を設定。 ' ' * ポート名の定義 * ' Ir_rxm Alias Pinb.3 '赤外線受信モジュールの接続ポート。 Sp_out Alias Portb.4 'スピーカー出力の接続ポート。 Sw_1 Alias Pinb.0 '[SW1]の接続ポート。 Sw_2 Alias Pinb.1 '[SW2]の接続ポート。 Sw_3 Alias Pinb.2 '[SW3]の接続ポート。 ' ' * 変数の宣言 * ' Dim Ir_custom As Word '受信した16ビットのカスタム・コード。 Dim Ir_data As Byte '受信した8ビットのデータ・コード。 Dim Ir_status As Byte '受信状態のフラグ。(0=受信なし, 1=受信有り, 2=リピート, 3〜受信エラー) Dim Customcode As Word '選択されたリモコンのカスタムコード。 Dim Swcode(6) As Byte 'スイッチに対応するコード。 ' Dim Dummy As Eram Long 'EEPROM 4バイトのダミーエリア。 Dim Eepcustomcode As Eram Word 'EEPROM 選択されたリモコンのカスタムコード。 Dim Eepswcode(6) As Eram Byte 'EEPROM スイッチに対応するコード。 ' ' * 初期設定 * ' Config Sp_out = Output 'スピーカー出力の接続ポートを出力に設定する。 Config Aci = Off 'アナログ比較器の電源を切る。 Config Timer0 = Timer , Prescale = 64 'Timer0の設定。1,000,000Hz / 64 = 15,625Hz (64uS) ' Waitms 500 'スイッチのプルアップ抵抗が[H]レベルになるまで待つ。 If Sw_1 = 1 And Sw_2 = 0 And Sw_3 = 0 Then 'If リモコン送信機の選択か? Then Gosub Remotesel 'リモコン送信機を選択する。 End If ' ' * EEPROMのデータを確認する * ' If Eepcustomcode = &HFFFF Then 'If EEPROMが初期値か? Then Restore Remotedata 'EEPROMに初期値を書き込む。 Read Customcode 'カスタムコードを読み込む。 Eepcustomcode = Customcode Read Ir_data '電源ボタンのコードを読み込む。 For Ir_status = 1 To 6 'スイッチの割り当てコードを読み込む。 Read Ir_data Eepswcode(ir_status) = Ir_data Next Ir_status End If ' Customcode = Eepcustomcode 'カスタムコードを読み込む。 For Ir_status = 1 To 6 'スイッチの割り当てコードを読み込む。 Swcode(ir_status) = Eepswcode(ir_status) Next Ir_status ' ' * 赤外線受信割り込みの設定 * ' Pcmsk = &B0000_1000 '[PCINT3]割り込みを許可する。 On Pcint0 Irrxint Nosave '赤外線受信割り込みルーチンのラベルを設定。 Enable Interrupts 'すべての割り込みを許可。 Gosub Beep50ms '起動音、4KHzの音を50mS鳴らす。 ' ' ******************* ' * メイン ルーチン * ' ******************* ' Main: Enable Pcint0 '赤外線受信割り込みを許可する。 Power Powerdown 'スリープモードへ移行する。(赤外線受信割り込みで再起動する) ' Disable Pcint0 '赤外線受信割り込みを禁止する。 ' Main1: Gosub Irnecrx 'NECフォーマット 赤外線リモコン 受信処理。 ' Select Case Ir_status Case 0 : 'リモコンボタンが放された。 Config Sw_1 = Input 'スイッチ[1]出力をOFFにする。 Config Sw_2 = Input 'スイッチ[1]出力をOFFにする。 Config Sw_3 = Input 'スイッチ[1]出力をOFFにする。 Goto Main ' Case 1 : '正常コードを受信。 If Ir_custom = Customcode Then 'If カスタムコードが一致したか? Then Select Case Ir_data Case Swcode(1) : 'スイッチ[1]に割り当てたボタンが押された。 Config Sw_1 = Output 'スイッチ[1]出力をONにする。 Gosub Beep50ms '4KHzの音を50mS鳴らす。 ' Case Swcode(2) : 'スイッチ[2]に割り当てたボタンが押された。 Config Sw_2 = Output 'スイッチ[2]出力をONにする。 Gosub Beep50ms '4KHzの音を50mS鳴らす。 ' Case Swcode(3) : 'スイッチ[3]に割り当てたボタンが押された。 Config Sw_3 = Output 'スイッチ[3]出力をONにする。 Gosub Beep50ms '4KHzの音を50mS鳴らす。 ' Case Swcode(4) : 'スイッチ[7]に割り当てたボタンが押された。 Config Sw_1 = Output 'スイッチ[1]出力をONにする。 Config Sw_2 = Output 'スイッチ[2]出力をONにする。 Gosub Beep50ms '4KHzの音を50mS鳴らす。 ' Case Swcode(5) : 'スイッチ[8]に割り当てたボタンが押された。 Config Sw_2 = Output 'スイッチ[2]出力をONにする。 Config Sw_3 = Output 'スイッチ[3]出力をONにする。 Gosub Beep50ms '4KHzの音を50mS鳴らす。 ' Case Swcode(6) : 'スイッチ[9]に割り当てたボタンが押された。 Config Sw_1 = Output 'スイッチ[1]出力をONにする。 Config Sw_3 = Output 'スイッチ[3]出力をONにする。 Gosub Beep50ms '4KHzの音を50mS鳴らす。 End Select End If Ir_status = 100 'リモコンボタンが離されるのを待つ。 End Select Goto Main1 ' ' * 4KHzの音を50mS鳴らすサブルーチン * ' Beep50ms: Sound Sp_out , 200 , 21 '4KHzの音を50mS鳴らす。 Return ' ' ****************************** ' * 赤外線受信割り込みルーチン * ' ****************************** ' Irrxint: '何も処理しない。 Return ' ' *********************************************** ' * NECフォーマット 赤外線リモコン 受信ルーチン * ' *********************************************** ' Dim Ir_temp1 As Byte 'IR用 汎用テンポラリ変数 Byte型 No.1 Dim Ir_temp2 As Byte 'IR用 汎用テンポラリ変数 Byte型 No.2 Dim Ir_temp3 As Byte 'IR用 汎用テンポラリ変数 Byte型 No.3 Dim Ir_temp4 As Byte 'IR用 汎用テンポラリ変数 Byte型 No.4 ' ' Irnecrx: If Ir_rxm = 0 Then Goto Irnecrx2 'If 赤外線信号が入ってきたか? Then ' If Tifr.tov0 = 1 Then 'If (64uSx256= 16.384mS)経過したか? Then Set Tifr.tov0 'Timer0オーバーフロー・フラグをリセットする。 Ir_temp3 = Ir_temp3 + 1 If Ir_temp3 > 6 Then 'If 114.7mS(約115mS)経過したか? Then Ir_temp3 = 0 Ir_status = 0 'リモコン信号が停止。(ボタンが離された) Ir_custom = 0 Ir_data = 0 End If End If Return ' ' Irnecrx2: 'リーダー・コード(スタート信号)の取得。 Gosub Irpulseme '赤外線のパルス幅を計測する。 If Ir_temp1 < 130 Or Ir_temp1 > 148 Then Goto Irnecrx91 'If リーダー部の[L]が(8.32mS〜9.47mS)以外か? Then If Ir_temp2 > 29 And Ir_temp2 < 41 Then Goto Irnecrx8 'If リーダー部の[H]が(1.92mS〜2.56mS)以内(反復)か? Then If Ir_temp2 < 60 Or Ir_temp2 > 75 Then Goto Irnecrx91 'If リーダー部の[H]が(3.84mS〜4.8mS)以外か? Then ' Ir_temp3 = 0 'カスタム・コード(デバイス・アドレス)の取得。 Irnecrx3: Gosub Irpulseme '赤外線のパルス幅を計測する。 If Ir_temp1 < 6 Or Ir_temp1 > 12 Then Goto Irnecrx92 'If データ部の[L]が(384uS〜768uS)以外か? Then If Ir_temp2 < 6 Or Ir_temp2 > 29 Then Goto Irnecrx92 'If データ部の[H]が(384uS〜1.856mS)以外か? Then Shift Ir_custom , Right , 1 '16ビットのカスタム・コードを右へシフト。(上位に[0]を入れる) If Ir_temp2 > 16 Then 'If データ部の[H]が(1.088mS)以上か? Then Set Ir_custom.15 '16ビットのカスタム・コードに[1]をセットする。 End If Ir_temp3 = Ir_temp3 + 1 If Ir_temp3 < 16 Then Goto Irnecrx3 'If 16bit受信していないか? Then ' Ir_temp3 = 0 'データ・コード(コマンド)の取得。 Irnecrx4: Gosub Irpulseme '赤外線のパルス幅を計測する。 If Ir_temp1 < 6 Or Ir_temp1 > 12 Then Goto Irnecrx93 'If データ部の[L]が(384uS〜768uS)以外か? Then If Ir_temp2 < 6 Or Ir_temp2 > 29 Then Goto Irnecrx93 'If データ部の[H]が(384uS〜1.856mS)以外か? Then Shift Ir_data , Right , 1 '8ビットのデータ・コードを右へシフト。(上位に[0]を入れる) If Ir_temp2 > 16 Then 'If データ部の[H]が(1.088mS)以上か? Then Set Ir_data.7 '8ビットのデータ・コードに[1]をセットする。 End If Ir_temp3 = Ir_temp3 + 1 If Ir_temp3 < 8 Then Goto Irnecrx4 'If 8bit受信していないか? Then ' Ir_temp3 = 0 'データ・コードの反転(コマンドの反転)の取得。 Irnecrx5: Gosub Irpulseme '赤外線のパルス幅を計測する。 If Ir_temp1 < 6 Or Ir_temp1 > 12 Then Goto Irnecrx94 'If データ部の[L]が(384uS〜768uS)以外か? Then If Ir_temp2 < 6 Or Ir_temp2 > 29 Then Goto Irnecrx94 'If データ部の[H]が(384uS〜1.856mS)以外か? Then Shift Ir_temp4 , Right , 1 '8ビットのデータ・コードを右へシフト。(上位に[0]を入れる) If Ir_temp2 > 16 Then 'If データ部の[H]が(1.088mS)以上か? Then Set Ir_temp4.7 '8ビットのデータ・コードに[1]をセットする。 End If Ir_temp3 = Ir_temp3 + 1 If Ir_temp3 < 8 Then Goto Irnecrx5 'If 8bit受信していないか? Then ' Ir_temp4 = Not Ir_temp4 If Ir_data <> Ir_temp4 Then Goto Irnecrx95 'If データにエラーが有ったか? Then ' Gosub Irpulseme '赤外線のパルス幅を計測する。(ストップ・ビット) Ir_status = 1 '受信状態フラグ。(0=受信なし, 1=受信有り, 2=リピート, 3=<受信エラー) Irnecrx6: Timer0 = 0 Set Tifr.tov0 'Timer0オーバーフロー・フラグをリセットする。 Ir_temp3 = 0 Return ' ' Irnecrx8: 'リピート・モード。 Gosub Irpulseme '赤外線のパルス幅を計測する。(ストップ・ビット) Ir_status = 2 '受信状態フラグ。(0=受信なし, 1=受信有り, 2=リピート, 3=<受信エラー) Goto Irnecrx6 ' ' Irnecrx91: 'タイム・オーバー。 Ir_status = 3 '受信状態フラグ。(3 = [1]リーダー・コード・エラー) Irnecrx99: Ir_custom = 0 Ir_data = 0 Goto Irnecrx6 ' Irnecrx92: 'タイム・オーバー。 Ir_status = 4 '受信状態フラグ。(4 = [2]カスタム・コード・エラー) Goto Irnecrx99 ' Irnecrx93: 'タイム・オーバー。 Ir_status = 5 '受信状態フラグ。(5 = [3]データ・コード・エラー) Goto Irnecrx99 ' Irnecrx94: 'タイム・オーバー。 Ir_status = 6 '受信状態フラグ。(6 = [4]反転データ・コード・エラー) Goto Irnecrx99 ' Irnecrx95: 'タイム・オーバー。 Ir_status = 7 '受信状態フラグ。(7 = [5]データチェック・エラー) Gosub Irpulseme '赤外線のパルス幅を計測する。(ストップ・ビット) Goto Irnecrx99 ' ' * 赤外線のパルス幅を計測するサブルーチン * (Ir_temp1 = [L]のパルス幅 x64uS) ' (Ir_temp2 = [H]のパルス幅 x64uS) Irpulseme: Timer0 = 0 Set Tifr.tov0 'Timer0オーバーフロー・フラグをリセットする。 ' Irpulseme1: If Tifr.tov0 = 1 Then Goto Irpulseme3 'If (64uSx256= 16.384mS)経過したか? Then If Ir_rxm = 0 Then Goto Irpulseme1 'If [L]レベルが続いているか? Then Ir_temp1 = Timer0 '[L]レベルのカウント数を保存する。 ' Timer0 = 0 Set Tifr.tov0 'Timer0オーバーフロー・フラグをリセットする。 ' Irpulseme2: If Tifr.tov0 = 1 Then Goto Irpulseme3 'If (64uSx256= 16.384mS)経過したか? Then If Ir_rxm = 1 Then Goto Irpulseme2 'If [H]レベルが続いているか? Then Ir_temp2 = Timer0 '[H]レベルのカウント数を保存する。 Return ' ' Irpulseme3: Ir_temp1 = 255 'タイム・オーバーを設定する。 Ir_temp2 = 255 Return ' ' ************************ ' * リモコン送信機の選択 * ' ************************ ' Remotesel: For Ir_temp1 = 1 To 3 '4KHzの音を3回ならす。 Sound Sp_out , 2000 , 21 '4KHzの音を500mS鳴らす。 Waitms 300 Next Ir_temp1 ' Remotesel1: Gosub Irnecrx 'NECフォーマット 赤外線リモコン 受信処理。 ' If Ir_status <> 1 Then Goto Remotesel1 'If 正常コードを受信できていないか? Then Ir_status = 0 Gosub Beep50ms '4KHzの音を50mS鳴らす。 ' Restore Remotedata Remotesel2: Read Customcode 'カスタムコードを読み込む。 Read Ir_temp4 '電源ボタンのコードを読み込む。 For Ir_temp1 = 1 To 6 'スイッチの割り当てコードを読み込む。 Read Ir_temp2 Swcode(ir_temp1) = Ir_temp2 Next Ir_temp1 ' If Customcode = 0 Then Goto Remotesel1 'If カスタムコードが見つからないか? Then If Customcode <> Ir_custom Then Goto Remotesel2 'If カスタムコードが合致しないか? Then If Ir_temp4 <> Ir_data Then Goto Remotesel2 'If 電源ボタンコードが合致しないか? Then ' Sound Sp_out , 8000 , 21 '4KHzの音を2秒鳴らす。 Eepcustomcode = Customcode 'EEPROMにカスタムコードを保存する。 For Ir_temp1 = 1 To 6 'EEPROMにスイッチの割り当てコードを保存する。 Eepswcode(ir_temp1) = Swcode(ir_temp1) Next Ir_temp1 Waitms 500 Return End ' ' * リモコンコードとスイッチ出力の対応データ * ' Remotedata: Data &HEF10% , &HD8 , &HF8 , &H78 , &H58 , &H11 , &H00 , &H81 '[OE13KIR],[Power],[0],[1],[2],[7],[8],[9] 秋月電子 Data &HBF00% , &H00 , &H10 , &H11 , &H12 , &H18 , &H19 , &H1A '[DFR0107],[Power],[0],[1],[2],[7],[8],[9] 秋月電子 ' Data &HBF40% , &H12 , &H01 , &H02 , &H03 , &H07 , &H08 , &H09 '[AV-R520N_541],[Power],[0],[1],[2],[7],[8],[9] NEC(3) , 東芝 , 地デジ-東芝 Data &HBA42% , &H12 , &H61 , &H62 , &H63 , &H67 , &H68 , &H69 '[AV-R520N_545],[Power],[0],[1],[2],[7],[8],[9] 東芝 Data &HCF30% , &H00 , &H10 , &H11 , &H12 , &H16 , &H17 , &H18 '[AV-R520N_641],[Power],[0],[1],[2],[7],[8],[9] 三洋(2) , 地デジ-三洋1 Data &H2D10% , &H1F , &H5C , &H1E , &H5E , &H1B , &H59 , &H5A '[AV-R520N_672],[Power],[0],[1],[2],[7],[8],[9] 地デジ-MrMax Data &HDF20% , &H00 , &H52 , &H12 , &H50 , &H4A , &H0A , &H48 '[AV-R520N_681],[Power],[0],[1],[2],[7],[8],[9] 地デジ-TMY1 Data &HFD86% , &H10 , &H11 , &H12 , &H13 , &H17 , &H18 , &H19 '[AV-R520N_682],[Power],[0],[1],[2],[7],[8],[9] 地デジ-TMY2 ' Data &HE718% , &H08 , &H10 , &H11 , &H12 , &H16 , &H17 , &H18 '[Analog-TV],[Power],[0],[1],[2],[7],[8],[9] NEC1,2 Data &HAF50% , &H17 , &H0D , &H0E , &H0F , &H1F , &H04 , &H05 '[Analog-TV],[Power],[0],[1],[2],[7],[8],[9] 日立1 Data &H916E% , &H14 , &H05 , &H06 , &H07 , &H0F , &H1C , &H1D '[Analog-TV],[Power],[0],[1],[2],[7],[8],[9] 日立2 Data &HFB04% , &H08 , &H11 , &H12 , &H13 , &H17 , &H18 , &H19 '[Analog-TV],[Power],[0],[1],[2],[7],[8],[9] 日立3,三菱,LG Data &H7A83% , &H08 , &H11 , &H12 , &H13 , &H17 , &H18 , &H19 '[Analog-TV],[Power],[0],[1],[2],[7],[8],[9] 日立4 Data &HCF30% , &H00 , &H10 , &H11 , &H12 , &H16 , &H17 , &H18 '[Analog-TV],[Power],[0],[1],[2],[7],[8],[9] 三洋1,2,3 Data &HC837% , &H00 , &H10 , &H11 , &H12 , &H16 , &H17 , &H18 '[Analog-TV],[Power],[0],[1],[2],[7],[8],[9] 三洋4 Data &HEA15% , &H12 , &H01 , &H02 , &H03 , &H07 , &H08 , &H09 '[Analog-TV],[Power],[0],[1],[2],[7],[8],[9] 富士通ゼネラル Data &H3BC4% , &H18 , &H01 , &H02 , &H03 , &H07 , &H08 , &H09 '[Analog-TV],[Power],[0],[1],[2],[7],[8],[9] ビクター Data &H0286% , &H49 , &H01 , &H02 , &H03 , &H07 , &H08 , &H09 '[Analog-TV],[Power],[0],[1],[2],[7],[8],[9] アイワ1 Data &H5C80% , &H49 , &H01 , &H02 , &H03 , &H07 , &H08 , &H09 '[Analog-TV],[Power],[0],[1],[2],[7],[8],[9] アイワ2,サムスン ' Data &H55AA% , &H1C , &H01 , &H02 , &H03 , &H07 , &H08 , &H09 '[Digital-TV],[Power],[0],[1],[2],[7],[8],[9] 地デジ-パイオニア Data &HE084% , &H20 , &H01 , &H02 , &H03 , &H07 , &H08 , &H09 '[Digital-TV],[Power],[0],[1],[2],[7],[8],[9] 地デジ-DXアンテナ ' Data &HFF00% , &H0C , &H0D , &H09 , &H05 , &H47 , &H43 , &H4E '[DVD-321Z],[Power],[0],[1],[2],[7],[8],[9] DVDプレーヤー ' Data &H0000% , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 'テーブル終了コード。