$prog &HFF , &H62 , &HDF , &HFF 'ヒューズ設定。(工場出荷状態) ' ' ******************************************************** ' * * ' * LEDライト調光器 赤外線リモコン 受信機プログラム * ' *   (テレビ・リモコン用) * ' * AVR is using ATtiny861A * ' * Basic Compiler is BASCOM-AVR * ' * Copyright By O-Family 2013. 4.13 * ' ******************************************************** ' ' Ver 05.01 テレビ・リモコンで制御するバージョン。 2013. 4.13 ' ' $regfile = "ATtiny861.DAT" '使用するAVRを設定。 $crystal = 1000000 'AVRクロックを設定。 ' $hwstack = 64 'ハードウェア・スタックの容量を設定。 $swstack = 10 'ソフトウェア・スタックの容量を設定。 $framesize = 24 'フレーム領域の容量を設定。 ' ' * ポート名の定義 * ' Ir_rxm Alias Pina.0 '赤外線受信モジュールの接続ポートを指定する。 Sp_out Alias Porta.1 'スピーカー出力の接続ポート。 ' Led_1 Alias Portb.6 'LED[1]の接続ポート。 Led_2 Alias Portb.2 'LED[2]の接続ポート。 ' Code_sel0 Alias Pina.4 'リモコンのアドレス選択ジャンパーピン[0]接続ポート。 Code_sel0pu Alias Porta.4 'リモコンのアドレス選択ジャンパーピン[0]プルアップポート。 Code_sel1 Alias Pina.5 'リモコンのアドレス選択ジャンパーピン[1]接続ポート。 Code_sel1pu Alias Porta.5 'リモコンのアドレス選択ジャンパーピン[1]プルアップポート。 Code_sel2 Alias Pina.6 'リモコンのアドレス選択ジャンパーピン[2]接続ポート。 Code_sel2pu Alias Porta.6 'リモコンのアドレス選択ジャンパーピン[2]プルアップポート。 Code_sel3 Alias Pina.7 'リモコンのアドレス選択ジャンパーピン[3]接続ポート。 Code_sel3pu Alias Porta.7 'リモコンのアドレス選択ジャンパーピン[3]プルアップポート。 ' ' * 変数の宣言 * ' Dim Customcode As Word 'ジャンパーピンで選択されたリモコンのカスタムコード。 Dim Datacode(22) As Byte 'ジャンパーピンで選択されたリモコンのデータコード。 Dim Command As Byte '受信したデータコードをコマンドに変換した値。 Dim Ir_custom As Word '受信した16ビットのカスタム・コード。 Dim Ir_data As Byte '受信した8ビットのデータ・コード。 Dim Ir_status As Byte '受信状態のフラグ。(0=受信なし, 1=受信有り, 2=リピート, 3=受信エラー) ' Dim Bright As Byte '輝度値。 Dim Color As Word '色相値。 Dim Contmode As Byte '制御モード。(0:電源OFF中 , 1:電源ON中 , 2:自動色相選択中 3:プリセット登録中) Dim Count1ms As Byte '1mSカウンター。 Dim Tim16msf As Byte '16.384mS経過フラグ。 Dim Blinktimer As Byte '[黄]LEDの点滅タイマー。 Dim Atofftime As Word '自動OFFのタイマーカウンター。 Dim Autocolf As Byte '自動色相変更フラグ。 Dim Autocoltimer As Word '自動色相変更タイマー。 Dim Autocolchgt As Word '自動色相変更時間。 ' Dim Ledcolor_r As Byte '[赤]の色相値。 Dim Ledcolor_g As Byte '[緑]の色相値。 Dim Ledcolor_b As Byte '[青]の色相値。 Dim Ledset_r As Byte '[赤]LED設定値。 Dim Ledset_g As Byte '[緑]LED設定値。 Dim Ledset_b As Byte '[青]LED設定値。 Dim Ledout_r As Byte '[赤]LED出力値。 Dim Ledout_g As Byte '[緑]LED出力値。 Dim Ledout_b As Byte '[青]LED出力値。 ' Dim Temp1 As Byte '汎用テンポラリ変数 Byte型 No.1 Dim Temp2 As Byte '汎用テンポラリ変数 Byte型 No.2 Dim Temp3 As Byte '汎用テンポラリ変数 Byte型 No.3 Dim Tempw1 As Word '汎用テンポラリ変数 Word型 No.1 Dim Tempw2 As Word '汎用テンポラリ変数 Word型 No.2 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 ' Dim Dummy As Eram Long 'EEPROM 4バイトのダミーエリア。 Dim Eep_bright(12) As Eram Byte 'EEPROM プリセット輝度値。 Dim Eep_color(12) As Eram Word 'EEPROM プリセット色相値。 Dim Eep_autocolf(12) As Eram Byte 'EEPROM 自動色相変更フラグ。 ' ' * ポートの初期設定 * ' Config Sp_out = Output 'スピーカー出力の接続ポートを出力に設定する。 Config Led_1 = Output 'LED[1]接続ポートを出力に設定する。 Config Led_2 = Output 'LED[2]接続ポートを出力に設定する。 ' Set Code_sel0pu 'リモコンのアドレス選択ジャンパーピン[0]接続ポートをプルアップする。 Set Code_sel1pu 'リモコンのアドレス選択ジャンパーピン[1]接続ポートをプルアップする。 Set Code_sel2pu 'リモコンのアドレス選択ジャンパーピン[2]接続ポートをプルアップする。 Set Code_sel3pu 'リモコンのアドレス選択ジャンパーピン[3]接続ポートをプルアップする。 ' Set Porta.2 '未使用ポートをプルアップ。 Set Porta.3 '未使用ポートをプルアップ。 Set Portb.0 '未使用ポートをプルアップ。 Set Portb.4 '未使用ポートをプルアップ。 ' Set Prr.prusi '電力削減 USI回路の停止。 Config Aci = Off 'アナログ比較器の電源を切る。 ' ' * Timerの設定 * ' Config Timer0 = Timer , Prescale = 64 '1,000,000Hz / 64 = 15,625Hz (64uS) ' Config Portb.1 = Output '[OC1A]ポートを出力に設定する。 Config Portb.3 = Output '[OC1B]ポートを出力に設定する。 Config Portb.5 = Output '[OC1D]ポートを出力に設定する。 Tccr1d = &B0000_0000 'Config Timer1 = Pwm (高速PWM動作) Tccr1b = &B0000_0011 'Prescale = 4 (1,000,000Hz / 4 = 250,000Hz) Tccr1a = &B1010_0011 'Compare A Pwm = Clear Up , Compare B Pwm = Clear Up Tccr1c = &B1010_1001 'Compare D Pwm = Clear Up Ocr1c = 250 - 1 '250,000Hz / 250 = 1,000Hz (1mS) ' On Timer1 Tint1ms Nosave 'Timer1 オーバーフロー割り込みルーチンのラベルを設定。 Enable Timer1 'Timer1 オーバーフロー割り込みを許可。 ' ' * 赤外線受信割り込みの設定 * ' Pcmsk0 = &B0000_0000 'PCINT割り込みマスクを設定。 Pcmsk1 = &B0000_0000 Set Pcmsk0.pcint0 'PA0[PCINT0]を許可する。 On Pcint1 Irrxint Nosave '赤外線受信割り込みルーチンのラベルを設定。 ' ' * EEPROMのデータを確認する * ' If Pinb.0 = 0 Then Goto Initeep 'If EEPROMの強制初期化か? Then If Eep_autocolf(1) < 13 Then Goto Initeep1 'If EEPROMが初期状態ではないか? Then Initeep: Restore Eepinitable 'EEPROMを初期化する。 For Temp1 = 1 To 12 Read Temp2 Eep_bright(temp1) = Temp2 'EEPROM プリセット輝度値。 Read Tempw1 Eep_color(temp1) = Tempw1 'EEPROM プリセット色相値。 Read Temp2 Eep_autocolf(temp1) = Temp2 'EEPROM 自動色相変更フラグ。 Next Temp1 Initeep1: ' ' * 初期設定 * ' Temp1.0 = Code_sel0 'リモコンのアドレス選択ジャンパーピンを読み込む。 Temp1.1 = Code_sel1 Temp1.2 = Code_sel2 Temp1.3 = Code_sel3 Temp1 = Not Temp1 Temp1 = Temp1 And &H0F Tempw1 = Temp1 * 23 'リモコンコードテープルの位置を計算する。 Temp1 = Lookup(tempw1 , Codetable) 'ジャンパーピンで選択されたリモコンのカスタムコードを読み込む。 Tempw1 = Tempw1 + 1 Temp2 = Lookup(tempw1 , Codetable) Customcode = Makeint(temp2 , Temp1) Tempw1 = Tempw1 + 1 For Temp1 = 1 To 21 'ジャンパーピンで選択されたリモコンのデータコードを読み込む。 Datacode(temp1) = Lookup(tempw1 , Codetable) Tempw1 = Tempw1 + 1 Next Temp1 ' Bright = 255 '最高輝度に設定する。 Color = 1023 '[白]に設定する。 ' Config Watchdog = 2048 'ウォッチドッグ タイマーの時間を設定。 Start Watchdog 'ウォッチドッグ タイマーの監視を開始。 ' Enable Interrupts 'すべての割り込みを許可。 Gosub Beep50ms '起動音、4KHzの音を50mS鳴らす。 ' ' ******************* ' * メイン ルーチン * ' ******************* ' Main: Reset Watchdog 'ウォッチドッグ タイマーを再スタート。 ' Gosub Irreceive '赤外線リモコン信号を受信する。 ' ' * 16mS(16.384mS)間隔の処理 * ' If Tim16msf = 1 Then 'If 16.384mS経過したか? Then Tim16msf = 0 If Contmode = 0 Then 'If 電源OFFか? Then ' ' * 電源OFFでスリープに入る * ' Temp1 = Ledout_r Or Ledout_g Temp1 = Temp1 Or Ledout_b If Temp1 = 0 Then 'If LED出力が全て消えたか? Then Atofftime = Atofftime + 1 If Atofftime > 122 Then 'If 自動OFF時間(2秒)を越えたか? Then Stop Watchdog 'ウォッチドッグ タイマーの監視を停止。 Reset Code_sel0pu 'リモコンのアドレス選択ジャンパーピン[0]接続ポートのプルアップを解除する。 Reset Code_sel1pu 'リモコンのアドレス選択ジャンパーピン[1]接続ポートのプルアップを解除する。 Reset Code_sel2pu 'リモコンのアドレス選択ジャンパーピン[2]接続ポートのプルアップを解除する。 Reset Code_sel3pu 'リモコンのアドレス選択ジャンパーピン[3]接続ポートのプルアップを解除する。 Enable Pcint1 '赤外線受信割り込みを許可する。 ' Power Powerdown 'スリープモードへ移行する。(赤外線受信割り込みで再起動する) ' Disable Pcint1 '赤外線受信変化割り込みを禁止する。 Set Code_sel0pu 'リモコンのアドレス選択ジャンパーピン[0]接続ポートをプルアップする。 Set Code_sel1pu 'リモコンのアドレス選択ジャンパーピン[1]接続ポートをプルアップする。 Set Code_sel2pu 'リモコンのアドレス選択ジャンパーピン[2]接続ポートをプルアップする。 Set Code_sel3pu 'リモコンのアドレス選択ジャンパーピン[3]接続ポートをプルアップする。 Start Watchdog 'ウォッチドッグ タイマーの監視を開始。 Atofftime = 0 End If End If ' Else '電源ON中の場合。 ' ' * [自動色相変更選択中]または[プリセット登録中]に黄色LEDを点滅させる * ' If Contmode > 1 Then 'If [自動色相変更選択中]または[プリセット登録中]か? Then If Contmode = 2 Then 'If [自動色相変更選択中]か? Then Blinktimer = Blinktimer + 1 If Blinktimer > 30 Then 'If 500mS経過したか? Then Toggle Led_2 '黄色LEDを点滅する。 Blinktimer = 0 End If Else '[プリセット登録中] Blinktimer = Blinktimer + 1 If Blinktimer > 6 Then 'If 100mS経過したか? Then Toggle Led_2 '黄色LEDを点滅する。 Blinktimer = 0 End If End If ' Atofftime = Atofftime + 1 If Atofftime > 610 Then 'If 自動モード復帰時間(10秒)を越えたか? Then Contmode = 1 Set Led_1 '電源ランプ[青]を点灯する。 Reset Led_2 'カラー変更ランプ[黄]を消灯する。 Atofftime = 0 End If End If ' ' * 自動色相変更モードで色を変える * ' If Autocolf <> 0 Then 'If 自動色相変更モードか? Then Autocoltimer = Autocoltimer + 1 If Autocoltimer >= Autocolchgt Then 'If 色相の変更時間か? Then Autocoltimer = 0 Color = Color + 1 If Color > 905 Then 'If 色相の最終値か? Then Color = 0 End If Gosub Colorset '色相設定値からRGBカラー値に変換する。 Gosub Colorcal 'RGBカラー値を輝度計算してPWM波形にする。 End If End If End If End If ' Goto Main ' ' ******************************** ' * 赤外線リモコン信号を受信する * ' ******************************** ' Irreceive: Gosub Irnecrx 'NECフォーマットの赤外線リモコンを受信処理。 ' Select Case Ir_status Case 0 : ' Case 1 : '[正常コードを受信] If Ir_custom = Customcode Then 'If カスタムコードが一致したか? Then Command = 0 For Temp1 = 1 To 21 '受信データ(コマンド)を調べる。 If Ir_data = Datacode(temp1) Then 'コマンドが見つかったか? Then Command = Temp1 End If Next Temp1 ' If Command = 1 Then 'If [電源]ボタンか? Then If Contmode = 0 Then 'If 電源[OFF]中か? Then Contmode = 1 Set Led_1 '電源ランプを点灯する。 Gosub Beep50ms '4KHzの音を50mS鳴らす。 Gosub Colorset '色相設定値からRGBカラー値に変換する。 Gosub Colorcal 'RGBカラー値を輝度計算してPWM波形にする。 Else '電源[OFF]にする。 Contmode = 0 Reset Led_1 '電源ランプを消灯する。 Reset Led_2 'カラー変更ランプを消灯する。 Gosub Beep50ms2 '4KHzで50mSの音を2回鳴らす。 Ledset_r = 0 '輝度を最小にする。 Ledset_g = 0 Ledset_b = 0 End If ' Else '[電源]ボタン以外の場合。 If Contmode <> 0 Then 'If 電源[ON]中か? Then Select Case Command Case 0 : '無効なコマンドの場合。 ' Case Is < 14 : '[1〜12]チャンネルボタン。 Select Case Contmode Case 1 : 'EEPROMからプリセットデータを読み出す。 Temp1 = Command - 1 '1〜12の数値に変換する。 Bright = Eep_bright(temp1) Color = Eep_color(temp1) Autocolf = Eep_autocolf(temp1) If Autocolf <> 0 Then '自動色相変更か? Then Autocolchgt = Lookup(autocolf , Autocoltab) Autocoltimer = 0 Color = 0 End If Gosub Colorset '色相設定値からRGBカラー値に変換する。 Gosub Colorcal 'RGBカラー値を輝度計算してPWM波形にする。 Gosub Beep50ms '4KHzの音を50mS鳴らす。 ' Case 2 : '[自動色相変更選択]中。 Autocolf = Command - 1 '1〜12の数値に変換する。 Autocolchgt = Lookup(autocolf , Autocoltab) Autocoltimer = 0 Color = 0 Gosub Colorset '色相設定値からRGBカラー値に変換する。 Gosub Colorcal 'RGBカラー値を輝度計算してPWM波形にする。 Contmode = 1 Reset Led_2 '黄色LEDを消灯する。 Gosub Beep50ms '4KHzの音を50mS鳴らす。 ' Case 3 : '[プリセット登録]中。 Temp1 = Command - 1 '1〜12の数値に変換する。 Eep_bright(temp1) = Bright Eep_color(temp1) = Color Eep_autocolf(temp1) = Autocolf Disable Timer1 'Timer1 オーバーフロー割り込みを禁止する。 Sound Sp_out , 4000 , 21 '4KHzの音を1秒鳴らす。 Enable Timer1 'Timer1 オーバーフロー割り込みを許可する。 Contmode = 1 Reset Led_2 '黄色LEDを消灯する。 End Select ' Case 14 : '[チャンネル+]ボタン(色相+)。 Autocolf = 0 If Color <> 1023 Then 'If 輝度の上限値ではないか? Then Color = Color + 1 Gosub Colorset '色相設定値からRGBカラー値に変換する。 Gosub Colorcal 'RGBカラー値を輝度計算してPWM波形にする。 Gosub Beep50ms '4KHzの音を50mS鳴らす。 Else Gosub Beep50ms2 '4KHzで50mSの音を2回鳴らす。 End If ' Case 15 : '[チャンネル−]ボタン(色相−)。 Autocolf = 0 If Color <> 0 Then 'If 輝度の下限値ではないか? Then Color = Color - 1 Gosub Colorset '色相設定値からRGBカラー値に変換する。 Gosub Colorcal 'RGBカラー値を輝度計算してPWM波形にする。 Gosub Beep50ms '4KHzの音を50mS鳴らす。 Else Gosub Beep50ms2 '4KHzで50mSの音を2回鳴らす。 End If ' Case 16 : '[音量+]ボタン(輝度Up)。 If Bright <> 255 Then 'If 輝度の上限値ではないか? Then Bright = Bright + 1 Gosub Colorcal 'RGBカラー値を輝度計算してPWM波形にする。 Gosub Beep50ms '4KHzの音を50mS鳴らす。 Else Gosub Beep50ms2 '4KHzで50mSの音を2回鳴らす。 End If ' Case 17 : '[音量−]ボタン(輝度Down)。 If Bright > 2 Then 'If 輝度の下限値ではないか? Then Bright = Bright - 1 Gosub Colorcal 'RGBカラー値を輝度計算してPWM波形にする。 Gosub Beep50ms '4KHzの音を50mS鳴らす。 Else Gosub Beep50ms2 '4KHzで50mSの音を2回鳴らす。 End If ' Case 18 : '[消音]ボタン[輝度と色相を初期化]。 Autocolf = 0 Bright = 255 Color = 1023 Gosub Colorset '色相設定値からRGBカラー値に変換する。 Gosub Colorcal 'RGBカラー値を輝度計算してPWM波形にする。 Gosub Beep50ms '4KHzの音を50mS鳴らす。 ' Case 19 : '[入力切換]ボタン[自動色相変更選択]モードの設定。 If Contmode = 2 Then 'If [自動色相変更中]か? Then Contmode = 1 Reset Led_2 '黄色LEDを消灯する。 Gosub Beep50ms '4KHzの音を50mS鳴らす。 Else Contmode = 2 Set Led_2 '黄色LEDを点灯する。 Blinktimer = 0 Gosub Beep50ms '4KHzの音を50mS鳴らす。 End If ' Case 20 : '[音声切換]ボタン[プリセット登録]。 If Contmode = 3 Then 'If [プリセット登録中]か? Then Contmode = 1 Reset Led_2 '黄色LEDを消灯する。 Gosub Beep50ms '4KHzの音を50mS鳴らす。 Else Contmode = 3 Set Led_2 '黄色LEDを点灯する。 Blinktimer = 0 Gosub Beep50ms '4KHzの音を50mS鳴らす。 End If ' End Select End If End If Atofftime = 0 '自動OFFのタイマーをリセットする。 End If Ir_status = 0 ' Case 2 : 'リピート・モードを受信。 If Contmode <> 0 Then 'If 電源[ON]中か? Then If Ir_custom = Customcode Then 'If カスタムコードが一致したか? Then Select Case Command Case 14 : '[チャンネル+]ボタン(色相+)。 If Color < 1014 Then 'If 色相の上限値ではないか? Then Color = Color + 10 Else Color = 1023 Gosub Beep50ms '4KHzの音を50mS鳴らす。 End If Gosub Colorset '色相設定値からRGBカラー値に変換する。 Gosub Colorcal 'RGBカラー値を輝度計算してPWM波形にする。 ' Case 15 : '[チャンネル−]ボタン(色相−)。 If Color > 9 Then 'If 色相の下限値ではないか? Then Color = Color - 10 Else Color = 0 Gosub Beep50ms '4KHzの音を50mS鳴らす。 End If Gosub Colorset '色相設定値からRGBカラー値に変換する。 Gosub Colorcal 'RGBカラー値を輝度計算してPWM波形にする。 ' Case 16 : '[音量+]ボタン(輝度Up)。 If Bright < 252 Then 'If 輝度の上限値ではないか? Then Bright = Bright + 4 Else Bright = 255 Gosub Beep50ms '4KHzの音を50mS鳴らす。 End If Gosub Colorcal 'RGBカラー値を輝度計算してPWM波形にする。 ' Case 17 : '[音量−]ボタン(輝度Down)。 If Bright > 5 Then 'If 輝度の下限値ではないか? Then Bright = Bright - 4 Else Bright = 2 Gosub Beep50ms '4KHzの音を50mS鳴らす。 End If Gosub Colorcal 'RGBカラー値を輝度計算してPWM波形にする。 End Select Atofftime = 0 '自動OFFのタイマーをリセットする。 End If End If Ir_status = 0 ' Case Is > 2 : '受信エラー。 Ir_status = 0 End Select Return ' ' *************************************************** ' * 色相設定値からRGBカラー値に変換するサブルーチン * (Color = 色相設定値) ' *************************************************** ' Colorset: Select Case Color Case Is < 151 : '[0-150] 赤。 Tempw1 = Color * 17 Tempw1 = Tempw1 / 10 Ledcolor_r = 255 Ledcolor_g = 0 Ledcolor_b = Low(tempw1) Case Is < 302 : '[151-301] マゼンタ。 Tempw1 = 301 - Color Tempw1 = Tempw1 * 17 Tempw1 = Tempw1 / 10 Ledcolor_r = Low(tempw1) Ledcolor_g = 0 Ledcolor_b = 255 Case Is < 453 : '[302-452] 青。 Tempw1 = Color - 302 Tempw1 = Tempw1 * 17 Tempw1 = Tempw1 / 10 Ledcolor_r = 0 Ledcolor_g = Low(tempw1) Ledcolor_b = 255 Case Is < 604 : '[453-603] シアン。 Tempw1 = 603 - Color Tempw1 = Tempw1 * 17 Tempw1 = Tempw1 / 10 Ledcolor_r = 0 Ledcolor_g = 255 Ledcolor_b = Low(tempw1) Case Is < 755 : '[604-754] 緑。 Tempw1 = Color - 604 Tempw1 = Tempw1 * 17 Tempw1 = Tempw1 / 10 Ledcolor_r = Low(tempw1) Ledcolor_g = 255 Ledcolor_b = 0 Case Is < 906 : '[755-905] 黄。 Tempw1 = 905 - Color Tempw1 = Tempw1 * 17 Tempw1 = Tempw1 / 10 Ledcolor_r = 255 Ledcolor_g = Low(tempw1) Ledcolor_b = 0 Case Else : '[906以上] 白。 Ledcolor_r = 255 Ledcolor_g = 255 Ledcolor_b = 255 End Select Return ' ' ****************************************************** ' * RGBカラー値を輝度計算してPWM波形にするサブルーチン * ' ****************************************************** ' Colorcal: Tempw1 = Ledcolor_r * Bright '[赤]の輝度を計算する。(色相 * 輝度値 / 256) Ledset_r = High(tempw1) '[赤]のPWM波形を設定する。 ' Tempw1 = Ledcolor_g * Bright '[緑]の輝度を計算する。(色相 * 輝度値 / 256) Ledset_g = High(tempw1) '[緑]のPWM波形を設定する。 ' Tempw1 = Ledcolor_b * Bright '[青]の輝度を計算する。(色相 * 輝度値 / 256) Ledset_b = High(tempw1) '[青]のPWM波形を設定する。 Return ' ' ************************************ ' * 4KHzの音を50mS鳴らすサブルーチン * ' ************************************ ' Beep50ms: Disable Timer1 'Timer1 オーバーフロー割り込みを禁止する。 Sound Sp_out , 200 , 21 '4KHzの音を50mS鳴らす。 Enable Timer1 'Timer1 オーバーフロー割り込みを許可する。 Return ' ' ***************************************** ' * 4KHzで50mSの音を2回鳴らすサブルーチン * ' ***************************************** ' Beep50ms2: Gosub Beep50ms '4KHzの音を50mS鳴らす。 Waitms 50 Gosub Beep50ms '4KHzの音を50mS鳴らす。 Return ' ' *********************************************** ' * NECフォーマット 赤外線リモコン 受信ルーチン * ' *********************************************** ' Irnecrx: If Ir_rxm = 0 Then Goto Irnecrx2 'If 赤外線信号が入ってきたか? Then If Tifr.tov0 = 0 Then Return 'If (64uSx256= 16.384mS)経過していないか? Then Set Tifr.tov0 'Timer0オーバーフロー・フラグをリセットする。 Tim16msf = 1 '16mS経過フラグを立てる。 Ir_temp3 = Ir_temp3 + 1 If Ir_temp3 < 7 Then Return 'If 114.7mS(約115mS)経過していないか? Then Ir_temp3 = 0 Ir_status = 0 'リモコン信号が停止。(ボタンが離された) Ir_custom = 0 Ir_data = 0 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 ' ' ****************************** ' * 赤外線受信割り込みルーチン * ' ****************************** ' Irrxint: '何も処理しない。 Return ' ' ************************************* ' * Timer1 [1mS]割り込み 処理ルーチン * ' ************************************* ' $notransform On 'R23またはR0を使用する命令に自動修正させない。 ' Tint1ms: $asm PUSH R1 IN R1,SREG 'ステータス・レジスタを待避。 PUSH R24 PUSH R25 ; LDS R24,{Count1ms} INC R24 CPI R24,5 BRCS Tint1ms10 'If 5mS経過したか? Then ; ; * LED設定値に順応してフェード調光する * ; LDS R24,{Ledset_r} '[赤]LEDの比較。 LDS R25,{Ledout_r} CP R24,R25 BREQ Tint1ms1 'If [赤]LEDは設定値と等しいか? Then BRCS Tint1ms2 'If 設定値 < 出力値 か? Then INC R25 RJMP Tint1ms3 ; Tint1ms2: DEC R25 Tint1ms3: STS {Ledout_r},R25 Tint1ms1: Out Ocr1a , R25 '[赤]のPWM波形を出力する。 ; LDS R24,{Ledset_g} '[緑]LEDの比較。 LDS R25,{Ledout_g} CP R24,R25 BREQ Tint1ms4 'If [緑]LEDは設定値と等しいか? Then BRCS Tint1ms5 'If 設定値 < 出力値 か? Then INC R25 RJMP Tint1ms6 ; Tint1ms5: DEC R25 Tint1ms6: STS {Ledout_g},R25 Tint1ms4: Out Ocr1b , R25 '[緑]のPWM波形を出力する。 ; LDS R24,{Ledset_b} '[青]LEDの比較。 LDS R25,{Ledout_b} CP R24,R25 BREQ Tint1ms7 'If [青]LEDは設定値と等しいか? Then BRCS Tint1ms8 'If 設定値 < 出力値 か? Then INC R25 RJMP Tint1ms9 ; Tint1ms8: DEC R25 Tint1ms9: STS {Ledout_b},R25 Tint1ms7: Out Ocr1d , R25 '[青]のPWM波形を出力する。 ; CLR R24 Tint1ms10: STS {Count1ms},R24 ; POP R25 POP R24 Out Sreg , R1 'ステータス・レジスタを復帰 POP R1 $end Asm Return ' ' $notransform Off ' ' End ' ' * EEPROMの初期値テーブル * ' Eepinitable: Data 255 , 0% , 0 '[1] 赤 Data 255 , 151% , 0 '[2] マゼンタ Data 255 , 302% , 0 '[3] 青 Data 255 , 453% , 0 '[4] シアン Data 255 , 604% , 0 '[5] 緑 Data 255 , 755% , 0 '[6] 黄 Data 255 , 1023% , 0 '[7] 白 100% Data 128 , 1023% , 0 '[8] 白 50% Data 64 , 1023% , 0 '[9] 白 25% Data 255 , 1023% , 1 '[10] 自動色相変更 15秒 Data 255 , 1023% , 2 '[11] 自動色相変更 30秒 Data 255 , 1023% , 3 '[12] 自動色相変更 60秒 ' ' * 自動色相変更の時間テーブル * (12ボタン) ' Autocoltab: Data 0% 'LOOKUP命令のダミー。 Data 1% '[1] 1×16.384mS×906階調 = 15秒 Data 2% '[2] 2×16.384mS×906階調 = 30秒 Data 4% '[3] 4×16.384mS×906階調 = 60秒 Data 8% '[4] 8×16.384mS×906階調 = 2分 Data 12% '[5] 12×16.384mS×906階調 = 3分 Data 20% '[6] 20×16.384mS×906階調 = 5分 Data 40% '[7] 40×16.384mS×906階調 = 10分 Data 81% '[8] 81×16.384mS×906階調 = 20分 Data 121% '[9] 121×16.384mS×906階調 = 30分 Data 242% '[10] 242×16.384mS×906階調 = 1時間 Data 485% '[11] 485×16.384mS×906階調 = 2時間 Data 727% '[12] 727×16.384mS×906階調 = 3時間 ' ' * リモコン コード テーブル * (23コード) ' Codetable: ' カスタムコード 電源 Ch1 Ch2 Ch3 Ch4 Ch5 Ch6 Ch7 Ch8 Ch9 Ch10 Ch11 Ch12 Ch+ Ch- 音量+ 音量- 消音 入力切換音声切換画面表示 Data &HCF , &H30 , &H00 , &H10 , &H11 , &H12 , &H13 , &H14 , &H15 , &H16 , &H17 , &H18 , &H19 , &H1A , &H1B , &H59 , &H5A , &H09 , &H0A , &H0B , &H05 , &H03 , &H0D '[0] 三洋(2) , 地デジ-三洋1 Data &HCF , &H30 , &H00 , &H10 , &H11 , &H12 , &H13 , &H14 , &H15 , &H16 , &H17 , &H18 , &H19 , &H1A , &H1B , &H01 , &H02 , &H09 , &H0A , &H0B , &H05 , &H03 , &H0D '[1] 三洋(1) Data &HBF , &H40 , &H12 , &H01 , &H02 , &H03 , &H04 , &H05 , &H06 , &H07 , &H08 , &H09 , &H0A , &H0B , &H0C , &H1B , &H1F , &H1A , &H1E , &H10 , &H0F , &H13 , &H1C '[2] NEC(3) ,東芝 , 地デジ-東芝 Data &HE7 , &H18 , &H08 , &H10 , &H11 , &H12 , &H13 , &H14 , &H15 , &H16 , &H17 , &H18 , &H19 , &H1A , &H1B , &H00 , &H01 , &H02 , &H03 , &H09 , &H0A , &H1D , &H0F '[3] NEC(1) Data &H2D , &H10 , &H1F , &H5C , &H1E , &H5E , &H58 , &H1A , &H5B , &H1B , &H59 , &H5A , &H1D , &H19 , &H18 , &H09 , &H12 , &H10 , &H11 , &H5F , &H04 , &H17 , &HFF '[4] 地デジ-MrMax Data &HDF , &H20 , &H00 , &H52 , &H12 , &H50 , &H4E , &H0E , &H4C , &H4A , &H0A , &H48 , &H46 , &H06 , &H44 , &H13 , &H53 , &H1B , &H5B , &H04 , &H43 , &H08 , &HFF '[5] 地デジ-TMY1 Data &HFD , &H86 , &H10 , &H11 , &H12 , &H13 , &H14 , &H15 , &H16 , &H17 , &H18 , &H19 , &H1A , &H1B , &H1C , &H28 , &H29 , &H20 , &H21 , &H1F , &H1E , &H32 , &HFF '[6] 地デジ-TMY2 Data &HE0 , &H84 , &H20 , &H01 , &H02 , &H03 , &H04 , &H05 , &H06 , &H07 , &H08 , &H09 , &H0A , &H0B , &H0C , &H50 , &H51 , &H60 , &H61 , &H64 , &H40 , &H65 , &H9B '[7] 地デジ-DXアンテナ Data &HAF , &H50 , &H17 , &H0D , &H0E , &H0F , &H1C , &H1D , &H1E , &H1F , &H04 , &H05 , &H06 , &H07 , &H0C , &H19 , &H18 , &H12 , &H15 , &H0B , &H09 , &H08 , &H10 '[8] 日立(1) Data &HFB , &H04 , &H08 , &H11 , &H12 , &H13 , &H14 , &H15 , &H16 , &H17 , &H18 , &H19 , &H10 , &H1C , &H1D , &H00 , &H01 , &H02 , &H03 , &H09 , &H0B , &H0A , &H1B '[9] 日立(3) , 三菱 , LG Data &H7A , &H83 , &H08 , &H11 , &H12 , &H13 , &H14 , &H15 , &H16 , &H17 , &H18 , &H19 , &H10 , &H0A , &H1C , &H00 , &H01 , &H02 , &H03 , &H09 , &H0C , &H00 , &H1B '[A] 日立(4) Data &HEA , &H15 , &H12 , &H01 , &H02 , &H03 , &H04 , &H05 , &H06 , &H07 , &H08 , &H09 , &H0A , &H0B , &H0C , &H1C , &H1D , &H16 , &H17 , &H15 , &H00 , &H13 , &H14 '[B] 富士通ゼネラル Data &H3B , &HC4 , &H18 , &H01 , &H02 , &H03 , &H04 , &H05 , &H06 , &H07 , &H08 , &H09 , &H0A , &H0B , &H0C , &H10 , &H11 , &H12 , &H13 , &H19 , &H1C , &H14 , &H53 '[C] ビクター Data &H02 , &H86 , &H49 , &H01 , &H02 , &H03 , &H04 , &H05 , &H06 , &H07 , &H08 , &H09 , &H00 , &H4C , &H4D , &H0A , &H0B , &H0C , &H0D , &H40 , &H43 , &H44 , &H42 '[D] アイワ(1) Data &H55 , &HAA , &H1C , &H01 , &H02 , &H03 , &H04 , &H05 , &H06 , &H07 , &H08 , &H09 , &H00 , &H46 , &H47 , &H10 , &H11 , &H0A , &H0B , &H49 , &H13 , &H1E , &H4A '[E] パイオニア , 地デジ-パイオニア (リピート×) Data &H63 , &H80 , &H0F , &H00 , &H01 , &H02 , &H03 , &H04 , &H05 , &H06 , &H07 , &H08 , &H09 , &H1D , &H1E , &H0A , &H0B , &H0C , &H0D , &H0E , &H12 , &H4A , &HFF '[F] 地デジ-オリオン2 (リピート×)