$prog &HFF , &H62 , &HDF , &HFF 'ヒューズ設定。(工場出荷状態) ' ' ******************************************************** ' * * ' * LEDライト調光器 赤外線リモコン 受信機プログラム * ' * * ' * AVR is using ATtiny861A * ' * Basic Compiler is BASCOM-AVR * ' * Copyright By O-Family 2013. 4.13 * ' ******************************************************** ' ' Ver 00.23 テスト・バージョン。 2012. 9.11 ' Ver 01.01 初回公開バージョン。 2012. 9.19 ' Ver 01.02 [Autocoltimer]をWord型に修正。 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]プルアップポート。 ' ' * 変数の宣言 * ' Dim Seladdress As Byte 'リモコンのアドレス選択ジャンパーピンで選択されたアドレス。 Dim Address As Byte 'リモコンRC5コードのアドレス。(0 〜 31) Dim Command As Byte 'リモコンRC5コードのコマンド。(0 〜 63) Dim Rxcount As Byte '同じRC5コードの受信回数。 Dim Togglebit As Byte 'トグルビット検出フラグ。 Dim Fslplow As Byte '[FSLP]値の下位6bit受信データ。 Dim Fslpdata As Word '[FSLP]値の受信データ。 Dim Fslpchf As Byte '[FSLP]のデータ変更フラグ。 Dim Bright As Word '輝度値。 Dim Color As Word '色相値。 Dim Contmode As Byte '制御モード。 Dim Count1ms As Byte '1mSカウンター。 Dim Blinktimer As Byte '[黄]LEDの点滅タイマー。 Dim Repcomtemp As Byte 'リピート・コマンドの保管用。 Dim Atofftime As Word '自動OFFのタイマーカウンター。 Dim Autocolf As Byte '自動色相変更フラグ。 Dim Autocoltimer As Word '自動色相変更タイマー。 Dim Autocoldata 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 Ledtemp_r As Byte '[赤]LED保管値。 Dim Ledtemp_g As Byte '[緑]LED保管値。 Dim Ledtemp_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 Dummy As Eram Long 'EEPROM 4バイトのダミーエリア。 Dim Eep_ledcolor_r(5) As Eram Byte 'EEPROM プリセット [赤]の色相値。 Dim Eep_ledcolor_g(5) As Eram Byte 'EEPROM プリセット [緑]の色相値。 Dim Eep_ledcolor_b(5) As Eram Byte 'EEPROM プリセット [青]の色相値。 Dim Eep_bright(5) As Eram Word 'EEPROM プリセット輝度値。 Dim Eep_autocolf(5) As Eram Byte 'EEPROM 自動色相変更フラグ。 Dim Eep_autocolchgt(5) As Eram Word '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 Porta.2 '未使用ポートをプルアップ。 Set Porta.3 '未使用ポートをプルアップ。 Set Porta.7 '予備ジャンパー・ピンのポートをプルアップ。 Set Portb.0 '未使用ポートをプルアップ。 Set Portb.4 '未使用ポートをプルアップ。 ' Set Prr.prusi '電力削減 USI回路の停止。 Config Aci = Off 'アナログ比較器の電源を切る。 Config Rc5 = Ir_rxm '赤外線受信モジュールの接続ポートを設定する。(タイムアウト=6.4ms) ' ' * Timerの設定 * ' 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 '赤外線受信割り込みルーチンのラベルを設定。 ' ' * 初期設定 * ' Fslplow = &HFF '[FSLP]下位データを未受信に設定する。 ' Ledcolor_r = 255 '電源投入時の初期値。 Ledcolor_g = 255 Ledcolor_b = 255 Ledtemp_r = 255 Ledtemp_g = 255 Ledtemp_b = 255 Bright = 255 If Eep_autocolf(1) > 1 Then 'If EEPROMが初期状態か? Then For Temp1 = 1 To 5 'EEPROMの自動色相設定を初期化する。 Eep_autocolf(temp1) = 0 Eep_autocolchgt(temp1) = 0 Next Temp1 End If ' Config Watchdog = 2048 'ウォッチドッグ タイマーの時間を設定。 Start Watchdog 'ウォッチドッグ タイマーの監視を開始。 ' Enable Interrupts 'すべての割り込みを許可。 Gosub Beep50ms '起動音、4KHzの音を50mS鳴らす。 ' ' ******************* ' * メイン ルーチン * ' ******************* ' Main: Reset Watchdog 'ウォッチドッグ タイマーを再スタート。 ' ' * 電源OFFでスリープに入る * (Mainルーチンは8mSで回る) ' Select Case Contmode Case 0 : '電源OFF中。 Temp1 = Ledout_r Or Ledout_g Temp1 = Temp1 Or Ledout_b If Temp1 = 0 Then 'If LEDが全て消えたか? Then Atofftime = Atofftime + 1 If Atofftime > 250 Then 'If 自動OFF時間(2秒)を越えたか? Then Stop Watchdog 'ウォッチドッグ タイマーの監視を停止。 Reset Code_sel0pu 'リモコンのアドレス選択ジャンパーピン[0]接続ポートのプルアップを解除する。 Reset Code_sel1pu 'リモコンのアドレス選択ジャンパーピン[1]接続ポートのプルアップを解除する。 Reset Code_sel2pu 'リモコンのアドレス選択ジャンパーピン[2]接続ポートのプルアップを解除する。 Enable Pcint1 '赤外線受信割り込みを許可する。 ' Power Powerdown 'スリープモードへ移行する。(赤外線受信割り込みで再起動する) ' Disable Pcint1 '赤外線受信変化割り込みを禁止する。 Set Code_sel0pu 'リモコンのアドレス選択ジャンパーピン[0]接続ポートをプルアップする。 Set Code_sel1pu 'リモコンのアドレス選択ジャンパーピン[1]接続ポートをプルアップする。 Set Code_sel2pu 'リモコンのアドレス選択ジャンパーピン[2]接続ポートをプルアップする。 Start Watchdog 'ウォッチドッグ タイマーの監視を開始。 Atofftime = 0 End If End If ' Case Is >= 2 : '輝度選択中またはプリセット選択中の場合。 Atofftime = Atofftime + 1 If Atofftime > 1250 Then 'If 自動モード復帰時間(10秒)を越えたか? Then Contmode = 1 Set Led_1 '電源ランプ[青]を点灯する。 Reset Led_2 'カラー変更ランプ[黄]を消灯する。 Atofftime = 0 End If End Select ' ' Gosub Irreceive '赤外線リモコン信号を受信する。 Gosub Fslpdtchg '[FSLP]のデータ変更処理。 ' ' * モードの移行でLEDを点滅させる * ' If Contmode >= 3 Then 'If [Preset]or[AutoColor]モードか? Then Blinktimer = Blinktimer + 1 If Blinktimer > 20 Then 'If 点滅時間か? Then If Contmode = 3 Then 'If [Preset]モードか? Then Toggle Led_1 '電源ランプ[青]を点滅する。 Else '[AutoColor]モードの場合。 Toggle Led_2 'カラー変更ランプを点滅する。 End If Blinktimer = 0 End If End If ' ' * 自動色相変更モードで色を変える * ' If Contmode <> 0 Then 'If 電源がONか? Then If Autocolf <> 0 Then 'If 自動色相変更モードか? Then Autocoltimer = Autocoltimer + 1 If Autocoltimer > Autocolchgt Then 'If 色相の変更時間か? Then Autocoltimer = 0 Autocoldata = Autocoldata + 1 If Autocoldata > 905 Then 'If 色相の最終値か? Then Autocoldata = 0 End If Tempw1 = Autocoldata Gosub Colorset '色相設定値からRGBカラー値に変換する。 Gosub Colorcal 'RGBカラー値を輝度計算してPWM波形にする。 End If End If End If ' Goto Main ' ' ******************************** ' * 赤外線リモコン信号を受信する * ' ******************************** ' Irreceive: Seladdress.2 = Code_sel0 'リモコンのアドレス選択ジャンパーピンを読み込む。 Seladdress.3 = Code_sel1 Seladdress.4 = Code_sel2 ' Getrc5(address , Command ) 'RC5赤外線リモコン信号を受信する。 Temp1 = Address And &B1111_1100 'ジャンパーピンで選択されたアドレスを取り出す。 If Temp1 = Seladdress Then 'If ジャンパーピンのアドレスが一致したか? Then ' Address = Address And &B0000_0011 'アドレス部の制御コードを取り出す。 Select Case Address Case &B0000_0000 : '制御コマンドを受信。 Temp1 = Command And &B1000_0000 'リモコンコードからトグルビットを取り出す。 If Togglebit <> Temp1 Then 'If トグルビットに変更が有ったか? Then Togglebit = Temp1 Rxcount = 0 End If ' Rxcount = Rxcount + 1 'RC5同じコードの受信回数を増やす。 If Rxcount = 2 Then '2回同じコードを受信したか? Then Temp1 = Command And &B0011_1111 'コマンドを取り出す。 Select Case Temp1 Case &B0001_1010 : '[ON/OFF]コマンド。 If Contmode = 0 Then 'If 電源[OFF]中か? Then Contmode = 1 Set Led_1 '電源ランプを点灯する。 Gosub Beep50ms '4KHzの音を50mS鳴らす。 Ledset_r = Ledtemp_r '輝度を前回の保管値にする。 Ledset_g = Ledtemp_g Ledset_b = Ledtemp_b Else '電源[OFF]にする。 Contmode = 0 Reset Led_1 '電源ランプを消灯する。 Reset Led_2 'カラー変更ランプを消灯する。 Gosub Beep50ms '4KHzの音を50mS鳴らす。 Waitms 50 Gosub Beep50ms '4KHzの音を50mS鳴らす。 Ledtemp_r = Ledout_r '輝度を保管する。 Ledtemp_g = Ledout_g Ledtemp_b = Ledout_b Ledset_r = 0 '輝度を最小にする。 Ledset_g = 0 Ledset_b = 0 End If ' Case &B0001_1011 : '[Color]輝度/色相コマンド。 Select Case Contmode Case 1 : '輝度設定中。 If Autocolf = 0 Then 'If 自動色相変更がOFFか? Then Contmode = 2 Else Contmode = 4 End If Set Led_1 '電源ランプを点灯する。 Set Led_2 'カラー変更ランプを点灯する。 Gosub Beep50ms '4KHzの音を50mS鳴らす。 Case 2 : '色相設定中。 Contmode = 1 Set Led_1 '電源ランプを点灯する。 Reset Led_2 'カラー変更ランプを消灯する。 Gosub Beep50ms '4KHzの音を50mS鳴らす。 Case 3 : 'プリセット選択中。 If Autocolf = 0 Then 'If 自動色相変更がOFFか? Then Contmode = 2 Else Contmode = 4 End If Set Led_1 '電源ランプを点灯する。 Set Led_2 'カラー変更ランプを点灯する。 Gosub Beep50ms '4KHzの音を50mS鳴らす。 Case 4 : '自動色相設定中。 Contmode = 1 Set Led_1 '電源ランプを点灯する。 Reset Led_2 'カラー変更ランプを消灯する。 Gosub Beep50ms '4KHzの音を50mS鳴らす。 End Select ' Case &B0001_1100 : '[Preset]コマンド。 Select Case Contmode Case 1 : '輝度設定中。 Contmode = 3 Set Led_1 '電源ランプを点灯する。 Reset Led_2 'カラー変更ランプを消灯する。 Gosub Beep50ms '4KHzの音を50mS鳴らす。 Case 2 : '色相設定中。 Contmode = 4 Autocolf = 1 '自動色相変更をONにする。 Set Led_1 '電源ランプを点灯する。 Set Led_2 'カラー変更ランプを点灯する。 Gosub Beep50ms '4KHzの音を50mS鳴らす。 Case 3 : 'プリセット選択中。 Contmode = 1 Set Led_1 '電源ランプを点灯する。 Reset Led_2 'カラー変更ランプを消灯する。 Gosub Beep50ms '4KHzの音を50mS鳴らす。 Case 4 : '自動色相設定中。 Contmode = 2 Autocolf = 0 '自動色相変更をOFFにする。 Set Led_1 '電源ランプを点灯する。 Set Led_2 'カラー変更ランプを点灯する。 Gosub Beep50ms '4KHzの音を50mS鳴らす。 End Select Repcomtemp = 0 'プリセット書き込みコマンドをクリアする。 ' Case &B0001_0001 : 'プリセット(1)書き込みコマンド。 Temp2 = 1 Gosub Eepprewr 'EEPROMにプリセットデータを書き込む。 ' Case &B0001_0010 : 'プリセット(2)書き込みコマンド。 Temp2 = 2 Gosub Eepprewr 'EEPROMにプリセットデータを書き込む。 ' Case &B0001_0011 : 'プリセット(3)書き込みコマンド。 Temp2 = 3 Gosub Eepprewr 'EEPROMにプリセットデータを書き込む。 ' Case &B0001_0100 : 'プリセット(4)書き込みコマンド。 Temp2 = 4 Gosub Eepprewr 'EEPROMにプリセットデータを書き込む。 ' Case &B0001_0101 : 'プリセット(5)書き込みコマンド。 Temp2 = 5 Gosub Eepprewr 'EEPROMにプリセットデータを書き込む。 End Select End If Fslplow = &HFF '[FSLP]下位データを未受信に設定する。 ' Case &B0000_0001 : '[FSLP]の下位6bitデータを受信。 Temp1 = Command And &B10000000 'リモコンコードからトグルビットを取り出す。 If Togglebit <> Temp1 Then 'If トグルビットに変更が有ったか? Then Togglebit = Temp1 Fslplow = Command And &B0011_1111 '下位6bitのデータ。 End If ' Case &B0000_0010 : '[FSLP]の上位6bitデータを受信。 Temp1 = Command And &B10000000 'リモコンコードからトグルビットを取り出す。 If Togglebit <> Temp1 Then 'If トグルビットに変更が有ったか? Then Togglebit = Temp1 If Fslplow <> &HFF Then 'If 下位6bitが受信されているか? Then Temp1 = Command And &B0011_1111 '上位6bitのデータ。 Fslpdata = Temp1 Shift Fslpdata , Left , 6 '左へ6bitシフトする。 Fslpdata = Fslpdata + Fslplow Rxcount = 0 If Contmode <> 0 Then 'If 電源[ON]中か? Then Fslpchf = 1 '[FSLP]のデータ変更フラグを立てる。 End If End If End If Fslplow = &HFF '[FSLP]下位データを未受信に設定する。 End Select Atofftime = 0 '自動OFFのタイマーをリセットする。 End If Return ' ' ************************** ' * [FSLP]のデータ変更処理 * ' ************************** ' Fslpdtchg: If Fslpchf <> 0 Then 'If [FSLP]のデータに変更が有るか? Then Fslpchf = 0 Select Case Contmode Case 1 : '[輝度]の変更。 Bright = Fslpdata Shift Bright , Right , 2 '1/4する。 ' Case 2 : '[色相]の変更。 Tempw1 = Fslpdata - 40 '[40〜1023]を[0〜983]に変換する。 Gosub Colorset '色相設定値からRGBカラー値に変換する。 ' Case 3 : '[Preset]の変更。 Select Case Fslpdata Case Is < 200 : '[40-199] (1) Temp2 = 1 Gosub Eepprerd 'EEPROMからプリセットデータを読み出す。 ' Case Is < 400 : '[200-399] (2) Temp2 = 2 Gosub Eepprerd 'EEPROMからプリセットデータを読み出す。 ' Case Is < 600 : '[400-599] (3) Temp2 = 3 Gosub Eepprerd 'EEPROMからプリセットデータを読み出す。 ' Case Is < 800 : '[600-799] (4) Temp2 = 4 Gosub Eepprerd 'EEPROMからプリセットデータを読み出す。 ' Case Else : '[800-1023] (5) Temp2 = 5 Gosub Eepprerd 'EEPROMからプリセットデータを読み出す。 End Select ' Case 4 : '[自動色相変更時間]の変更。 Tempw1 = Fslpdata - 40 '[40〜1023]を[0〜983]に変換する。 Autocolchgt = Tempw1 / 2 '設定値([0〜983]÷2)+1×8mS×906(色階調) = 約7.2秒〜約60分 Autocoltimer = 0 End Select ' Gosub Colorcal 'RGBカラー値を輝度計算してPWM波形にする。 End If Return ' ' *************************************************** ' * 色相設定値からRGBカラー値に変換するサブルーチン * (Tempw1 = 色相設定値) ' *************************************************** ' Colorset: Select Case Tempw1 Case Is < 151 : '[0-150] 赤。 Tempw2 = Tempw1 * 17 Tempw2 = Tempw2 / 10 Ledcolor_r = 255 Ledcolor_g = 0 Ledcolor_b = Low(tempw2) Case Is < 302 : '[151-301] マゼンタ。 Tempw2 = 301 - Tempw1 Tempw2 = Tempw2 * 17 Tempw2 = Tempw2 / 10 Ledcolor_r = Low(tempw2) Ledcolor_g = 0 Ledcolor_b = 255 Case Is < 453 : '[302-452] 青。 Tempw2 = Tempw1 - 302 Tempw2 = Tempw2 * 17 Tempw2 = Tempw2 / 10 Ledcolor_r = 0 Ledcolor_g = Low(tempw2) Ledcolor_b = 255 Case Is < 604 : '[453-603] シアン。 Tempw2 = 603 - Tempw1 Tempw2 = Tempw2 * 17 Tempw2 = Tempw2 / 10 Ledcolor_r = 0 Ledcolor_g = 255 Ledcolor_b = Low(tempw2) Case Is < 755 : '[604-754] 緑。 Tempw2 = Tempw1 - 604 Tempw2 = Tempw2 * 17 Tempw2 = Tempw2 / 10 Ledcolor_r = Low(tempw2) Ledcolor_g = 255 Ledcolor_b = 0 Case Is < 906 : '[755-905] 黄。 Tempw2 = 905 - Tempw1 Tempw2 = Tempw2 * 17 Tempw2 = Tempw2 / 10 Ledcolor_r = 255 Ledcolor_g = Low(tempw2) 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 ' ' ************************************************** ' * EEPROMにプリセットデータを書き込むサブルーチン * ' ************************************************** ' Eepprewr: If Contmode = 3 Then 'If プリセット・モードか? Then If Repcomtemp <> Temp1 Then 'If 新規のプリセット書き込みコマンドか? Then Eep_ledcolor_r(temp2) = Ledcolor_r 'EEPROMにプリセット・データを書き込む。 Eep_ledcolor_g(temp2) = Ledcolor_g Eep_ledcolor_b(temp2) = Ledcolor_b Eep_bright(temp2) = Bright Eep_autocolf(temp2) = Autocolf Eep_autocolchgt(temp2) = Autocolchgt Disable Timer1 'Timer1 オーバーフロー割り込みを禁止する。 Sound Sp_out , 4000 , 21 '4KHzの音を1秒鳴らす。 Enable Timer1 'Timer1 オーバーフロー割り込みを許可する。 Repcomtemp = Temp1 'プリセット書き込みコマンドを保管する。 Togglebit = &HFF 'ブザー中に受信するので、トグルビットを強制破棄する。 End If Contmode = 1 'プリセット・モードを解除する。 Set Led_1 '電源ランプを点灯する。 Reset Led_2 'カラー変更ランプを消灯する。 End If Return ' ' **************************************************** ' * EEPROMからプリセットデータを読み出すサブルーチン * ' **************************************************** ' Eepprerd: Ledcolor_r = Eep_ledcolor_r(temp2) Ledcolor_g = Eep_ledcolor_g(temp2) Ledcolor_b = Eep_ledcolor_b(temp2) Bright = Eep_bright(temp2) Autocolf = Eep_autocolf(temp2) Autocolchgt = Eep_autocolchgt(temp2) Autocoltimer = 0 Return ' ' ************************************ ' * 4KHzの音を50mS鳴らすサブルーチン * ' ************************************ ' Beep50ms: Disable Timer1 'Timer1 オーバーフロー割り込みを禁止する。 Sound Sp_out , 200 , 21 '4KHzの音を50mS鳴らす。 Enable Timer1 'Timer1 オーバーフロー割り込みを許可する。 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