' ' *********************************************** ' * * ' * ロジック・チェッカー プログラム * ' * * ' * AVR is using ATmega88 * ' * Basic Compiler is BASCOM-AVR * ' * Copyright By O-Family 2009. 3.24 * ' *********************************************** ' ' Ver 1.02 初回公開バージョン ' ' Const Prgver = "01.02" 'プログラム・バージョン。 ' $regfile = "m88def.dat" '使用するAVRを設定。 $crystal = 8000000 'AVRクロックを設定。 ' $hwstack = 32 'ハードウェア・スタックの容量を設定。 $swstack = 8 'ソフトウェア・スタックの容量を設定。 $framesize = 24 'フレーム領域の容量を設定。 ' Dim Addata As Byte 'A/D変換した電圧値。 Dim Level_l As Byte '[L]レベルの設定値。 Dim Level_h As Byte '[H]レベルの設定値。 Dim Chkmod As Byte '検出モード。 Dim Chktim As Byte '検出用の10msタイマーカウント値。 Dim Lastlev As Byte '前回のA/D判定レベル値。 Dim Bzflag As Byte 'ブザーの状態フラグ。 ' Dim Tempw1 As Word '汎用テンポラリ変数 Word型 No.1 ' ' * ポート名の定義 * ' Led_1 Alias Portc.5 '[LED1 緑]の接続ポート。 Led_2 Alias Portc.4 '[LED2 黄]の接続ポート。 Led_3 Alias Portc.2 '[LED3 黄]の接続ポート。 Led_4 Alias Portc.1 '[LED4 黄]の接続ポート。 Led_5 Alias Portc.0 '[LED5 赤]の接続ポート。 Dsw_1 Alias Pinb.1 'ディップ・スイッチ[1]の接続ポート。 Dsw_2 Alias Pinb.2 'ディップ・スイッチ[2]の接続ポート。 Dsw_3 Alias Pind.7 'ディップ・スイッチ[3]の接続ポート。 Dsw_4 Alias Pinb.0 'ディップ・スイッチ[4]の接続ポート。 Pz_sp Alias Portd.6 '圧電スピーカーの接続ポート。 Hc74_rst Alias Portd.0 '74HC74の[RST]接続ポート。 Hc74_q Alias Pind.1 '74HC74の[Q]接続ポート。 Ad_ch Alias 3 'A/Dコンバータのチャネル番号。 ' ' * ポートの初期設定 * ' Config Led_1 = Output 'LED接続ポートを出力に設定。 Config Led_2 = Output 'LED接続ポートを出力に設定。 Config Led_3 = Output 'LED接続ポートを出力に設定。 Config Led_4 = Output 'LED接続ポートを出力に設定。 Config Led_5 = Output 'LED接続ポートを出力に設定。 Config Pz_sp = Output '圧電スピーカーの接続ポートを出力に設定。 Config Hc74_rst = Output '74HC74の[RST]接続ポートを出力に設定。 ' Set Portb.1 'ディップ・スイッチ[1]の接続ポートをプルアップ。 Set Portb.2 'ディップ・スイッチ[2]の接続ポートをプルアップ。 Set Portd.7 'ディップ・スイッチ[3]の接続ポートをプルアップ。 Set Portb.0 'ディップ・スイッチ[4]の接続ポートをプルアップ。 ' Set Portb.3 '未使用ポートをプルアップ。 Set Portb.4 '未使用ポートをプルアップ。 Set Portb.5 '未使用ポートをプルアップ。 Set Portb.6 '未使用ポートをプルアップ。 Set Portb.7 '未使用ポートをプルアップ。 Set Portd.2 '未使用ポートをプルアップ。 Set Portd.3 '未使用ポートをプルアップ。 Set Portd.4 '未使用ポートをプルアップ。 Set Portd.5 '未使用ポートをプルアップ。 ' ' * Timer & ADC の設定 * ' Config Timer0 = Timer , Prescale = 256 , Clear Timer = 1 , Compare A = Toggle 'ブザー用 Timer0 8,000,000Hz / 256 = 31,250Hz ' Config Timer1 = Timer , Prescale = 256 , Clear Timer = 1 '500mSタイマー用 Timer1 8,000,000Hz / 256 = 31,250Hz Ocr1a = 15625 - 1 '31,250Hz / 2Hz(500mS) = 15625カウント ' Config Timer2 = Timer , Prescale = 1024 , Clear Timer = 1 '10mSタイマー用 Timer2 8,000,000Hz / 1,024 = 7812.5Hz Ocr2a = 78 - 1 '7812.5Hz / 100Hz(10mS) = 約78カウント ' Config Adc = Single , Prescaler = 8 , Reference = Avcc 'A/Dコンバータの設定。 Start Adc ' ' * ポートと変数の初期値を設定 * ' Set Hc74_rst '74HC74のリセット端子を[H]にする。 Level_l = 41 '[L]レベルの設定値。 Level_h = 153 '[H]レベルの設定値。 Gosub Bzoff 'ブザー音を止める。 ' ' ******************* ' * メイン ルーチン * ' ******************* ' Main: Tempw1 = Getadc(ad_ch , &H20) 'プローブ入力をA/D変換する(8bit)。 Addata = High(tempw1) ' Gosub Dipswchk 'ディップ・スイッチのチェック。 Gosub Bzcheck 'ブザー音の判定。 Gosub Leddisp 'LEDの点灯。 Goto Main ' End ' ' ********************************************* ' * ディップ・スイッチのチェック サブルーチン * ' ********************************************* ' Dipswchk: If Tifr1.ocf1a = 0 Then Return 'If Timer1が500mSカウント終了したか? Else Set Tifr1.ocf1a 'Timer1 比較A一致フラグをリセット。 ' If Dsw_2 = 1 Then 'If [TTL]レベルか? Then Level_l = 41 'TTL [L]レベルの設定値 (0.8V)。 Level_h = 127 'TTL [H]レベルの設定値 (2.5V)。 Else Level_l = 77 'C-MOS [L]レベルの設定値 (0.3Vcc)。 Level_h = 153 'C-MOS [H]レベルの設定値 (0.6Vcc)。 End If Return ' ' ****************************** ' * ブザー音の判定サブルーチン * ' ****************************** ' Bzcheck: On Chkmod Goto Bzcheck0 , Bzcheck1 , Bzcheck2 , Bzcheck3 , Bzcheck4 '検出モードにより処理を分岐する。 ' ' * 待機中の処理 (0) * ' Bzcheck0: If Addata < Level_l Then Goto Bzcheck01 'If [L]レベルか? Then If Addata > Level_h Then Goto Bzcheck02 'If [H]レベルか? Then ' If Lastlev = 0 Then Goto Bzcheck05 'If 前回から中間電位のまま変化なしか? Then ' '[H]or[L]から中間電位へ変化した場合。 Bzcheck03: Chkmod = 1 '検出モードをチャタリング除去に設定。 Chktim = 5 'チャタリング・タイマーを50mSに設定。 Return ' ' Bzcheck01: '[L]レベルの場合。 If Lastlev = 1 Then Return 'If 前回から[L]レベルのまま変化なしか? Then If Lastlev = 0 Then Goto Bzcheck03 'If 中間電位から[L]へ変化したか? Then ' '[H]から[L]レベルへ変化した場合。 Gosub Bzonlow '[L]レベル ブザー音を鳴らす。 Lastlev = 1 Bzcheck04: Chkmod = 2 '検出モードをパルス検出に設定。 Chktim = 5 'パルス検出時間を設定。 Reset Hc74_rst '74HC74をリセットする。 Set Hc74_rst Return ' ' Bzcheck02: '[H]レベルの場合。 If Lastlev = 2 Then Return 'If 前回から[H]レベルのまま変化なしか? Then If Lastlev = 0 Then Goto Bzcheck03 'If 中間電位から[H]へ変化したか? Then ' '[L]から[H]レベルへ変化した場合。 Gosub Bzonhi '[H]レベル ブザー音を鳴らす。 Lastlev = 2 Goto Bzcheck04 ' ' Bzcheck05: '中間電位のまま変化なしの場合。 If Hc74_q = 1 Then Goto Bzcheck13 'If パルス入力が有ったか(A/D変換が追いつかない)? Then Return ' ' * チャタリングの除去処理 (1) * ' Bzcheck1: If Tifr2.ocf2a = 0 Then Return 'If Timer2が10mSカウント終了したか? Else Set Tifr2.ocf2a 'Timer2 比較A一致フラグをリセット。 Chktim = Chktim - 1 If Chktim <> 0 Then Return 'If チャタリング除去期間が経過したか? Else ' If Addata < Level_l Then Goto Bzcheck11 'If [L]レベルか? Then If Addata > Level_h Then Goto Bzcheck12 'If [H]レベルか? Then ' '中間電位になった場合。 Gosub Bzoff 'ブザー音を止める。 Lastlev = 0 Chkmod = 0 Return ' ' Bzcheck11: '[L]レベルになった場合。 Gosub Bzonlow '[L]レベル ブザー音を鳴らす。 Lastlev = 1 Bzcheck13: Chkmod = 2 '検出モードをパルス検出に設定。 Chktim = 5 'パルス検出時間を設定。 Reset Hc74_rst '74HC74をリセットする。 Set Hc74_rst Return ' ' Bzcheck12: '[H]レベルになった場合。 Gosub Bzonhi '[H]レベル ブザー音を鳴らす。 Lastlev = 2 Goto Bzcheck13 ' ' * パルス検出中の処理 (2) * ' Bzcheck2: If Hc74_q = 1 Then Goto Bzcheck21 'If パルス入力が有ったか? Then ' If Tifr2.ocf2a = 0 Then Goto Bzcheck22 'If Timer2が10mSカウント終了したか? Else Set Tifr2.ocf2a 'Timer2 比較A一致フラグをリセット。 Chktim = Chktim - 1 If Chktim <> 0 Then Goto Bzcheck22 'If 50mS経過したか? Else ' Chkmod = 0 '中間電位が50mS続いた。(プローブが離された) Gosub Bzoff 'ブザー音を止める。 Return ' ' Bzcheck22: If Addata < Level_l Then Goto Bzcheck23 'If [L]レベルか? Then If Addata > Level_h Then Goto Bzcheck24 'If [H]レベルか? Then Return '中間電位の場合。 ' ' Bzcheck23: '[L]レベルの場合。 If Lastlev <> 1 Then 'If [L]レベルに変化したのか? Then Gosub Bzonlow '[L]レベル ブザー音を鳴らす。 Lastlev = 1 End If Chktim = 5 'パルス検出時間を延長する。 Return ' ' Bzcheck24: '[H]レベルの場合。 If Lastlev <> 2 Then 'If [H]レベルに変化したのか? Then Gosub Bzonhi '[H]レベル ブザー音を鳴らす。 Lastlev = 2 End If Chktim = 5 'パルス検出時間を延長する。 Return ' ' Bzcheck21: 'パルス入力が有った場合。 Reset Hc74_rst '74HC74をリセットする。 Set Hc74_rst ' 'ブザー音を反転する。 If Bzflag = 1 Then 'If 現在のブザー音が[L]か? Then Gosub Bzonhi '[H]レベル ブザー音を鳴らす。 Else 'If 現在のブザー音が[H] Gosub Bzonlow '[L]レベル ブザー音を鳴らす。 End If Chkmod = 3 '検出モードをブザー音反転中[1]に設定。 Chktim = 5 'ブザーの反転時間を設定。 Return ' ' * ブザー音反転中[1]の処理 (3) * ' Bzcheck3: If Tifr2.ocf2a = 0 Then Return 'If Timer2が10mSカウント終了したか? Else Set Tifr2.ocf2a 'Timer2 比較A一致フラグをリセット。 Chktim = Chktim - 1 If Chktim <> 0 Then Return 'If ブザーの反転時間を経過したか? Else ' 'ブザー音を反転する。 If Bzflag = 1 Then 'If 現在のブザー音が[L]か? Then Gosub Bzonhi '[H]レベル ブザー音を鳴らす。 Else 'If 現在のブザー音が[H] Gosub Bzonlow '[L]レベル ブザー音を鳴らす。 End If Chkmod = 4 '検出モードをブザー音反転中[2]に設定。 Chktim = 5 'ブザー音の反転時間を設定。 Return ' ' * ブザー音反転中[2]の処理 (4) * ' Bzcheck4: If Tifr2.ocf2a = 0 Then Return 'If Timer2が10mSカウント終了したか? Else Set Tifr2.ocf2a 'Timer2 比較A一致フラグをリセット。 Chktim = Chktim - 1 If Chktim <> 0 Then Return 'If ブザー音の反転時間を経過したか? Else ' Chkmod = 2 '検出モードをパルス検出に設定。 Chktim = 5 'パルス検出時間を設定。 Return ' ' ****************************************** ' * [L]レベル ブザー音を鳴らすサブルーチン * ' ****************************************** ' Bzonlow: Bzflag = 1 If Dsw_1 = 1 Then Goto Bzoff1 'If ディップ・スイッチにより、ブザー音禁止か? Then Ocr0a = 71 - 1 '31,250Hz / (220Hz * 2) = 71 Reset Tccr0a.com0a1 'タイマー出力を開始。 Return ' ' ****************************************** ' * [H]レベル ブザー音を鳴らすサブルーチン * ' ****************************************** ' Bzonhi: Bzflag = 2 If Dsw_1 = 1 Then Goto Bzoff1 'If ディップ・スイッチにより、ブザー音禁止か? Then Ocr0a = 9 - 1 '31,250Hz / (1760Hz * 2) = 9 Reset Tccr0a.com0a1 'タイマー出力を開始。 Return ' ' ******************************** ' * ブザー音を止めるサブルーチン * ' ******************************** ' Bzoff: Bzflag = 0 Bzoff1: Set Tccr0a.com0a1 'タイマー出力を停止。 Return ' ' ************************* ' * LEDの点灯サブルーチン * ' ************************* ' Leddisp: Set Led_1 '全てのLEDを消灯。 Set Led_2 Set Led_3 Set Led_4 Set Led_5 ' If Dsw_3 = 0 Then Goto Leddisp1 'If ディップ・スイッチにより、LEDがパルス同期表示か? Then ' Leddisp2: Select Case Addata 'A/Dデータから点灯させるLEDを選択する。 Case Is < 51 : Reset Led_1 Case Is < 102 : Reset Led_2 Case Is < 153 : Reset Led_3 Case Is < 204 : Reset Led_4 Case Else : Reset Led_5 End Select Return ' ' Leddisp1: 'ブザー反転中の処理。 If Chkmod < 3 Then Goto Leddisp2 'If パルス検出でブザー反転中か? Else ' If Bzflag = 1 Then Reset Led_1 '[L] LEDを強制点灯する。 Else Reset Led_5 '[H] LEDを強制点灯する。 End If Return