$prog &HFF , &H6A , &HFF , &H00 'ヒューズ設定。(工場出荷状態) ' ' ********************************************** ' * * ' * LED 卓上ライト(振動) * ' * * ' * AVR is using ATtiny13A * ' * Basic Compiler is BASCOM-AVR * ' * Copyright By O-Family 2013. 1. 3 * ' ********************************************** ' ' Ver 00.04 テスト・バージョン。 2012.10.14 ' Ver 01.01 初回公開バージョン。 2012.10.17 ' Ver 01.02 スイッチ[1]でOFFにした後に、その振動で起動しないようにOFF検出を延長する。 2013. 1. 3 ' ' ' * 動作時間の設定 * ' Const Swlight = 300 '[SW1]で点灯する時間。(秒) Const Mlight1 = 540 '振動で高輝度点灯する時間。(秒) Const Mlight2 = 60 '振動で半輝度点灯する時間。(秒) $regfile = "ATtiny13.DAT" '使用するAVRを設定。 $crystal = 1200000 'AVRクロックを設定。 ' $hwstack = 20 'ハードウェア・スタックの容量を設定。 $swstack = 8 'ソフトウェア・スタックの容量を設定。 $framesize = 8 'フレーム領域の容量を設定。 ' ' * ポート名の定義 * ' Sw_1 Alias Pinb.1 'スイッチ[1]の接続ポート。 Sw_1pu Alias Portb.1 'スイッチ[1]のプルアップポート。 Sw_m Alias Pinb.2 'マーキュリースイッチの接続ポート。 Sw_mpu Alias Portb.2 'マーキュリースイッチのプルアップポート。 Vr_pow Alias Portb.3 'ボリューム電源端子の接続ポート。 ' Ad_vr Alias 2 'ボリュームのA/Dチャネル番号。(PB4) ' ' * 変数の宣言 * ' Dim Ledset As Byte 'LEDの輝度設定値。 Dim Ledout As Byte 'LEDの輝度出力値。 Dim Time17msf As Byte '1.7mS経過フラグ。 Dim Time1scun As Word '1秒カウンター。 Dim Time1sf As Byte '1秒経過フラグ。 Dim Ledtimer As Word 'LED点灯時間タイマー。 Dim Timebright As Byte '輝度変更時間用タイマー。 Dim Swtimer As Word 'スイッチ長押しタイマー。 Dim Ledmode As Byte 'LEDの点灯モード。(0:OFF , 1:振動で最大輝度点灯 , 2:振動点灯の半減 , 3:SW1で点灯 , 4:SW1長押しで点灯) Dim Swoffchk As Byte 'スイッチの[OFF]確認フラグ。 Dim Swoff2time As Byte 'スイッチ[OFF]確認の後半用チャタリング・タイマー。 ' Dim Temp1 As Byte '汎用テンポラリ変数 Byte型 No.1 Dim Tempw1 As Word '汎用テンポラリ変数 Word型 No.1 ' ' * ハードウェアの初期設定 * ' Config Vr_pow = Output 'ボリューム電源端子の接続ポートを出力に設定する。 Set Sw_1pu 'スイッチ[1]の接続ポートをプルアップする。 Set Sw_mpu 'マーキュリースイッチの接続ポートをプルアップする。 ' Config Aci = Off 'アナログ比較器の電源を切る。 Config Adc = Single , Prescaler = Auto , Reference = Avcc 'A/Dコンバータの設定。 Set Didr0.adc2d 'デジタル入力禁止レジスタの設定。(PB4) ' Config Portb.0 = Output '[OC0A]ポートを出力に設定する。 Config Timer0 = Pwm , Prescale = 8 , Clear Timer = 1 , Compare A Pwm = Clear Up '8ビット高速PWM動作。 '1,200,000Hz / 8 = 150,000Hz 150,000Hz / 256 = 586Hz (1.7mS) ' Set Pcmsk.pcint1 'スイッチ[1]のピン変化割り込みを許可する。 Set Pcmsk.pcint2 'マーキュリースイッチのピン変化割り込みを許可する。 On Pcint0 Swint Nosave 'スイッチ入力のピン変化割り込みルーチンを設定。 Enable Interrupts 'すべての割り込みを許可。 ' ' ******************* ' * メイン ルーチン * ' ******************* ' Main: If Tifr.tov0 = 1 Then 'If 1.7mS経過したか? Then Set Tifr.tov0 'Timer0 オーバーフロー・フラグをリセット。 Time17msf = 1 '1.7mS経過フラグをセット。 Time1scun = Time1scun + 1 If Time1scun >= 588 Then 'If 1秒経過したか? Then Time1scun = 0 Time1sf = 1 '1秒経過フラグをセット。 End If ' ' * LEDをフェード調光する * ' Timebright = Timebright + 1 If Timebright > 4 Then 'If 調光の時間か? Then Timebright = 0 If Ledset > Ledout Then 'If LEDの輝度変更有りか? Then Ledout = Ledout + 1 Else If Ledset < Ledout Then 'If LEDの輝度変更有りか? Then Ledout = Ledout - 1 End If End If Ocr0a = Ledout 'PWMのパルス幅を設定する。 End If ' ' * 点灯モードごとに時間を管理する * ' Select Case Ledmode Case 0 : 'LEDをOFF。 If Ledout = 0 Then 'If LEDが消灯したか? Then If Swoffchk = 0 Then 'If スイッチのOFFのチェック終了か? Then Tccr0a = &B0000_0011 '[OC0A]ポートを[L]にする。 Reset Vr_pow 'ボリューム電源端子をOFFにする。 Stop Adc 'A/Dコンバータの電源を切る。 Set Gifr.pcif 'ピン変化割り込みをリセットする。 Enable Pcint0 'スイッチ割り込みを許可する。 ' Power Powerdown 'スリープモードへ移行する。(スイッチ割り込みで再起動する) ' Disable Pcint0 'スイッチ割り込みを禁止する。 Start Adc 'A/Dコンバータに電源を供給。 Set Vr_pow 'ボリューム電源端子をONにする。 Tccr0a = &B1000_0011 '[OC0A]ポートを[PWM]にする。 End If End If ' Case 1 : '振動で最大輝度点灯。 If Time1sf <> 0 Then 'If 1秒経過したか? Then Gosub Ledtimeinc 'LED点灯時間タイマーを加算する。 If Ledtimer >= Mlight1 Then '最大輝度点灯時間が終わったか? Then Ledmode = 2 Ledtimer = 0 Ledset = 128 '輝度を半減する。 End If End If ' Case 2 : '振動で半輝度点灯。 If Time1sf <> 0 Then 'If 1秒経過したか? Then Gosub Ledtimeinc 'LED点灯時間タイマーを加算する。 If Ledtimer >= Mlight2 Then '半輝度点灯時間が終わったか? Then Ledmode = 0 Ledset = 0 '消灯する。 End If End If ' Case Is >= 3 : 'SW1で点灯。 Tempw1 = Getadc(ad_vr , &H20) '輝度ボリュームの電圧値をA/D変換する。 Temp1 = High(tempw1) 'A/D値の上位8bitを取り出す。 If Temp1 < 10 Then 'If 最小輝度値以下か Then Temp1 = 10 '輝度を最小値にする。 End If Ledset = Temp1 'ボリュームの輝度をLEDの輝度に設定する。 ' If Ledmode = 3 Then 'If 自動消灯するか? Then If Time1sf <> 0 Then 'If 1秒経過したか? Then Gosub Ledtimeinc 'LED点灯時間タイマーを加算する。 If Ledtimer >= Swlight Then '点灯時間が終わったか? Then Ledmode = 0 Ledset = 0 '消灯する。 End If End If End If End Select End If ' ' * スイッチの検出 * ' If Swoffchk <> 0 Then Goto Swchk5 'If スイッチの[OFF]検出中か? Then If Sw_1 = 0 Then Goto Swchk1 'If [SW1]が押されたか? Then If Sw_m = 0 Then Goto Swchk2 'If 振動が感知されたか? Then Goto Swchk9 ' ' Swchk1: '[SW1]が押された。 If Ledmode = 0 Then 'If 消灯中か? Then Ledmode = 3 'LEDを[SW1]モードで点灯する。 Swtimer = 0 'スイッチの長押しタイマーをリセット。 Else '点灯中の場合。 Ledmode = 0 Ledset = 0 '消灯する。 End If Goto Swchk3 ' ' Swchk2: '振動が感知された。 If Ledmode < 3 Then 'If [SW1]で点灯していないか? Then Ledmode = 1 Ledset = 255 '最大輝度で点灯する。 End If ' ' Swchk3: Swoffchk = 1 'スイッチの[OFF](離した)を検出させる。 Time1sf = 0 Ledtimer = 0 Time17msf = 0 Goto Swchk9 ' ' Swchk5: 'スイッチが離されるのを確認する。 If Time17msf <> 0 Then 'If 1.7mS経過したか? Then Time17msf = 0 Swtimer = Swtimer + 1 If Swtimer >= 18 Then 'If 30mS経過したか? Then If Swoffchk = 1 Then 'If OFFのチェックか? Then If Sw_1 = 1 Then 'If スイッチが離されたか? Then Swoffchk = 2 '後半のチャタリング除去に設定。 Swtimer = 0 Else '長押しのチェック。 If Ledmode = 3 Then 'If SW1で点灯か? Then If Swtimer >= 588 Then 'If 1秒経過したか? Then Ledmode = 4 For Temp1 = 1 To 2 'LEDをフラッシュ点灯する。 Ocr0a = 128 Waitms 100 Ocr0a = 0 Waitms 100 Next Temp1 End If Else Swtimer = 0 End If End If Else '後半のチャタリング除去完了。 Swtimer = 0 Swoff2time = Swoff2time + 1 If Swoff2time >= 17 Then 'If スイッチが離されてから500mS経過したか? Then Swoff2time = 0 Swoffchk = 0 End If End If End If End If Swchk9: Goto Main ' ' * LED点灯時間タイマーを加算するサブルーチン * ' Ledtimeinc: Time1sf = 0 Ledtimer = Ledtimer + 1 Return ' ' **************************** ' * スイッチ割り込みルーチン * ' **************************** ' Swint: '何も処理しない。 Return ' ' End