' ' ********************************************** ' * * ' * 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コンバータに電源を供給。 ' ' ↓********************************************↓ ' ↓ これ以降に各自のプログラムを作成して下さい ↓ ' ↓********************************************↓ ' ' ' ************************************************* ' * 温度・湿度 センサー [AM2321] 制御プログラム * ' * (I2Cモード) * ' * Copyright By O-Family 2014. 1. 9 * ' ************************************************* ' ' Dim Temperature As Word '温度値。(x0.1) Dim Humidity As Word '湿度値。(x0.1) Dim I2cbuff(10) As Byte 'I2C送受信バッファー。 Dim Am2321err As Byte '[AM2321]のエラーフラグ。 Dim Crcsum As Word 'CRCチェックサムの合計値。 ' Dim Tim1scun As Byte '1秒カウンター。 Dim Tim2sf As Byte '2秒経過フラグ。 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 Tempstr As String * 20 '汎用テンポラリ変数 String型 No.1 ' ' Cursor Off 'LCDのカーソルをオフにする。 ' ' * I2Cの初期設定 * ' Config Scl = Portd.2 'I2CバスのSCLラインを接続するポートピンを設定。 Config Sda = Portd.3 'I2CバスのSDAラインを接続するポートピンを設定。 I2cinit 'I2CバスのSCL,SDAラインを初期化する。 ' ' * Timerの設定 * ' Config Timer1 = Timer , Prescale = 256 , Clear Timer = 1 'Timer1の設定。16,000,000Hz / 256 = 62,500Hz Compare1a = 62500 - 1 '62,500Hz / 1Hz(1秒) = 62,500カウント On Compare1a Tint1sec 'TIMER1比較一致A割り込みルーチンのラベルを設定。 Enable Compare1a 'TIMER1比較一致A割り込みを許可。 ' Waitms 500 '[AM2321]のパワーオン時間を待つ。 Enable Interrupts 'すべての割り込みを許可する。 ' ' ******************* ' * メイン ルーチン * ' ******************* ' Main: If Tim2sf <> 0 Then 'If 2秒経過したか? Then Tim2sf = 0 Gosub Am2321measure '[AM2321]の湿度・温度を測定する。(2秒間隔で計測する) Gosub Lcddisp '湿度・温度データをLCDに表示する。 End If ' Goto Main ' ' ************************************* ' * Timer1 [1秒]割り込み 処理ルーチン * ' ************************************* ' Tint1sec: Tim1scun = Tim1scun + 1 If Tim1scun > 1 Then 'If 2秒経過したか? Then Tim1scun = 0 Tim2sf = 1 '2秒経過フラグを立てる。 End If Return ' ' ********************************* ' * [AM2321]の湿度・温度 測定処理 * (Temperature = 温度データ , Humidity = 湿度データ) ' ********************************* (AM2321err = [AM2321]の通信状態) ' Am2321measure: ' ' * [AM2321]を休止状態から呼び覚ます * ' I2cstart 'I2Cバスを[スタート・コンディション]にする。 I2cwbyte &HB8 'スレーブ・アドレス(書き込み)を送信。 Waitus 800 'センサーを休止状態から呼び覚ますための待ち時間。 I2cstop 'I2Cバスを[ストップ・コンディション]にする。 ' ' * [AM2321]のレジスター・データ読み取り命令を送信する * ' I2cstart 'I2Cバスを[スタート・コンディション]にする。 I2cwbyte &HB8 'スレーブ・アドレス(書き込み)を送信。 I2cwbyte &H03 '機能コード [03] レジスター・データの読み取り。 I2cwbyte &H00 'レジスタの先頭アドレス。(湿度の上位バイト) I2cwbyte &H04 '読み出すレジスタの数。(湿度と温度の4バイト) I2cstop 'I2Cバスを[ストップ・コンディション]にする。 Waitus 1500 '機能命令を送信した後の待ち時間。 ' ' * [AM2321]のレジスター・データを受信する * ' I2cstart 'I2Cバスを[スタート・コンディション]にする。 I2cwbyte &HB9 'スレーブ・アドレス(読み込み)を送信。 Waitus 30 '読み取り動作前の待ち時間。 For Temp1 = 1 To 7 'データを受信する。 I2crbyte I2cbuff(temp1) , Ack Next Temp1 I2crbyte I2cbuff(8) , Nack I2cstop 'I2Cバスを[ストップ・コンディション]にする。 ' ' * 受信したデータから湿度・温度値を取り出す * ' Humidity = Makeint(i2cbuff(4) , I2cbuff(3)) '湿度値。(x0.1) Temperature = Makeint(i2cbuff(6) , I2cbuff(5)) '温度値。(x0.1) Tempw1 = Makeint(i2cbuff(7) , I2cbuff(8)) '受信したCRCチェックサムの値。 ' ' * CRCチェックサムの計算 * ' Crcsum = &HFFFF For Temp1 = 1 To 6 '受信した6バイトについて計算する。 Crcsum = Crcsum Xor I2cbuff(temp1) For Temp2 = 1 To 8 Temp3 = Crcsum.0 Shift Crcsum , Right , 1 If Temp3 = 1 Then Crcsum = Crcsum Xor &HA001 End If Next Temp2 Next Temp1 ' Am2321err = 0 If Tempw1 <> Crcsum Then 'If CRCチェックサム エラーがあるか? Then Am2321err = 1 End If ' If I2cbuff(3) >= &H80 Then 'If エラーコードを受信したか? Then Am2321err = I2cbuff(3) End If Return ' ' *********************************** ' * 湿度・温度データをLCDに表示する * (Temperature = 温度データ , Humidity = 湿度データ) ' *********************************** (AM2321err = [AM2321]の通信状態) ' Lcddisp: Locate 1 , 1 Lcd Hex(i2cbuff(1)) ; Hex(i2cbuff(2)) ; " "; '受信した機能コードと返送バイト数を表示する。 Lcd Hex(i2cbuff(3)) ; Hex(i2cbuff(4)) ; " "; '受信した16進表記の湿度値を表示する。 Lcd Hex(i2cbuff(5)) ; Hex(i2cbuff(6)) '受信した16進表記の温度値を表示する。 ' If Am2321err <> 0 Then Goto Error 'If エラーが発生したか? Then Locate 2 , 9 '温度値の表示。 If Temperature.15 = 0 Then 'If 温度がプラス値か? Then Tempstr = Str(temperature) '数値変数を文字変数に変換する。 Lcd Format(tempstr , " 0.0") ; " ゚C"; 'LCDに温度を表示する。 Else '温度値がマイナスの場合。 Tempw1 = Temperature Reset Tempw1.15 '温度の符号を消去する。 Tempstr = Str(tempw1) '数値変数を文字変数に変換する。 Lcd "-" ; Format(tempstr , " 0.0") ; " ゚C"; 'LCDにマイナスの温度を表示する。 End If ' Locate 2 , 1 '湿度値の表示 Tempstr = Str(humidity) '数値変数を文字変数に変換する。 Lcd Format(tempstr , " 0.0") ; " %" 'LCDに湿度を表示する。 Return ' ' Error: 'エラー表示。 Locate 2 , 1 Lcd "E" ; Hex(am2321err) ; ":"; Select Case Am2321err Case &H80 : 'サポートしていない機能コード。 Lcd "NotSupported" Case &H81 : '不正なアドレスの読み込み。 Lcd "AddressError" Case &H82 : '範囲を超えたデータの書き込み。 Lcd "DatOverRange" Case &H83 : 'CRCチェックサムエラー。 Lcd "CRC SumError" Case &H84 : '書き込み禁止。 Lcd "WriteProtect" Case &H01 : '受信CRCチェックサムエラー。 Lcd "Rx CRC Error" End Select Return ' ' End