' ' ********************************************** ' * * ' * 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コンバータに電源を供給。 ' ' ↓********************************************↓ ' ↓ これ以降に各自のプログラムを作成して下さい ↓ ' ↓********************************************↓ ' ' ' *************************************************** ' * LPS331AP 気圧センサー 動作テスト プログラム * ' * * ' * Basic Compiler is BASCOM-AVR * ' * Copyright By O-Family 2013. 5.16 * ' *************************************************** ' ' ' * ポート名の定義 * ' Spi_cs Alias Portd.6 'LPS331APの[CS]端子接続ポート。 Spi_sck Alias Portd.5 'LPS331APの[SPC]端子接続ポート。 Spi_sdo Alias Portd.4 'LPS331APの[SDI]端子接続ポート。 Spi_sdi Alias Pind.3 'LPS331APの[SDO]端子接続ポート。 Spi_int1 Alias Pind.2 'LPS331APの[INT1]端子接続ポート。 ' ' * 変数の宣言 * ' Dim Average(32) As Long '移動平均用バッファー。 Dim Avgpoi As Byte '移動平均のポインター。 Dim Avgsum As Long '移動平均の合計値。 Dim Baropress As Long '気圧値。(×100) Dim Temperature As Integer '温度値。(×10) ' Dim Temp1 As Byte '汎用テンポラリ変数 Byte型 No.1 Dim Temp2 As Byte '汎用テンポラリ変数 Byte型 No.2 Dim Temp3 As Byte '汎用テンポラリ変数 Byte型 No.3 Dim Tempw1 As Word '汎用テンポラリ変数 Word型 No.1 Dim Tempi1 As Integer '汎用テンポラリ変数 Integer型 No.1 Dim Templ1 As Long '汎用テンポラリ変数 Long型 No.1 Dim Tempstr As String * 10 '汎用テンポラリ変数 String型 ' ' * ポートの初期設定 * ' Cursor Off 'LCDのカーソルをオフにする。 Deflcdchar 1 , &H10 , &H18 , &H14 , &H14 , &H02 , &H05 , &H06 , &H04 'カスタム文字[hp]をLCDへ書き込む。 Deflcdchar 2 , &H08 , &H14 , &H08 , &H06 , &H09 , &H08 , &H09 , &H06 'カスタム文字[℃]をLCDへ書き込む。 ' Set Spi_cs 'LPS331APの[CS]端子を[H]にする。 Set Spi_sck 'LPS331APの[SPC]端子を[H]にする。 Waitms 10 'LPS331APの起動待ち時間。 ' ' * LPS331APの初期化 * ' Temp1 = &H0F 'LPS331APの存在を確認する。 Gosub Spird8 'LPS331APのレジスターから1バイトを読み出す。 If Temp1 <> &HBB Then 'If デバイスの識別コードが読み出せないか? Then Locate 1 , 1 Lcd "# LPS331AP" Locate 2 , 1 Lcd "# Not Found" Stop End If ' Tempw1 = &H2180 'LPS331APをBOOT起動する。(CTRL_REG2のBOOT) Gosub Spiwr 'LPS331APのレジスターに1バイトを書き込む。 ' Do Temp1 = &H21 'BOOTの終了を待つ。 Gosub Spird8 'LPS331APのレジスターから1バイトを読み出す。 Loop Until Temp1 = &H00 'If [BOOT]ビットがリセットされたか? Then Waitms 10 'BOOTからの起動待ち時間。 ' Tempw1 = &H2104 'ソフトウェアRESETを起動する。(CTRL_REG2のSWRESET) Gosub Spiwr 'LPS331APのレジスターに1バイトを書き込む。 Waitms 10 'SWRESETの起動待ち時間。 ' Tempw1 = &H2100 'ソフトウェアRESETを解除する。(CTRL_REG2のSWRESET) Gosub Spiwr 'LPS331APのレジスターに1バイトを書き込む。 Waitms 10 'SWRESETからの起動待ち時間。 ' Tempw1 = &H2000 'LPS331APをパワーダウンにする。(CTRL_REG1のPD) Gosub Spiwr 'LPS331APのレジスターに1バイトを書き込む。 Waitms 2 'パワーダウンの起動待ち時間。 ' Tempw1 = &H107A 'LPS331APの分解能を設定する。(RES_CONF) Gosub Spiwr 'LPS331APのレジスターに1バイトを書き込む。 ' Tempw1 = &H2204 'LPS331APの[INT1]端子を[データの準備完了]に設定する。(CTRL_REG3) Gosub Spiwr 'LPS331APのレジスターに1バイトを書き込む。 ' Tempw1 = &H3001 'LPS331APのアナログ・フロント・エンド回路をONにする。(AMP_CTRL) Gosub Spiwr 'LPS331APのレジスターに1バイトを書き込む。 ' Tempw1 = &H2084 'LPS331APを起動する。ブロック・データ更新を有効にする。(CTRL_REG1のPDとBDU) Gosub Spiwr 'LPS331APのレジスターに1バイトを書き込む。 Waitms 2 'パワーダウンからの起動待ち時間。 ' Temp1 = &H28 '圧力と温度レジスターを空読みする。 Gosub Spird24 '### STATUS_REGはソフトウェアRESETが効かない ### Temp1 = &H2B Gosub Spird16 ' ' * 移動平均バッファーを初期化する * ' Tempw1 = &H2101 'LPS331APをワンショット・モードで変換開始する。(CTRL_REG2のONE_SHOT) Gosub Spiwr 'LPS331APのレジスターに1バイトを書き込む。 ' Do '変換の終了を待つ。 Loop Until Spi_int1 = 1 'If [INT1]端子が[1]になったか? Then Gosub Ptrdconv 'LPS331APから圧力と温度データを読み出して、気圧値と温度値に変換する。 ' For Avgpoi = 1 To 32 '移動平均バッファーを初期値で埋める。 Average(avgpoi) = Templ1 Next Avgpoi Avgsum = Templ1 Shift Avgsum , Left , 5 '32個の平均合計を作る。 Avgpoi = 1 '移動平均のポインターを初期化。 ' ' ******************* ' * メイン ルーチン * ' ******************* ' Main: ' ' * 気圧値と温度値の取得 * ' Tempw1 = &H2101 'LPS331APをワンショット・モードで変換開始する。(CTRL_REG2のONE_SHOT) Gosub Spiwr 'LPS331APのレジスターに1バイトを書き込む。 ' Set Led_4b Do '変換の終了を待つ。 Loop Until Spi_int1 = 1 'If [INT1]端子が[1]になったか? Then Reset Led_4b ' Gosub Ptrdconv 'LPS331APから圧力と温度データを読み出して、気圧値と温度値に変換する。 ' ' * 気圧値を移動平均する * ' Avgsum = Avgsum - Average(avgpoi) '一番古いデータを減算する。 Average(avgpoi) = Templ1 '移動平均バッファーに格納する。 Avgsum = Avgsum + Templ1 '新しいデータを合算する。 ' Avgpoi = Avgpoi + 1 '移動平均ポインターを更新する。 If Avgpoi > 32 Then 'If ポインターが上限か? Then Avgpoi = 1 End If ' Baropress = Avgsum Shift Baropress , Right , 5 '32個の移動平均を取る。 ' ' * 気圧値をLCDに表示する * ' Locate 1 , 1 '気圧値の取得データを表示。 Tempstr = Str(templ1) Lcd Format(tempstr , " 0.00") ; " " ; Chr(1) ' Locate 2 , 1 '気圧値の移動平均データを表示。 Tempstr = Str(baropress) Lcd Format(tempstr , " 0.00") ; " hPa" ' ' * 温度値をLCDに表示する * ' Locate 1 , 11 Tempstr = Str(tempi1) Lcd Format(tempstr , " 0.0") ; Chr(2) ' Wait 1 '1秒の更新時間を待つ。 Goto Main ' ' ********************************************************************** ' * LPS331APから圧力と温度データを読み出して、気圧値と温度値に変換する * (Templ1 = 気圧値×100) ' ********************************************************************** (Tempi1 = 温度値×10) ' Ptrdconv: Temp1 = &H28 '[PRESS_OUT_XL,PRESS_OUT_L,PRESS_OUT_H]を読み出す。 Gosub Spird24 'LPS331APのレジスターから連続した3バイトを読み出す。 Templ1 = Temp3 '3バイトをロング変数に変換する。 Shift Templ1 , Left , 16 Tempw1 = Makeint(temp1 , Temp2) Templ1 = Templ1 Or Tempw1 Templ1 = Templ1 * 100 '小数点以下2桁を桁上げする。(小数点演算を使わないため) Templ1 = Templ1 / 4096 ' Temp1 = &H2B '[TEMP_OUT_L,TEMP_OUT_H]を読み出す。 Gosub Spird16 'LPS331APのレジスターから連続した2バイトを読み出す。 Tempi1 = Makeint(temp1 , Temp2) Tempi1 = Tempi1 / 48 Tempi1 = Tempi1 + 425 Return ' ' ******************************************* ' * LPS331APのレジスターに1バイトを書き込む * (Tempw1 = 上位バイト:書き込むレジスターのアドレス) ' ******************************************* (Tempw1 = 下位バイト:書き込むバイト・データ) ' Spiwr: Reset Spi_cs Shiftout Spi_sdo , Spi_sck , Tempw1 , 0 , 16 Set Spi_cs Return ' ' ********************************************* ' * LPS331APのレジスターから1バイトを読み出す * (Temp1 = 読み出すレジスターのアドレス) ' ********************************************* (Temp1 = 読み出したデータ値) ' Spird8: Temp1 = Temp1 Or &B1100_0000 Reset Spi_cs Shiftout Spi_sdo , Spi_sck , Temp1 , 0 Shiftin Spi_sdi , Spi_sck , Temp1 , 0 Set Spi_cs Return ' ' ***************************************************** ' * LPS331APのレジスターから連続した2バイトを読み出す * (Temp1 = 読み出すレジスターのアドレス) ' ***************************************************** (Temp1 , Temp2 = 読み出したデータ値) ' Spird16: Temp1 = Temp1 Or &B1100_0000 Reset Spi_cs Shiftout Spi_sdo , Spi_sck , Temp1 , 0 Shiftin Spi_sdi , Spi_sck , Temp1 , 0 Shiftin Spi_sdi , Spi_sck , Temp2 , 0 Set Spi_cs Return ' ' ***************************************************** ' * LPS331APのレジスターから連続した3バイトを読み出す * (Temp1 = 読み出すレジスターのアドレス) ' ***************************************************** (Temp1 , Temp2 , Temp3 = 読み出したデータ値) ' Spird24: Temp1 = Temp1 Or &B1100_0000 Reset Spi_cs Shiftout Spi_sdo , Spi_sck , Temp1 , 0 Shiftin Spi_sdi , Spi_sck , Temp1 , 0 Shiftin Spi_sdi , Spi_sck , Temp2 , 0 Shiftin Spi_sdi , Spi_sck , Temp3 , 0 Set Spi_cs Return ' ' End