$prog &HFF , &HE2 , &HDE , &HFF 'CKDIV8 = 1 , BODLEVEL = 1.8V ' ' ****************************************** ' * ロジック・チェッカー (V2) プログラム * ' * * ' * AVR is ATtiny861A-PU * ' * Basic Compiler is BASCOM-AVR * ' * Copyright O-Family 2018. 5.31 * ' ****************************************** ' ' Ver 1.02 初回公開バージョン。(ATmega88版) 2009. 3.24 ' Ver 2.01 ATtiny861Aに変更。プリント基板を変更。 2018. 6. 6 ' ' Const Prgver = " 2.01" 'プログラム・バージョン。 ' $regfile = "ATtiny861.DAT" '使用するAVRを設定。 $crystal = 8000000 'AVRクロックを設定。 ' $hwstack = 64 'ハードウェア・スタックの容量を設定。 $swstack = 10 'ソフトウェア・スタックの容量を設定。 $framesize = 24 'フレーム領域の容量を設定。 ' ' * ポート名の定義 * ' Led_1 Alias Porta.6 '[LED1 緑]の接続ポート。 Led_2 Alias Porta.7 '[LED2 黄]の接続ポート。 Led_3 Alias Portb.5 '[LED3 黄]の接続ポート。 Led_4 Alias Portb.6 '[LED4 黄]の接続ポート。 Led_5 Alias Portb.4 '[LED5 赤]の接続ポート。 ' Dsw_1 Alias Pina.2 'ディップ・スイッチ[1]の接続ポート。 Dsw_1pu Alias Porta.2 'ディップ・スイッチ[1]の接続ポート(プルアップ用)。 Dsw_2 Alias Pina.1 'ディップ・スイッチ[2]の接続ポート。 Dsw_2pu Alias Porta.1 'ディップ・スイッチ[2]の接続ポート(プルアップ用)。 Dsw_3 Alias Pina.0 'ディップ・スイッチ[3]の接続ポート。 Dsw_3pu Alias Porta.0 'ディップ・スイッチ[3]の接続ポート(プルアップ用)。 Sp_out Alias Portb.1 'スピーカーの接続ポート。 Hc74_rst Alias Porta.4 '74HC74の[RST]接続ポート。 Hc74_q Alias Pina.3 '74HC74の[Q]接続ポート。 ' ' * 変数の宣言 * ' 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 ' ' * ポートの初期設定 * ' Config Led_1 = Output '[LED1 緑]の接続ポートを出力に設定する。 Config Led_2 = Output '[LED2 黄]の接続ポートを出力に設定する。 Config Led_3 = Output '[LED3 黄]の接続ポートを出力に設定する。 Config Led_4 = Output '[LED4 黄]の接続ポートを出力に設定する。 Config Led_5 = Output '[LED5 赤]の接続ポートを出力に設定する。 Config Sp_out = Output '圧電スピーカーの接続ポートを出力に設定する。 Config Hc74_rst = Output '74HC74の[RST]接続ポートを出力に設定する。 ' Set Dsw_1pu 'ディップ・スイッチ[1]の接続ポートをプルアップする。 Set Dsw_2pu 'ディップ・スイッチ[2]の接続ポートをプルアップする。 Set Dsw_3pu 'ディップ・スイッチ[3]の接続ポートをプルアップする。 ' Set Portb.0 '未使用ポートをプルアップ。 Set Portb.2 '未使用ポートをプルアップ。 Set Portb.3 '未使用ポートをプルアップ。 ' ' * Timerの設定 * ' Tccr0a = &B0000_0001 'Timer0 = 8bit Timer動作 , Clear Timer = 1 Tccr0b = &B0000_0101 'Prescale = 1024 (8,000,000Hz / 1,024 = 7,812.5Hz) Ocr0a = 78 - 1 '7,812.5Hz / 78 = 100Hz(10mS) ' Tccr1d = &B0000_0000 'Config Timer1 = Timer (標準動作) Tccr1b = &B0000_1001 'Prescale = 256 (8,000,000Hz / 256 = 31,250Hz) Tccr1a = &B0100_0000 'Compare A = Toggle Tccr1c = &B0100_0000 'Compare A = Toggle ' ' * A/D変換器の設定 * ' Set Prr.prusi '電力削減 USI回路の停止。 Config Aci = Off 'アナログ比較器の電源を切る。 Ad_ch Alias 4 'A/Dコンバータのチャネル番号。 Set Didr0.adc4d 'デジタル入力禁止レジスタの設定。 Config Adc = Single , Prescaler = 8 , Reference = Avcc 'A/Dコンバータの設定。 Start Adc 'A/Dコンバータの電源を入れる。 ' ' * ポートと変数の初期値を設定 * ' Set Hc74_rst '74HC74のリセット端子を[H]にする。 Level_l = 41 '[L]レベルの設定値。 Level_h = 153 '[H]レベルの設定値。 Gosub Bzoff 'ブザー音を止める。 '-------------------------------------------------------------------------------------------------- ' ' ******************* ' * メイン ルーチン * ' ******************* ' Main: Admux = Admux Or &H20 'A/D変換データを左揃えにする。(ADLAR=1) Tempw1 = Getadc(ad_ch) 'プローブ入力をA/D変換する。 Addata = High(tempw1) '上位8bitを取り出す。 ' Gosub Dipswchk 'ディップ・スイッチのチェック。 Gosub Bzcheck 'ブザー音の判定。 Gosub Leddisp 'LEDの点灯処理。 Goto Main '================================================================================================== ' ' ******************************** ' * ディップ・スイッチのチェック * ' ******************************** ' Dipswchk: 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に設定する。 Timer0 = 0 'Timer0を初期化する。 Set Tifr.ocf0a 'Timer0 比較A一致フラグをリセットする。 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 'パルス検出時間を設定する。 Timer0 = 0 'Timer0を初期化する。 Set Tifr.ocf0a 'Timer0 比較A一致フラグをリセットする。 Reset Hc74_rst '74HC74をリセットする。 Waitus 100 '100pFの時定数分の待ち時間。 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 Tifr.ocf0a = 0 Then Return 'If Timer0が10mSカウント終了していないか? Then Set Tifr.ocf0a 'Timer0 比較A一致フラグをリセットする。 Chktim = Chktim - 1 If Chktim <> 0 Then Return 'If チャタリング除去期間が経過していないか? Then ' 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 'パルス検出時間を設定する。 Timer0 = 0 'Timer0を初期化する。 Set Tifr.ocf0a 'Timer0 比較A一致フラグをリセットする。 Reset Hc74_rst '74HC74をリセットする。 Waitus 100 '100pFの時定数分の待ち時間。 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 Tifr.ocf0a = 0 Then Goto Bzcheck22 'If Timer0が10mSカウント終了していないか? Then Set Tifr.ocf0a 'Timer0 比較A一致フラグをリセットする。 Chktim = Chktim - 1 If Chktim <> 0 Then Goto Bzcheck22 'If 50mS経過していないか? Then ' 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をリセットする。 Waitus 100 '100pFの時定数分の待ち時間。 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 'ブザーの反転時間を設定する。 Timer0 = 0 'Timer0を初期化する。 Set Tifr.ocf0a 'Timer0 比較A一致フラグをリセットする。 Return ' ' * ブザー音反転中[1]の処理 (3) * ' Bzcheck3: If Tifr.ocf0a = 0 Then Return 'If Timer0が10mSカウント終了していないか? Then Set Tifr.ocf0a 'Timer0 比較A一致フラグをリセットする。 Chktim = Chktim - 1 If Chktim <> 0 Then Return 'If ブザーの反転時間を経過していないか? Then ' 'ブザー音を反転する。 If Bzflag = 1 Then 'If 現在のブザー音が[L]か? Then Gosub Bzonhi '[H]レベルのブザー音を鳴らす。 Else 'If 現在のブザー音が[H] Gosub Bzonlow '[L]レベルのブザー音を鳴らす。 End If Chkmod = 4 '検出モードをブザー音反転中[2]に設定する。 Chktim = 5 'ブザー音の反転時間を設定する。 Timer0 = 0 'Timer0を初期化する。 Set Tifr.ocf0a 'Timer0 比較A一致フラグをリセットする。 Return ' ' * ブザー音反転中[2]の処理 (4) * ' Bzcheck4: If Tifr.ocf0a = 0 Then Return 'If Timer0が10mSカウント終了していないか? Then Set Tifr.ocf0a 'Timer0 比較A一致フラグをリセットする。 Chktim = Chktim - 1 If Chktim <> 0 Then Return 'If ブザー音の反転時間を経過していないか? Then ' Chkmod = 2 '検出モードをパルス検出に設定する。 Chktim = 5 'パルス検出時間を設定する。 Timer0 = 0 'Timer0を初期化する。 Set Tifr.ocf0a 'Timer0 比較A一致フラグをリセットする。 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 パルス検出でブザー反転中ではないか? Then ' If Bzflag = 1 Then Reset Led_1 '[L] LEDを強制点灯する。 Else Reset Led_5 '[H] LEDを強制点灯する。 End If Return '================================================================================================== ' ' ******************************************* ' * [L]レベルのブザー音を鳴らすサブルーチン * ' ******************************************* ' Bzonlow: Bzflag = 1 If Dsw_1 = 1 Then Goto Bzoff1 'If ディップ・スイッチにより、ブザー音禁止か? Then Ocr1c = 71 - 1 '31,250Hz / (220Hz * 2) = 71 Set Tccr1c.com1a0s 'タイマー出力を開始。 Return ' ' ******************************************* ' * [H]レベルのブザー音を鳴らすサブルーチン * ' ******************************************* ' Bzonhi: Bzflag = 2 If Dsw_1 = 1 Then Goto Bzoff1 'If ディップ・スイッチにより、ブザー音禁止か? Then Ocr1c = 9 - 1 '31,250Hz / (1760Hz * 2) = 9 Set Tccr1c.com1a0s 'タイマー出力を開始。 Return ' ' ******************************** ' * ブザー音を止めるサブルーチン * ' ******************************** ' Bzoff: Bzflag = 0 Bzoff1: Reset Tccr1c.com1a0s 'タイマー出力を停止。 Return ' ' End