' ' ********************************************** ' * * ' * AVR & BASCOM-AVR トレーニング・ボード * ' * 初期設定 Ver.1.01 * ' * * ' * AVR is using ATmega88P * ' * Basic Compiler is BASCOM-AVR * ' * Copyright By O-Family 2009. 7.25 * ' ********************************************** ' $regfile = "m88pdef.dat" '使用するAVRを設定。 $crystal = 16000000 'AVRクロックを設定。 ' $hwstack = 64 'ハードウェア・スタックの容量を設定。 $swstack = 8 'ソフトウェア・スタックの容量を設定。 $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コンバータに電源を供給。 ' ' ↓********************************************↓ ' ↓ これ以降に各自のプログラムを作成して下さい ↓ ' ↓********************************************↓ ' ' ' ************************************************ ' * 1-Wireバス デジタル温度計 DS18B20 * ' *  複数接続時の温度表示 * ' * (Ver.1.01) * ' * Copyright By O-Family 2010. 4.19 * ' ************************************************ ' 1w_dq Alias Portd.0 '1-Wireバスのデータ線[DQ]を接続するポートピン。 ' ' Dim Tint1sflg As Byte '1秒経過フラグ。 ' Dim Txbuff(8) As Byte '送信データを格納する配列。 Dim Rxbuff(9) As Byte '受信データを格納する配列。 Dim Temp1 As Byte '汎用テンポラリ変数 Byte型 No.1 Dim Temp2 As Byte '汎用テンポラリ変数 Byte型 No.2 Dim Temp3 As Byte '汎用テンポラリ変数 Byte型 No.3 Dim Tempi1 As Integer '汎用テンポラリ変数 Integer型 No.1 Dim Templ1 As Long '汎用テンポラリ変数 Long型 No.1 Dim Tempstr As String * 20 '汎用テンポラリ変数 String型 No.1 Dim Tempstr2 As String * 20 '汎用テンポラリ変数 String型 No.2 ' ' * Timerの設定 * ' Config Timer1 = Timer , Prescale = 1024 , Clear Timer = 1 'Timer1の設定。16,000,000Hz / 1024 = 15,625Hz Compare1a = 15625 - 1 '15,625Hz / 1Hz(1秒) = 15625カウント On Compare1a Tint1sec 'TIMER1比較一致A割り込みルーチンのラベルを設定。 Enable Compare1a 'TIMER1比較一致A割り込みを許可。 ' ' * 初期設定 * ' Config 1wire = 1w_dq '1-Wireバスのデータ線を接続するポートピンを設定。 Cursor Off 'LCDのカーソルをオフにする。 Enable Interrupts 'すべての割り込みを許可。 ' ' * メイン ルーチン * ' Main: If Tint1sflg = 1 Then 'If 1秒経過したか? Then Tint1sflg = 0 Gosub Tempdisp 'LCDに温度を表示する。 End If Goto Main ' ' ********************************************** ' * LCDに温度表示 + 温度変換 (1秒毎に呼び出す) * ' ********************************************** ' Tempdisp: Restore Devid01 'デバイスのシリアル番号を指定する。 Gosub Treadsub 'シリアル番号を指定して温度データを読み込む。 Locate 1 , 1 'LCDに温度を表示する。 Lcd "Temp1:" ; Tempstr ' Restore Devid02 'デバイスのシリアル番号を指定する。 Gosub Treadsub 'シリアル番号を指定して温度データを読み込む。 Locate 2 , 1 'LCDに温度を表示する。 Lcd "Temp2:" ; Tempstr ' ' <<< ここに、センサーを増設可能 >>> ' 1wreset '1-Wireバスを初期化する。(リセットを送信) 1wwrite &HCC '[SKIP ROM]コマンドを送信する。(シリアル番号の指定をしない) 1wwrite &H44 '[CONVERT T]コマンドを送信する。(温度変換) Config 1w_dq = Output 'データ線の接続ポートを出力に設定する。 Set 1w_dq '1-Wireバスのデータ線を[H]レベルにしてDS18B20に電力を供給する。 Return ' ' ********************************************************** ' * シリアル番号を指定して温度データを読み込むサブルーチン * (Tempstr = 温度データの文字列) ' ********************************************************** ' Treadsub: For Temp1 = 1 To 8 'シリアル番号(8byte)を送信バッファへ転送する。 Read Temp2 Txbuff(temp1) = Temp2 Next Temp1 Temp3 = 0 'エラーカウンターをクリア。 ' Treadsub1: 1wreset '1-Wireバスを初期化する。(リセットを送信) If Err = 1 Then Goto Treadsub2 'If デバイスが接続されていないか? Then ' 1wwrite &H55 '[MATCH ROM]コマンドを送信する。(シリアル番号を指定) 1wwrite Txbuff(1) , 8 'シリアル番号(8byte)を送信する。 ' 1wwrite &HBE '[READ SCRATCHPAD]コマンドを送信する。(温度データ読み込み) Rxbuff(1) = 1wread(9) '温度データを含むDS18B20のメモリー内容を受信する。 ' Temp1 = Crc8(rxbuff(1) , 9) '受信データの9バイトすべてでCRC8を計算する。 If Temp1 <> 0 Then Goto Treadsub3 'If CRCエラーか? Then ' Tempi1 = Makeint(rxbuff(1) , Rxbuff(2)) '2バイトの温度データを1ワードにする。 Templ1 = Tempi1 * 625 'DS18B20の温度分解能を掛ける。(0.0625 X 10000) Templ1 = Templ1 / 1000 '表示用に桁合わせをする。(25.6℃ = 256) Tempstr2 = Str(templ1) '数値変数を文字変数に変換する。 Tempstr = Format(tempstr2 , " 0.0") + "゚C " 'Tempstrに温度の文字列を入れる。 Return ' ' Treadsub2: 'デバイスが見つからない場合。 Tempstr = " Not found" ' Treadsub4: Temp3 = Temp3 + 1 If Temp3 < 3 Then Goto Treadsub1 'If エラーが3回未満か ? Then Return ' Treadsub3: 'CRCエラーの場合。 Tempstr = " CRC Error" Goto Treadsub4 ' ' ************************************* ' * Timer1 (1秒)割り込み 処理ルーチン * ' ************************************* ' Tint1sec: ' <<< ここに、時計カウントなどの処理を入れる >>> Tint1sflg = 1 '1秒経過フラグをセットする。 Return ' ' End ' ' *********************************** ' * デバイスのシリアル番号 テーブル * (「デバイスのシリアル番号を調べる」プログラムを使用して記述する。) ' *********************************** ' Devid01: Data &H28 , &H12 , &H1B , &HB1 , &H01 , &H00 , &H00 , &H92 '参考例。 ' Devid02: Data &H28 , &HD9 , &H37 , &HB1 , &H01 , &H00 , &H00 , &H2C '参考例。 ' Devid03: ' Devid04: