' ' ********************************************** ' * * ' * 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コンバータに電源を供給。 ' ' ↓********************************************↓ ' ↓ これ以降に各自のプログラムを作成して下さい ↓ ' ↓********************************************↓ ' ' ' ****************************************************** ' * デジタル 湿度&温度センサー [DHT22] 制御プログラム * ' * (Ver.1.01) * ' * Copyright By O-Family 2011. 6. 1 * ' ****************************************************** ' ' Dht22_do Alias Portd.2 '[DHT22]のDATAピン接続ポート(出力)。 Dht22_di Alias Pind.2 '[DHT22]のDATAピン接続ポート(入力)。 ' ' Dim Temperature As Word '温度値。(x0.1) Dim Humidity As Word '湿度値。(x0.1) Dim Dht22_rxbuf(5) As Byte '[DHT22]の受信バッファー。 Dim Dht22_err As Byte '[DHT22]のエラーフラグ。 Dim Dht22_timer As Byte '[DHT22]の信号期間タイマー。 ' 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のカーソルをオフにする。 ' ' * 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割り込みを許可。 ' Config Dht22_do = Input '[DHT22]のDATAポートを入力にする。(外部プルアップで[H]) Wait 1 '[DHT22]のパワーオン時間を待つ。 Enable Interrupts 'すべての割り込みを許可する。 ' ' Main: If Tim2sf <> 0 Then 'If 2秒経過したか? Then Tim2sf = 0 Gosub Dht22_measure '[DHT22]の湿度・温度を測定する。(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 ' ' ****************************** ' * DHT22の湿度・温度 測定処理 * (Temperature = 温度データ , Humidity = 湿度データ) ' ****************************** (Dht22_err = [DHT22]の通信状態) ' Dht22_measure: Config Dht22_do = Output '[DHT22]のDATAポートを出力にする。 Reset Dht22_do '[DHT22]に[スタート信号]を送信する。 Waitms 1 '1mSの信号幅を維持する。 Config Dht22_do = Input '[DHT22]のDATAポートを入力にする。(プルアップで[H]) Gosub Dht22_loin '[DHT22]からの[L]信号を待つ。(センサーからの応答信号を待つ) If Dht22_err <> 0 Then Goto Dht22_measure3 'If エラーが発生したか? Then ' Temp1 = 1 '5バイト(40bit)のデータを受信する。 Dht22_measure1: Temp2 = 8 '8bitカウンター。 Temp3 = 0 'bitデータを保管用。 Dht22_measure2: Gosub Dht22_loin '[DHT22]からの[L]信号を待つ。(ビットの同期信号を受信する) If Dht22_err <> 0 Then Goto Dht22_measure3 'If エラーが発生したか? Then Gosub Dht22_hiin '[DHT22]からの[H]信号の長さを計測する。 If Dht22_err <> 0 Then Goto Dht22_measure3 'If エラーが発生したか? Then ' Temp3 = Temp3 + Temp3 'bitデータを左へシフトする。(Shift Temp3 , Left , 1) If Dht22_timer > 5 Then 'If [DATA]が[1]か? Then Set Temp3.0 End If Temp2 = Temp2 - 1 If Temp2 <> 0 Then Goto Dht22_measure2 'If 8ビット受信終了か? Else ' Dht22_rxbuf(temp1) = Temp3 '受信バッファーへ格納する。 Temp1 = Temp1 + 1 If Temp1 < 6 Then Goto Dht22_measure1 'If 5バイト受信終了か? Else ' Temp2 = 0 'チェックサムを合計する。 For Temp1 = 1 To 4 Temp2 = Temp2 + Dht22_rxbuf(temp1) Next Temp1 If Temp2 = Dht22_rxbuf(5) Then 'If チェックサムが一致したか? Then Temperature = Makeint(dht22_rxbuf(4) , Dht22_rxbuf(3)) '2バイトの受信データを1ワードに変換する。 Humidity = Makeint(dht22_rxbuf(2) , Dht22_rxbuf(1)) '2バイトの受信データを1ワードに変換する。 Else Dht22_err = 2 'チェックサム(CRC)エラーが発生した。 End If Dht22_measure3: Return ' ' * [DHT22]からの[L]信号を待つサブルーチン * ( H -> L -> H) ' Dht22_loin: Gosub Dht22_hiin '[DHT22]からの[H]信号の長さを計測する。(DATAが[L]になるのを待つ) If Dht22_err <> 0 Then Return 'If エラーが発生したか? Then ' Dht22_timer = 0 'DATAが[H]になるのを検出する。 Dht22_loin1: Waitus 10 '10uSの待ち時間。 Dht22_timer = Dht22_timer + 1 If Dht22_di = 1 Then Goto Dht22_loin2 'If [DHT22]のDATAが[H]になったか? Then If Dht22_timer < 10 Then Goto Dht22_loin1 'If タイムアウト(100uS)が発生していないか? Then Dht22_err = 1 'タイムアウトエラーが発生。 Return ' Dht22_loin2: '[DHT22]のDATAが[H -> L -> H]の信号を検出完了。 Dht22_err = 0 Return ' ' * [DHT22]からの[H]信号の長さを計測するサブルーチン * (Dht22_timer = [H]信号の長さ x 10uS) ' Dht22_hiin: Dht22_timer = 0 Dht22_hiin1: Waitus 10 '10uSの待ち時間。 Dht22_timer = Dht22_timer + 1 If Dht22_di = 0 Then Goto Dht22_hiin2 'If [DHT22]のDATAが[L]になったか? Then If Dht22_timer < 10 Then Goto Dht22_hiin1 'If タイムアウト(100uS)が発生していないか? Then Dht22_err = 1 'タイムアウトエラーが発生。 Return ' Dht22_hiin2: '[DHT22]のDATAが[L]になったのを検出完了。 Dht22_err = 0 Return ' ' *********************************** ' * 湿度・温度データをLCDに表示する * (Temperature = 温度データ , Humidity = 湿度データ) ' *********************************** (Dht22_err = [DHT22]の通信状態) ' Lcddisp: Locate 1 , 1 Select Case Dht22_err Case 0 : 'エラー無し。 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 ' Tempstr = Str(humidity) '数値変数を文字変数に変換する。 Lcd " " ; Format(tempstr , " 0.0") ; " %" 'LCDに湿度を表示する。 ' Case 1 : 'タイムアウトエラーが発生した。 Lcd " Time out" ; Spc(7) ' Case 2 : 'チェックサム(CRC)エラーが発生した。 Lcd " CRC error" ; Spc(6) End Select ' Locate 2 , 2 '受信データを16進(HEX)でテスト表示する。 For Temp1 = 1 To 5 Lcd Hex(dht22_rxbuf(temp1)) ; " "; Next Temp1 Return ' ' End