' ' ****************************************************** ' * * ' * AVR + グラフィックLCD オシロ・スコープ (Ver.2) * ' * * ' * AVR is using ATmega164P * ' * Basic Compiler is BASCOM-AVR * ' * Copyright By O-Family 2009. 6.12 * ' ****************************************************** ' ' Ver 2.01 初回公開バージョン ' ' Const Prgver = "02.01" 'プログラム・バージョン。 ' $regfile = "m164Pdef.dat" '使用するAVRを設定。 $crystal = 20000000 'AVRクロックを設定。 ' $hwstack = 64 'ハードウェア・スタックの容量を設定。 $swstack = 8 'ソフトウェア・スタックの容量を設定。 $framesize = 24 'フレーム領域の容量を設定。 ' ' * 変数の宣言 * ' Dim Sampbuf(256) As Byte 'サンプリング データ バッファ。 Dim Glbuf(8) As Byte 'G-LCD Y方向1ライン描画バッファ。 Dim Bittab(8) As Byte '波形描画のビットパターンテーブル。 Dim Multab(8) As Byte '波形描画のビットをシフトさせる掛け率テーブル。 ' Dim Adnum As Byte 'A/D変換のサンプリング・バッファ位置。 Dim Gdnum As Byte 'G-LCD X描画位置。 Dim Gly As Byte 'G-LCDへデータ転送時のYアドレス。 Dim Glcun As Byte 'スケール描画用のカウンタ。 Dim Adsta As Byte 'タイマー割り込み内のA/D変換状態。 Dim Timdiv As Byte 'Time/Div値。 Dim Slope As Byte 'トリガーを検知する傾斜方向。 Dim Level As Byte 'トリガー・レベル。 Dim Trgmod As Byte 'トリガー・モード。 Dim Negedg As Byte 'トリガー逆エッジ検出フラグ。 Dim Timout As Byte 'トリガーAUTO動作時の未検出タイマー。 Dim Wavchn As Byte '波形表示のチャネル数。(0:1Ch , 1:2Ch) Dim Ch2ofs As Byte 'Ch2.オフセット値。 Dim Gain As Byte '入力感度。(0:X4 , 1:X2 , 2:X1 , 3:1/2 , 4:1/5 , 5:1/10) Dim Dcacsel As Byte 'DC/AD 選択。(0:DC , 1:AC) ' Dim Keycun As Byte 'キー入力チェック用タイマーカウンター。 Dim Keyflg As Byte 'キー入力検出フラグ。 Dim Keydata As Byte 'キー入力データ。 Dim Keytemp As Byte 'キー入力用テンポラリ。 ' Dim Temp1 As Byte '汎用テンポラリ変数 Byte型 No.1 Dim Temp2 As Byte '汎用テンポラリ変数 Byte型 No.2 Dim Temp3 As Byte '汎用テンポラリ変数 Byte型 No.3 Dim Temp4 As Byte '汎用テンポラリ変数 Byte型 No.4 Dim Temp5 As Byte '汎用テンポラリ変数 Byte型 No.5 Dim Tempsb1 As Byte '汎用変数サブルーチン用 Byte型 No.1 Dim Tempw1 As Word '汎用テンポラリ変数 Word型 No.1 Dim Tempstr As String * 3 '汎用テンポラリ変数 String型 ' ' * ポート名の定義 * ' Att_a Alias Porta.1 'アッテネータ TC4052Bの[A]入力。 Att_b Alias Porta.0 'アッテネータ TC4052Bの[B]入力。 Dcac_a Alias Porta.3 'DC/AC切換 TC4052Bの[A]入力。 Dcac_b Alias Porta.2 'DC/AC切換 TC4052Bの[B]入力。 Ad_ch1 Alias 4 '入力1のA/Dコンバータ・チャネル番号。 Ad_ch2 Alias 5 '入力2のA/Dコンバータ・チャネル番号。 Ad_ofs Alias 6 '入力2 オフセット・ボリュームのA/Dコンバータ・チャネル番号。 Ad_trl Alias 7 'トリガーレベル・ボリュームのA/Dコンバータ・チャネル番号。 ' ' * ポートの初期設定 * ' Config Att_a = Output 'アッテネータ TC4052Bの[A] 接続ポートを出力に設定。 Config Att_b = Output 'アッテネータ TC4052Bの[B] 接続ポートを出力に設定。 Config Dcac_a = Output 'DC/AC切換 TC4052Bの[A] 接続ポートを出力に設定。 Config Dcac_b = Output 'DC/AC切換 TC4052Bの[B] 接続ポートを出力に設定。 ' Set Portd.0 'スイッチ[1]の接続ポートをプルアップ。 Set Portd.1 'スイッチ[2]の接続ポートをプルアップ。 Portc = &B11111111 'スイッチ[3]〜[8]の接続ポートをプルアップ。 ' ' * グラフィックLCDの定義 * ' $lib "GlcdKS108.lbx" 'KS0108チップ用のライブラリを組み込む。 Config Graphlcd = 128 * 64sed , Dataport = Portb , Controlport = Portd , Ce = 4 , Ce2 = 5 , Cd = 3 , Rd = 6 , Reset = 2 , Enable = 7 Cls '全画面を消去する。 Setfont Oscfont6x8 'フォント・データを定義する。 ' ' * A/Dコンバータとタイマーの設定 * ' Config Adc = Single , Prescaler = 32 , Reference = Avcc 'A/Dコンバータの設定。 Start Adc 'A/Dコンバータに電源を供給する。 ' Config Timer0 = Timer , Prescale = 1024 , Clear Timer = 1 'Timer0(キー入力用)20,000,000Hz / 1,024 = 19,531Hz Ocr0a = 195 - 1 '19,531Hz / 195 = 約100Hz (約10mS) ' Config Timer1 = Timer , Prescale = 1 , Clear Timer = 1 'Timer1を設定。(データ サンプリング タイマー) Compare1a = 1000 - 1 On Compare1a Tmiad Nosave 'Timer1の割り込みルーチンを設定。 ' ' * プログラム・バージョンの表示 * ' If Pind.0 = 0 Then 'If スイッチ[1]が押されているか? Then Lcdat 2 , 31 , "AVR + G-LCD" Lcdat 4 , 22 , "OSCILLOSCOPE 2" Lcdat 6 , 37 , "VER." ; Prgver Bitwait Pind.0 , Set 'スイッチ[1]が離されるまで待つ。 Waitms 30 'チャタリング・タイマー。 Cls '全画面を消去する。 End If ' ' * 変数の初期設定 * ' Restore Gldata '波形描画のビットパターン・テーブルをSRAMへ転送する。 For Temp1 = 1 To 8 Read Temp2 : Bittab(temp1) = Temp2 Next For Temp1 = 1 To 8 '波形描画のビットをシフトさせる掛け率テーブルをSRAMへ転送する。 Read Temp2 : Multab(temp1) = Temp2 Next ' Lcdat 1 , 111 , "abc" '[Tm/Dv]文字を表示。 Lcdat 7 , 111 , "def" '[Vo/Dv]文字を表示。 Lcdat 4 , 111 , "mn" '[Slp]文字を表示。 Lcdat 5 , 111 , "o" '[Tr]文字を表示。 Lcdat 8 , 123 , "V" '[V]文字を表示。 ' Timdiv = 3 'Time/Divを1mS(初期値)に設定する。 Gain = 2 '入力感度を[X1:1V]に設定する。 ' Gosub Tmdset '[Time/Div]の設定と表示。 Gosub Trgmddsp 'Slope , Auto/Single値の表示。 Gosub Vodvset '[Vo/Dv]値を設定し表示する。 Gosub Dcacdsp '[DC/AC]選択を表示する。 Enable Interrupts 'すべての割り込みを許可。 ' ' ******************* ' * メイン ルーチン * ' ******************* ' Main: Adsta = 1 'タイマー割り込み内のA/D変換状態を設定 [AUTO検知中]。 Main4: Temp5 = Adcsra 'A/Dコンバータのプリスケラ値を待避。 Adcsra = Temp5 Or &H07 'プリスケラ値を[CK/128]に変更する。 Tempw1 = Getadc(ad_trl , &H20) 'トリガーレベル ボリューム値をA/D変換する。 Level = High(tempw1) Temp1 = Level / 5 '0〜255値を0〜51に変換。 Tempstr = Str(temp1) 'トリガーレベル値をLCDへ表示する。 Tempstr = Format(tempstr , "0.0") Setfont Oscfont4x8 'フォント・データを定義する。 Lcdat 5 , 117 , Tempstr Setfont Oscfont6x8 'フォント・データを定義する。 ' Tempw1 = Getadc(ad_ofs , &H20) 'Ch2.オフセット ボリューム値をA/D変換する。 Ch2ofs = High(tempw1) Select Case Ch2ofs 'オフセットボリュームのセンター位置を調整する。 Case Is > 135 : Ch2ofs = Ch2ofs - 8 Case Is < 120 : Ch2ofs = Ch2ofs + 8 Case Else : Ch2ofs = 128 End Select Ch2ofs = Not Ch2ofs 'LCD画面に合わせて反転する。 Shift Ch2ofs , Right , 1 '変換値を1/2する (0-127) Ch2ofs = Ch2ofs - 64 'LCD画面の位置に調整する。 Adcsra = Temp5 'A/Dコンバータのプリスケラ値を復帰。 ' Adnum = 0 '波形描画用の初期値を設定。 Gdnum = 0 Glcun = 1 Timout = 128 Negedg = 0 ' Temp1 = Getadc(ad_ch1 , &H20) 'A/Dコンバータを入力1で左揃えモードに設定する。 Enable Compare1a 'サンプリング用 Timaer1 割り込み開始。 ' Main1: If Gdnum > 108 Then Goto Main2 'If 1画面分の波形描画が終了したか? Then Gosub Glwvsub 'Yアドレス1列分の波形を描画する。 ' Main3: Gosub Keyin 'キー入力をチェックする。 If Keyflg <> 0 Then Goto Keyon 'If キー入力が有ったか? Then Goto Main1 ' ' Main2: '1画面分の波形描画が終了した場合。 If Trgmod = 1 Then Goto Main3 'If トリガーモードが[Single]か? Then Main5: If Adsta <> 0 Then Goto Main5 'If A/D変換のサンプリングがすべて終了したか? Else Goto Main ' ' * キーが押された処理 * ' Keyon: Keyflg = 0 'キー入力フラグをクリアする。 Select Case Keydata Case &B00000001 : Goto Keyon1 '[SW1]が押された場合。 Case &B00000010 : Goto Keyon2 '[SW2]が押された場合。 Case &B00000100 : Goto Keyon3 '[SW3]が押された場合。 Case &B00001000 : Goto Keyon4 '[SW4]が押された場合。 Case &B00010000 : Goto Keyon5 '[SW5]が押された場合。 Case &B00100000 : Goto Keyon6 '[SW6]が押された場合。 Case &B01000000 : Goto Keyon7 '[SW7]が押された場合。 Case &B10000000 : Goto Keyon8 '[SW8]が押された場合。 Case &B11000000 : Goto Keyon9 '[SW7+SW8]が押された場合。 End Select Goto Main1 ' ' * [SW1] 波形表示数を切換 * ' Keyon1: If Wavchn = 0 Then 'If 現在1Ch表示モードか? Then Wavchn = 1 '1Ch → 2Ch 表示へ変更する。 If Timdiv > 2 Then 'If [Time/Div] > 1mS か? Then Timdiv = Timdiv - 1 '[Time/Div]を1つ高く(早く)する。 Else Timdiv = 2 '[Time/Div]を1mSに設定。 End If Else Wavchn = 0 '2Ch → 1Ch 表示へ変更する。 If Timdiv <> 11 Then Timdiv = Timdiv + 1 '[Time/Div]を1つ低く(遅く)する。 End If Gosub Vodvdsp '[Vo/Dv]値を表示する。 ' Keyon11: Disable Compare1a 'サンプリング用 Timaer1 割り込みを禁止する。 Gosub Tmdset 'サンプリング・クロックと[Time/Div]表示を変更する。 Goto Main ' ' * [SW2] [Auto/Single] 切換 * ' Keyon2: Disable Compare1a 'サンプリング用 Timaer1 割り込みを禁止する。 Toggle Trgmod.0 'トリガー・モードを変更。 Gosub Trgmddsp '[Slope] , [Auto/Single] の項目を表示する。 Goto Main ' ' * [SW3] [Ready]キー * ' Keyon3: If Trgmod = 0 Then Goto Main1 'If トリガー・モードが[Auto]か? Then Disable Compare1a 'サンプリング用 Timaer1 割り込みを禁止する。 Adsta = 2 'タイマー割り込み内のA/D変換状態を[SINGLE検知中]に設定する。 Lcdat 4 , 34 , " READY " , 1 '[READY]文字を反転表示する。 Goto Main4 ' ' * [SW4] [Slope] 切換 * ' Keyon4: Toggle Slope.0 'トリガーを検知する傾斜方向を変更する。 Gosub Trgmddsp '[Slope] , [Auto/Single] の項目を表示する。 Goto Main1 ' ' * [SW5] [Time/Div]を低く(遅く)する * ' Keyon5: If Timdiv = 11 Then Goto Main1 'If 下限値か? Then Timdiv = Timdiv + 1 '[Time/Div]を1つ低く(遅く)する。 Goto Keyon11 ' ' * [SW6] [Time/Div]を高く(早く)する * ' Keyon6: If Wavchn = 0 Then 'If 1Ch表示モードか? Then Temp1 = 0 Else Temp1 = 2 End If If Timdiv = Temp1 Then Goto Main1 'If 上限値か? Then Timdiv = Timdiv - 1 '[Time/Div]を1つ高く(早く)する。 Goto Keyon11 ' ' * [SW7] [Volts/Div]を下げる(感度を上げる) * ' Keyon7: If Gain <> 0 Then 'If 入力感度の下限値か? Else Gain = Gain - 1 '入力感度を上げる。 End If Gosub Vodvset '[Vo/Dv]値を設定し表示する。 Goto Main1 ' ' * [SW8] [Volts/Div]を上げる(感度を下げる) * ' Keyon8: If Gain < 5 Then 'If 入力感度の上限値か? Else Gain = Gain + 1 '入力感度を下げる。 End If Gosub Vodvset '[Vo/Dv]値を設定し表示する。 Goto Main1 ' ' * [SW7+SW8] [DC/AC] 選択 * ' Keyon9: Toggle Dcacsel.0 '[DC/AC] 選択を変更する。 If Dcacsel = 0 Then 'If [DC]入力か? Then Reset Dcac_a 'DC/AC切換 TC4052Bの[A] 接続ポートを[0]に設定。 Reset Dcac_b 'DC/AC切換 TC4052Bの[B] 接続ポートを[0]に設定。 Else Set Dcac_a 'DC/AC切換 TC4052Bの[A] 接続ポートを[1]に設定。 Set Dcac_b 'DC/AC切換 TC4052Bの[B] 接続ポートを[1]に設定。 End If Gosub Dcacdsp '[DC/AC]選択を表示する。 Goto Main1 ' ' ************************* ' * キー入力 サブルーチン * (Keyflg = キー入力が有ると1) ' ************************* (Keydata = キーデータ) ' Keyin: If Tifr0.ocf0a = 0 Then Return 'If 10mS経過したかか? Else Set Tifr0.ocf0a 'Timer0 比較A一致フラグをリセット。 ' If Keycun < 10 Then Goto Keyin01 'If キー入力チェック開始待ちか(100mS)? Then If Keycun = 10 Then Goto Keyin02 'If キー入力チェック開始か? Then If Keycun < 13 Then Goto Keyin01 'If チャタリング チェック期間か? Then If Keycun = 13 Then Goto Keyin04 'If キー入力再確認か? Then ' Gosub Keyport 'キーオフを確認する。 If Keydata <> Keytemp Then Goto Keyin05 'If キーオフか? Then If Keycun < 113 Then Goto Keyin01 'If リピート期間待ち(1Sec)か? Then Keyflg = 1 Keycun = 102 'リピートを開始。 ' Keyin01: 'キー入力チェック開始待ち(100mS)。 Keycun = Keycun + 1 Return ' Keyin02: 'キー入力チェック開始。 Gosub Keyport 'キー接続ポートからデータを入力。 If Keydata <> 0 Then Goto Keyin03 'If キー入力有りか? Then Keyin05: Keycun = 0 Return ' Keyin03: 'キー入力有り。 Keytemp = Keydata 'キー・データを一時保存。 Goto Keyin01 ' Keyin04: 'キー入力再確認。 Gosub Keyport 'キー接続ポートからデータを入力。 If Keydata <> Keytemp Then Goto Keyin05 'If キー入力エラーか? Then Keyflg = 1 Goto Keyin01 ' ' ---------------------------------------------- ' * キー接続ポートからのデータ入力サブルーチン * (Keydata = キー・データ) ' ---------------------------------------------- ' Keyport: Keydata = Pinc 'スイッチ[3]〜[8]のポートを読み込む。 Shift Keydata , Left , 2 '左へ2bitシフトする。 Tempsb1 = Pind 'スイッチ[1]〜[2]のポートを読み込む。 Tempsb1 = Tempsb1 And &B00000011 '不要なビットをマスクする。 Keydata = Keydata Or Tempsb1 '両ポートのデータを合成する。 Keydata = Not Keydata 'ビットを反転する。 Return ' ' ----------------------------- ' * Time/Div 設定サブルーチン * (Timdiv = Time/Div値) ' ----------------------------- ' Tmdset: If Wavchn = 0 Then 'サンプリング データ テーブルを選択する。 Restore Samtab1 '1Ch.時。 Else Restore Samtab2 '2Ch.時。 End If Temp3 = Timdiv + 1 Temp4 = 0 Do Read Temp1 : Read Tempw1 : Read Temp2 'テーブルの読み込み。 Temp4 = Temp4 + 1 Loop Until Temp4 = Temp3 ' Temp3 = Temp1 And &H0F 'サンプリング時間を表示する。 Temp4 = Temp1 And &H30 Select Case Temp4 '桁数により分類する。 Case &H00 : '1桁[1,2,5]の場合。 Lcdat 2 , 111 , " " ; Temp3 Case &H10 : '2桁[10,20,50]の場合。 Lcdat 2 , 111 , Temp3 ; "0" Case &H20 : '3桁[100,200,500]の場合。 Setfont Oscfont4x8 'フォント・データを定義する。 Lcdat 2 , 111 , Temp3 ; "**" Setfont Oscfont6x8 'フォント・データを定義する。 End Select ' Temp4 = Temp1 And &HC0 '"u","m","S" の単位を表示する。 Select Case Temp4 Case &H00 : Tempstr = "p" '[u] Case &H40 : Tempstr = "q" '[m] Case &H80 : Tempstr = "S" '[S] End Select Lcdat 2 , 123 , Tempstr ' Temp4 = Temp2 And &H80 'Timer1のプリスケラ値を設定する。 If Temp4 = 0 Then Temp3 = 1 Else Temp3 = 2 End If Temp1 = Tccr1b And &HF8 Tccr1b = Temp1 Or Temp3 Compare1a = Tempw1 ' Temp4 = Temp2 And &H0F ' A/Dコンバータのプリスケラを設定する。 Temp1 = Adcsra And &HF8 Adcsra = Temp1 Or Temp4 Return ' ' ---------------------------------------------- ' * Auto/Single , Slope を表示するサブルーチン * ' ---------------------------------------------- ' Trgmddsp: If Slope = 0 Then '[Slope]を表示する。 Tempstr = "+" Else Tempstr = "-" End If Lcdat 4 , 122 , Tempstr ' If Trgmod = 0 Then '[Auto]/[Single]を表示する。 Tempstr = "ghi" '[Auto] Else Tempstr = "jkl" '[Single] End If Lcdat 3 , 111 , Tempstr Return ' ' ----------------------------------------- ' * [Vo/Dv]値を設定し表示するサブルーチン * ' ----------------------------------------- ' Vodvset: Select Case Gain 'アッテネータを設定する。 Case 3 : '1/2倍 [Vo/Dv=2V] Set Att_a 'アッテネータ TC4052Bの[A]入力。 Reset Att_b 'アッテネータ TC4052Bの[B]入力。 Case 4 : '1/5倍 [Vo/Dv=5V] Reset Att_a 'アッテネータ TC4052Bの[A]入力。 Set Att_b 'アッテネータ TC4052Bの[B]入力。 Case 5 : '1/10倍 [Vo/Dv=10V] Set Att_a 'アッテネータ TC4052Bの[A]入力。 Set Att_b 'アッテネータ TC4052Bの[B]入力。 Case Else : 'X4,X2,X1倍 [Vo/Dv=0.25V,0.5V,1V] Reset Att_a 'アッテネータ TC4052Bの[A]入力。 Reset Att_b 'アッテネータ TC4052Bの[B]入力。 End Select ' Vodvdsp: If Wavchn = 0 Then '波形表示数を確認する。 Tempstr = Lookupstr(gain , Vodvdt1) '1Ch.時。 Else Tempstr = Lookupstr(gain , Vodvdt2) '2Ch.時。 End If Lcdat 8 , 111 , Tempstr Return ' ' ---------------−-------------------- ' * [DC/AC]選択を表示するサブルーチン * ' -----------------−------------------ ' Dcacdsp: If Dcacsel = 0 Then '[DC/AC] 選択。(0:DC , 1:AC) Tempstr = "D" Else Tempstr = "A" End If Lcdat 6 , 115 , Tempstr ; "C" Return ' ' **************************************** ' * グラフィックLCD 波形描画サブルーチン * ' **************************************** ' Glwvsub: $asm LDS R24,{Gdnum} '表示用のデータ番号を読み込む。 LDS R25,{Adnum} 'A/D変換値用のデータ番号を読み込む。 Sub R25 , R24 CPI R25,2 BRCC Glwvsub2 'If A/D変換待ちか? Else RJMP Glwvsub1 'A/D変換待ちの場合は、何も処理せずにReturnする。 ; ; Glwvsub2: 'A/Dデータが有った場合。 Loadadr Glbuf(1) , Z 'グリッド・スケールを描画する。 LDS R16,{Glcun} DEC R16 BREQ Glwvsub3 'If [Y]スケールの描画か? Then STS {Glcun},R16 CLR R17 ANDI R16,&H03 BRNE Glwvsub7 'If [X]スケールの描画か? Else ST Z+,R17 '[X]スケールを描画。 LDI R18,$08 ST Z+,R18 ST Z+,R17 LDI R18,$01 ST Z+,R18 LDI R18,$20 ST Z+,R18 ST Z+,R17 LDI R18,$04 ST Z+,R18 LDI R18,$80 ST Z+,R18 RJMP Glwvsub4 ; Glwvsub3: '[Y]スケールを描画。 LDI R16,20 STS {Glcun},R16 LDI R18,$84 ST Z+,R18 LDI R19,$88 ST Z+,R19 LDI R18,$10 ST Z+,R18 LDI R18,$11 ST Z+,R18 LDI R18,$22 ST Z+,R18 LDI R18,$42 ST Z+,R18 LDI R18,$44 ST Z+,R18 ST Z+,R19 RJMP Glwvsub4 ; Glwvsub7: 'G-LCD [Y]方向1ライン描画バッファをクリアする。 ST Z+,R17 ST Z+,R17 ST Z+,R17 ST Z+,R17 ST Z+,R17 ST Z+,R17 ST Z+,R17 ST Z+,R17 ; ; Glwvsub4: LDS R18,{Wavchn} '波形の表示数を確認する。 CPI R18,1 BREQ Glwvsub5 'If 2波形表示か? Then RCALL Glcdlins 'チャネル1の波形をG-LCD描画バッファへ書き込む。 RJMP Glwvsub8 ; ; Glwvsub5: '2波形表示の場合。 RCALL Glcdl21s 'チャネル1の波形をG-LCD描画バッファへ書き込む。 RCALL Glcdl22s 'チャネル2の波形をG-LCD描画バッファへ書き込む。 ; ; Glwvsub8: LDS R20,{Gdnum} 'G-LCD [Y]方向1ライン描画バッファのデータをG-LCDへ転送する。 INC R20 STS {Gdnum},R20 LDI R21,1 STS {Gly},R21 ; Glwvsub6: LDS R20,{Gdnum} 'R20 = Xアドレス。 LDS R21,{Gly} 'R21 = Yアドレス。 RCALL _glocate 'G-LCDライブラリのアドレスセット・ルーチンを呼び出し。 Loadadr Glbuf(gly) , X LD R24,X 'R24 = データ。 RCALL _gwrite_data 'G-LCDライブラリのデータセット・ルーチンを呼び出し。 ; LDS R21,{Gly} INC R21 STS {Gly},R21 CPI R21,9 BRCS Glwvsub6 'If 8バイト転送終了か? Else Glwvsub1: $end Asm Return ' ' -------------------------------------------------------- ' * G-LCD [Y]方向1ライン描画バッファ書き込みサブルーチン * ' -------------------------------------------------------- ' $asm Glcdlins: RCALL Glcdgain '入力感度に合わせて画面表示用のデータを作成する。 ; Glcdlin8: MOV R24,R17 Sub R17 , R16 '2個のデータの差分を求め、絶対値を取る。 BRPL Glcdlin2 MOV R16,R24 NEG R17 'R17 = ライン・レングス。 Glcdlin2: Loadadr Glbuf(1) , Z 'G-LCD描画バッファの描画開始位置を計算(Z)。 LDI R24,$38 AND R24,R16 LSL R24 Swap R24 ADD R30,R24 ADC R31,R25 ; LDI R18,$08 '描画開始位置のビットパターンを計算。 LDI R20,$FF CPI R17,$08 BRCC Glcdlin3 'If ライン・レングスが < 8 か? Else CPI R17,$00 BRNE Glcdlin4 'If ライン・レングスが = 0 か?Else INC R17 Glcdlin4: MOV R18,R17 'R18 = 描画開始位置のビット数。 Loadadr Bittab(1) , X ADD XL,R18 ADC XH,R25 LD R20,X 'R20 = 描画開始位置のビットパターン。 ; Glcdlin3: Loadadr Multab(1) , X '描画開始位置のビット位置を計算。 LDI R19,$07 AND R19,R16 ADD XL,R19 ADC XH,R25 LD R21,X MUL R20,R21  'R21 = ビットをシフトさせる掛け率。 ; LD R1,Z 'G-LCD描画バッファへ初めのデータを書き込む。 OR R0,R1 ST Z+,R0 ; LDI R24,$08 '開始位置へ描画したビット数を計算。 Sub R24 , R18 Sub R24 , R19 BRCC Glcdlin5 ADD R18,R24 'R18 = 開始位置へ描画したビット数。 Glcdlin5: Sub R17 , R18 'ライン・レングスの残数を計算。 Glcdlin6: CPI R17,$08 BRCS Glcdlin7 'If 残数が < 8 か? Then SER R24 'バイト単位のフルビット($FF)パターンを書き込む。 ST Z+,R24 SUBI R17,$08 RJMP Glcdlin6 ; Glcdlin7: Loadadr Bittab(1) , X '終わりのビットパターンを書き込む。 ADD XL,R17 ADC XH,R25 LD R0,X LD R1,Z OR R0,R1 ST Z,R0 RET ' ' -------------------------------------------------------------- ' * 入力感度に合わせて画面表示用のデータを作成するサブルーチン * ' -------------------------------------------------------------- ' Glcdgain: Loadadr Sampbuf(1) , X 'A/D変換データを2個読み込む。 LDS R24,{Gdnum} Glcdgainb: CLR R25 ADD XL,R24 ADC XH,R25 LD R16,X+ 'R16 = バッファーへの描画開始位置([Y]アドレス位置)。 LD R17,X 'R17 = 直線の差分用。 ; LDS R18,{Gain} '入力感度を確認する。 CPI R18,2 BRCS Glcdga01 'If 入力感度が[X2],[X4]か? Then ; '入力感度が[X1] 以上の場合。 COM R16 'A/Dデータを反転し6Bit(G-LCD画面幅)に縮小する。 LSR R16 LSR R16 COM R17 LSR R17 LSR R17 RET ' ' * 入力感度が[2倍]・[4倍]の処理 * ' Glcdga01: LDS R19,{Dcacsel} '[DC/AC]の選択状態を確認する。 CPI R19,1 BREQ Glcdga02 'If [AC]入力か ? Then ; ; CPI R18,0 '[DC]入力の場合。 BREQ Glcdga03 'If 入力感度が[X4]か? Then LSR R16 'A/Dデータを1/2する。 LSR R17 ; Glcdga03: 'G-LCD画面の上限をチェック。 CPI R16,$40 BRCS Glcdga04 'If 画面表示範囲を超えたか? Else LDI R16,$3F ; Glcdga04: 'G-LCD画面の上限をチェック。 CPI R17,$40 BRCS Glcdga05 'If 画面表示範囲を超えたか? Else LDI R17,$3F ; Glcdga05: COM R16 'A/DデータをG-LCD画面用に反転する。 ANDI R16,$3F COM R17 ANDI R17,$3F RET ; ; Glcdga02: '[AC]入力の場合。 CPI R18,0 BREQ Glcdga06 'If 入力感度が[X4]か? Then ; '入力感度が[X2]の場合。 SUBI R16,$80 'オフセット電圧分を差し引く。 SUBI R17,$80 ASR R16 'A/Dデータを1/2する。 ASR R17 SUBI R16,-$80 'オフセット電圧を再加算する。 SUBI R17,-$80 ; Glcdga06: 'G-LCD画面の上限をチェック。 CPI R16,$A0 BRCS Glcdga07 LDI R16,$9F Glcdga07: 'G-LCD画面の下限をチェック。 CPI R16,$60 BRCC Glcdga08 LDI R16,$60 ; Glcdga08: 'G-LCD画面の上限をチェック。 CPI R17,$A0 BRCS Glcdga09 LDI R17,$9F Glcdga09: 'G-LCD画面の下限をチェック。 CPI R17,$60 BRCC Glcdga10 LDI R17,$60 ; Glcdga10: SUBI R16,$60 'オフセット電圧位置を画面用に調整する。 SUBI R17,$60 RJMP Glcdga05 ' ' -------------------------------------------------------- ' * G-LCD [Y]方向1ライン描画バッファ書き込みサブルーチン * ' (2波形表示のCh.1用) ' -------------------------------------------------------- ' Glcdl21s: '2波形表示のCh.1用サブルーチン RCALL Glcdgain '入力感度に合わせて画面表示用のデータを作成する。 ; LSR R16 '画面表示を半分にする。 LSR R17 SUBI R16,-$20 '画面下半分へオフセットを加算する。 SUBI R17,-$20 RJMP Glcdlin8 ' ' -------------------------------------------------------- ' * G-LCD [Y]方向1ライン描画バッファ書き込みサブルーチン * ' (2波形表示のCh.2用) ' -------------------------------------------------------- ' Glcdl22s: LDS R24,{Gdnum} CPI R24,0 BRNE Glcdl221 'If 1番目のデータ? Else RET ; ; Glcdl221: Loadadr Sampbuf(128) , X 'Ch.2のバッファ先頭アドレス。 RCALL Glcdgainb '入力感度に合わせて画面表示用のデータを作成する。 ; LSR R16 '画面表示を半分にする。 LSR R17 ; LDS R18,{Ch2ofs} 'Ch.2波形にボリュームのオフセットを加算する。 ADD R16,R18 'オフセットを加算する。 CPI R16,$80 'G-LCD画面の上限をチェック。 BRCS glcd222 'If 画面表示範囲を超えたか? Else LDI R16,$00 Glcd222: CPI R16,$40 'G-LCD画面の下限をチェック。 BRCS glcd223 'If 画面表示範囲を超えたか? Else LDI R16,$3F Glcd223: ADD R17,R18 'オフセットを加算する。 CPI R17,$80 'G-LCD画面の上限をチェック。 BRCS glcd224 'If 画面表示範囲を超えたか? Else LDI R17,$00 Glcd224: CPI R17,$40 'G-LCD画面の下限をチェック。 BRCS glcd225 'If 画面表示範囲を超えたか? Else LDI R17,$3F Glcd225: RJMP Glcdlin8 $end Asm ' ' ******************************* ' * Timer1 割り込み処理ルーチン * ' ******************************* ' Tmiad: $asm PUSH R0 PUSH R1 PUSH R16 PUSH R17 PUSH R18 PUSH XL PUSH XH PUSH R23 'R23は、拡張I/Oレジスタへのアクセスに使用する。 IN R0,SREG 'ステータス・レジスタを待避。 ; IN R1,ADCH 'A/Dコンバータのデータを読み込む。 LDS R16,{Adsta} 'タイマー割り込み内のA/D変換処理状態を判定。 CPI R16,03 BRNE Tmiad05 'If 1ChモードでA/Dバッファへ書き込みか? Else RJMP Tmiad03 '1ChモードでA/Dバッファへ書き込み処理へ。 ; Tmiad05: CPI R16,04 BRCS Tmiad14 'If 波形表示が2Chモードか? Else RJMP Tmiad04 '2Ch波形表示モードへ。 ; Tmiad14: 'エッジ検出処理。 [Adsta = 1,2] CPI R16,02 BREQ Tmiad02 'If [Single]モードか? Then ; LDS R17,{Timout} '[Auto]モードの処理。 DEC R17 'トリガー未検出タイマーをカウントする。 STS {Timout},R17 BRNE Tmiad02 'If タイムアウトしたか? Else RJMP Tmiad06 '自動的に非同期で掃引する。 ; Tmiad02: 'トリガーエッジを検出する。 LDS R18,{Level} LDS R16,{Negedg} LDS R17,{Slope} CPI R17,0 BRNE Tmiad07 'If トリガーエッジが[-]か? Then ; CPI R16,1 'トリガーエッジ[+]時の処理。 BREQ Tmiad08 'If 逆エッジを検出完了か? Then CP R1,R18 '逆エッジ検出処理。 BRCS Tmiad09 'If 逆エッジを検知したか? Then RJMP Tmiad16 ; Tmiad09: 'トリガー[+]エッジを検知開始。 LDI R16,1 STS {Negedg},R16 ; Tmiad08: 'トリガー[+]エッジを検知する。 CP R18,R1 BRCS Tmiad06 'If A/D値 > トリガー・レベル か? Then RJMP Tmiad16 ; Tmiad07: 'トリガーエッジ[-]時の処理。 CPI R16,1 BREQ Tmiad11 'If 逆エッジを検出完了か? Then CP R18,R1 '逆エッジ検出処理。 BRCS Tmiad12 'If 逆エッジを検知したか? Then RJMP Tmiad16 ; Tmiad12: 'トリガー[-]エッジを検知開始。 LDI R16,1 STS {Negedg},R16 ; Tmiad11: 'トリガー[-]エッジを検知する。 CP R1,R18 BRCS Tmiad06 'If A/D値 < トリガー・レベル か? Then Tmiad16: SBI ADCSR,ADSC 'A/Dコンバータを再起動する。 Loadadr Sampbuf(1) , X 'A/D変換値をバッファーに書き込む。 ST X,R1 RJMP Tmiad01 ; ; Tmiad04: '波形表示2Chモード [Adsta = 4,5] CPI R16,05 BREQ Tmiad13 'If Ch.2をバッファーへ書き込みか? Then Tmiad15: SBI ADMUX,MUX0 'A/DチャンネルをADC[5]に変更する。 LDI R16,05 'A/D変換処理状態をCh.2に設定する。 RJMP Tmiad10 ; Tmiad13: 'Ch.2データをバッファーへ書き込む。 CBI ADMUX,MUX0 'A/DチャンネルをADC[4]に変更する。 SBI ADCSR,ADSC 'A/Dコンバータを再起動する。 LDI R16,04 'A/D変換処理状態をCh.1に設定する。 STS {Adsta},R16 Loadadr Sampbuf(129) , X 'A/Dデータ・バッファの書き込み位置を計算する。 CLR R18 LDS R17,{Adnum} ADD XL,R17 ADC XH,R18 ST -X,R1 RJMP Tmiad01 ; ; Tmiad06: 'トリガー検出完了処理。 LDS R17,{Wavchn} '波形表示のチャンネル数をチェックする。 CPI R17,1 BREQ Tmiad15 'If 波形表示のチャンネル数が2か? Then LDI R16,03 'A/D変換処理状態を1Chモードに設定する。 Tmiad10: STS {Adsta},R16 ; Tmiad03: SBI ADCSR,ADSC 'A/Dコンバータを再起動する。 Loadadr Sampbuf(2) , X 'A/Dデータ・バッファの書き込み位置を計算する。 CLR R18 LDS R17,{Adnum} ADD XL,R17 ADC XH,R18 ST X,R1 INC R17 'A/Dデータ・バッファのポインターを更新する。 STS {Adnum},R17 CPI R17,110 BRCS Tmiad01 'If A/Dデータ・バッファの書き込みが終了したか? Else STS {Adsta},R18 CBI TIMSK1,OCIE1A 'TIMER1 比較一致割り込みを禁止する。 Tmiad01: ; Out Sreg , R0 'ステータス・レジスタを復帰。 POP R23 POP XH POP XL POP R18 POP R17 POP R16 POP R1 POP R0 $end Asm Return ' End ' ' ******************* ' * データ テーブル * ' ******************* ' Samtab1: '1Ch.表示用。 Data &H21 , 99% , &H02 'Time/Div 100uS Data &H22 , 199% , &H03 'Time/Div 200uS Data &H25 , 499% , &H04 'Time/Div 500uS Data &H41 , 999% , &H05 'Time/Div 1mS Data &H42 , 1999% , &H06 'Time/Div 2mS Data &H45 , 4999% , &H07 'Time/Div 5mS Data &H51 , 9999% , &H07 'Time/Div 10mS Data &H52 , 19999% , &H07 'Time/Div 20mS Data &H55 , 49999% , &H07 'Time/Div 50mS Data &H61 , 12499% , &H87 'Time/Div 100mS Data &H62 , 24999% , &H87 'Time/Div 200mS Data &H65 , 62499% , &H87 'Time/Div 500mS ' Samtab2: '2Ch.表示用。 Data &H22 , 99% , &H02 'Time/Div 200uS (Dummy) Data &H25 , 249% , &H03 'Time/Div 500uS (Dummy) Data &H41 , 499% , &H04 'Time/Div 1mS Data &H42 , 999% , &H05 'Time/Div 2mS Data &H45 , 2499% , &H06 'Time/Div 5mS Data &H51 , 4999% , &H07 'Time/Div 10mS Data &H52 , 9999% , &H07 'Time/Div 20mS Data &H55 , 24999% , &H07 'Time/Div 50mS Data &H61 , 49999% , &H07 'Time/Div 100mS Data &H62 , 12499% , &H87 'Time/Div 200mS Data &H65 , 31249% , &H87 'Time/Div 500mS Data &H81 , 62499% , &H87 'Time/Div 1 S ' ' Gldata: Data &H00 , &H01 , &H03 , &H07 , &H0F , &H1F , &H3F , &H7F '波形描画のビットパターンテーブル。 Data 1 , 2 , 4 , 8 , 16 , 32 , 64 , 128 '波形描画のビットをシフトさせる掛け率テーブル。 ' ' Vodvdt1: Data "rs" , "tu" , " 1" , " 2" , " 5" , "10" '[Vo/Dv]数値用テーブル(1Ch表示用)。 Vodvdt2: Data "tu" , " 1" , " 2" , " 4" , "10" , "20" '[Vo/Dv]数値用テーブル(2Ch表示用)。 ' ' ******************* ' * フォント データ * ' ******************* ' $asm Oscfont6x8: .db 1 , 6 , 6 , 0 .db $00 , $00 , $00 , $00 , $00 , $00 ' .db $00 , $00 , $00 , $5f , $00 , $00 '! .db $00 , $00 , $07 , $00 , $07 , $00 '” .db $00 , $14 , $7f , $14 , $7f , $14 '# .db $00 , $24 , $2a , $7f , $2a , $12 '$ .db $00 , $23 , $13 , $08 , $64 , $62 '% .db $00 , $36 , $49 , $55 , $22 , $50 '& .db $00 , $00 , $05 , $03 , $00 , $00 '' .db $00 , $00 , $1c , $22 , $41 , $00 '( .db $00 , $00 , $41 , $22 , $1c , $00 ') .db $00 , $14 , $08 , $3e , $08 , $14 '* .db $00 , $08 , $08 , $3e , $08 , $08 '+ .db $00 , $00 , $50 , $30 , $00 , $00 ', .db $00 , $08 , $08 , $08 , $08 , $08 '- .db $00 , $00 , $60 , $60 , $00 , $00 '. .db $00 , $20 , $10 , $08 , $04 , $02 '/ .db $00 , $3e , $51 , $49 , $45 , $3e '0 .db $00 , $00 , $42 , $7f , $40 , $00 '1 .db $00 , $62 , $51 , $49 , $49 , $46 '2 .db $00 , $22 , $41 , $49 , $49 , $36 '3 .db $00 , $18 , $14 , $12 , $7f , $10 '4 .db $00 , $27 , $45 , $45 , $45 , $39 '5 .db $00 , $3c , $4a , $49 , $49 , $30 '6 .db $00 , $01 , $71 , $09 , $05 , $03 '7 .db $00 , $36 , $49 , $49 , $49 , $36 '8 .db $00 , $06 , $49 , $49 , $29 , $1e '9 .db $00 , $00 , $36 , $36 , $00 , $00 ': .db $00 , $00 , $56 , $36 , $00 , $00 '; .db $00 , $08 , $14 , $22 , $41 , $00 '< .db $00 , $14 , $14 , $14 , $14 , $14 '= .db $00 , $00 , $41 , $22 , $14 , $08 '> .db $00 , $02 , $01 , $51 , $09 , $06 '? .db $00 , $32 , $49 , $79 , $41 , $3e '@ .db $00 , $7e , $11 , $11 , $11 , $7e 'A .db $00 , $7f , $49 , $49 , $49 , $36 'B .db $00 , $3e , $41 , $41 , $41 , $22 'C .db $00 , $7f , $41 , $41 , $22 , $1c 'D .db $00 , $7f , $49 , $49 , $49 , $41 'E .db $00 , $7f , $09 , $09 , $09 , $01 'F .db $00 , $3e , $41 , $49 , $49 , $7a 'G .db $00 , $7f , $08 , $08 , $08 , $7f 'H .db $00 , $00 , $41 , $7f , $41 , $00 'I .db $00 , $30 , $40 , $40 , $40 , $3f 'J .db $00 , $7f , $08 , $14 , $22 , $41 'K .db $00 , $7f , $40 , $40 , $40 , $40 'L .db $00 , $7f , $02 , $0c , $02 , $7f 'M .db $00 , $7f , $04 , $08 , $10 , $7f 'N .db $00 , $3e , $41 , $41 , $41 , $3e 'O .db $00 , $7f , $09 , $09 , $09 , $06 'P .db $00 , $3e , $41 , $51 , $21 , $5e 'Q .db $00 , $7f , $09 , $19 , $29 , $46 'R .db $00 , $26 , $49 , $49 , $49 , $32 'S .db $00 , $01 , $01 , $7f , $01 , $01 'T .db $00 , $3f , $40 , $40 , $40 , $3f 'U .db $00 , $0f , $30 , $40 , $30 , $0f 'V .db $00 , $1f , $60 , $1c , $60 , $1f 'W .db $00 , $63 , $14 , $08 , $14 , $63 'X .db $00 , $07 , $08 , $70 , $08 , $07 'Y .db $00 , $61 , $51 , $49 , $45 , $43 'Z .db $00 , $00 , $7f , $41 , $41 , $00 '[ .db $00 , $15 , $16 , $7c , $16 , $15 '\ .db $00 , $00 , $41 , $41 , $7f , $00 '] .db $00 , $04 , $02 , $01 , $02 , $04 '^ .db $00 , $40 , $40 , $40 , $40 , $40 '_ .db $00 , $00 , $01 , $02 , $04 , $00 '` .db $01 , $7f , $01 , $7c , $04 , $78 'a [Tm/Dv] .db $04 , $78 , $10 , $08 , $04 , $7f 'b .db $41 , $3e , $00 , $3c , $40 , $3c 'c .db $1f , $60 , $1f , $00 , $38 , $44 'd [Vo/Dv] .db $44 , $38 , $10 , $08 , $04 , $7f 'e .db $41 , $3e , $00 , $3c , $40 , $3c 'f .db $7e , $11 , $11 , $7e , $00 , $3c 'g [Auto] .db $40 , $20 , $7c , $00 , $04 , $3e 'h .db $44 , $00 , $38 , $44 , $44 , $38 'i .db $26 , $49 , $49 , $32 , $00 , $7d 'j [Singl] .db $00 , $7c , $04 , $78 , $00 , $48 'k .db $54 , $3c , $00 , $7f , $40 , $00 'l .db $26 , $49 , $32 , $00 , $7f , $40 'm [Slp] .db $40 , $00 , $7c , $14 , $08 , $00 'n .db $01 , $7f , $01 , $7c , $08 , $00 'o [Tr] .db $00 , $fc , $20 , $20 , $10 , $3c 'p [u] .db $00 , $7c , $04 , $78 , $04 , $78 'q [m] .db $60 , $60 , $00 , $62 , $51 , $49 'r [.25] .db $46 , $00 , $27 , $45 , $45 , $39 's .db $3e , $49 , $45 , $3e , $00 , $60 't [0.5] .db $60 , $00 , $27 , $45 , $45 , $39 'u Oscfont4x8: .db 1 , 4 , 4 , 0 .db $00 , $00 , $00 , $00 ' .db $00 , $00 , $00 , $00 '! .db $00 , $00 , $00 , $00 '” .db $00 , $00 , $00 , $00 '# .db $00 , $00 , $00 , $00 '$ .db $00 , $00 , $00 , $00 '% .db $00 , $00 , $00 , $00 '& .db $00 , $00 , $00 , $00 '’ .db $00 , $00 , $00 , $00 '( .db $00 , $00 , $00 , $00 ') .db $00 , $3e , $41 , $3e '* [00] .db $00 , $00 , $00 , $00 '+ .db $00 , $00 , $00 , $00 ', .db $00 , $00 , $00 , $00 '- .db $00 , $60 , $60 , $00 '. .db $00 , $00 , $00 , $00 '/ .db $3e , $49 , $45 , $3e '0 .db $00 , $42 , $7f , $40 '1 .db $62 , $51 , $49 , $46 '2 .db $22 , $49 , $49 , $36 '3 .db $1c , $12 , $7f , $10 '4 .db $27 , $45 , $45 , $39 '5 .db $3c , $4a , $49 , $30 '6 .db $01 , $71 , $09 , $07 '7 .db $36 , $49 , $49 , $36 '8 .db $06 , $49 , $29 , $1e '9 $end Asm