' ' ********************************************** ' * * ' * AVR & BASCOM-AVR トレーニング・ボード * ' * 初期設定 Ver.1.01 * ' * * ' * AVR is using ATmega88P * ' * Basic Compiler is BASCOM-AVR * ' * Copyright By O-Family 2010.10.29 * ' ********************************************** ' $regfile = "m88pdef.dat" '使用するAVRを設定。 $crystal = 16000000 'AVRクロックを設定。 ' $hwstack = 64 'ハードウェア・スタックの容量を設定。 $swstack = 10 'ソフトウェア・スタックの容量を設定。 $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コンバータに電源を供給。 ' ' ↓********************************************↓ ' ↓ これ以降に各自のプログラムを作成して下さい ↓ ' ↓********************************************↓ ' ' ' ******************************************* ' * SEN0193 (静電容量式 土壌水分センサー) * ' * テスト・プログラム * ' * * ' * Copyright O-Family 2018.11.21 * ' ******************************************* ' ' Ver 0.01 初回公開バージョン。 2018.11.21 Const Prgver = " 0.01" 'プログラム・バージョン。 ' ' * 変数の宣言 * ' Dim Advalue As Word 'SEN0193センサーの出力A/D変換値。 Dim Voltage As Word 'SEN0193センサーの出力電圧。(x0.01) Dim Threshdry As Word '乾燥時のしきい値。 Dim Threshwater As Word '水中時のしきい値。 Dim Moisture As Byte '水分量の百分率。(0〜100%) ' Dim Temp1 As Byte '汎用テンポラリ変数 Byte型 No.1 Dim Tempw1 As Word '汎用テンポラリ変数 Word型 No.1 Dim Tempw2 As Word '汎用テンポラリ変数 Word型 No.2 Dim Templ1 As Long '汎用テンポラリ変数 Long型 No.1 Dim Tempstr As String * 10 '汎用テンポラリ変数 String型 ' Dim Dummy As Eram Long 'EEPROM 4バイトのダミーエリア。 Dim Eepprgid As Eram Long 'EEPROM プログラムのID。 Dim Eepthreshdry As Eram Word 'EEPROM 乾燥時のしきい値。 Dim Eepthreshwater As Eram Word 'EEPROM 水中時のしきい値。 ' ' * EEPROMのデータを確認する * ' If Eepprgid <> &H33393130 Then 'If EEPROMが初期値か? Then Eepprgid = &H33393130 'EEPROM プログラムのID。[0193] Eepthreshdry = 1023 'EEPROM 乾燥時のしきい値。 Eepthreshwater = 0 'EEPROM 水中時のしきい値。 End If Threshdry = Eepthreshdry Threshwater = Eepthreshwater ' ' * カスタム文字をLCDに設定する * ' Deflcdchar 0 , &H11 , &H11 , &H11 , &H11 , &H11 , &H11 , &H11 , &H1F 'カスタム文字[カップ1bit]をLCDへ書き込む。 Deflcdchar 1 , &H11 , &H11 , &H11 , &H11 , &H11 , &H11 , &H1F , &H1F 'カスタム文字[カップ2bit]をLCDへ書き込む。 Deflcdchar 2 , &H11 , &H11 , &H11 , &H11 , &H11 , &H1F , &H1F , &H1F 'カスタム文字[カップ3bit]をLCDへ書き込む。 Deflcdchar 3 , &H11 , &H11 , &H11 , &H11 , &H1F , &H1F , &H1F , &H1F 'カスタム文字[カップ4bit]をLCDへ書き込む。 Deflcdchar 4 , &H11 , &H11 , &H11 , &H1F , &H1F , &H1F , &H1F , &H1F 'カスタム文字[カップ5bit]をLCDへ書き込む。 Deflcdchar 5 , &H11 , &H11 , &H1F , &H1F , &H1F , &H1F , &H1F , &H1F 'カスタム文字[カップ6bit]をLCDへ書き込む。 Deflcdchar 6 , &H11 , &H1F , &H1F , &H1F , &H1F , &H1F , &H1F , &H1F 'カスタム文字[カップ7bit]をLCDへ書き込む。 Deflcdchar 7 , &H1F , &H1F , &H1F , &H1F , &H1F , &H1F , &H1F , &H1F 'カスタム文字[カップ8bit]をLCDへ書き込む。 ' Cursor Off 'LCDのカーソルをオフにする。 '-------------------------------------------------------------------------------------------------- ' ' ******************* ' * メイン ルーチン * ' ******************* ' Main: ' ' * センサーの出力電圧をA/D変換する * ' Advalue = Getadc(ad_ain1) '測定入力1(PC2)をA/D変換する。 Templ1 = 500 * Advalue '5.00V÷1024×10000000(有効5桁*小数点以下2桁)×[A/D値]÷100000 Shift Templ1 , Right , 10 '式を変えて 5.00V×100倍×[A/D値]÷1024 Voltage = Templ1 'SEN0193センサーの出力電圧。(0〜500 x0.01) ' ' * センサーのA/D変換値と出力電圧値をLCDに表示する * ' Tempstr = Str(advalue) '数値変数を文字変数に変換する。 Locate 1 , 1 'LCDにA/D値を表示する。 Lcd "AD:" ; Format(tempstr , " 0") Tempstr = Str(voltage) '数値変数を文字変数に変換する。 Locate 1 , 9 'LCDに電圧値を表示する。 Lcd "OV:" ; Format(tempstr , "0.00") ; "v" ' ' * しきい値から水分量を換算してLCDに表示する * ' Locate 2 , 2 Lcd "Moisture:" ; ' If Threshdry =< Threshwater Then 'If 乾燥時と水中時のしきい値設定が異常か? Then Lcd "Error!" 'しきい値設定が異常な場合。 ' Else 'しきい値設定が正常な場合。 If Advalue < Threshwater Then 'If A/D値が水中時のしきい値より低いか? Then Lcd "WetOvr" '水中時のオフセット設定が異常な場合。 ' Else 'A/D値の下限が正常な場合。 If Advalue > Threshdry Then 'If A/D値が乾燥時のしきい値より高いか? Then Lcd "DryOvr" '乾燥時のオフセット設定が異常な場合。 ' Else 'A/D値の上限が正常な場合。 Tempw1 = Advalue - Threshwater 'A/D値から水中時のオフセットを差し引く。 Tempw2 = Threshdry - Threshwater '乾燥時と水中時のしきい値の差分を求める。 Templ1 = Tempw1 * 100 '水分量の百分率を求める。 Templ1 = Templ1 / Tempw2 Moisture = Templ1 Moisture = 100 - Moisture '水分量を逆比例に変換する。 ' Tempstr = Str(moisture) '数値変数を文字変数に変換する。 Lcd Format(tempstr , " 0") ; "% " ' Locate 2 , 16 'LCDに水分量の絵図を表示する。 Select Case Moisture Case Is < 10 : Lcd "D" '[0〜9%] Case Is < 20 : Lcd Chr(0) '[10〜19%] Case Is < 30 : Lcd Chr(1) '[20〜29%] Case Is < 40 : Lcd Chr(2) '[30〜39%] Case Is < 50 : Lcd Chr(3) '[40〜49%] Case Is < 60 : Lcd Chr(4) '[50〜59%] Case Is < 70 : Lcd Chr(5) '[60〜69%] Case Is < 80 : Lcd Chr(6) '[70〜79%] Case Is < 90 : Lcd Chr(7) '[80〜89%] Case Else : Lcd "W" '[90〜100%] End Select End If End If End If ' Waitms 500 '表示間隔の待ち時間。 ' ' * スイッチの検出 * ' Temp1 = Sw_1 Or Sw_2 '[SW1]と[SW2]が同時に押された場合。 If Temp1 = 0 Then Goto Threshset 'If しきい値の設定モードか? Then Goto Main '================================================================================================== ' ' * しきい値の設定 * ' Threshset: Cls 'LCDの全画面を消去する。 Lcd "Threshold Set" Sound Sp_out , 200 , 333 '4KHzの音を50mS鳴らす。 Bitwait Sw_1 , Set '[SW1]が離されるまで待つ。 Bitwait Sw_2 , Set '[SW2]が離されるまで待つ。 Waitms 30 'チャタリング除去の待ち時間。 ' Threshset1: Locate 1 , 7 'しきい値をLCDに表示する。 Lcd " Dry:" ; Tempstr = Str(threshdry) '数値変数を文字変数に変換する。 Lcd Format(tempstr , " 0") Locate 2 , 7 Lcd "Water:" ; Tempstr = Str(threshwater) '数値変数を文字変数に変換する。 Lcd Format(tempstr , " 0") ' Threshset2: Tempw1 = Getadc(ad_ain1) '測定入力1をA/D変換する。 Tempstr = Str(tempw1) '数値変数を文字変数に変換する。 Locate 2 , 1 'LCDにA/D値を表示する。 Lcd Format(tempstr , " 0") ' Debounce Sw_1 , 0 , Sw1on 'If [SW1]が押されたか? Then Debounce Sw_2 , 0 , Sw2on 'If [SW2]が押されたか? Then Debounce Sw_3 , 0 , Sw3on 'If [SW3]が押されたか? Then Goto Threshset2 ' ' * 乾燥時のしきい値を設定する * ' Sw1on: Threshdry = Tempw1 Sound Sp_out , 200 , 333 '4KHzの音を50mS鳴らす。 Goto Threshset1 ' ' * 水中時のしきい値を設定する * ' Sw2on: Threshwater = Tempw1 Sound Sp_out , 200 , 333 '4KHzの音を50mS鳴らす。 Goto Threshset1 ' ' * しきい値の設定終了 * ' Sw3on: Eepthreshdry = Threshdry 'EEPROMに保管する。 Eepthreshwater = Threshwater 'EEPROMに保管する。 Sound Sp_out , 200 , 333 '4KHzの音を50mS鳴らす。 Bitwait Sw_3 , Set '[SW3]が離されるまで待つ。 Cls 'LCDの全画面を消去する。 Goto Main ' ' End