' ' ********************************************** ' * * ' * 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コンバータに電源を供給。 ' ' ↓********************************************↓ ' ↓ これ以降に各自のプログラムを作成して下さい ↓ ' ↓********************************************↓ ' Cursor Off 'LCDのカーソルをオフにする。 ' ' ******************************************** ' * MPL115A1 デジタル気圧センサー * ' * テスト プログラム * ' * (Ver.2.01) * ' * Copyright By O-Family 2013. 5.20 * ' ******************************************** ' ' Const Serialoption = 1 'データのシリアル出力。(0=出力しない , 1=出力する) ' ' * ポート名の定義 * ' Spi_cs Alias Portd.6 'MPL115A1の[CS]端子接続ポート。 Spi_sck Alias Portd.5 'MPL115A1の[SCLK]端子接続ポート。 Spi_dout Alias Portd.4 'MPL115A1の[DIN]端子接続ポート。 Spi_din Alias Pind.3 'MPL115A1の[DOUT]端子接続ポート。 ' ' * 変数の宣言 * ' Dim Rxbuff(10) As Byte 'SPIの受信データ・バッファー。 ' Dim Uipadc As Word '圧力のA/D変換値。 Dim Uitadc As Word '温度のA/D変換値。 Dim Sia0 As Integer '[a0] 圧力のオフセット係数。 Dim Sib1 As Integer '[b1] 圧力の感度係数。 Dim Sib2 As Integer '[b2] 1次の温度オフセット係数 (TCO)。 Dim Sic12 As Integer '[c12]温度感度係数(TCS)のための係数。 ' Dim Temp1 As Byte '汎用テンポラリ変数 Byte型 No.1 Dim Temp2 As Byte '汎用テンポラリ変数 Byte型 No.2 Dim Temp3 As Byte '汎用テンポラリ変数 Byte型 No.3 Dim Tl1 As Long '汎用テンポラリ変数 Long型 No.1 Dim Tl2 As Long '汎用テンポラリ変数 Long型 No.2 ' ' * ポートの初期設定 * ' Set Spi_cs 'MPL115A1の[CS]端子を[H]にする。 Reset Spi_sck 'MPL115A1の[SCLK]端子を[L]にする。 Waitms 10 'MPL115A1の起動待ち時間。 ' ' * MPL115A1から係数ROMデータを読み出す * ' Reset Spi_dout 'MPL115A1の[DIN]端子を[L]にする。 Reset Spi_sck 'MPL115A1の[SCLK]端子を[L]にする。 Temp2 = 1 Reset Spi_cs 'MPL115A1の[CS]を[L]にする。 For Temp1 = &H88 To &H96 Step 2 Shiftout Spi_dout , Spi_sck , Temp1 , 1 Shiftin Spi_din , Spi_sck , Rxbuff(temp2) , 1 Temp2 = Temp2 + 1 Next Temp1 ' Temp1 = 0 '[00]を送信する。 ' Shiftout Spi_dout , Spi_sck , Temp1 , 1 Set Spi_cs 'MPL115A1の[CS]を[H]にする。 ' ' * 係数のバイト・データを16bitのワードに変換する * ' Sia0 = Makeint(rxbuff(2) , Rxbuff(1)) '[a0] 圧力のオフセット係数。 Sib1 = Makeint(rxbuff(4) , Rxbuff(3)) '[b1] 圧力の感度係数。 Sib2 = Makeint(rxbuff(6) , Rxbuff(5)) '[b2] 1次の温度オフセット係数 (TCO)。 Sic12 = Makeint(rxbuff(8) , Rxbuff(7)) '[c12]温度感度係数(TCS)のための係数。 ' ' #if Serialoption = 1 'If データをシリアル出力するか? Then $baud = 115200 'ハードウェアUARTの通信速度(ボーレート)を設定。 Print Print Print "a0: b1: b2: c12:" Print Hex(sia0) ; " "; '係数ROMデータをシリアル出力する。 Print Hex(sib1) ; " "; Print Hex(sib2) ; " "; Print Hex(sic12) Print #endif ' ' ******************* ' * メイン ルーチン * ' ******************* ' Main: ' ' * [変換開始]コマンドを送信する * ' Reset Spi_dout 'MPL115A1の[DIN]端子を[L]にする。 Reset Spi_sck 'MPL115A1の[SCLK]端子を[L]にする。 Reset Spi_cs 'MPL115A1の[CS]を[L]にする。 Temp1 = &H24 '[24]を送信する。 Shiftout Spi_dout , Spi_sck , Temp1 , 1 Temp1 = 0 '[00]を送信する。 Shiftout Spi_dout , Spi_sck , Temp1 , 1 Set Spi_cs 'MPL115A1の[CS]を[H]にする。 ' Wait 1 '変換中と表示間隔の待ち時間。 ' ' * [圧力と温度]のデータを読み出す * ' Reset Spi_dout 'MPL115A1の[DIN]端子を[L]にする。 Reset Spi_sck 'MPL115A1の[SCLK]端子を[L]にする。 Temp2 = 1 Reset Spi_cs 'MPL115A1の[CS]を[L]にする。 For Temp1 = &H80 To &H86 Step 2 Shiftout Spi_dout , Spi_sck , Temp1 , 1 Shiftin Spi_din , Spi_sck , Rxbuff(temp2) , 1 Temp2 = Temp2 + 1 Next Temp1 ' Temp1 = 0 '[00]を送信する。 ' Shiftout Spi_dout , Spi_sck , Temp1 , 1 Set Spi_cs 'MPL115A1の[CS]を[H]にする。 ' ' * [圧力と温度]のA/D変換値をワードに変換し、下位10bitに移動する * ' Uipadc = Makeint(rxbuff(2) , Rxbuff(1)) '圧力のA/D変換値(8bit)を16bitにまとめる。 Shift Uipadc , Right , 6 '下位10bitに移動させる。 ' Uitadc = Makeint(rxbuff(4) , Rxbuff(3)) '温度のA/D変換値(8bit)を16bitにまとめる。 Shift Uitadc , Right , 6 '下位10bitに移動させる。 ' ' Locate 1 , 1 'LCDへ圧力と温度のA/D変換値を表示する。 Lcd "Pa:" ; Hex(uipadc) ; " "; Lcd "Ta:" ; Hex(uitadc) ' #if Serialoption = 1 'If データをシリアル出力するか? Then Print "Padc:" ; Hex(uipadc) ; " "; Print "Tadc:" ; Hex(uitadc) ; " "; #endif ' ' * 圧力のA/D変換値に係数を適用し補償する * ' Pcomp = a0 + (b1 + c12 * Tadc) * Padc + b2 * Tadc ' Tl1 = Sic12 'c12x2 = (((sint32)c12) * Tadc) >> 11; // c12x2 = c12 * Tadc Tl2 = Uitadc Tl2 = Tl1 * Tl2 Shift Tl2 , Right , 11 , Signed ' Tl1 = Sib1 'a1 = (sint32)b1 + c12x2; // a1 = b1 + c12x2 Tl2 = Tl1 + Tl2 ' Tl2 = Tl2 * Uipadc 'a1x1 = a1 * Padc; // a1x1 = a1 * Padc ' Tl1 = Sia0 'y1 = (((sint32)a0) << 10) + a1x1; // y1 = a0 + a1x1 Shift Tl1 , Left , 10 Tl2 = Tl1 + Tl2 ' Tl1 = Sib2 'a2x2 = (((sint32)b2) * Tadc) >> 1; // a2x2 = b2 * Tadc Tl1 = Tl1 * Uitadc Shift Tl1 , Right , 1 , Signed ' Tl1 = Tl2 + Tl1 'Pcomp =(y1 + A2x2) >> 9 ; / / Pcomp = Y1 + A2x2 Shift Tl1 , Right , 13 , Signed '小数点以下を切り捨てて整数にするために、13bit右シフト ' ' * 気圧値の計算 * ' 気圧値 = ((65.0 / 1023.0) * 圧力値) + 50 [kPa] = (圧力値 * 65000 + 51150000) / 1023 [Pa] ' Tl2 = Tl1 * 65000 Tl2 = Tl2 + 51150000 Tl2 = Tl2 / 1023 Tl2 = Tl2 / 100 '[Pa]を[hPa]に変換する。 ' ' * 測定値の表示 * ' Locate 2 , 1 'LCDへ圧力値と気圧値を表示する。 Lcd Tl1 ; " " Locate 2 , 6 Lcd "AP " ; Tl2 ; " hPa " ' #if Serialoption = 1 'If データをシリアル出力するか? Then Print "Pcomp=" ; Tl1 ; " "; '計数適用データをシリアル出力する。 Print "AP = " ; Tl2 ; " hPa" '気圧値をシリアル出力する。 #endif ' Goto Main ' ' End