' ' ********************************************** ' * * ' * 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コンバータに電源を供給。 ' ' ↓********************************************↓ ' ↓ これ以降に各自のプログラムを作成して下さい ↓ ' ↓********************************************↓ ' ' ' **************************************************** ' * A1324LUA-T 磁束密度計(ガウスメータ) プログラム * ' * 直流磁界専用 (Ver.0.01) * ' * Copyright By O-Family 2013.10.24 * ' **************************************************** ' ' ' * 変数の宣言 * ' Dim Magdensity As Integer '磁束密度値。 Dim Offset As Integer 'センサーのオフセット誤差値。 Dim Polarity As Byte '磁場の極性。(0:磁束密度[0G] , 1:[S極] , 2:[N極]) Dim Lcdcount As Byte 'LCDの数値表示時間間隔カウンター。 ' Dim Temp1 As Byte '汎用テンポラリ変数 Byte型 No.1 Dim Temp2 As Byte '汎用テンポラリ変数 Byte型 No.2 Dim Temp3 As Byte '汎用テンポラリ変数 Byte型 No.3 Dim Temp4 As Byte '汎用テンポラリ変数 Byte型 No.4 Dim Tempi1 As Integer '汎用テンポラリ変数 Integer型 No.1 Dim Templ1 As Long '汎用テンポラリ変数 Long型 No.1 Dim Tempstr As String * 20 '文字変数を宣言する。 ' ' * LCDの設定 * ' Cursor Off 'LCDのカーソルをオフにする。 Deflcdchar 0 , &H00 , &H00 , &H00 , &H00 , &H10 , &H10 , &H10 , &H10 'バーグラフ用のカスタム文字をLCDへ書き込む。 Deflcdchar 1 , &H00 , &H00 , &H00 , &H00 , &H18 , &H18 , &H18 , &H18 Deflcdchar 2 , &H00 , &H00 , &H00 , &H00 , &H1C , &H1C , &H1C , &H1C Deflcdchar 3 , &H00 , &H00 , &H00 , &H00 , &H1E , &H1E , &H1E , &H1E Deflcdchar 4 , &H00 , &H00 , &H00 , &H00 , &H1F , &H1F , &H1F , &H1F Deflcdchar 5 , &H00 , &H00 , &H00 , &H00 , &H01 , &H01 , &H01 , &H01 Deflcdchar 6 , &H00 , &H00 , &H00 , &H00 , &H03 , &H03 , &H03 , &H03 Deflcdchar 7 , &H00 , &H00 , &H00 , &H00 , &H07 , &H07 , &H07 , &H07 ' Locate 2 , 1 'バーグラフ用の極性を表示する。 Lcd "N" Locate 2 , 16 Lcd "S" ' Waitms 1 'センサーの起動待ち時間。 ' ' * センサーのオフセット誤差を検出する * ' Tempi1 = Getadc(ad_ain1) '測定入力1をA/D変換する。 Offset = Tempi1 - 512 'オフセット誤差値を計算する。 Polarity = 0 '磁場の極性を[0G]にする。 ' ' ******************* ' * メイン ルーチン * ' ******************* ' Main: Tempi1 = Getadc(ad_ain1) '測定入力1をA/D変換する。 Tempi1 = Tempi1 - Offset 'センサーのオフセット誤差を相殺する。 ' ' * 磁場の極性を調べる * ' Tempi1 = Tempi1 - 512 'センサーの静止電圧からの差分を求める。 Select Case Tempi1 '磁場の極性による判別。 Case Is > 1 : '磁場が[S極]方向の場合。 Polarity = 1 '極性を[S極]にする。 Case Is < -1 : '磁場が[N極]方向の場合。 Polarity = 2 '極性を[N極]にする。 Tempi1 = Abs(tempi1) '絶対値を求める。 Case Else : '磁束がない場合。 Polarity = 0 '極性を[0G]にする。 Tempi1 = 0 '±1G以内を0Gに丸める。 End Select ' ' * 磁束密度を計算する * ' Templ1 = 1000 * Tempi1 ' (5V÷5mV)÷1024×[A/D値] Shift Templ1 , Right , 10 '式を変えて (5V÷5mV)×[A/D値]÷1024 Magdensity = Templ1 'Integer変数に変換する。 ' ' * LCDへの表示 * ' Lcdcount = Lcdcount + 1 If Lcdcount > 3 Then 'If 300ms 経過したか? Then Lcdcount = 0 Locate 1 , 3 'LCDに磁束密度値を表示する。 If Magdensity > 420 Then 'If 磁束密度の上限値を超えたか? Then Lcd "-Over-" ; Spc(8) Magdensity = 420 Else Tempstr = Str(magdensity) '数値変数を文字変数に変換する。 Lcd Format(tempstr , " 0") ; " G " 'ガウス表示。 Locate 1 , 10 Lcd Format(tempstr , " 0.0") ; " mT" 'テスラ表示。 End If End If ' ' * 極性とバーグラフの表示 * ' If Magdensity > 419 Then 'If バーグラフの上限を超えているか? Then Magdensity = 419 End If ' Tempi1 = Magdensity / 12 'バーグラフのドット数を求める。(0〜34.9) Temp1 = Tempi1 'Byte変数に変換する。 Temp2 = Temp1 / 5 '塗りつぶしキャラクターの数を求める。(0〜6) Temp3 = Temp2 * 5 Temp3 = Temp1 - Temp3 '塗りつぶし後の端数のドット数を求める。(0〜4) ' Locate 1 , 1 '極性による表示処理。 Select Case Polarity Case 0 : '[0G]の場合。 Lcd " " ' Locate 2 , 2 'バーグラフに[0G]の表示をする。 Lcd Spc(6) ; Chr(5) ; Chr(0) ; Spc(6) ' Case 1 : '[S]極性の場合。 Lcd "S" ' Deflcdchar 3 , &H00 , &H00 , &H00 , &H00 , &H1E , &H1E , &H1E , &H1E 'カスタム文字の共用部をLCDへ書き込む。 Locate 2 , 2 '[N]極性側を消去する。 Lcd Spc(7) ' Temp1 = 9 '塗りつぶしパターンの処理。 While Temp2 <> 0 'If 塗りつぶしが有るか? Then Locate 2 , Temp1 Lcd Chr(4) ; Temp1 = Temp1 + 1 'カーソル位置を1つ進める。 Temp2 = Temp2 - 1 Wend ' Temp2 = Lookup(temp3 , Cgdata_s) '端数のドット分のパターンを取り出す。 Locate 2 , Temp1 Lcd Chr(temp2) ' Temp1 = Temp1 + 1 '残りスペースを消去する。 Temp2 = 16 - Temp1 If Temp2 <> 0 Then 'If 残りスペースが有るか? Then Locate 2 , Temp1 Lcd Spc(temp2) End If ' Case Else : '[N]極性の場合。 Lcd "N" ' Deflcdchar 3 , &H00 , &H00 , &H00 , &H00 , &H0F , &H0F , &H0F , &H0F 'カスタム文字の共用部をLCDへ書き込む。 Locate 2 , 9 '[S]極性側を消去する。 Lcd Spc(7) ' Temp1 = 8 '塗りつぶしパターンの処理。 While Temp2 <> 0 'If 塗りつぶしが有るか? Then Locate 2 , Temp1 Lcd Chr(4) ; Temp1 = Temp1 - 1 'カーソル位置を1つ戻す。 Temp2 = Temp2 - 1 Wend ' Temp2 = Lookup(temp3 , Cgdata_n) '端数のドット分のパターンを取り出す。 Locate 2 , Temp1 Lcd Chr(temp2) ' Temp1 = Temp1 - 2 '残りスペースを消去する。 If Temp1 <> 0 Then 'If 残りスペースが有るか? Then Locate 2 , 2 Lcd Spc(temp1) End If End Select ' Waitms 100 '表示周期の待ち時間。 Goto Main ' ' End ' ' * バーグラフ用のLCDキャラクター・データ * ' Cgdata_s: Data 0 , 1 , 2 , 3 , 4 ' Cgdata_n: Data 5 , 6 , 7 , 3 , 4