' ' ********************************************** ' * ラーメン・タイマー プログラム * ' * * ' * AVR is using ATtiny13A * ' * Basic Compiler is BASCOM-AVR * ' * Copyright By O-Family 2010. 2. 8 * ' ********************************************** ' ' Ver 1.01 初回公開バージョン ' ' $regfile = "ATtiny13.DAT" '使用するAVRを設定。 $crystal = 1200000 'AVRクロックを設定。 ' $hwstack = 32 'ハードウェア・スタックの容量を設定。 $swstack = 8 'ソフトウェア・スタックの容量を設定。 $framesize = 8 'フレーム領域の容量を設定。 ' ' * 変数の宣言 * ' Dim Timesel As Byte 'タイマーの時間選択。(0:3分, 1:4分, 2:5分) Dim Timecount As Byte 'タイマーの経過カウンター。 Dim Time10s As Byte '10秒カウンター。 Dim Offtime As Byte 'タイマー強制停止のキー入力時間。 Dim Keyflag As Byte 'キー入力状態フラグ。 Dim Ledtime 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 ' ' * ポート名の定義 * ' Sw_1 Alias Pinb.3 'スイッチ[1]の接続ポート。 Sw_2 Alias Pinb.0 'スイッチ[2]の接続ポート。 Led_1r Alias Portb.1 'LED1[赤]の接続ポート。 Led_2g Alias Portb.2 'LED2[緑]の接続ポート。 Sp_out Alias Portb.4 'スピーカーの接続ポート。 ' ' * ハードウェアの初期設定 * ' Gosub Portinit 'ポートの初期設定を行う。 Config Aci = Off 'アナログ比較器の電源を切る。 ' Config Timer0 = Timer , Prescale = 1024 , Clear Timer = 1 '1,200,000Hz / 1024 = 約1,172Hz Ocr0a = 114 - 1 '1,172Hz / 10Hz(100mS) = 117カウント ' *** 発振器の誤差により、112〜122の値で調整して下さい *** ' Pcmsk = &B0000_1000 'スイッチ[1]のピン変化割り込みを許可する。 On Pcint0 Intsw1 Nosave 'スイッチ[1]のピン変化割り込みルーチンを設定。 Enable Pcint0 'ピン変化割り込みを許可。 Enable Interrupts 'すべての割り込みを許可。 ' Set Led_1r 'パワーオン動作を表示する。 Set Led_2g '両LEDを1秒間点灯する。 Wait 1 ' ' * メイン ルーチン * ' Main: Reset Led_1r 'LEDを消灯する。 Reset Led_2g Reset Sp_out 'スピーカーの接続ポートを[L]レベルにする。 Reset Portb.0 'スイッチ[2]の接続ポートプルアップを禁止する。 Ddrb = &B0000_0000 '全てのポートを入力に変更する。 Power Powerdown 'AVRをパワーダウン・モードに移行する。 ' Gosub Portinit 'ポートの初期設定を行う。 Waitms 30 'チャタリング除去の待ち時間。 If Sw_1 = 1 Then Goto Main 'If スイッチ[1]が押されていない(誤動作)か? Then ' Gosub Buzz1khz '1KHzの音を50mS鳴らす。(起動音) Timesel = 0 'タイマーを3分に初期設定する。 Gosub Settime 'タイマーの時間からカウンターとLEDを設定する。 Timecount = Temp1 Keyflag = 1 'スイッチ[1]が離されるのを待つ。 Offtime = 20 '強制オフタイマーの設定値。(2秒) ' Main1: If Keyflag = 1 Then Goto Main3 'If スイッチ[1]のオフ確認中か? Then Main2: If Sw_1 = 0 Then Goto Main4 'If スイッチ[1]の入力が有ったか? Then ' If Tifr.ocf0a = 0 Then Goto Main2 'If 100mS経過していないか? Then Set Tifr.ocf0a 'Timer0 比較A一致フラグをリセット。 ' Ledtime = Ledtime + 1 'LED点灯タイマーを更新する。 Select Case Ledtime Case 9 : 'LEDの点灯時間。 Gosub Settime 'タイマーの時間からカウンターとLEDを設定する。 Case 10 : 'LEDの消灯時間。 Reset Led_1r Reset Led_2g Ledtime = 0 End Select ' Time10s = Time10s + 1 '10秒タイマーを更新する。 If Time10s <> 100 Then Goto Main2 'If 10秒経過していないか? Then Time10s = 0 Timecount = Timecount - 1 'タイマーの設定時間を更新する。 If Timecount <> 0 Then Goto Main2 'If タイマーの設定時間になっていないか? Then ' ' * アラームを鳴らす * ' If Sw_2 = 0 Then 'If 断続音か? Then For Temp1 = 1 To 16 '断続音(ピピピ)を鳴らす。 Tempw1 = 400 Tempw2 = 25 Gosub Buzzer '4KHzの音を100mS鳴らす。 Waitms 100 Next Temp1 Else For Temp1 = 1 To 2 Restore Melodydata 'メロディー(チャルメラ)を鳴らす。 Read Temp3 '音符数を読み込む。 For Temp2 = 1 To Temp3 Read Tempw1 Read Tempw2 Gosub Buzzer Next Temp2 Next Temp1 End If Goto Main ' ' スイッチ[1]のオフを確認する処理 * ' Main3: If Sw_1 = 1 Then Goto Main5 'If スイッチ[1]が離されたか? Then ' If Tifr.ocf0a = 0 Then Goto Main1 'If 100mS経過していないか? Then Set Tifr.ocf0a 'Timer0 比較A一致フラグをリセット。 ' Offtime = Offtime - 1 If Offtime <> 0 Then Goto Main1 'If 強制オフ時間になっていないか? Then ' Tempw1 = 120 Tempw2 = 250 Gosub Buzzer '400Hzの音を300mS鳴らす。(強制オフ) Wait 2 Goto Main ' ' * スイッチ[1]が離された場合の処理 * ' Main5: Offtime = 20 '強制オフタイマーの設定値。(2秒) Ledtime = 0 'LED点灯タイマーの初期化する。 Time10s = 0 '10秒カウンターを初期化する。 Stop Timer0 '100mSタイマーを初期化する。 Set Tifr.ocf0a 'Timer0 比較A一致フラグをリセット。 Timer0 = 0 Start Timer0 Keyflag = 0 Main6: Waitms 30 'チャタリング除去の待ち時間。 Goto Main1 ' ' * スイッチ[1]の入力が有った場合の処理 * ' Main4: Gosub Buzz1khz '1KHzの音を50mS鳴らす。 Timesel = Timesel + 1 'タイマーの時間選択を更新する。 If Timesel > 2 Then 'If 上限値か? Then Timesel = 0 End If Gosub Settime 'タイマーの時間からカウンターとLEDを設定する。 Timecount = Temp1 Keyflag = 1 Goto Main6 ' ' * ポートの初期設定を行うサブルーチン * ' Portinit: Config Led_1r = Output 'LED1[赤]の接続ポートを出力に設定する。 Config Led_2g = Output 'LED2[緑]の接続ポートを出力に設定する。 Config Sp_out = Output 'スピーカーの接続ポートを出力に設定する。 ' Set Portb.3 'スイッチ[1]の接続ポートをプルアップする。 Set Portb.0 'スイッチ[2]の接続ポートをプルアップする。 Return ' ' * 1KHzの音を50mS鳴らすサブルーチン * ' Buzz1khz: Tempw1 = 50 Tempw2 = 100 ' ' * 指定のブザー音を鳴らすサブルーチン * (Tempw1=期間 , Tempw2=パルス幅) ' Buzzer: Sound Sp_out , Tempw1 , Tempw2 Return ' ' * タイマーの時間から、カウンターとLEDを設定するサブルーチン * ' Settime: Select Case Timesel Case 0 : 'タイマーを3分に設定する。 Temp1 = 18 Set Led_1r Reset Led_2g Case 1 : 'タイマーを4分に設定する。 Temp1 = 24 Set Led_1r Set Led_2g Case Else : 'タイマーを5分に設定する。 Temp1 = 30 Reset Led_1r Set Led_2g End Select Return ' ' * スイッチ入力割り込み処理ルーチン * ' Intsw1: Return '何も処理しない。 ' ' End ' ' * メロディー・テーブル * ' Melodydata: Data 13 '音符数。 Data 235% , 128% 'ソ 0.3s Data 264% , 114% 'ラ 0.3s Data 1186% , 101% 'シ 1.2s Data 220% , 114% 'ラ 0.25s Data 196% , 128% 'ソ 0.25s Data 10000% , 3% '休符 0.5s Data 196% , 128% 'ソ 0.25s Data 220% , 114% 'ラ 0.25s Data 247% , 101% 'シ 0.25s Data 220% , 114% 'ラ 0.25s Data 196% , 128% 'ソ 0.25s Data 1584% , 114% 'ラ 1.8s Data 10000% , 3% '休符 0.5s