' ' ********************************************** ' * * ' * AVR & BASCOM-AVR トレーニング・ボード * ' * 初期設定 Ver.1.01 * ' * * ' * AVR is using ATmega88P * ' * Basic Compiler is BASCOM-AVR * ' * Copyright By O-Family 2009. 7.25 * ' ********************************************** ' $regfile = "m88pdef.dat" '使用するAVRを設定。 $crystal = 16000000 'AVRクロックを設定。 ' $hwstack = 64 'ハードウェア・スタックの容量を設定。 $swstack = 8 'ソフトウェア・スタックの容量を設定。 $framesize = 24 'フレーム領域の容量を設定。 ' ' * ポート名の定義 * ' Sw_1 Alias Pind.0 'スイッチ[1]の接続ポート。 Sw_2 Alias Pind.1 'スイッチ[2]の接続ポート。 Sw_3 Alias Pind.2 'スイッチ[3]の接続ポート。 Sw_4 Alias Pind.3 'スイッチ[4]の接続ポート。 ' Led_1r Alias Portd.4 'LED1[赤]の接続ポート。 Led_2g Alias Portd.5 'LED2[緑]の接続ポート。 Led_3y Alias Portd.6 'LED3[黄]の接続ポート。 Led_4b Alias Portd.7 'LED4[青]の接続ポート。 Sp_out Alias Portc.5 'スピーカーの接続ポート。 ' Ad_photo Alias 0 '光センサーのA/Dコンバータ・チャネル番号。 Ad_thermo Alias 1 '温度センサーのA/Dコンバータ・チャネル番号。 Ad_ain1 Alias 2 '測定入力[1]のA/Dコンバータ・チャネル番号。 Ad_ain2 Alias 3 '測定入力[2]のA/Dコンバータ・チャネル番号。 Ad_ain3 Alias 4 '測定入力[3]のA/Dコンバータ・チャネル番号。 Ad_spin Alias 5 'スピーカー入力のA/Dコンバータ・チャネル番号。 ' ' * ポートの初期設定 * ' Config Led_1r = Output 'LED1の接続ポートを出力に設定する。 Config Led_2g = Output 'LED2の接続ポートを出力に設定する。 Config Led_3y = Output 'LED3の接続ポートを出力に設定する。 Config Led_4b = Output 'LED4の接続ポートを出力に設定する。 Config Sp_out = Output 'スピーカーの接続ポートを出力に設定する。 ' Set Portd.0 'スイッチ[1]の接続ポートをプルアップする。 Set Portd.1 'スイッチ[2]の接続ポートをプルアップする。 Set Portd.2 'スイッチ[3]の接続ポートをプルアップする。 Set Portd.3 'スイッチ[4]の接続ポートをプルアップする。 Didr0 = &B00111111 'デジタル入力禁止レジスタの設定。 ' ' * LCDの初期設定 * ' Config Lcdmode = Port 'LCDを4ビットのポートモードに設定。 Config Lcdbus = 4 'LCDデータバスを4bitに設定。 Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.2 'LCDのポート割り当て。 Config Lcdpin = Pin , Db6 = Portb.1 , Db7 = Portb.0 Config Lcdpin = Pin , E = Portb.4 , Rs = Portb.5 Config Lcd = 16 * 2 'LCD表示を16文字2行に設定。 Cls 'LCD表示をすべて消去。 ' ' * A/Dコンバータの初期設定 * ' Config Adc = Single , Prescaler = Auto , Reference = Avcc 'A/Dコンバータの設定。 Start Adc 'A/Dコンバータに電源を供給。 ' ' ↓********************************************↓ ' ↓ これ以降に各自のプログラムを作成して下さい ↓ ' ↓********************************************↓ ' ' ' ********************************************** ' * 音感センサー & スイッチ プログラム * ' * (Ver.1.01) * ' * Copyright By O-Family 2009. 8. 1 * ' ********************************************** ' Dim Addata As Word 'A/D変換データ。 Dim Micgain As Byte 'マイク入力の感度。 Dim Tcount1 As Byte '10mS タイマー・カウンタ[1] Dim Tcount2 As Byte '10mS タイマー・カウンタ[2] Dim Temp1 As Byte '汎用テンポラリ変数 Byte型 No.1 Dim Temp2 As Byte '汎用テンポラリ変数 Byte型 No.2 Dim Tempstr As String * 20 '文字列変換用。 ' Dim Eepmicgain As Eram Byte At $10 'EEPROM マイク感度の保管用。 ' ' Cursor Off 'LCDのカーソルをオフにする。 ' Config Timer1 = Timer , Prescale = 256 , Clear Timer = 1 'Timer1の設定。16,000,000Hz / 256 = 62,500Hz Compare1a = 625 - 1 '62,500Hz / 100Hz(10mS) = 625カウント ' Config Adc = Single , Prescaler = Auto , Reference = Internal_1.1 'A/Dコンバータの設定。(リファレンス電圧の変更) Reset Sp_out 'スピーカー接続ポートを[L]レベルにする。 ' If Eepmicgain > 50 Then Eepmicgain = 40 'If EEPROMが未使用か? Then Micgain = Eepmicgain 'EEPROMのマイク感度を読み出す。 Gosub Gaindisp 'マイク感度値をLCDに表示する Locate 1 , 1 Lcd "レベル" '「レベル」の文字をLCDに表示する。 ' ' * メイン ルーチン * ' Main: Gosub Swcheck 'スイッチ入力を調べる。 Gosub Micadc 'マイク信号をA/D変換する。 Gosub Timecont 'タイマー処理をする。 Goto Main ' ' * スイッチ入力を調べるルーチン * ' Swcheck: If Sw_1 = 0 Then Goto Sw1on 'If スイッチ[1]が押されたか? Then If Sw_2 = 0 Then Goto Sw2on 'If スイッチ[2]が押されたか? Then If Sw_3 = 0 Then Goto Sw3on 'If スイッチ[3]が押されたか? Then If Sw_4 = 0 Then Goto Sw4on 'If スイッチ[4]が押されたか? Then Return ' ' Sw1on: 'スイッチ[1] マイク感度を上げる。 Micgain = Micgain + 1 'マイク感度値を上げる。 If Micgain > 50 Then Micgain = 50 'If マイク感度の上限値か? Then Eepmicgain = Micgain 'マイク感度をEEPROMに書き込む。 Gosub Gaindisp 'マイク感度値をLCDに表示する ' Swoff: Waitms 30 'スイッチのチャタリングタイマー。 Bitwait Sw_1 , Set 'スイッチ[1]が離されるまで待つ。 Bitwait Sw_2 , Set 'スイッチ[2]が離されるまで待つ。 Bitwait Sw_3 , Set 'スイッチ[3]が離されるまで待つ。 Bitwait Sw_4 , Set 'スイッチ[4]が離されるまで待つ。 Waitms 30 'スイッチのチャタリングタイマー。 Tcount2 = 50 'スイッチ入力後、500mS間はマイク入力を禁止する。 Return ' Sw2on: 'スイッチ[2] マイク感度を下げる。 Micgain = Micgain - 1 'マイク感度値を下げる。 If Micgain = 0 Then Micgain = 1 'If マイク感度の下限値か? Then Eepmicgain = Micgain 'マイク感度をEEPROMに書き込む。 Gosub Gaindisp 'マイク感度値をLCDに表示する Goto Swoff ' Sw3on: 'スイッチ[3] LEDを全てONにする。 Set Led_1r 'LEDを全て点灯する。 Set Led_2g Set Led_3y Set Led_4b Goto Swoff ' Sw4on: 'スイッチ[4] LEDを全てOFFにする。 Reset Led_1r 'LEDを全て消灯する。 Reset Led_2g Reset Led_3y Reset Led_4b Goto Swoff ' ' * マイク信号をA/D変換するルーチン * ' Micadc: If Tcount2 <> 0 Then Return 'If マイク入力の禁止期間か? Then Config Sp_out = Input 'スピーカー接続ポートを入力に変更する。 Addata = Getadc(ad_spin) '圧電スピーカーの電圧をA/D変換する。 Config Sp_out = Output 'スピーカー接続ポートを出力に変更する。(プルダウン) ' If Addata > 20 Then 'If 雑音レベル以上か? Then Addata = Addata - 20 Else '雑音を排除する。 Addata = 0 End If ' Temp1 = 51 - Micgain If Addata > Temp1 Then 'If マイク感度値より大きな音が入ったか? Then Temp1 = Addata / 10 'レベルメータ用の計算を行う。 Temp1 = Temp1 + 1 If Temp1 > 10 Then Temp1 = 10 'If 表示範囲以上か? Then Locate 1 , 6 For Temp2 = 1 To Temp1 'レベルメータを表示する。 Lcd Chr(&Hff); Next Temp2 Tcount1 = 20 '音の検出後に200mSでレベルメータを消す。 ' Toggle Led_1r 'LEDを反転させる。(スイッチ操作) Tcount2 = 10 '音の検出後、100mS間はマイク入力を禁止する。 End If Return ' ' * タイマー処理ルーチン * ' Timecont: If Tifr1.ocf1a = 0 Then Return 'If 10mS経過したか? Else Set Tifr1.ocf1a 'Timer1 比較A一致フラグをリセット。 ' If Tcount1 <> 0 Then 'If タイマー・カウンタ[1]が使用中か? Then Tcount1 = Tcount1 - 1 If Tcount1 = 0 Then 'If タイマー・カウンタ1がタイムアウトしたか? Then Locate 1 , 6 '音の検出後、一定時間でレベルメータを消す。 Lcd Spc(10) End If End If ' If Tcount2 <> 0 Then 'If タイマー・カウンタ[2]が使用中か? Then Tcount2 = Tcount2 - 1 End If Return ' ' * マイク感度値をLCDに表示するサブルーチン * ' Gaindisp: Tempstr = Str(micgain) '数値変数を文字変数に変換する。 Locate 2 , 1 Lcd "マイク カンド:" ; Format(tempstr , " ") Return ' ' End