/********************************************************************** * Scope Hardware V6(2現象としては、3号機) * Scope Soft Ver1.02 * オシロ_V5aの、カラーQVGA液晶表示版 * * <改善点> * ・画面更新時のチラツキが、モノクロオシロに比較し * 多く、気になるので、ソフトをバージョンアップした。(再チャレンジ) * * 2.8インチQVGA液晶モジュール(aitendo): M028C9325TP * 240x320ドット 16ビットカラー 横置き表示 * * Condition: * 8MHz External X'tal Oscillator, 10x PLL (8MHzx10= 80MHz) * Fcy=80MHz/2=40MHz, Tcy=25ns * * CPU: PIC24HJ64G206 * * 1回目チャレンジ:N.Ishii 2014.10.1 * 2回目チャレンジ:N.Ishii 2016.11.10 * * <変更・修正履歴> * 161110 * @ dotLine描画関数は削除した。 *   実質カラー版のオシロでは使ってないのと、私の勘違いで、モノクロ用の *   dotLine関数を、そのまま記載していた為、無駄なので削除した。 * A 現AxisDraw関数は、座標線描画と、計測条件表示処理を兼ねているが、 *   別々にした。(座標線描画:AxisDraw()/計測条件表示:DispMeas() * B テキスト表示エリアと、座標線(Y座標の下側)が干渉を起こさない *   ように、Y座標線の長さを修正した。 ************************************************************************/ #include #include "colorlcd_lib_pic24hj64.h" /// Set Configuration Word: 8MHz External X'tal OSC _FBS(BSS_NO_FLASH & BWRP_WRPROTECT_OFF ) _FGS(GSS_OFF & GCP_OFF & GWRP_OFF ) _FOSCSEL(FNOSC_PRIPLL & IESO_ON) _FOSC(FCKSM_CSECME & OSCIOFNC_OFF & POSCMD_XT ) _FWDT(FWDTEN_OFF & WINDIS_OFF) _FPOR(FPWRT_PWR32) //--------------------------------------------------------------- #define AC_DC_SW_1 PORTDbits.RD4 #define AC_DC_SW_2 PORTDbits.RD5 #define HOLD_RUN_SW PORTDbits.RD6 #define TRIG_MODE_SW PORTCbits.RC13 #define READY_SW PORTCbits.RC14 #define SLOPE_SW PORTDbits.RD7 #define XY_SW PORTGbits.RG9 //-------------------------------------------------------------- /// A Variable (Global) // Data Buffer for GLCD int Buffer1[512]; // CH1用 int Buffer2[512]; // CH2用 int Index,POT,TSW,VSW_1,VSW_2; char EndFlag; /// DMA_Buffer Location & BufferA/B Change Flag // AN0:1CH信号入力、AN1:2CH信号入力、AN2:トリガレベル入力 unsigned int BufferA[4] __attribute__((space(dma))); // DMAバッファ_A側 unsigned int BufferB[4] __attribute__((space(dma))); // DMAバッファ_B側 unsigned int DmaBuffer = 0; // DMAバッファ・チェンジ・フラグ char HOLD_ON_flag = 0; char hold_status = 0; char READY_flag = 0; char ready_status = 0; char POS_flag = 1; // Defult Trigger Slope is positive char Chang_xy_flag,Chang_dual_flag = 0; // 161107 //--------------------------------------------------------------- /// Function Prottypes void Oscillo(void); void AxisDraw(void); void DispMeas(void); void Oscillo_single_mode(void); void Single_trigger_mode(void); /************************************************ * Function Main ************************************************/ int main(void){ /* Initialize Clock */ CLKDIVbits.PLLPRE = 0; // PLLPRE=1/2 to 4MHz PLLFBDbits.PLLDIV = 38; // PLLDIV=1/40 to 160MHz CLKDIVbits.PLLPOST = 0; // PLLPOST=1/2 to 80MHz then 40MIPS /* Initialize Port */ AD1PCFGL = 0xFFF8; // AN0-2 are Analog AD1PCFGH = 0xFFFF; // OTHER Digital TRISB = 0x00FF; // LCD_DataPort(RB8-RB15) is output, TSW_IN(RB3-RB5) is input TRISC = 0xFFFF; // TRG_MODE_SW, READY_SW(RC13, RC14) is input TRISD = 0xF0F0; // LCD_ControlPort(RD0, RD8-RD11) is output, SLOPE,HOLD_SW,DC/AC_SW_1,2(RD7-RD4) is input TRISF = 0xFFFF; // VSW2-1,2,4(RF3,RF4,RF5) is input TRISG = 0x8FFF; // HOLD.READY,TRIG_LED(RG14,13,12) is output, VSW-1,2,4(RG6-RG8),XY_SW(RG9) is input // CNPU1 = 0x8001; // HOLD,READY_SW(RD6,RC14) is pull up CNPU1 = 0xE8E3; // HOLD,READY_SW(RD6,RC14) TSW(RB3-5),AC/DC_SW1(RD4).AC/DC_SW2(RD5),XY_SW(RG9) is pull up CNPU2 = 0x0001; // SLOPE_SW(RD7) is pull up /// Set Switch Change Notification Interrupts CNEN1 = 0x8001; // Valid CN15,CN0: HOLD,READY_SW CNEN2 = 0x0001; // Valid CN16: SLOPE_SW IPC4bits.CNIP = 3; // The Order of Priority: CN INT=6, (DMA5 Defult INT=4) IEC1bits.CNIE = 1; // Enable CN INT LATGbits.LATG12 = 1; // Green LED(TRIG) OFF LATGbits.LATG13 = 1; // Red LED(READY) OFF LATGbits.LATG14 = 1; // YELLOW LED(HOLD) OFF // 液晶表示器の初期化 lcd_Init(); lcd_Clear(BLACK); lcd_Str(0, 0, "Scope V6", CYAN, BLACK); lcd_Str(0, 1, "Soft Ver1.02", CYAN, BLACK); delay_ms(1000); //// Initialize DMA Oチャンネル DMA0CONbits.AMODE = 0; // Configure DMA for Register indirect mode // with post-increment DMA0CONbits.MODE = 2; // Configure DMA for Continuous Ping-Pong mode DMA0PAD = (volatile unsigned int)&ADC1BUF0; // Point DMA to ADC1BUF0 DMA0CNT = 3; // 4 DMA request DMA0REQ = 13; // Select ADC1 as DMA Request source (IREQ13) DMA0STA = __builtin_dmaoffset(BufferA); // Read New DMA Address A-side DMA0STB = __builtin_dmaoffset(BufferB); // Read New DMA Address B-side IFS0bits.DMA0IF = 0; //Clear the DMA interrupt flag bit IEC0bits.DMA0IE = 1; //Set the DMA interrupt enable bit DMA0CONbits.CHEN=1; // Enable DMA /// Initialize ADC(2CHオシロの設定:4CH同時サンプリング) AD1CON1 = 0x004C; // b15:ADON:0:ADCモジュールOFF // b14:x:0 // b13:ADSIDL:0:アイドルモードでも動作継続 // b12:ADDMABM:0:DMAバッファはスキャッタ/ギャザモードで書込まれる //------------------------------------------------------------------------------------------ // b11:x:0 // b10:AD12B:0:10bitで4CHのAD動作 // 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:x:0 //------------------------------------------------------------------------------------------ // b_3:SIMSAM:1:※ 同時サンプリング // b_2:ASAM:1:サンプリングは最後の変換終了直後に開始する。SAMPビットは自動セットされる // b_1:SAMP:0:S/Hはホールド中 // b_0:DONE:0:ADCステータスビット //------------------------------------------------------------------------------------------ AD1CON2 = 0x0200; // b15:VCFG<2>:0:VREF=AVDD-AVSS // b14:VCFG<1>:0: // b13:VCFG<0>:0: // b12:x:0 //------------------------------------------------------------------------------------------ // b11:x:0 // b10:CSCNA:0:※ 今回は4CH同時サンプルなので、4つのS/H(CH0〜3)を使用し入力スキャンは使用しない // b_9:CHPS<1>:1:※ 4CH(CH0〜3)を変換 // b_8:CHPS<0>:0: (AN3はDSW-1デジタル入力としているのでAVSS=0Vが変換される) //------------------------------------------------------------------------------------------ // b_7:BUFS:0(R-Only):※ バッファフルステータス  // b_6:x:0          BUF_0〜7に書込み中、BUF8〜15内のデータにアクセスせよ // b_5:SMPI<3>:0:※ 4CH同時サンプルの場合は、1回のサンプルで4CH分の同時サンプル終了後、4CH分の // b_4:SMPI<2>:0   変換が完了する毎にAD割込みを発生させる //------------------------------------------------------------------------------------------ // b_3:SMPI<1>:0 // b_2:SMPI<0>:0 // b_1:BUFM:0:毎回のサンプル/変換動作完了ごとにDMAアドレスを+1 // b_0:ALTS:0 //------------------------------------------------------------------------------------------ AD1CON3 = 0x0202; // b15:ADRC:0:ADCクロックソース= システムクロックから取出したクロック // b14:x:0 // b13:x:0 // b12:SAMC<4>:0:自動サンプル時間(Acquisition Time)Tsmp=2Tad(200nS(40MIPS)) //------------------------------------------------------------------------------------------ // b11:SAMC<3>:0 // b10:SAMC<2>:0 // b_9:SAMC<1>:1 // b_8:SAMC<0>:0 //------------------------------------------------------------------------------------------ // b_7:x:0 // b_6:x:0 // b_5:ADCS<5>:0:ADCクロック周期(Tad)= Tcy*(ADCS+1)= 25nS*(2+1)= 75nS(規格:≧70nSmin):40MIPS // 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 //------------------------------------------------------------------------------------------ //////////////////////////////////////////////////////////////////////////////////////////////// /// <総変換時間算出> ///  @ 40MIPSの場合 /// Tconv= 12Tad= 12*0.075uS= 0.9uSなので、 /// 総変換時間= Tsmp + (Tconv*4)= 0.2u + (0.9uS*4)= 3.8uS /////////////////////////////////////////////////////////////////////////////////////////////// AD1CON4 = 0x0000; // アナログ入力ごとに、1ワードのDMAバッファを配置 // b15:x:0 // b14:x:0 // b13:x:0 // b12:x:0 //------------------------------------------------------------------------------------------ // b11:x:0 // b10:x:0 // b_9:x:0 // b_8:x:0 //------------------------------------------------------------------------------------------ // b_7:x:0 // b_6:x:0 // b_5:x:0 // b_4:x:0 //------------------------------------------------------------------------------------------ // b_3:x:0 // b_2:DMABL<2>:0 // b_1:DMABL<1>:0 // b_0:DMABL<0>:0 //------------------------------------------------------------------------------------------ AD1CHS123= 0x0000; // b15:x:0 // b14:x:0 // b13:x:0 // b12:x:0 //------------------------------------------------------------------------------------------ // b11:x:0 // b10:CH123NB<1>:0:B側のS/Hは未使用 // b_9:CH123NB<0>:0 // b_8:CH123SB:0: //------------------------------------------------------------------------------------------ // b_7:x:0 // b_6:x:0 // b_5:x:0 // b_4:x:0 //------------------------------------------------------------------------------------------ // b_3:x:0 // b_2:CH123NA<1>:0:S/H(CH1-3)負側入力は、AVSSに接続 // b_1:CH123NA<0>:0 // b_0:CH123SA:0:AN0 for CH1 +IN/ AN1 for CH2 +IN/ AN2 for CH3 +IN(CH1〜3はS/HのCH) //------------------------------------------------------------------------------------------ AD1CHS0 = 0x0003; // b15:CH0NB:0:B側のS/Hは未使用 // b14:x:0 // b13:x:0 // b12:CH0SB<4>:0 //------------------------------------------------------------------------------------------ // b11:CH0SB<3>:0 // b10:CH0SB<2>:0 // b_9:CH0SB<1>:0 // b_8:CH0SB<0>:0 //------------------------------------------------------------------------------------------ // b_7:CH0NA:0:S/H(CH0)負側入力は、AVSSに接続 // b_6:x:0 // b_5:x:0 // b_4:CH0SA<4>:0:※ AN3 for CH0 +IN //------------------------------------------------------------------------------------------ // b_3:CH0SA<3>:0 // b_2:CH0SA<2>:0 // b_1:CH0SA<1>:1 // b_0:CH0SA<0>:1 //------------------------------------------------------------------------------------------ AD1CSSL = 0x0000; // b15:x:0 // b14:x:0 // b13:x:0 // b12:x:0 //------------------------------------------------------------------------------------------ // b11:x:0 // b10:x:0 // b_9:x:0 // b_8:x:0 //------------------------------------------------------------------------------------------ // b_7:x:0 // b_6:x:0 // 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を選択しない //------------------------------------------------------------------------------------------ AD1PCFGL = 0xFFF8; // b15:x:1 // b14:x:1 // b13:x:1 // b12:x:1 //------------------------------------------------------------------------------------------ // b11:x:1 // b10:x: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:AN3は、デジタル入力ピンに設定(RB1:DSW-1として使用:この場合MUXはAVSS=0Vに接続される) // b_2:PCFG2:0:AN2を、アナログ入力ピンに設定 // b_1:PCFG1:0:AN1を、アナログ入力ピンに設定 // b_0:PCFG0:0:AN0を、アナログ入力ピンに設定 //------------------------------------------------------------------------------------------ AD1CON1bits.ADON = 1; // ADC Start /* Inittalize Timer3:T3= Tcy*PS*n= 0.025uS*1*400 = 10uS */ PR3 = 399; // n = 400 (PR3=n-1): Mod. 0x018F-> 399 110423 T3CON = 0x0000; // T3_OFF, T3_GATE_OFF, T3_PS_1_1, T3_SOURCE_INT lcd_Clear(BLACK); // 最初だけ、全画面クリアを行う /****** Main Loop ****/ while(1){ /* Draw a Graph of Input Wave Data */ EndFlag = 0; // Clear End of Convertion Flag Index = 0; if (TRIG_MODE_SW) { // Trigger is AUTO Mode /* Switching Sampling Period */ TSW = (~PORTB & 0x0038) >> 3; // Read Decimal Dip SW /// Add Branch Set PS3: 110425 if (TSW == 7) T3CONbits.TCKPS = 1; // PS3 = 1/8 else T3CONbits.TCKPS = 0; // PS3 = 1/1 /// 2CHオシロ(4CH同時サンプリング)の場合の、T3サンプル周期設定 switch(TSW){ case 0: PR3 = 159; // 4usec:0.2msec/div break; case 1: PR3 = 399; // 10usec:0.5msec/div break; case 2: PR3 = 799; // 20usec:1.0msec/div break; case 3: PR3 = 1599; // 40usec:2.0msec/div break; case 4: PR3 = 3999; // 100usec:5.0msec/div break; case 5: PR3 = 7999; // 200usec:10msec/div break; case 6: PR3 = 39999; // 1000usec:50msec/div break; case 7: PR3 = 49999; // 10msec:500msec/div break; default:PR3 = 399; // 10usec:0.5msec/div break; } LATGbits.LATG13 = 1; // Red LED OFF READY_flag = 0; ready_status = 0; T3CONbits.TON = 1; // T3ON-> ADC Start while(!EndFlag); Oscillo(); // Disp. Oscillo EndFlag = 0; Index = 0; } else Single_trigger_mode(); } } /******************************************************************************** * ADC : 3Channel使用(AN0:1CH信号入力、AN1:2CH信号入力、AN2:トリガレベル入力) * DMA Interrupt Period = T3_Period *********************************************************************************/ void __attribute__((interrupt, auto_psv)) _DMA0Interrupt(void) { // Switch between Primary and Secondary Ping-Pong buffers if(DmaBuffer == 0) { /// x = BufferA[0]→ AN3 Input Data(AN3は、DSW-1デジタル入力なので何もしない) Buffer1[Index] = BufferA[1]; // Buffer1[] <- AN0 Input Data(オシロのCH1) Buffer2[Index] = BufferA[2]; // Buffer2[] <- AN1 Input Data(オシロのCH2) POT = BufferA[3]; // POT <- AN2 Input Data((オシロのトリガ・ポテンショレベル) } else{ // '0'-> Useing ADC1BUF0- ADC1BUF6 Side (Access is ADC1BUF8- ADC1BUFE Side) /// x = BufferB[0]→ AN3 Input Data(AN3は、DSW-1デジタル入力なので何もしない) Buffer1[Index] = BufferB[1]; // Buffer1[] <- AN0 Input Data(オシロのCH1) Buffer2[Index] = BufferB[2]; // Buffer2[] <- AN1 Input Data(オシロのCH2) POT = BufferB[3]; // POT <- AN2 Input Data((オシロのトリガ・ポテンショレベル) } ++Index; DmaBuffer ^= 1; // ALT DmaBuffer Flag if(Index >= 512){ // Buffer Full ? T3CONbits.TON = 0; // Buffer Full Then T3 OFF and EOC Flag ON EndFlag = 1; } IFS0bits.DMA0IF = 0; //Clear the DMA0 Interrupt Flag } /******************************************************* * Switch Change Notification Interrupts ********************************************************/ void __attribute__((interrupt, no_auto_psv)) _CNInterrupt(void) { delay_ms(10); if (!hold_status) { // hold_status -> 0: RUN if (!HOLD_RUN_SW){ HOLD_ON_flag = 1; LATGbits.LATG14 = 0; } } else { // hold_status -> 1: HOLD_ON Loop if (!HOLD_RUN_SW){ HOLD_ON_flag = 0; LATGbits.LATG14 = 1; } } if (ready_status) { if (!READY_SW) READY_flag = 1; } if (!SLOPE_SW) { if (POS_flag) POS_flag = 0; else POS_flag = 1; } IFS1bits.CNIF = 0; // Clead CNIF Flag } /************************************************************** * Disp. Oscillo (Disp. Save Buffer Data) * Detect Trigger-> Disp. 320Data from this Position * Not Detect Trigger-> Disp. 320Data from Top Position * * <X-Yモードの説明> * 1CHをX入力、2CHをY入力とし、各AD変換値格納バッファの値を * X、Y座標値に変換して液晶画面上にプロットし、ライン表示する * * X-Yモードの時は、NORMALトリガとしトリガ成立の時のみ * リサージュ図形を表示するようにする * (トリガ不成立の時は、TRIG_LEDを消灯させるだけ) ***************************************************************/ void Oscillo(void){ short i,x, Point; AxisDraw(); // 座標表示(この中では、全画面クリアはしない) DispMeas(); // 計測条件読込み表示処理 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 (XY_SW != 0) { // DUALモードの時は、以下を実行 /// トリガ成立、その位置から波形表示 if(Point != -1){ LATGbits.LATG12 = 0; // LED ON for(i=1; i<=320; i++) { lcd_Line(i, Buffer1[i+Point-1]*5/22, i, Buffer1[i+Point]*5/22, MAGENTA); lcd_Line(i, Buffer2[i+Point-1]*5/22, i, Buffer2[i+Point]*5/22, GREEN); } /// 指定色で、サンプルデータを0.05秒間表示後、波形のみをクリア(黒で描画) delay_ms(50); // 波形表示中に、Hold SWが押されたら、画面をホールド→ もう一度、Hold SWを押すと解除 while (HOLD_ON_flag) { hold_status = 1; } hold_status = 0; // 波形のみをクリア(黒で描画) for(i=1; i<=320; i++) { lcd_Line(i, Buffer1[i+Point-1]*5/22, i, Buffer1[i+Point]*5/22, BLACK); lcd_Line(i, Buffer2[i+Point-1]*5/22, i, Buffer2[i+Point]*5/22, BLACK); } // 波形のみをクリアすると、波形線と座標線が交差した座標線の一部が途切れるので、再度座標描画する。 AxisDraw(); } // トリガ不成立、最初から表示する else { LATGbits.LATG12 = 1; // LED OFF for(i=1; i<=320; i++){ lcd_Line(i, Buffer1[i-1]*5/22, i, Buffer1[i]*5/22, MAGENTA); lcd_Line(i, Buffer2[i-1]*5/22, i, Buffer2[i]*5/22, GREEN); } /// 指定色で、サンプルデータを0.05秒間表示後、波形のみをクリア(黒で描画) delay_ms(50); while (HOLD_ON_flag) { hold_status = 1; } hold_status = 0; for(i=1; i<=320; i++){ lcd_Line(i, Buffer1[i-1]*5/22, i, Buffer1[i]*5/22, BLACK); lcd_Line(i, Buffer2[i-1]*5/22, i, Buffer2[i]*5/22, BLACK); } AxisDraw(); } } else { // X-Yモードの時は以下を実行 /// トリガ成立 if(Point != -1){ LATGbits.LATG12 = 0; // LED ON for(i=1; i<=320; i++) { lcd_Line((Buffer1[i+Point-1]*5/22)+58, Buffer2[i+Point-1]*5/22, (Buffer1[i+Point]*5/22)+58, Buffer2[i+Point]*5/22, MAGENTA); } /// 指定色で、サンプルデータを0.05秒間表示後、波形のみをクリア(黒で描画) delay_ms(50); while (HOLD_ON_flag) { hold_status = 1; } hold_status = 0; for(i=1; i<=320; i++) { lcd_Line((Buffer1[i+Point-1]*5/22)+58, Buffer2[i+Point-1]*5/22, (Buffer1[i+Point]*5/22)+58, Buffer2[i+Point]*5/22, BLACK); } AxisDraw(); } // トリガ不成立 else LATGbits.LATG12 = 1; // LED OFF } } /****************************************************** * 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){ LATGbits.LATG12 = 0; // Green LED ON LATGbits.LATG13 = 1; // Red LED OFF AxisDraw(); for(i=1; i<=320; i++) { lcd_Line(i, Buffer1[i+Point-1]*5/22, i, Buffer1[i+Point]*5/22, MAGENTA); lcd_Line(i, Buffer2[i+Point-1]*5/22, i, Buffer2[i+Point]*5/22, GREEN); } READY_flag = 0; } // トリガ不成立、Retry sample else { LATGbits.LATG12 = 1; // LED OFF } } /********************************************* * Single_trigger_mode **********************************************/ void Single_trigger_mode(void) { hold_status = 1; // Singleモード中に、Holdスイッチが押されても、Hold LEDが点灯しないようにする為の処置 DispMeas(); // 計測条件読込み表示処理 /// READY SW ON 待ちループ while ((!READY_flag) && (!TRIG_MODE_SW)) { ready_status = 1; } delay_ms(50); // SINGLEから、AUTOトリガに切替えた瞬間のチャッタ防止のための待ち(チャッタで誤判断し // 1度、信号入力状態(READY LED点灯→ADC開始)になるのを防ぐための待ち) // BNC入力に信号が有る状態で、誤動作すると、AUTOに戻った時に、ホールドされた波形が変に残ることがあった。 if (!TRIG_MODE_SW) { ready_status = 0; LATGbits.LATG13 = 0; // Red LED ON T3CONbits.TON = 1; // T3ON-> ADC Start while(!EndFlag); Oscillo_single_trigger(); } else lcd_Clear(0); } /************************** * Drawing Coordinate Axis ***************************/ void AxisDraw(void){ int i; // lcd_Clear(0); /// Singleモードの時のみ、以下を実行 161108 if (!TRIG_MODE_SW) { lcd_Clear(0); Chang_dual_flag= 0; Chang_xy_flag= 0; } /// X、Y座標軸,補助線表示 if (XY_SW != 0) { // DUALモードの時は、以下を実行 Chang_dual_flag= 1; /// X-Yモードから、DUALモードに移行後だけ、全画面クリアするための処理 if (Chang_xy_flag) { lcd_Clear(0); Chang_xy_flag= 0; } // for(i=0; i<319; i+=50) lcd_Line(i, 0, i, 231, BROWN); // Y axis lcd_Line(0, 0, 0, 231, BROWN); // Y axis:左端ライン for(i=50; i<319; i+=50) lcd_Line(i, 13, i, 231, BROWN); // Y axis:残6本分のライン for(i=0; i<239; i+=58) lcd_Line(0, i, 319, i, BROWN); // X axis } else { // X-Yモードの時は以下を実行 Chang_xy_flag= 1; /// DUALモードから、X-Yモードに移行後だけ、全画面クリアするための処理 if (Chang_dual_flag) { lcd_Clear(0); Chang_dual_flag= 0; } // for(i=0; i<319; i+=58) lcd_Line(i, 0, i, 231, BROWN); // Y axis lcd_Line(0, 0, 0, 231, BROWN); // Y axis:左端ライン for(i=58; i<319; i+=58) lcd_Line(i, 13, i, 231, BROWN); // Y axis:残5本分のライン for(i=0; i<239; i+=58) lcd_Line(0, i, 319, i, BROWN); // X axis } } /******************************************* * 計測条件表示関数 ********************************************/ void DispMeas(void){ /* Disp. AC/DC */ if (AC_DC_SW_1 == 0) lcd_Char(0, 16, 0x8C, YELLOW, BLACK); // CH1:DCキャラクタ表示 else lcd_Char(0, 16, 0x8B, YELLOW, BLACK); // CH1:ACキャラクタ表示 if (AC_DC_SW_2 == 0) lcd_Char(9, 16, 0x8C, YELLOW, BLACK); // CH2:DCキャラクタ表示 else lcd_Char(9, 16, 0x8B, YELLOW, BLACK); // CH2:ACキャラクタ表示 /* Disp. Unit Volt Axis (V/D or mV/D) */ VSW_1 = (PORTG & 0x01C0) >> 6; // Read VSW_1 SW VSW_2 = (PORTF & 0x0038) >> 3; // Read VSW_2 SW switch(VSW_1){ case 0: lcd_Str(1,16,"50mV/D ", CYAN, BLACK); break; case 1: lcd_Str(1,16,"0.1V/D ", CYAN, BLACK); break; case 2: lcd_Str(1,16,"0.25V/D", CYAN, BLACK); break; case 3: lcd_Str(1,16,"0.5V/D ", CYAN, BLACK); break; case 4: lcd_Str(1,16,"1.0V/D ", CYAN, BLACK); break; case 5: lcd_Str(1,16,"2.5V/D ", CYAN, BLACK); break; case 6: lcd_Str(1,16,"5.0V/D ", CYAN, BLACK); break; case 7: lcd_Str(1,16,"10V/D ", CYAN, BLACK); break; default:lcd_Str(1,16,"2.5V/D ", CYAN, BLACK); break; } switch(VSW_2){ case 0: lcd_Str(10,16,"50mV/D ", CYAN, BLACK); break; case 1: lcd_Str(10,16,"0.1V/D ", CYAN, BLACK); break; case 2: lcd_Str(10,16,"0.25V/D", CYAN, BLACK); break; case 3: lcd_Str(10,16,"0.5V/D ", CYAN, BLACK); break; case 4: lcd_Str(10,16,"1.0V/D ", CYAN, BLACK); break; case 5: lcd_Str(10,16,"2.5V/D ", CYAN, BLACK); break; case 6: lcd_Str(10,16,"5.0V/D ", CYAN, BLACK); break; case 7: lcd_Str(10,16,"10V/D ", CYAN, BLACK); break; default:lcd_Str(10,16,"2.5V/D ", CYAN, BLACK); break; } /// TRGエッジ表示 if (POS_flag) lcd_Char(18, 16, 0x8D, YELLOW, BLACK); // TRG+表示 else lcd_Char(18, 16, 0x8E, YELLOW, BLACK); // TRG-表示 /// Disp. Unit Time Axis (msec/div) switch(TSW){ case 0: lcd_Str(19, 16, "0.2mS/D", CYAN, BLACK); break; case 1: lcd_Str(19, 16, "0.5mS/D", CYAN, BLACK); break; case 2: lcd_Str(19, 16, "1.0mS/D", CYAN, BLACK); break; case 3: lcd_Str(19, 16, "2.0mS/D", CYAN, BLACK); break; case 4: lcd_Str(19, 16, "5.0mS/D", CYAN, BLACK); break; case 5: lcd_Str(19, 16, "10mS/D ", CYAN, BLACK); break; case 6: lcd_Str(19, 16, "50mS/D ", CYAN, BLACK); break; case 7: lcd_Str(19, 16, "500mS/D", CYAN, BLACK);; break; default:lcd_Str(19, 16, "0.5mS/D", CYAN, BLACK); break; } }