' ' ********************************************** ' * * ' * 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コンバータに電源を供給。 ' ' ↓********************************************↓ ' ↓ これ以降に各自のプログラムを作成して下さい ↓ ' ↓********************************************↓ ' ' ' ********************************************** ' * ストップ・ウォッチ プログラム * ' * (Ver.1.01) * ' * Copyright By O-Family 2009. 8.15 * ' ********************************************** ' Sw_port Alias Pind '全スイッチの接続ポート名を定義。 ' Dim Tim1000 As Word '[1/1000]秒カウンタ。 Dim Timsec As Byte '[秒]カウンタ。 Dim Timmin As Byte '[分]カウンタ。 Dim Timhour As Byte '[時]カウンタ。 Dim Lapt1000(100) As Word '[1/1000秒]ラップタイム。 Dim Laptsec(100) As Byte '[秒]ラップタイム。 Dim Laptmin(100) As Byte '[分]ラップタイム。 Dim Lapthour(100) As Byte '[時]ラップタイム。 Dim Lapcount As Byte 'ラップタイム番号。 Dim Lapdsnum As Byte 'ラップタイム表示番号。 Dim T1msflag As Byte '[1mS]経過フラグ。 Dim T1secflag As Byte '[1秒]経過フラグ。 Dim Swflag As Byte 'スイッチの状態用フラグ。 Dim Stastpflag As Byte 'スタート/ストップ動作フラグ。 ' Dim Temp1 As Byte '汎用テンポラリ変数 Byte型 No.1 Dim Tempstr As String * 20 '文字変数を宣言する。 ' ' Cursor Off 'LCDのカーソルをオフにする。 ' ' * スイッチのチャタリング期間用Timer * Config Timer0 = Timer , Prescale = 1024 '16,000,000Hz / 1,024 = 15,625Hz / 256(OVF) = 61Hz(16ms) ' * [1mS]計測用Timer * Config Timer1 = Timer , Prescale = 64 , Clear Timer = 1 '16,000,000Hz / 64 = 250,000Hz Compare1a = 250 - 1 '250,000Hz / 1,000Hz(1mS) = 250カウント On Compare1a Timint1ms 'TIMER1比較一致A割り込みルーチンのラベルを設定。 Enable Compare1a 'TIMER1比較一致A割り込みを許可。 Stop Timer1 'Timer1を停止させる。 Enable Interrupts 'すべての割り込みを許可。 ' ' * メイン ルーチン * ' Main: Tim1000 = 0 'カウンターを初期化する。 Timsec = 0 Timmin = 0 Timhour = 0 Lapcount = 0 Lapdsnum = 1 Timer1 = 0 T1msflag = 1 '初期時間を強制表示させる。 T1secflag = 1 ' ' Main1: If Tifr0.tov0 = 0 Then Goto Main2 'If スイッチ・チャタリング防止期間中か? Then Temp1 = Sw_port And &B00001111 'スイッチ入力を確認する。 If Swflag = 1 Then Goto Swoff 'スイッチが離されるのを待機か? Then If Temp1 <> &B00001111 Then Goto Main3 'If スイッチ入力が有ったか? Then ' Main2: If T1msflag = 0 Then Goto Main1 'If [1mS] 経過していないか? Then T1msflag = 0 Locate 1 , 14 Tempstr = Str(tim1000) '数値変数を文字変数に変換する。 Lcd Format(tempstr , "000") '[1/1000秒]を表示。 If T1secflag = 0 Then Goto Main1 'If [1秒] 経過していないか? Then T1secflag = 0 Locate 1 , 5 Tempstr = Str(timhour) '数値変数を文字変数に変換する。 Lcd Format(tempstr , " 0") ; ":"; '[時]を表示。 Tempstr = Str(timmin) '数値変数を文字変数に変換する。 Lcd Format(tempstr , "00") ; "'"; '[分]を表示。 Tempstr = Str(timsec) '数値変数を文字変数に変換する。 Lcd Format(tempstr , "00") ; Chr(&H22) '[秒]を表示。 Goto Main1 ' ' Main3: If Temp1 = &B00001110 Then Goto Swon1 'If スイッチ[1]が押されたか? Then If Temp1 = &B00001101 Then Goto Swon2 'If スイッチ[2]が押されたか? Then If Temp1 = &B00001011 Then Goto Swon3 'If スイッチ[3]が押されたか? Then If Temp1 = &B00000111 Then Goto Swon4 'If スイッチ[4]が押されたか? Then ' Main4: Swflag = 1 Main5: Timer0 = 0 'スイッチ・チャタリング防止期間を設定する。 Set Tifr0.tov0 'Timer0 オーバーフロー・フラグをリセット。 Goto Main2 ' ' Swon1: 'スイッチ[1] スタート/ストップ動作。 Toggle Stastpflag.0 'スタート/ストップ フラグを反転する。 If Stastpflag = 1 Then 'If カウント・スタート? Then Set Led_1r '[赤]LEDを点灯する。 Start Timer1 'Timse1 を始動する。 Else Reset Led_1r '[赤]LEDを消灯する。 Stop Timer1 'Timse1 を停止する。 End If Goto Main4 ' ' Swon2: 'スイッチ[2] ラップタイム記録動作。 If Lapcount >= 99 Then Goto Swon21 'If ラップ記録が最大数(99個)か? Then Lapcount = Lapcount + 1 Disable Compare1a 'TIMER1比較一致A割り込みを禁止。 Lapt1000(lapcount) = Tim1000 'ラップタイムを記録する。 Laptsec(lapcount) = Timsec Laptmin(lapcount) = Timmin Lapthour(lapcount) = Timhour Enable Compare1a 'TIMER1比較一致A割り込みを許可。 Temp1 = Lapcount ' Swon22: Locate 2 , 1 'ラップタイムを表示する。 If Temp1 < 10 Then 'If ラップ数が10未満か? Then Lcd "Lp" ; Else Lcd "L" ; End If Lcd Temp1 ; " "; 'ラップ番号を表示。 Tempstr = Str(lapthour(temp1)) '数値変数を文字変数に変換する。 Lcd Format(tempstr , " 0") ; ":"; '[時]を表示。 Tempstr = Str(laptmin(temp1)) '数値変数を文字変数に変換する。 Lcd Format(tempstr , "00") ; "'"; '[分]を表示。 Tempstr = Str(laptsec(temp1)) '数値変数を文字変数に変換する。 Lcd Format(tempstr , "00") ; Chr(&H22); '[秒]を表示。 Tempstr = Str(lapt1000(temp1)) '数値変数を文字変数に変換する。 Lcd Format(tempstr , "000") '[1/1000秒]を表示。 Goto Main4 ' Swon21: Locate 2 , 5 'メモリーフルのメッセージを表示する。 Lcd "-MEMORY Full" Goto Main4 ' ' Swon3: 'スイッチ[3] ラップタイム表示動作。 If Lapcount = 0 Then Goto Main4 'If ラップデータが無いか? Then If Lapcount < Lapdsnum Then Lapdsnum = 1 'If ラップデータの最後か? Then Temp1 = Lapdsnum Lapdsnum = Lapdsnum + 1 Goto Swon22 ' ' Swon4: 'スイッチ[4] リセット動作。 Waitms 500 '誤操作防止の待ち時間。 If Sw_4 = 1 Then Goto Main4 'If スイッチ[4]が離されたか? Then ' Reset Led_1r '[赤]LEDを消灯する。 Set Led_4b '[青]LEDを点灯する。 Stop Timer1 'Timse1 を停止する。 Stastpflag = 0 Bitwait Sw_4 , Set 'If スイッチ[4]が離されるまで待つ。 Reset Led_4b '[青]LEDを消灯する。 Swflag = 1 Cls 'LCD表示をすべて消去。 Goto Main ' ' * スイッチが離されるのを待機する * ' Swoff: If Temp1 <> &B00001111 Then Goto Main2 'If スイッチが押されているか? Then Swflag = 0 Goto Main5 ' ' * Timer1 1mS (1/1000秒) 割り込み ルーチン * ' Timint1ms: Tim1000 = Tim1000 + 1 '[1/1000]秒をカウントする。 If Tim1000 > 999 Then 'If 1秒経過したか? Then Tim1000 = 0 T1secflag = 1 Timsec = Timsec + 1 '[秒]を更新する。 If Timsec > 59 Then 'If 60秒経過したか? Then Timsec = 0 Timmin = Timmin + 1 If Timmin > 59 Then 'If 60分経過したか? Then Timmin = 0 Timhour = Timhour + 1 If Timhour > 99 Then 'If 100時間経過したか? Then Timhour = 0 End If End If End If End If T1msflag = 1 Return ' ' End