/******************************************************************************* * Scope Program * ソース名:Scope_V4.C * * ハード上の主な修正:Scope_V3.1→ Scope_V4.0 *  @ アンプ部のハードを見直しどこかのレンジでZEROを取れば、レンジを切替えても *    或いは、AC/DCモードを切り替えてもZEROがずれない様にした *    (JA1WBYさんのハードを拝借させて頂きました) *  A 電圧レンジを得るのに、入力アッテネータのみの切替に変更した *    今までは、これプラスGAINの切替の組合せで行っていたが、これが切替え時 *    にZEROがずれる一因となっていた * B 入力インピーダンスを約200kから、1MΩに変更した * * ソフト上の主な修正 *  @ 電圧レンジの種類を、16→ 8に変更に伴い、切替テーブルを修正 * A AC/DC切替えの、ソフト上の記述は今回は表示のみでよい * * 2.8インチQVGA液晶モジュール(aitendo): M028C9325TP * 240x320ドット 16ビットカラー 横置き表示 * * タッチ・パネルコントローラ:XPT2046 "XPTEC社製 * * タッチ・ボタン化したボタンは以下の通りです。 * TRIG_LEVEL_UP/DWN・TIME_SET_UP/DWN・VOLT_SET_UP/DWN・HOLD_SW・SLOPE_SW * * 以下のSWは、通常のハードSWを使用しました。 * AC/DC切替SW・AUTO/SINGLE切替SW・READY_SW * * Condition: * 8MHz External X'tal Oscillator, 20x PLL (8MHzx20= 160MHz) * Fcy=160MHz/2=80MHz, Tcy=12.5ns * * CPU: PIC32MX340F256H * * N.Ishii 2013.12.10  **********************************************************************************/ #include /// PIC32 peripheral library #include "colorlcd_libdsPICVH.h" #include "Touch_XPT2046_Lib.h" #include // コンフィギュレーション設定 // CPU=80MHz Peri=80MHz,HS+PLL,Divider=1/2,PLL=x20,WDT=Off #pragma config FNOSC=PRIPLL, POSCMOD=HS, FPLLIDIV=DIV_2 #pragma config FPLLMUL=MUL_20, FPBDIV=DIV_1, FPLLODIV=DIV_1 #pragma config FWDTEN=OFF, ICESEL=ICS_PGx2 // メッセージテーブル char str_Start[] = "Oscillo V4"; char str_0_1ms[] = "0.1mS/D"; char str_0_2ms[] = "0.2mS/D"; char str_0_5ms[] = "0.5mS/D"; char str_1_0ms[] = "1.0mS/D"; char str_2_0ms[] = "2.0mS/D"; char str_5_0ms[] = "5.0mS/D"; char str_10ms[] = "10mS/D"; char str_50ms[] = "50mS/D"; char str_500ms[] = "500mS/D"; char str_50mv[] = "50mV/D"; char str_0_1v[] = "0.1V/D"; char str_0_25v[] = "0.25V/D"; char str_0_5v[] = "0.5V/D"; char str_1_0v[] = "1.0V/D"; char str_2_5v[] = "2.5V/D"; char str_5_0v[] = "5.0V/D"; char str_10v[] = "10V/D"; char str_Trig[] = "TRIG:xxx"; char str_AC[] = "AC"; char str_DC[] = "DC"; char str_SLOPE_P[] = "SLOPE+"; char str_SLOPE_N[] = "SLOPE-"; char str_HOLD[] = "HOLD"; char str_SPACE_4[] = " "; /// タッチ関係------------------------------------------------------------------------------ char MsgScrn[] = "X=xxxx Y=xxxx"; // デバッグ用座標表示 //char MsgScrnX[] = "X=xxxx"; //char MsgScrnY[] = "Y=xxxx"; // タッチ・アップ/ダウンボタンのキャラクタコード char MsgUp[] = {0xEB, 0}; char MsgDown[] = {0xED, 0}; // タッチ・ボタン追加:SLOPE切替ボタン及び、HOLDボタンのキャラクタコード //char MsgSLOPE[] = {0xEA, 0}; //char MsgSLOPE[] = {0xE9, 0}; char MsgBUTTON[] = {0xE9, 0}; // タッチボタン座標データ short Button[8][2] = {{302,871}, // [0]:TIME_UPボタン {300,245}, // [1]:TIME_DWNボタン {220,1847}, // [2]:TRIG_UPボタン:337,1847から変更:170717 {220,1200}, // [3]:TRIG_DWNボタン:343,1152から変更:170717 {1828,824}, // [4]:VOLT_UPボタン {1814,250}, // [5]:VOLT_DWNボタン {1750,1817}, // [6]:SLOPE切替ボタン 130714修正 {1700,1310} // [7]:HOLDボタン 130717追加 }; ///----------------------------------------------------------------------------------------- #define AC_DC_SW PORTFbits.RF5 #define HOLD_RUN_SW PORTFbits.RF4 #define TRIG_MODE_SW PORTGbits.RG6 #define READY_SW PORTGbits.RG7 #define ATT_A LATBbits.LATB1 #define ATT_B LATBbits.LATB2 #define ATT_C LATBbits.LATB8 ///----------------------------------------------------------------------------------------- /// A Variable (Global) /// Data Buffer for GLCD unsigned short Buffer1[512]; //unsigned short Buffer2[512]; unsigned short Index,POT,Y_pos; short TSW; short VSW; short Count; short Chatta; char EndFlag; char POS_flag; // トリガ極性 char HOLD_ON_flag; char hold_status; char READY_flag; /// Function Prottypes void Oscillo(void); void AxisDraw(void); short CheckBtn(short x, short y); void Process(short sw); void Set_Volt_Renge(void); void itostring(char digit, unsigned int data, char *buffer); void Oscillo_single_mode(void); void Single_trigger_mode(void); /************************************************ * Function Main ************************************************/ int main(void) { //システム最適設定 SYSTEMConfigPerformance(80000000); mJTAGPortEnable(DEBUG_JTAGPORT_OFF); // JTAGを無効化 //I/O設定 AD1PCFG = 0xFFFE; TRISE = 0x0000; // LCDデータバス(DB0-DB7)オール出力 TRISD = 0xFF07; // LCD_RS,CS,WR,RESET:全て出力・デバッグLED:出力・他未使用ピンは入力設定 TRISF = 0xFFFC; // RF2:DOUT入力, RF0:READY_LED, RF1:TRG_LED出力 // RF4:AC_DC_SW, RF5:予備_SW, RF6:PENIRQ入力, RF3は未使用(入力設定) TRISC = 0xFFFF; // RCポートは結局、未使用(全入力設定にした) 130716 TRISG = 0xFFFF; // RG6:TRIG_MODE_SW, RG7:READY_SW, 他未使用ピンは入力設定 // TRISB = 0x8FC1; // RB15:BUSY入力、RB14:TCLK, RB13:TCS, RB12:TDINは出力、RB8-11:未使用入力 // RB1:ATT_A, RB2:ATT_B, RB3:GAIN_A, RB4:GAIN_B, RB5:AC_DC_Aは出力 TRISB = 0x8EC1; // RB15:BUSY入力、RB14:TCLK, RB13:TCS, RB12:TDIN、RB8:ATT_Cは出力, RB9-11:未使用入力 // RB1:ATT_A, RB2:ATT_B, RB3:GAIN_A, RB4:GAIN_B, RB5:AC_DC_Aは出力 130906 //  (今回、RB3,4,5は未使用:131210) // ODCB = 0x003E; // アナログSWセレクト出力は、オープン・ドレインに設定(ATT_A,ATT_B,GAIN_A,GAIN_B,AC_DC_A) ODCB = 0x013E; // アナログSWセレクト出力は、オープン・ドレインに設定(ATT_C,ATT_A,ATT_B,GAIN_A,GAIN_B,AC_DC_A):130905 LATDbits.LATD3 = 1; // デバッグLED消灯 LATFbits.LATF0 = 1; // READY_LED消灯 LATFbits.LATF1 = 1; // TRIG_LED消灯 /// タッチ制御信号初期化 TCS = 1; TCLK = 0; TDIN = 0; /// 液晶表示器の初期化 Glcd_Init(); Glcd_Clear(BLACK); Glcd_Str(0, 0, str_Start, CYAN, BLACK); delay_ms(1000); /// ADC初期設定 AD1CON1 = 0x0044; // サンプルモード等設定 // b15:ON:0:ADCモジュールOFF // b14:FRZ:0:デバッグ中動作継続 // b13:ADSIDL:0:アイドルモードでも動作継続 // b12:x:0 //------------------------------------------------------------------------------------------ // b11:x:0 // b10:FORM<2>:0:データフォーマット= 整数16ビット // b_9:FORM<1>:0 // b_8:FORM<0>:0 //------------------------------------------------------------------------------------------ // b_7:SSRC<2>:0:サンプルクロックソース= T3一致でサンプリング終了し変換開始(ADC1の場合) // b_6:SSRC<1>:1 // b_5:SSRC<0>:0 // b_4:CLRASAM:0:割込みで変換継続 //------------------------------------------------------------------------------------------ // b_3:x:0 // b_2:ASAM:1:サンプリングは最後の変換終了直後に開始する。SAMPビットは自動セットされる // b_1:SAMP:0:S/Hはホールド中 // b_0:DONE:0:ADCステータスビット //------------------------------------------------------------------------------------------ AD1CON2 = 0x003C; // スキャンモード等設定 // b15:VCFG<2>:0:VREF=AVDD-AVSS // b14:VCFG<1>:0: // b13:VCFG<0>:0: // b12:OFFCAL:0:較正モード無効 //------------------------------------------------------------------------------------------ // b11:x:0 // b10:CSCNA:0:※ 入力スキャンしない // b_9:x:0 // b_8:x:0 //------------------------------------------------------------------------------------------ // b_7:BUFS:0(R-Only):※ バッファフルステータス  // b_6:x:0          BUF_0〜7に書込み中、BUF8〜15内のデータにアクセスせよ // b_5:SMPI<3>:1:※ 16回のサンプル/変換動作完了毎に割込み発生 // b_4:SMPI<2>:1 //------------------------------------------------------------------------------------------ // b_3:SMPI<1>:1 // b_2:SMPI<0>:1 // b_1:BUFM:0:※ 16ワード単一結果バッファを使用 // b_0:ALTS:0:※ 常にMUXA入力選択を使用 //------------------------------------------------------------------------------------------ AD1CON3 = 0x0202; // ADCクロック等設定 // b15:ADRC:0:ADCクロックソース= システムクロックから取出したクロック // b14:x:0 // b13:x:0 // b12:SAMC<4>:0:自動サンプル時間(Acquisition Time)Tsmp= 2Tad= 2*75nS= 150nS(規格:≧132nSmin):80MIPS //------------------------------------------------------------------------------------------ // b11:SAMC<3>:0 // b10:SAMC<2>:0 // b_9:SAMC<1>:1 // b_8:SAMC<0>:0 //------------------------------------------------------------------------------------------ // b_7:ADCS<7>:0:ADCクロック周期(Tad)= 2*Tcy*(ADCS+1)= 2*12.5nS*(2+1)= 75nS(規格:≧65nSmin):80MIPS // b_6:ADCS<6>: // b_5:ADCS<5>:0: // b_4:ADCS<4>:0 //------------------------------------------------------------------------------------------ // b_3:ADCS<3>:0 // b_2:ADCS<2>:0 // b_1:ADCS<1>:1 // b_0:ADCS<0>:0 //------------------------------------------------------------------------------------------ ///////////////////////////////////////////////////////////////////////////////////////////// /// <総変換時間算出> ///  @ 80MIPSの場合 /// Tconv= 12Tad= 12*0.075uS= 0.9uS /// 総変換時間= Tsmp + Tconv= 0.15uS+ 0.9uS= 1.05uS //////////////////////////////////////////////////////////////////////////////////////////// AD1CHS = 0x00000000; // MUX設定 // b31:CH0NB:0:B側のS/Hは未使用(負側入力をAVCCに接続) // b30:x:0 // b29:x:0 // b28:x:0 //------------------------------------------------------------------------------------------ // b27:CH0SB<3>:0 // b26:CH0SB<2>:0 // b25:CH0SB<1>:0 // b24:CH0SB<0>:0 //------------------------------------------------------------------------------------------ // b23:CH0NA:0:S/H(CH0)負側入力は、AVSSに接続 // b22:x:0 // b21:x:0 // b20:x:0 //------------------------------------------------------------------------------------------ // b19:CH0SA<3>:0:※ AN0 for CH0 +IN // b18:CH0SA<2>:0 // b17:CH0SA<1>:0 // b16:CH0SA<0>:0 //------------------------------------------------------------------------------------------ // AD1CSSL = 0x0005; AD1CSSL = 0x0000; // 入力スキャンCH設定 141103 修正 // b15:CSS15:0:入力スキャンに、AN15を選択しない // b14:CSS14:0:入力スキャンに、AN14を選択しない // b13:CSS13:0:入力スキャンに、AN13を選択しない // b12:CSS12:0:入力スキャンに、AN12を選択しない //------------------------------------------------------------------------------------------ // b11:CSS11:0:入力スキャンに、AN11を選択しない // b10:CSS10:0:入力スキャンに、AN10を選択しない // b_9:CSS9:0:入力スキャンに、AN9を選択しない // b_8:CSS8:0:入力スキャンに、AN8を選択しない //------------------------------------------------------------------------------------------ // b_7:CSS7:0:入力スキャンに、AN7を選択しない // b_6:CSS6:0:入力スキャンに、AN6を選択しない // b_5:CSS5:0:入力スキャンに、AN5を選択しない // b_4:CSS4:0:入力スキャンに、AN4を選択しない //------------------------------------------------------------------------------------------ // b_3:CSS3:0:入力スキャンに、AN3を選択しない // b_2:CSS2:0:入力スキャンに、AN2を選択しない // b_1:CSS1:0:入力スキャンに、AN1を選択しない // b_0:CSS0:0:入力スキャンに、AN0を選択しない //------------------------------------------------------------------------------------------ AD1PCFG = 0xFFFE; // アナログ/デジタルピン設定 // b15:PCFG15:1 // b14:PCFG14:1 // b13:PCFG13:1 // b12:PCFG12:1 //------------------------------------------------------------------------------------------ // b11:PCFG11:1 // b10:PCFG10:1 // b_9:PCFG9:1 // b_8:PCFG8:1 //------------------------------------------------------------------------------------------ // b_7:PCFG7:1 // b_6:PCFG6:1 // b_5:PCFG5:1 // b_4:PCFG4:1 //------------------------------------------------------------------------------------------ // b_3:PCFG3:1 // b_2:PCFG2:1 // b_1:PCFG1:1 // b_0:PCFG0:AN0を、アナログ入力ピンに設定(他は全てデジタル入力ピンに設定) //------------------------------------------------------------------------------------------ AD1CON1bits.ADON = 1; // ADC Start mAD1ClearIntFlag(); // Clead AD1 IF Flag mAD1SetIntPriority(7); // AD1割込み優先レベル初期設定 mAD1SetIntSubPriority(3); // AD1割込みサブ優先レベル初期設定 mAD1IntEnable(1); // Enable ADC INT /// Timer3:T3初期設定= Tcy*PS*n= 0.0125uS*2*400 = 10uS PR3 = 399; // n = 400 (PR3=n-1 T3CON = 0x0010; // T3_OFF, T3_GATE_OFF, T3_PS_1_2, T3_SOURCE_INT // PULL_UP設定(結局、AC/DC及び、TRIGモード切替SW、READY_SW以外の全てのタクトSWをタッチ化したので、CN割込みは未使用になった) mCNOpen(CN_OFF, CN_DISABLE_ALL, CN9_PULLUP_ENABLE | CN8_PULLUP_ENABLE | CN17_PULLUP_ENABLE | CN18_PULLUP_ENABLE); //        READY_SW__PULLUP, TRIG_MODE_SW, 予備_SW_PULLUP, AC_DC_SW /// タイマ1設定 50msec周期 タッチスクリーン用 //タイマ1初期設定 12.5nsecx256x15625=50msec OpenTimer1(T1_ON | T1_SOURCE_INT | T1_PS_1_256, 15624); // タイマ1割り込み設定 ConfigIntTimer1(T1_INT_ON | T1_INT_PRIOR_2); mT1ClearIntFlag(); //割り込みフラグクリア // マルチベクタ割り込み設定、割り込み許可 INTEnableSystemMultiVectoredInt(); /// Inittalize Variable Count = 0; Chatta = 0; HOLD_ON_flag = 0; hold_status = 0; READY_flag = 0; /// POT変数及び、トリガレベルライン描画Y座標初期化(トリガレベルを、デジタル値で直に与える) POT = 512; // センターレベル設定 Y_pos = 116; // トリガレベルライン描画Y座標設定 TSW = 2; // デフォルト・時間軸レンジ= 0.5mS/D VSW = 5; // デフォルト・電圧軸レンジ= 2.5V/D POS_flag = 1; // デフォルト・トリガ・スロープ= 正 /// メイン・ループ while(1){ EndFlag = 0; // Clear End of Convertion Flag Index = 0; if (TRIG_MODE_SW) { // Trigger is AUTO Mode T1CONbits.TON = 1; // SIMGLEモードから戻って来たときのための、タッチ再許可 /// Switching Sampling Period if (TSW == 8) T3CONbits.TCKPS = 4; // PS3 = 1/16 else T3CONbits.TCKPS = 1; // PS3 = 1/2 switch(TSW){ case 0: PR3 = 79; // 2usec(0.1ms/div) break; case 1: PR3 = 159; // 4usec(0.2ms/div) break; case 2: PR3 = 399; // 10usec(0.5ms/div) break; case 3: PR3 = 799; // 20usec(1.0ms/div) break; case 4: PR3 = 1599; // 50usec(2.0ms/div) break; case 5: PR3 = 3999; // 100usec(5.0ms/div) break; case 6: PR3 = 7999; // 200usec(10ms/div) break; case 7: PR3 = 39999; // 1000usec(50ms/div) break; case 8: PR3 = 49999; // 5000usec(500ms/div) break; default:PR3 = 399; // 10usec(0.5ms/div) break; } /// 電圧軸レンジ設定(アナログSWの設定) Set_Volt_Renge(); LATFbits.LATF0 = 1; // READY_LED OFF READY_flag = 0; // ready_status = 0; T3CONbits.TON = 1; // T3ON-> ADC Start while(!EndFlag); /* LATDbits.LATD3 = 0; while(1); */ Oscillo(); // Disp. Oscillo EndFlag = 0; Index = 0; /// Cheack HOLD_RUN_SW Status while (HOLD_ON_flag) { hold_status = 1; } hold_status = 0; delay_ms(1000); // Disp. is 1.0Sec Period } else Single_trigger_mode(); } } /************************************************ * ADC Interrupt: 1Channel (16ワード Buffers) * ADC Interrupt Period = T3_Period*16 *************************************************/ void __ISR(27, ipl7) AD1Interrupt(void) { //LATDbits.LATD3 = ~LATDbits.LATD3; mAD1ClearIntFlag(); // Clead IF Flag Buffer1[Index++] = ADC1BUF0; // 1Times: Buffer <- AN0 Input Data Buffer1[Index++] = ADC1BUF1; // 2Times: Buffer <- AN0 Input Data Buffer1[Index++] = ADC1BUF2; // 3Times: Buffer <- AN0 Input Data Buffer1[Index++] = ADC1BUF3; // 4Times: Buffer <- AN0 Input Data Buffer1[Index++] = ADC1BUF4; // 5Times: Buffer <- AN0 Input Data Buffer1[Index++] = ADC1BUF5; // 6Times: Buffer <- AN0 Input Data Buffer1[Index++] = ADC1BUF6; // 7Times: Buffer <- AN0 Input Data Buffer1[Index++] = ADC1BUF7; // 8Times: Buffer <- AN0 Input Data Buffer1[Index++] = ADC1BUF8; // 9Times: Buffer <- AN0 Input Data Buffer1[Index++] = ADC1BUF9; // 10Times: Buffer <- AN0 Input Data Buffer1[Index++] = ADC1BUFA; // 11Times: Buffer <- AN0 Input Data Buffer1[Index++] = ADC1BUFB; // 12Times: Buffer <- AN0 Input Data Buffer1[Index++] = ADC1BUFC; // 13Times: Buffer <- AN0 Input Data Buffer1[Index++] = ADC1BUFD; // 14Times: Buffer <- AN0 Input Data Buffer1[Index++] = ADC1BUFE; // 15Times: Buffer <- AN0 Input Data Buffer1[Index++] = ADC1BUFF; // 16Times: Buffer <- AN0 Input Data if(Index >= 512){ // Buffer Full ? // if(Index >= 384){ T3CONbits.TON = 0; // Buffer Full Then T3 OFF and EOC Flag ON EndFlag = 1; } } /**************************************************** * タイマ1割り込み処理:タッチ用5OmS周期   130612 ****************************************************/ void __ISR(4, ipl2) T1Handler(void){ static short Xset, Yset, Xold, Yold; mT1ClearIntFlag(); //割り込みフラグクリア // LATDbits.LATD3 = !LATDbits.LATD3; ///タッチポイントの座標入力 Xset = XPT_Read_XY(CMD_RDX); // X座標値取得(15回変換の平均化処理後のデータ) Yset = XPT_Read_XY(CMD_RDY); // Y座標値取得(15回変換の平均化処理後のデータ) //// <確実なタッチの検出> //// X座標、Y座標とも「15カウント以内」 //// に入る状態が「3回」以上続いたら位置座標として確定する。 if(!PENIRQ) { // タッチONの場合、確実なタッチの検出処理を実行 // タッチOFFの場合、 SETデータを、OLDデータに置換えて抜けるだけ if((abs(Xset - Xold) < 15) && abs(Yset - Yold) < 15){ Count++; if((Count >= 3)&&(Chatta==0)){ Count = 0; Process(CheckBtn(Xset, Yset)); if(Chatta) AxisDraw(); // 時間軸レンジを変えた時は、ここで時間軸レンジ表示更新 } } else Count = 0; } Xold = Xset; Yold = Yset; } /**************************************** * オシロスコープ表示、保存したデータを表 * トリガを検出してその位置から320データ表示 * トリガが一致しなければ最初から320データ表示する *****************************************/ void Oscillo(void){ short i,x, Point; AxisDraw(); // 座標表示 Point = -1; // 最初のデータ /// トリガチェック if (POS_flag) { // トリガ・スロープ:正 for(x=0; x<190; x++){ if((Buffer1[x] < POT) && (Buffer1[x+5] >= POT)){ Point = x; continue; } } } else { // トリガ・スロープ:負 for(x=0; x<190; x++){ if((Buffer1[x+5] < POT) && (Buffer1[x] >= POT)){ Point = x; continue; } } } /// トリガ成立、その位置から波形表示 if(Point != -1){ LATFbits.LATF1 = 0; // LED ON for(i=1; i<=320; i++) { Glcd_Line(i, Buffer1[i+Point-1]*5/22, i, Buffer1[i+Point]*5/22, MAGENTA); } } // トリガ不成立、最初から表示する else { LATFbits.LATF1 = 1; // LED OFF for(i=1; i<=320; i++){ Glcd_Line(i, Buffer1[i-1]*5/22, i, Buffer1[i]*5/22, MAGENTA); } } Chatta = 0; } /****************************************** * Drawing Coordinate Axis *******************************************/ void AxisDraw(void){ short i; /* LATDbits.LATD3 = 0; while(1); */ Glcd_Clear(BLACK); /* LATDbits.LATD3 = 0; while(1); */ /// X、Y座標軸,補助線表示 for(i=0; i<319; i+=50) Glcd_Line(i, 0, i, 231, BROWN); // Y axis for(i=0; i<239; i+=58) Glcd_Line(0, i, 319, i, BROWN); // X axis /// Disp. HOLD:130715追加(130717ロケーション変更) if (HOLD_ON_flag == 1) Glcd_Str(11,15,str_HOLD, WHITE, BLACK); else Glcd_Str(11,15,str_SPACE_4, WHITE, BLACK); /// Disp. AC/DC if (AC_DC_SW == 0) Glcd_Str(0,16,str_DC, WHITE, BLACK); else Glcd_Str(0,16,str_AC, WHITE, BLACK); /// Disp. Unit Time Axis (mS/D) switch(TSW){ case 0: Glcd_Str(17, 0, str_0_1ms, CYAN, BLACK); break; case 1: Glcd_Str(17, 0, str_0_2ms, CYAN, BLACK); break; case 2: Glcd_Str(17, 0, str_0_5ms, CYAN, BLACK); break; case 3: Glcd_Str(17, 0, str_1_0ms, CYAN, BLACK); break; case 4: Glcd_Str(17 ,0, str_2_0ms, CYAN, BLACK); break; case 5: Glcd_Str(17, 0, str_5_0ms, CYAN, BLACK); break; case 6: Glcd_Str(17, 0, str_10ms, CYAN, BLACK); break; case 7: Glcd_Str(17, 0, str_50ms, CYAN, BLACK); break; case 8: Glcd_Str(17, 0, str_500ms, CYAN, BLACK); break; default:Glcd_Str(17, 0, str_0_5ms, CYAN, BLACK); break; } /// Disp. Unit Volt Axis (V/D or mV/D) switch(VSW){ case 0: Glcd_Str(18, 16, str_50mv, CYAN, BLACK); break; case 1: Glcd_Str(18, 16, str_0_1v, CYAN, BLACK); break; case 2: Glcd_Str(18, 16, str_0_25v, CYAN, BLACK); break; case 3: Glcd_Str(18, 16, str_0_5v, CYAN, BLACK); break; case 4: Glcd_Str(18, 16, str_1_0v, CYAN, BLACK); break; case 5: Glcd_Str(18, 16, str_2_5v, CYAN, BLACK); break; case 6: Glcd_Str(18, 16, str_5_0v, CYAN, BLACK); break; case 7: Glcd_Str(18, 16, str_10v, CYAN, BLACK); break; default:Glcd_Str(18, 16, str_2_5v, CYAN, BLACK); break; } Glcd_Str(0, 0, MsgUp, BLACK, WHITE); // トリガ・アップ・ボタン表示(キャラクタ) Glcd_Str(11, 0, MsgDown, BLACK, WHITE); // トリガ・ダウン・ボタン表示(キャラクタ) Glcd_Str(15, 0, MsgUp, BLACK, WHITE); // 時間軸レンジ・アップ・ボタン表示(キャラクタ) Glcd_Str(25, 0, MsgDown, BLACK, WHITE); // 時間軸レンジ・ダウン・ボタン表示(キャラクタ) Glcd_Str(16, 16, MsgUp, BLACK, WHITE); // 電圧軸レンジ・アップ・ボタン表示(キャラクタ) Glcd_Str(25, 16, MsgDown, BLACK, WHITE); // 電圧軸レンジ・ダウン・ボタン表示(キャラクタ) Glcd_Str(0, 15, MsgBUTTON, GREEN, BLACK); // スロープ・ボタン表示(キャラクタ) Glcd_Str(9, 15, MsgBUTTON, YELLOW, BLACK); // ホールド・ボタン表示(キャラクタ) Glcd_Line(310, Y_pos, 319, Y_pos, YELLOW); // トリガレベルライン描画 itostring(3, POT, str_Trig + 5); // POTデータを文字列に変換 Glcd_Str(2, 0, str_Trig, WHITE, BLACK); // トリガレベル値表示 if (POS_flag) Glcd_Str(2,15,str_SLOPE_P, WHITE, BLACK); // トリガ・スロープ+ or −表示 else Glcd_Str(2,15,str_SLOPE_N, WHITE, BLACK); } //----------------------------------------------------------------------------------------- /********************************************************** * タッチボタン判定処理 * タッチポイントの座標から、押されたボタンの種別No.を取得 * し、その値を返す ***********************************************************/ short CheckBtn(short x, short y) { short i, btn; /// タッチ座標位置表示(デバッグ用) itostring(4, x, MsgScrn+2); itostring(4, y, MsgScrn+9); Glcd_Str(3, 16, MsgScrn, GREEN, BLACK); /// ボタンチェック btn = -1; for( i=0; i<8; i++){ if((x > Button[i][0]-60)&&(x < Button[i][0]+40)){ if((y > Button[i][1]-70)&&(y < Button[i][1]+70)) btn = i; } } return(btn); } /************************************************** * タッチ・ボタンごとの処理 ***************************************************/ void Process(short sw) { switch(sw){ case 0: /// 時間軸レンジアップ(サンプル周期小へ移行) TSW--; if (TSW < 0) TSW= 8; Chatta = 1; break; case 1: /// 時間軸レンジアップダウン(サンプル周期大へ移行) TSW++; if (TSW > 8) TSW= 0; Chatta = 1; break; case 2: /// トリガレベルアップ:+5ステップで最大レベル712の40ポイント if (Y_pos < 156) { Y_pos++; POT += 5; } break; case 3: /// トリガレベルダウン:-5ステップで最小レベル312の40ポイント if (Y_pos > 76) { Y_pos--; POT -= 5; } break; case 4: /// 電圧軸レンジアップ(電圧大へ移行) VSW++; if (VSW > 7) VSW= 0; Chatta = 1; break; case 5: /// 電圧軸レンジダウン(電圧小へ移行) VSW--; if (VSW < 0) VSW= 7; Chatta = 1; break; case 6: /// トリガ・スロープ切替 if (POS_flag) POS_flag = 0; else POS_flag = 1; Chatta = 1; break; case 7: /// HOLD_RUN切替:130717追加 if (!hold_status) { // hold_status -> 0: RUN HOLD_ON_flag = 1; } else { // hold_status -> 1: HOLD_ON Loop HOLD_ON_flag = 0; } Chatta = 1; break; default: break; } } /*************************************************************** * 電圧軸レンジ切替タッチボタンを検知した結果得られた、 * 処理分岐設定値:VSWにより、各レンジに於ける、 * アナログSWの、選択入力の設定を行う (131210:全8レンジに変更) ****************************************************************/ void Set_Volt_Renge(void) { switch(VSW) { case 0: // 50mV/D ATT_A = 0; ATT_B = 0; ATT_C = 0; break; case 1: // 0.1V/D ATT_A = 1; ATT_B = 0; ATT_C = 0; break; case 2: // 0.25V/D ATT_A = 0; ATT_B = 1; ATT_C = 0; break; case 3: // 0.5V/D ATT_A = 1; ATT_B = 1; ATT_C = 0; break; case 4: // 1.0V/D ATT_A = 0; ATT_B = 0; ATT_C = 1; break; case 5: // 2.5V/D ATT_A = 1; ATT_B = 0; ATT_C = 1; break; case 6: // 5.0V/D ATT_A = 0; ATT_B = 1; ATT_C = 1; break; case 7: // 10V/D ATT_A = 1; ATT_B = 1; ATT_C = 1; break; default: // 2.5V/D ATT_A = 1; ATT_B = 0; ATT_C = 1; break; } } /****************************************************** * Disp. Oscillo and Cheack trigger for Single mode *******************************************************/ void Oscillo_single_trigger(void){ short i,x, Point; Point = -1; // 最初のデータ /// トリガチェック if (POS_flag) { // トリガ・スロープ:正 for(x=0; x<190; x++){ if((Buffer1[x] < POT) && (Buffer1[x+5] >= POT)){ Point = x; continue; } } } else { // トリガ・スロープ:負 for(x=0; x<190; x++){ if((Buffer1[x+5] < POT) && (Buffer1[x] >= POT)){ Point = x; continue; } } } /// トリガ成立、その位置から波形表示 if(Point != -1){ LATFbits.LATF1 = 0; // TRIG_LED ON LATFbits.LATF0 = 1; // READY_LED OFF AxisDraw(); // シングル・トリガの場合は、トリガ成立した時のみ、座標表示更新 for(i=1; i<=320; i++) { Glcd_Line(i, Buffer1[i+Point-1]*5/22, i, Buffer1[i+Point]*5/22, MAGENTA); } READY_flag = 0; } // トリガ不成立の場合は、TRIG_LED消灯のみで、再トライ else { LATFbits.LATF1 = 1; // LED OFF } Chatta = 0; } /********************************************* * Single_trigger_mode **********************************************/ void Single_trigger_mode(void) { T1CONbits.TON = 0; // シングルモード時は、T1 OFF(タッチ禁止) while ((!READY_flag) && (!TRIG_MODE_SW)) { if (!READY_SW) READY_flag = 1; } if (!TRIG_MODE_SW) { LATFbits.LATF0 = 0; // READY_LED ON T3CONbits.TON = 1; // T3ON-> ADC Start while(!EndFlag); Oscillo_single_trigger(); } } //--------------------------------------------------------------------------------------------- /***************************************** * 数値から文字列に変換 *****************************************/ void itostring(char digit, unsigned int data, char *buffer){ char i; buffer += digit; // 文字列の最後 for(i=digit; i>0; i--) { // 最下位桁から上位へ buffer--; // ポインター1 *buffer = (data % 10) + '0'; // その桁数値を文字にして格納 data = data / 10; // 桁-1 } }