' ' ********************************************** ' * * ' * 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コンバータに電源を供給。 ' ' ↓********************************************↓ ' ↓ これ以降に各自のプログラムを作成して下さい ↓ ' ↓********************************************↓ ' ' ' ************************************************* ' * LPS25H 気圧センサー 動作テスト プログラム * ' * * ' * Basic Compiler is BASCOM-AVR * ' * Copyright By O-Family 2016. 1. 7 * ' ************************************************* ' ' ' * ポート名の定義 * ' Spi_cs Alias Portd.6 'LPS25Hの[CS]端子接続ポート。 Spi_sck Alias Portd.5 'LPS25Hの[SPC]端子接続ポート。 Spi_sdo Alias Portd.4 'LPS25Hの[SDI]端子接続ポート。 Spi_sdi Alias Pind.3 'LPS25Hの[SDO]端子接続ポート。 Spi_int1 Alias Pind.2 'LPS25Hの[INT1]端子接続ポート。 ' ' * 変数の宣言 * ' Dim Spibuff(5) As Byte 'SPIの送受信データ・バッファー。 Dim Baropress As Long '気圧値。(×100) Dim Temperature As Integer '温度値。(×10) ' Dim Tempw1 As Word '汎用テンポラリ変数 Word型 No.1 Dim Tempstr As String * 10 '汎用テンポラリ変数 String型 ' ' * ポートの初期設定 * ' Config Spi_cs = Output 'LPS25Hの[CS]ピン接続ポートを出力に設定する。 Set Spi_cs 'LPS25Hの[CS]ピンを[H]にする。 Config Spi = Soft , Clock = Spi_sck , Dout = Spi_sdo , Din = Spi_sdi , Ss = None , Mode = 3 'ソフトウェアSPIの設定。 Spiinit 'SPIポートを初期化する。 ' 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へ書き込む。 ' Waitms 10 'LPS25Hの起動待ち時間。 ' ' * LPS25Hの初期設定 * ' Spibuff(1) = &H0F 'LPS25Hの存在を確認する。 Gosub Spird 'LPS25Hのレジスターから1バイトを読み出す。 If Spibuff(1) <> &HBD Then 'If デバイスの識別コードが読み出せないか? Then Locate 1 , 1 Lcd "# LPS25H" Locate 2 , 1 Lcd "# Not Found" Stop End If ' Spibuff(1) = &H20 'LPS25Hをパワーダウンにする。(クリーン・スタート) Spibuff(2) = &B0000_0000 '[CTRL_REG1] PD=0 Gosub Spiwr 'LPS25Hのレジスターに1バイトを書き込む。 Waitms 1 ' Spibuff(1) = &H10 'LPS25Hの分解能を設定する。 Spibuff(2) = &B0000_1111 '[RES_CONF] AVGT=64 , AVGP=512 Gosub Spiwr 'LPS25Hのレジスターに1バイトを書き込む。 ' Spibuff(1) = &H2E 'LPS25HのFIFOを設定する。 Spibuff(2) = &B1101_1111 '[FIFO_CTRL] F_MODE=FIFO平均モード , WTM_POINT=32サンプル Gosub Spiwr 'LPS25Hのレジスターに1バイトを書き込む。 ' Spibuff(1) = &H21 'LPS25HのFIFOを有効にする。 Spibuff(2) = &B0100_0000 '[CTRL_REG2] FIFO_EN=1 Gosub Spiwr 'LPS25Hのレジスターに1バイトを書き込む。 ' Spibuff(1) = &H22 'LPS25Hの[INT1]端子を設定する。 Spibuff(2) = &B0000_0000 '[CTRL_REG3] 極性=[H,プッシュプル] , INT1=データ信号 Gosub Spiwr 'LPS25Hのレジスターに1バイトを書き込む。 ' Spibuff(1) = &H23 'LPS25Hの[INT1]端子を設定する。 Spibuff(2) = &B0000_0001 '[CTRL_REG4] INT1ピンにデータ準備完了 Gosub Spiwr 'LPS25Hのレジスターに1バイトを書き込む。 ' Spibuff(1) = &H20 'LPS25Hの電源を入れる。 Spibuff(2) = &B1001_0100 '[CTRL_REG1] PD=1 , ODR=1Hz , BDU=1 Gosub Spiwr 'LPS25Hのレジスターに1バイトを書き込む。 Waitms 1 'センサーが起動する待ち時間。 ' ' ******************* ' * メイン ルーチン * ' ******************* ' Main: ' ' * 気圧値と温度値の取得 * ' Reset Led_4b '変換中のLEDサイン。 Do '変換の終了を待つ。 Loop Until Spi_int1 = 1 'If [INT1]端子が[H]になったか? Then Set Led_4b ' ' * LPS25Hの出力データを気圧値に変換する * ' Spibuff(1) = &H28 Or &B1100_0000 '[R/W]=1 , [M/S]=1 Reset Spi_cs 'LPS25Hの[CS]ピンを[L]にする。 Spiout Spibuff(1) , 1 'LPS25Hへ読み出しアドレスを送信する。 Spiin Spibuff(1) , 3 '[PRESS_OUT_XL,PRESS_OUT_L,PRESS_OUT_H]を読み出す。 Set Spi_cs 'LPS25Hの[CS]ピンを[H]にする。 ' Baropress = Spibuff(3) '3バイトの気圧値をロング変数に変換する。 Shift Baropress , Left , 16 '最上位バイトへ移動する。 Tempw1 = Makeint(spibuff(1) , Spibuff(2)) '下位2バイトをワード変数にする。 Baropress = Baropress Or Tempw1 'ロング変数にまとめる。 Baropress = Baropress * 100 '小数点以下2桁を桁上げする。(小数点演算を使わないため) Baropress = Baropress / 4096 '気圧値の変換計算。 ' ' * LPS25Hの出力データを温度値に変換する * ' Spibuff(4) = &H2B Or &B1100_0000 '[R/W]=1 , [M/S]=1 Reset Spi_cs 'LPS25Hの[CS]ピンを[L]にする。 Spiout Spibuff(4) , 1 'LPS25Hへ読み出しアドレスを送信する。 Spiin Spibuff(4) , 2 '[TEMP_OUT_L,TEMP_OUT_H]を読み出す。 Set Spi_cs 'LPS25Hの[CS]ピンを[H]にする。 ' Temperature = Makeint(spibuff(4) , Spibuff(5)) '2バイトをインテジャ変数にする。 Temperature = Temperature / 48 '温度値の変換計算。 Temperature = Temperature + 425 ' ' * 気圧値をLCDに表示する * ' Tempstr = Str(baropress) '文字変数に変換する。 Locate 1 , 1 Lcd Format(tempstr , " 0.00") ; " " ; Chr(1) '小数点表記にフォーマットを変換してLCDに表示する。 ' Locate 2 , 1 '16進値データを表示する。 Lcd Hex(spibuff(3)) ; Hex(spibuff(2)) ; Hex(spibuff(1)) ' ' * 温度値をLCDに表示する * ' Tempstr = Str(temperature) '文字変数に変換する。 Locate 1 , 11 Lcd Format(tempstr , " 0.0") ; Chr(2) '小数点表記にフォーマットを変換してLCDに表示する。 ' Locate 2 , 12 '16進値データを表示する。 Lcd Hex(spibuff(5)) ; Hex(spibuff(4)) ' Goto Main ' ' ***************************************************** ' * LPS25Hのレジスターに1バイトを書き込むサブルーチン * (Spibuff(1) = 書き込むレジスターのアドレス) ' ***************************************************** (Spibuff(2) = 書き込むバイト・データ) ' Spiwr: Reset Spi_cs 'LPS25Hの[CS]ピンを[L]にする。 Spiout Spibuff(1) , 2 'SPIバスへ2バイトを送信する。 Set Spi_cs 'LPS25Hの[CS]ピンを[H]にする。 Return ' ' ******************************************************* ' * LPS25Hのレジスターから1バイトを読み出すサブルーチン * (Spibuff(1) = 読み出すレジスターのアドレス) ' ******************************************************* (Spibuff(1) = 読み出したデータ値) ' Spird: Spibuff(1) = Spibuff(1) Or &B1100_0000 '[R/W]=1 , [M/S]=1 Reset Spi_cs 'LPS25Hの[CS]ピンを[L]にする。 Spiout Spibuff(1) , 1 'SPIバスへ1バイトを送信する。 Spiin Spibuff(1) , 1 'SPIバスから1バイトを受信する。 Set Spi_cs 'LPS25Hの[CS]ピンを[H]にする。 Return ' ' End