' ' ************************************ ' * Gamebuino 初期設定 * ' * * ' * Copyright O-Family 2017. 3.23 * ' ************************************ ' ' Ver. 0.01 新規作成バージョン。 2017. 3.23 ' ' $regfile = "m328pdef.dat" '使用するAVRを設定。 $crystal = 16000000 'AVRクロックを設定。 ' $hwstack = 128 'ハードウェア・スタックの容量を設定。 $swstack = 128 'ソフトウェア・スタックの容量を設定。 $framesize = 128 'フレーム領域の容量を設定。 Const Sdcard_use = 0 'SD-Cardの使用状況。(0:使用しない , 1:使用する) ' ' * ポート名の定義 * ' Btn_u Alias Pinb.1 'ボタン[Up]の接続ポート。 Btn_d Alias Pind.6 'ボタン[Down]の接続ポート。 Btn_l Alias Pinb.0 'ボタン[Left]の接続ポート。 Btn_r Alias Pind.7 'ボタン[Right]の接続ポート。 Btn_a Alias Pind.4 'ボタン[A]の接続ポート。 Btn_b Alias Pind.2 'ボタン[B]の接続ポート。 Btn_c Alias Pinc.3 'ボタン[C]の接続ポート。 ' Backlight Alias Portd.5 'G-LCDのバックライトの接続ポート。 Sp_out Alias Portd.3 'スピーカーの接続ポート。 ' ' * ポートの初期設定 * ' Set Portb.1 'ボタン[Up]の接続ポートをプルアップする。 Set Portd.6 'ボタン[Down]の接続ポートをプルアップする。 Set Portb.0 'ボタン[Left]の接続ポートをプルアップする。 Set Portd.7 'ボタン[Right]の接続ポートをプルアップする。 Set Portd.4 'ボタン[A]の接続ポートをプルアップする。 Set Portd.2 'ボタン[B]の接続ポートをプルアップする。 Set Portc.3 'ボタン[C]の接続ポートをプルアップする。 ' Config Backlight = Output 'G-LCDのバックライトの接続ポートを出力に設定する。 Config Sp_out = Output 'スピーカーの接続ポートを出力に設定する。 ' Set Portb.2 'SDカードの[/CS]接続ポートを[H]に設定する。 Config Portb.2 = Output 'SDカードの[/CS]接続ポートを出力に設定する。 Set Portc.1 'G-LCDの[/CE]接続ポートを[H]に設定する。 Config Portc.1 = Output 'G-LCDの[/CE]接続ポートを出力に設定する。 Set Portb.5 'G-LCDの[CLK]接続ポートを[H]に設定する。 Config Portb.5 = Output 'G-LCDの[CLK]接続ポートを出力に設定する。 ' ' * AVR-DOSの初期設定 * ' #if Sdcard_use = 0 Config Spi = Hard , Master = Yes , Interrupt = Off , Data Order = Msb , Phase = 1 , Polarity = High , Clockrate = 4 , Noss = 1 Spiinit 'SPIピンを初期化する。 #else $include "Config_MMCSD_HC_Gamebuino.bas" 'SD/MMCカードのピン設定プログラムを組み込む。 $include "CONFIG_AVR-DOS_Mega328P.bas" 'AVR-DOSの設定プログラムを組み込む。 Temp1 = Initfilesystem(1) 'ファイル・システムを初期化する。 #endif ' ' * G-LCDの初期設定 * ' $lib "glcd-Gamebuino.LBX" Config Graphlcd = 128x64sed , Rst = Portc.0 , Cs1 = Portc.1 , A0 = Portc.2 , Si = Portb.3 , Sclk = Portb.5 Cls 'G-LCDの全画面を消去する。 ' ' * I2Cの初期設定 * ' $lib "i2c_twi.lbx" 'TWI用ライブラリを組み込む。 Config Scl = Portc.5 'SCLラインを接続する、ポートピンを設定。 Config Sda = Portc.4 'SDAラインを接続する、ポートピンを設定。 Config Twi = 400000 'SCLクロック速度を設定。 I2cinit 'SCL・SDAラインを初期化。 ' ' * A/Dコンバータの初期設定 * ' Config Adc = Single , Prescaler = Auto , Reference = Avcc 'A/Dコンバータの設定。 Start Adc 'A/Dコンバータに電源を供給。 ' ' * シリアル通信の初期設定 * ' Config Com1 = 9600 , Parity = None , Stopbits = 1 , Databits = 8 'ハードウェアUARTの設定。 Config Serialin = Buffered , Size = 80 'シリアルデータ受信を、バッファを使用した割り込み処理にする。 Enable Interrupts 'すべての割り込みを許可。 '-------------------------------------------------------------------------------------------------- ' ' ****************************************************** ' * SHT31 温度・湿度 センサー Gamebuino 接続プログラム * ' * (Strawberry Linux基板とAliExpress基板の比較) * ' * * ' * Copyright O-Family 2017. 4. 5 * ' ****************************************************** ' ' Ver. 1.01 新規作成バージョン。 2017. 4. 5 ' Const Sht31_1_adr = &H88 'SHT31-1のI2Cアドレス。 Const Sht31_2_adr = &H8A 'SHT31-2のI2Cアドレス。 ' Dim Temperature As Integer 'SHT31温度値。(x0.01) Dim Humidity As Integer 'SHT31湿度値。(x0.01) Dim I2cbuff(10) As Byte 'I2C送受信バッファー。 Dim Errorflag As Byte 'エラーフラグ。 Dim I2cadr As Byte 'I2Cアドレス。 ' Dim Tempw1 As Word '汎用テンポラリ変数 Word型 No.1 Dim Templ1 As Long '汎用テンポラリ変数 Long型 No.1 Dim Tempstr As String * 20 '汎用テンポラリ変数 String型 ' ' * Timerの設定 * ' Config Timer1 = Timer , Prescale = 1024 , Clear Timer = 1 'Timer1の設定。16,000,000Hz / 1024 = 15,625Hz Compare1a = 15625 - 1 '15,625Hz / 1Hz(1秒) = 15625カウント ' ' * タイトルの表示 * ' Setfont Gamebuino_font6x8 Print : Print "*** SHT31 1 & 2 Temperature & Humidity Sensor ***" 'シリアル・ターミナルへオープニング・メッセージを出力する。 Sound Sp_out , 50 , 1333 '1000Hzの音を50mS鳴らす。 Set Backlight 'G-LCDのバックライトを点灯する。 ' ' * SHT31の接続を確認する * ' I2cbuff(1) = &HF3 '[ステータス]レジスター。 I2cbuff(2) = &H2D I2creceive Sht31_1_adr , I2cbuff(1) , 2 , 3 'I2Cバスで、2バイトのコマンドを送信し3バイトのデータを受信する。 If Err <> 0 Then 'If [SHT31]の応答が無いか? Then Lcdat 2 , 13 , "# SHT31-1" Lcdat 4 , 13 , "Not found!" , 1 Print " # SHT31 Not found!" Sound Sp_out , 100 , 6666 '200Hzの音を500mS鳴らす。 Stop End If ' I2cbuff(1) = &HF3 '[ステータス]レジスター。 I2cbuff(2) = &H2D I2creceive Sht31_2_adr , I2cbuff(1) , 2 , 3 'I2Cバスで、2バイトのコマンドを送信し3バイトのデータを受信する。 If Err <> 0 Then 'If [SHT31]の応答が無いか? Then Lcdat 2 , 13 , "# SHT31-2" Lcdat 4 , 13 , "Not found!" , 1 Print " # SHT31 Not found!" Sound Sp_out , 100 , 6666 '200Hzの音を500mS鳴らす。 Stop End If ' ' * LCD画面の初期設定 * ' Lcdat 1 , 1 , " SHT31 1 & 2 " , 2 ' ' ******************* ' * メイン ルーチン * ' ******************* ' Main: If Tifr1.ocf1a = 1 Then 'If 1秒経過したか? Then Set Tifr1.ocf1a 'Timer1の比較A一致フラグをリセット。 ' ' * SHT31-1の温度・湿度を測定 * ' I2cadr = Sht31_1_adr Gosub Sht31measure 'SHT31-1の温度・湿度を測定する。 ' Tempstr = Str(temperature) '温度値を表示する。 If Temperature < 0 Then 'If マイナスの値か? Then Lcdat 3 , 1 , Format(tempstr , " 0.00") ; "C" Else 'プラス値の場合。 Lcdat 3 , 1 , Format(tempstr , " 0.00") ; "C" End If Print " SHT31-1 Temperature : " ; Format(tempstr , " 0.00") ; " C " ; ' Tempstr = Str(humidity) '湿度値を表示する。 Lcdat 3 , 43 , Format(tempstr , " 0.00") ; "%" Print "Humidity : " ; Format(tempstr , " 0.00") ; " % " ' ' * SHT31-2の温度・湿度を測定 * ' I2cadr = Sht31_2_adr Gosub Sht31measure 'SHT31-2の温度・湿度を測定する。 ' Tempstr = Str(temperature) '温度値を表示する。 If Temperature < 0 Then 'If マイナスの値か? Then Lcdat 5 , 1 , Format(tempstr , " 0.00") ; "C" Else 'プラス値の場合。 Lcdat 5 , 1 , Format(tempstr , " 0.00") ; "C" End If Print " SHT31-2 Temperature : " ; Format(tempstr , " 0.00") ; " C " ; ' Tempstr = Str(humidity) '湿度値を表示する。 Lcdat 5 , 43 , Format(tempstr , " 0.00") ; "%" Print "Humidity : " ; Format(tempstr , " 0.00") ; " % " End If ' Debounce Btn_c , 0 , Btncon 'ボタン[C]の検出。 Goto Main ' ' * ボタン[C]が押された場合 * ' Btncon: Toggle Backlight 'G-LCDのバックライトの点灯をON/OFFする。 Goto Main '################################################################################################## ' ' ********************************************** ' * SHT31 温度・湿度 センサー 測定サブルーチン * ' ********************************************** ' Sht31measure: I2cbuff(1) = &H24 '単発測定コマンド、精度:高、クロックストレッチ:無し。 I2cbuff(2) = &H00 I2csend I2cadr , I2cbuff(1) , 2 'I2Cバスで、2バイトのコマンドを送信する。 Waitms 20 '測定の待ち時間。 ' I2cstart '[スタート・コンディション] の状態にする。 I2cwbyte I2cadr + 1 'スレーブ・アドレス(読み出し)を送信する。 I2crbyte I2cbuff(1) , Ack '温度の上位バイトを読み出す。 I2crbyte I2cbuff(2) , Ack '温度の下位バイトを読み出す。 I2crbyte I2cbuff(3) , Ack '温度のチェックサムを読み出す。 I2crbyte I2cbuff(5) , Ack '湿度の上位バイトを読み出す。 I2crbyte I2cbuff(6) , Ack '湿度の下位バイトを読み出す。 I2crbyte I2cbuff(7) , Nack '湿度のチェックサムを読み出す。 I2cstop '[ストップ・コンディション] の状態にする。 ' ' * 温度の計算 * ' Errorflag = 0 Gosub Sht31crc 'SHT31用のCRC8を計算する。 If I2cbuff(3) <> I2cbuff(4) Then 'If CRCエラーか? Then Errorflag = 1 'チェックサム・エラーが発生した。 End If Tempw1 = Makeint(i2cbuff(2) , I2cbuff(1)) '2バイトを1ワードに変換する。 Templ1 = 17500 * Tempw1 'T = -45 + 175 * St / (2^16-1) (小数点演算を使わないために100倍した値) Templ1 = Templ1 / 65535 Temperature = Templ1 Temperature = Temperature - 4500 ' ' * 湿度の計算 * ' I2cbuff(1) = I2cbuff(5) I2cbuff(2) = I2cbuff(6) I2cbuff(3) = I2cbuff(7) Gosub Sht31crc 'SHT31用のCRC8を計算する。 If I2cbuff(3) <> I2cbuff(4) Then 'If CRCエラーか? Then Errorflag = 1 'チェックサム・エラーが発生した。 End If Tempw1 = Makeint(i2cbuff(2) , I2cbuff(1)) '2バイトを1ワードに変換する。 Templ1 = 10000 * Tempw1 'RH = 100 * Srh / (2^16-1) (小数点演算を使わないために100倍した値) Templ1 = Templ1 / 65535 Humidity = Templ1 Return ' ' * SHT31用のCRC8を計算する * ' Sht31crc: Loadadr I2cbuff(1) , Z $asm LDI R16,$02 '計算するバイト数。 SER R24 'CRC値。(FFh) LDI R22,$31 'POLYNOMIAL = 0x131 P(x)=x^8+x^5+x^4+1 = 1_0011_0001 Sht31crc1: LD R25,Z+ '計算するバイトを読み出す。 EOR R24,R25 'CRC = CRC EXOR I2cbuff(x) LDI R17,$08 Sht31crc2: LSL R24 'CRCを左へ1bitシフトする。 BRcc Sht31crc3 'If シフト前のCRCのbit7が[1]か? Else EOR R24,R22 'CRC = CRC EXOR &H31 Sht31crc3: DEC R17 BRNE Sht31crc2 'If 8ビット終了か? Else DEC R16 BRNE Sht31crc1 'If 計算するバイト数が終わったか? Else ADIW R30,1 '受信CRCバイトの次に計算CRC値を格納する。 ST Z,R24 $end Asm Return End ' ' * フォント データ * ' $include "Gamebuino_font6x8.font" $include "Font10x16num.font"