' ' ************************************************** ' * * ' * ロジック・パルサー プログラム * ' * * ' * AVR is using ATtiny2313 * ' * Basic Compiler is BASCOM-AVR * ' * Copyright By O-Family 2009. 2.26 * ' ************************************************** ' ' Ver 01.01 初回公開バージョン ' ' Const Prgver = "01.01" 'プログラム・バージョン。 ' $regfile = "ATtiny2313.DAT" 'AVRデバイスを"ATtiny2313"に設定。 $crystal = 16000000 'クロック周波数を16MHzに設定。 ' $hwstack = 32 'ハードウェア・スタックの容量を設定。 $swstack = 8 'ソフトウェア・スタックの容量を設定。 $framesize = 24 'フレーム領域の容量を設定。 ' ' Dim Plsfrq As Byte '出力パルスの周波数選択。 Dim Frqmag As Byte '出力周波数の倍率。 Dim Blkcun As Byte 'LED点滅用カウンター。 Dim Blktim1 As Byte 'LEDの点灯時間値。 Dim Blktim2 As Byte 'LEDの消灯時間値。 ' Dim Temp1 As Byte '汎用テンポラリ変数 Byte型 No.1 Dim Tempw1 As Word '汎用テンポラリ変数 Word型 No.1 Dim Tempw2 As Word '汎用テンポラリ変数 Word型 No.2 ' Dim Eepfrq As Eram Byte At $10 'EEPROM 出力パルスの周波数。 Dim Eepmag As Eram Byte At $12 'EEPROM 出力周波数の倍率。 ' ' * ポート名の定義 * ' Led_100 Alias Portd.5 '[100] LEDの接続ポート。 Led_10 Alias Portb.0 '[ 10] LEDの接続ポート。 Led_1 Alias Portb.1 '[ 1] LEDの接続ポート。 Led_mhz Alias Portd.4 '[MHz] LEDの接続ポート。 Led_khz Alias Portd.3 '[KHz] LEDの接続ポート。 Led_hz Alias Portd.6 '[ Hz] LEDの接続ポート。 ' Sw_up Alias Pinb.5 '[UP] スイッチの接続ポート。 Sw_dn Alias Pinb.6 '[DOWN] スイッチの接続ポート。 ' ' * ポートの初期設定 * ' Config Portb.3 = Output '[OC1A]ポートを出力に設定。 Config Portb.4 = Output '[OC1B]ポートを出力に設定。 Config Led_100 = Output 'LED接続ポートを出力に設定。 Config Led_10 = Output 'LED接続ポートを出力に設定。 Config Led_1 = Output 'LED接続ポートを出力に設定。 Config Led_mhz = Output 'LED接続ポートを出力に設定。 Config Led_khz = Output 'LED接続ポートを出力に設定。 Config Led_hz = Output 'LED接続ポートを出力に設定。 ' Set Portb.5 'スイッチ接続ポートをプルアップ。 Set Portb.6 'スイッチ接続ポートをプルアップ。 ' Set Portb.2 '未使用ポートをプルアップ。 Set Portb.7 '未使用ポートをプルアップ。 Set Portd.0 '未使用ポートをプルアップ。 Set Portd.1 '未使用ポートをプルアップ。 Set Portd.2 '未使用ポートをプルアップ。 ' Gosub Ledblank 'LEDを全て消灯。 ' ' * タイマーの設定 * ' Config Timer0 = Timer , Prescale = 1024 , Clear Timer = 1 '16,000,000Hz / 1,024 = 15,625Hz Ocr0a = 156 - 1 '15,625Hz / 156カウント = 約100Hz (10mS) ' ' * EEPROMの使用確認 * ' If Eepfrq < 9 Then 'If EEPROMを使用しているか? Then Plsfrq = Eepfrq Else Plsfrq = 0 'EEPROMと変数を初期化する。 Eepfrq = 0 End If ' If Eepmag < 3 Then 'If EEPROMを使用しているか? Then Frqmag = Eepmag Else Frqmag = 0 'EEPROMと変数を初期化する。 Eepmag = 0 End If ' ' * 動作の初期化 * ' Gosub Leddisp 'LEDを表示。 Gosub Blktset 'LEDの点滅周期を設定する。 Gosub Frqset 'Timse1に出力周波数を設定。 ' ' ******************* ' * メイン ルーチン * ' ******************* ' Main: Gosub Switchin 'スイッチの入力処理。 Gosub Ledblink 'LEDの点滅処理。 Goto Main ' ' ****************************** ' * スイッチの入力処理ルーチン * ' ****************************** ' Switchin: If Sw_up = 0 Then Goto Switchin1 'If [UP]スイッチが押されたか? Then If Sw_dn = 0 Then Goto Switchin1 'If [DOWN]スイッチが押されたか? Then Return ' Switchin1: Waitms 50 'チャタリング防止の待ち時間。 If Sw_up = 0 Then Goto Switchin2 'If [UP]スイッチが押されたか? Then If Sw_dn = 0 Then Goto Switchin3 'If [DOWN]スイッチが押されたか? Then Return ' ' Switchin2: '[UP]スイッチの処理。 If Sw_dn = 0 Then Goto Switchin4 'If 両方のスイッチが押されたか? Then Plsfrq = Plsfrq + 1 '周波数値を加算する。 If Plsfrq > 8 Then Plsfrq = 0 'If 設定値を超えたか? Then Switchin5: Eepfrq = Plsfrq 'EEPROMに周波数値を保存する。 Switchin6: Gosub Ledblank 'LEDを全て消灯。 Gosub Leddisp 'LEDを表示。 Gosub Frqset '出力周波数を変更。 ' Bitwait Sw_up , Set '[UP]スイッチが離されるまで待つ。 Bitwait Sw_dn , Set '[DOWN]スイッチが離されるまで待つ。 Waitms 30 'チャタリング防止の待ち時間。 Return ' ' Switchin3: '[DOWN]スイッチの処理。 If Sw_up = 0 Then Goto Switchin4 'If 両方のスイッチが押されたか? Then Plsfrq = Plsfrq - 1 '周波数値を減算する。 If Plsfrq > 8 Then Plsfrq = 8 'If 設定値を超えたか? Then Goto Switchin5 ' ' Switchin4: '両方のスイッチが押された処理。 Frqmag = Frqmag + 1 '周波数倍率値を加算する。 If Frqmag > 2 Then Frqmag = 0 'If 設定値を超えたか? Then Eepmag = Frqmag 'EEPROMに周波数倍率値を保存する。 Gosub Blktset 'LEDの点滅周期を設定する。 Goto Switchin6 ' ' * LEDの点滅周期を設定する サブルーチン * ' Blktset: Select Case Frqmag Case 1 : '周波数倍率(x2)の点滅時間を設定する。 Blktim1 = 25 Blktim2 = Blktim1 + Blktim1 Case 2 : '周波数倍率(x5)の点滅時間を設定する。 Blktim1 = 10 Blktim2 = Blktim1 + Blktim1 End Select Blkcun = 0 'LED点滅用カウンターを初期化。 Return ' ' ************************* ' * LEDの点滅処理ルーチン * ' ************************* ' Ledblink: If Tifr.ocf0a = 0 Then Return 'If Timer0が10mSカウント終了したか? Else Set Tifr.ocf0a 'Timer0 比較A一致フラグをリセット。 ' If Frqmag = 0 Then Return 'If 周波数倍率が(x1)か? Then ' Blkcun = Blkcun + 1 'LED点滅カウンターを更新。 If Blkcun = Blktim1 Then Goto Ledblink1 'If 消灯時間に達したか? Then If Blkcun = Blktim2 Then Goto Ledblink2 'If 点灯時間に達したか? Then Return ' ' Ledblink1: Gosub Ledblankn '数値LEDを消灯する。 Return ' ' Ledblink2: Gosub Leddisp 'LEDを表示。 Blkcun = 0 'LED点滅用カウンターを初期化。 Return ' ' ************************* ' * LED 表示 サブルーチン * ' ************************* ' Leddisp: Temp1 = Plsfrq If Temp1 > 5 Then Goto Leddisp1 'If [MHz]オーダーか? Then If Temp1 > 2 Then Goto Leddisp2 'If [KHz]オーダーか? Then ' Set Led_hz Leddisp3: Select Case Temp1 '数値LEDを点灯。 Case 0 : Set Led_1 Case 1 : Set Led_10 Case 2 : Set Led_100 End Select Return ' ' Leddisp1: '[MHz]オーダーの処理。 Set Led_mhz Temp1 = Temp1 - 6 Goto Leddisp3 ' Leddisp2: '[KHz]オーダーの処理。 Set Led_khz Temp1 = Temp1 - 3 Goto Leddisp3 ' ' *************************** ' * LED 全消灯 サブルーチン * ' *************************** ' Ledblank: Reset Led_mhz Reset Led_khz Reset Led_hz Ledblankn: '数値LEDのみを消灯。 Reset Led_100 Reset Led_10 Reset Led_1 Return ' ' ******************************************** ' * 出力周波数をTimerに設定する サブルーチン * ' ******************************************** ' Frqset: Select Case Frqmag '周波数倍率により周波数テーブルを選択する。 Case 0 : Tempw1 = Lookup(plsfrq , Timtabp1) '周波数テーブルからプリスケラ値を読み込む。 Tempw2 = Lookup(plsfrq , Timtabc1) '周波数テーブルから比較器値を読み込む。 Case 1 : Tempw1 = Lookup(plsfrq , Timtabp2) '周波数テーブルからプリスケラ値を読み込む。 Tempw2 = Lookup(plsfrq , Timtabc2) '周波数テーブルから比較器値を読み込む。 Case Else : Tempw1 = Lookup(plsfrq , Timtabp5) '周波数テーブルからプリスケラ値を読み込む。 Tempw2 = Lookup(plsfrq , Timtabc5) '周波数テーブルから比較器値を読み込む。 End Select ' Select Case Tempw1 'プリスケラ値を選択する。 Case 1 : Config Timer1 = Timer , Prescale = 1 , Clear Timer = 1 , Compare A = Toggle , Compare B = Toggle Case 8 : Config Timer1 = Timer , Prescale = 8 , Clear Timer = 1 , Compare A = Toggle , Compare B = Toggle Case 64 : Config Timer1 = Timer , Prescale = 64 , Clear Timer = 1 , Compare A = Toggle , Compare B = Toggle Case 256 : Config Timer1 = Timer , Prescale = 256 , Clear Timer = 1 , Compare A = Toggle , Compare B = Toggle Case 1024 : Config Timer1 = Timer , Prescale = 1024 , Clear Timer = 1 , Compare A = Toggle , Compare B = Toggle End Select ' Compare1a = Tempw2 - 1 '比較器(A)に周波数を設定する。 Compare1b = Tempw2 - 1 '比較器(B)に周波数を設定する。 Return ' ' End ' ' ********************************* ' * タイマーの周波数設定 テーブル * ' ********************************* ' Timtabp1: 'プリスケラ(倍率x1)用 Data 256% , 64% , 64% , 1% , 1% , 1% , 1% , 1% , 1% ' Timtabc1: '比較器(倍率x1)用 Data 31250% , 12500% , 1250% , 8000% , 800% , 80% , 8% , 2% , 1% ' ' Timtabp2: 'プリスケラ(倍率x2)用 Data 64% , 64% , 1% , 1% , 1% , 1% , 1% , 1% , 1% ' Timtabc2: '比較器(倍率x2)用 Data 62500% , 6250% , 40000% , 4000% , 400% , 40% , 4% , 2% , 1% ' ' Timtabp5: 'プリスケラ(倍率x5)用 Data 64% , 64% , 1% , 1% , 1% , 1% , 1% , 1% , 1% ' Timtabc5: '比較器(倍率x5)用 Data 25000% , 2500% , 16000% , 1600% , 160% , 16% , 8% , 2% , 1%