/****************************************************************** * easy_fra_v2 プログラム * * <ハード概要> * 周波数スイープとして、自作の「PIC18F_DDS_AF_OSC_V2a」を使用する。 * ログアンプを使用。縦軸は、dB軸とする。 * * 2.4インチ・カラーQVGA液晶モジュール(aitendo): UL024TF * * Condition: * 8MHz External X'tal Oscillator, 10x PLL (8MHzx10= 80MHz) * Fcy=80MHz/2=40MHz, Tcy=25ns * * MPU: dsPIC33FJ64GP802 * * N.Ishii 2015.10.16 ********************************************************************/ #include "p33FJ64GP802.h" #include "colorlcd_libdsPICVH.h" /// コンフィギュレーション設定 80MH _FOSCSEL(FNOSC_PRIPLL & IESO_OFF); // Prim OSC _FOSC(FCKSM_CSDCMD & IOL1WAY_OFF & OSCIOFNC_OFF & POSCMD_XT); _FWDT(FWDTEN_OFF); _FPOR(ALTI2C_OFF & FPWRT_PWR32); _FICD(JTAGEN_OFF & ICS_PGD1); /// A Variable (Global) char sync_m0; // NEWテンポラリ char sync_m1; // OLDテンポラリ char sync_m2; // EDGEテンポラリ int x; /// Function Prottypes void AxisDraw(void); /************************************************ * Function Main ************************************************/ int main(void){ /* Initialize Clock */ CLKDIVbits.PLLPRE = 0; // PLLPRE=1/2 to 4MHz PLLFBDbits.PLLDIV = 40; // PLLDIV=1/40 to 160MHz CLKDIVbits.PLLPOST = 0; // PLLPOST=1/2 to 80MHz then 40MIPS /* Initialize Clock */ OSCCON = 0x00300; // PRIPLL指定 CLKDIV = 0x0100; // クロックの分周1:2に設定 PLLFBD = 0x0026; // 40倍 8MHz÷2×40÷2 = 80MHz /* Initialize Port */ AD1PCFGL = 0xFFFA; // AN0,2 are Analog(AN1は、RA1のデジタル入力(スイープ同期信号入力)として使用) TRISA = 0x000F; // RA4 is Out, Other is Input TRISB = 0x000F; // Set QVGA Port Direction CNPU1 = 0x00E0; // RB1,2,3 pull up /* Initialize GLCD */ lcd_Init(); lcd_Clear(BLACK); // クリア lcd_Str(0, 0, "Start Test", CYAN, BLACK); delay_ms(1000); /* Initialize ADC */ AD1CON1= 0x0000; // SAMP bit= 0 ends sampling... and starts converting(手動AD変換) AD1CHS0= 0x0000; // Connect AN0 as CH0 input AD1CSSL= 0x0000; // 自動スキャンしない AD1CON3= 0x0002; // 手動サンプル、Tad= internal 2Tcy AD1CON2= 0x0000; // Vref=AVdd-AVss,入力スキャンしない、CH0を変換 AD1CON1bits.ADON = 1; // ADC Start /****** Main Loop ****/ while(1){ do { sync_m0 = PORTAbits.RA1; //New Sync Signal sync_m2 = sync_m1^(sync_m0 & sync_m1); //Neg_Edge Sence Sync Signal sync_m1 = sync_m0; //Chenge New Data to Old Data m1 } while(!sync_m2); // スイープ同期パルスの立下りエッジが検知されるまでエッジ検知を繰り返す。 // (立下りエッジから、スイープを開始する。) AxisDraw(); // 座標表示 /// 181回、x座標をずらしながら、サンプル→ 変換→ ドット描画を繰返し、 /// 1画面分のグラフを描画 for(x= 0; x < 181; ++x) { // delay_ms(500); // 実測、506mS delay_ms(494); // 実測、500mS AD1CON1bits.SAMP= 1; // サンプリング開始 // delay_ms(100); // 実測、101.2mS delay_ms(99); // 実測、100.08mS AD1CON1bits.SAMP= 0; // AD変換開始 while(!AD1CON1bits.DONE); // AD変換終了待ち /// 変換値をドット描画の、Y座標(レベル)に変換、そこにドット描画する。 lcd_Pixel(x,239-(ADC1BUF0)*5/22,WHITE); // delay_ms(400); // 実測、405mS(これで次回から、0.5+0.1+0.4= 1秒周期のサンプリングになる。) delay_ms(395); // 実測、400mS } } } /****************************************** * Drawing Coordinate Axis *******************************************/ void AxisDraw(void){ int i; lcd_Clear(BLACK); // X、Y座標軸表示 for(i=0; i<181; i+=45) lcd_Line(i, 17, i, 217, GREEN); // X axis for(i=17; i<218; i+=40) lcd_Line(0, i, 180, i, GREEN); // Y axis lcd_Str(0, 16, "10", CYAN, BLACK); // 10 lcd_Str(3, 16, "100", CYAN, BLACK); // 100 lcd_Str(7, 16, "1k", CYAN, BLACK); // 1k lcd_Str(10,16, "10k", CYAN, BLACK); // 10k lcd_Str(14,16, "100kHz", CYAN, BLACK); // 100kHz lcd_Str(15, 0, "+10", CYAN, BLACK); // +10 lcd_Str(15, 3, "0dB", CYAN, BLACK); // 0dB lcd_Str(15, 6, "-10", CYAN, BLACK); // -10 lcd_Str(15, 9, "-20", CYAN, BLACK); // -20 lcd_Str(15, 12, "-30", CYAN, BLACK); // -30 lcd_Str(15, 15, "-40", CYAN, BLACK); // -40 }