/************************************************************************ * PIC24_GC_QVGA_TEST * 高速ADCを試す前に、オシロの表示器として使う * カラーQVGA液晶の、表示テストを行う。 * * MPU:PIC24FJ64GC006 * 2.4インチQVGA液晶モジュール(aitendo): UL024TF使用 * * デバッグ年月日: 2015/12/12 N.Ishii * ================================================================== * /// 以下は、後閑氏のオリジナル・コメント(これを基にスタンドアロン化) * ワイアレスオシロスコープ * PIC24FJ64GC006 の10Mspsのパイプライン型ADCの使用例 *  Timer2でA/D変換し、DMAでバッファに格納 * 可能な変換速度は 4Mspsが限界 @Tad=8MHz *  コマンドで下記実行 *   T :変換開始 2000回のサンプリングを送信する * *************************************************************************/ #include #include "colorlcd_libdsPICVH.h" #include #include "imagedata.h" /* コンフィギュレーションの設定 */ // CONFIG4 #pragma config DSWDTPS = DSWDTPS1F // Deep Sleep Watchdog Timer Postscale Select bits (1:68719476736 (25.7 Days)) #pragma config DSWDTOSC = LPRC // DSWDT Reference Clock Select (DSWDT uses LPRC as reference clock) #pragma config DSBOREN = OFF // Deep Sleep BOR Enable bit (DSBOR Disabled) #pragma config DSWDTEN = OFF // Deep Sleep Watchdog Timer Enable (DSWDT Disabled) #pragma config DSSWEN = OFF // DSEN Bit Enable (Deep Sleep operation is always disabled) #pragma config RTCBAT = OFF // RTC Battery Operation Enable (RTC operation is discontinued in VBAT) #pragma config PLLDIV = DIV2 // PLL Input Prescaler Select bits (Oscillator divided by 2 (8 MHz input)) #pragma config I2C2SEL = PRI // Alternate I2C2 Location Select bit (I2C2 is multiplexed to SDA2/RA3 and SCL2/RA2 ) #pragma config IOL1WAY = OFF // PPS IOLOCK Set Only Once Enable bit (The IOLOCK bit can be set and cleared using the unlock sequence) // CONFIG3 #pragma config WPFP = WPFP127 // Write Protection Flash Page Segment Boundary (Page 127 (0x1FC00)) #pragma config SOSCSEL = OFF // SOSC Selection bits (Digital (SCLKI) mode) #pragma config WDTWIN = PS25_0 // Window Mode Watchdog Timer Window Width Select (Watch Dog Timer Window Width is 25 percent) #pragma config BOREN = OFF // Brown-out Reset Enable (Brown-out Reset Disabled) #pragma config WPDIS = WPDIS // Segment Write Protection Disable (Disabled) #pragma config WPCFG = WPCFGDIS // Write Protect Configuration Page Select (Disabled) #pragma config WPEND = WPENDMEM // Segment Write Protection End Page Select (Write Protect from WPFP to the last page of memory) // CONFIG2 #pragma config POSCMD = EC // Primary Oscillator Select (External-Clock Mode Enabled) #pragma config WDTCLK = LPRC // WDT Clock Source Select bits (WDT uses LPRC) //#pragma config OSCIOFCN = OFF // OSCO Pin Configuration (OSCO/CLKO/RC15 functions as CLKO (FOSC/2)) #pragma config FCKSM = CSDCMD // Clock Switching and Fail-Safe Clock Monitor Configuration bits (Clock switching and Fail-Safe Clock Monitor are disabled) #pragma config FNOSC = PRIPLL // Initial Oscillator Select (Primary Oscillator with PLL module (XTPLL,HSPLL, ECPLL)) #pragma config ALTADREF = AVREF_RA // External 12-Bit A/D Reference Location Select bit (AVREF+/AVREF- are mapped to RA9/RA10) #pragma config ALTCVREF = CVREF_RA // External Comparator Reference Location Select bit (CVREF+/CVREF- are mapped to RA9/RA10) #pragma config WDTCMX = WDTCLK // WDT Clock Source Select bits (WDT clock source is determined by the WDTCLK Configuration bits) #pragma config IESO = OFF // Internal External Switchover (Disabled) // CONFIG1 #pragma config WDTPS = PS32768 // Watchdog Timer Postscaler Select (1:32,768) #pragma config FWPSA = PR128 // WDT Prescaler Ratio Select (1:128) #pragma config WINDIS = OFF // Windowed WDT Disable (Standard Watchdog Timer) #pragma config FWDTEN = WDT_DIS // Watchdog Timer Enable (WDT disabled in hardware; SWDTEN bit disabled) #pragma config ICS = PGx2 // Emulator Pin Placement Select bits (Emulator functions are shared with PGEC2/PGED2) #pragma config LPCFG = ON // Low power regulator control (Low voltage regulator controlled in sw by RETEN bit) #pragma config GWRP = OFF // General Segment Write Protect (Disabled) #pragma config GCP = OFF // General Segment Code Protect (Code protection is disabled) #pragma config JTAGEN = OFF // JTAG Port Enable (Disabled) /* /// 以下は、オシロ用変数なので今回は未使用 // グローバル変数、定数定義 unsigned char Flag; int Index, i, temp; unsigned int MaxRes; // アナログ出力最高分解能// #define Max_Size 2016 // サンプリング数 __attribute__((far)) unsigned char RcvBuf[64]; __attribute__((far)) unsigned int Buffer[Max_Size+50]; // Max 2016+50word */ char Buf[17]; //文字列のバッファー用レジスタ char str_Hellow[] = "Hellow"; char str_World[] = "World !!"; char str_Tokyo[] = "Tokyo"; char str_Japan[] = "Japan"; char str_Chiyodaku[] = "Chiyodaku"; char str_Sotokanda[] = "Sotokanda"; char str_Akihabara[] = "Akihabara"; char str_AKB48[] = "AKB48"; long int T0 = 5000; ////--------------------------------------------------------------------------------------------------------- /********************************************* * 2次元立体グラフ描画関数 * z(x,y) = 1/(1+SQRT(x2+y2))*COS(SQRT(x2+y2)) * (-3*PI< x,y < 3*PIの範囲) * zの最大値をPOTで変更する * * 追加:後閑氏作成PIC24F用関数を、拝借 **********************************************/ /* グローバル定数 */ #define X0 5 #define Y0 20 #define PI 3.141592654f #define NODES 38 #define SIDE 6 // 描画関数 void D2Graph(short Hight) { short i, j, px, py,x, y, z; float zf, xf, yf, sf; struct{ short x; short y; } edge[NODES], prev; lcd_Line(X0, 3, X0, ENDPAGE-12 ,GREEN); // z axis lcd_Line(X0-3, Y0, ENDCOL, Y0, GREEN); // x axis lcd_Line(X0, Y0-2, X0+140, Y0+140, GREEN); // y axis for(j=0; j> 12; // 10進スイッチの入力 /// スイッチの値により各処理へ分岐 switch(SW){ case 0: // 文字列描画 lcd_Str(0,0,str_Hellow,BLACK,WHITE); lcd_Str(1,1,str_World,RED,WHITE); lcd_Str(2,2,str_Japan,BLUE,WHITE); lcd_Str(3,3,str_Tokyo,WHITE,BLACK); lcd_Str(4,4,str_Chiyodaku,RED,BLACK); lcd_Str(5,5,str_Sotokanda,GREEN,BLACK); lcd_Str(6,6,str_Akihabara,RED,YELLOW); lcd_Str(7,7,str_AKB48,GREEN,YELLOW); Delayms(T0); // 5秒待ち lcd_Clear(BLACK); // クリア break; case 1: // ASCII文字の描画 for(j=0; j<17; j++){ // ASCII文字全表示: 26文字/行 * 17文字/列=442キャラクタ for(i=0; i<26; i++){ index = j*26+i+0x20; // スペースコードから開始し、1行26文字で繰返し if (j<4) lcd_Char(i, j, index, WHITE, BLACK); // 文字表示制御 if ((j>3) && (j<8)) lcd_Char(i, j, index, GREEN, BLACK); if ((j>7) && (j<12))lcd_Char(i, j, index, RED, BLACK); if ((j>11) && (j<17))lcd_Char(i, j, index, YELLOW, BLACK); } } Delayms(T0); // 5秒待ち lcd_Clear(BLACK); // クリア break; case 2: // 画面全体描画(16ビットカラー各色で順次全体描画) lcd_Clear(WHITE); Delayms(1000); lcd_Clear(BLACK); Delayms(1000); lcd_Clear(RED); Delayms(1000); lcd_Clear(GREEN); Delayms(1000); lcd_Clear(BLUE); Delayms(1000); lcd_Clear(CYAN); Delayms(1000); lcd_Clear(MAGENTA); Delayms(1000); lcd_Clear(YELLOW); Delayms(1000); lcd_Clear(BROWN); Delayms(1000); lcd_Clear(ORANGE); Delayms(1000); lcd_Clear(PERPLE); Delayms(1000); lcd_Clear(COBALT); Delayms(1000); Delayms(T0); // 5秒待ち lcd_Clear(BLACK); // クリア break; case 3: // 斜め直線描画 lcd_Clear(WHITE); // クリア for(i=0; i<240; i++){ // 斜め直線の表示: 白ベタ背景・黒線表示 lcd_Pixel(i,i,BLACK); lcd_Pixel(240+i, i,BLACK); } Delayms(T0); // 5秒待ち lcd_Clear(BLACK); // クリア for(i=0; i<240; i++){ // 斜め直線: 黒ベタ背景・白線表示 lcd_Pixel(i,i,WHITE); lcd_Pixel(240+i, i,WHITE); } Delayms(T0); // 5秒待ち lcd_Clear(BLACK); // クリア break; case 4: // 直線描画テスト i = 0; for(j=0; j<120; j+=10){ // ボックス表示 lcd_Line(j,j, 319-j, j,YELLOW); // 次第に小さなボックスへ lcd_Line(j,j, j, 239 -j,YELLOW); lcd_Line(319-j,239-j, 319-j,j,YELLOW); lcd_Line(319-j,239-j, j,239-j,YELLOW); Delayms(500); } Delayms(T0); lcd_Clear(BLACK); // クリア break; case 5: // 円描画 for(i = 0; i < 10; i++){ lcd_Circle(320/2 + 5*i,240/2,240/2,GREEN); } Delayms(T0); lcd_Clear(BLACK); // クリア break; case 6: // 曲線描画(2次元グラフ表示) for(i=0; i<8; i++){ // 曲線描画 lcd_Clear(BLACK); lcd_Str(0, 0, "Graphic Display", BLUE, BLACK); D2Graph(20*i); //曲面グラフ表示 Delayms(2000); } Delayms(T0); lcd_Clear(BLACK); // クリア break; case 7: // イメージグラフィック表示 lcd_Image(0, Header1, MAGENTA, BLACK); lcd_Image(8, Header2, CYAN, BLACK); lcd_Image(16, My_PIC_Scope, GREEN, BLACK); Delayms(T0); lcd_Clear(BLACK); // クリア break; case 8: // オシロV6の、座標画面デザイン確認用デモ表示 // X、Y座標軸,補助線表示 for(i=0; i<319; i+=50) lcd_Line(i, 0, i, 231, BROWN); // Y axis for(i=0; i<239; i+=58) lcd_Line(0, i, 319, i, BROWN); // X axis lcd_Char(0, 16, 0x8B, YELLOW, BLACK); // AC表示 lcd_Str(1, 16, "2.5V/D", CYAN, BLACK); // 1CH 電圧レンジ表示 lcd_Char(9, 16, 0x8C, YELLOW, BLACK); // DC表示 lcd_Str(10, 16, "2.5V/D", CYAN, BLACK); // 2CH 電圧レンジ表示 lcd_Char(18, 16, 0x8D, YELLOW, BLACK); // TRG+表示 lcd_Str(19, 16, "1.0mS/D", CYAN, BLACK);// 時間軸レンジ表示 Delayms(T0); lcd_Clear(BLACK); // クリア break; default: // 上ケース0〜8以外の時は、デバッグLED点滅テスト LATDbits.LATD1= 1; // デバッグLED 点灯 Delayms(500); LATDbits.LATD1= 0; // デバッグLED 消灯 Delayms(500); break; } } /*********** メイン関数 **************************/ int main(void){ /* クロックの設定 8MHz→96MHz÷3=32MHz */ CLKDIVbits.RCDIV = 0; // 1/1 8MHz CLKDIVbits.CPDIV = 0; // 32/1= 32MHz /* I/Oの初期設定 */ TRISB = 0xFF3F; // RB1-5(OPアンプ+AN4pin), RB12〜 RB15:DSW 4bit is Input TRISD = 0; // すべてOutput:LCD制御信号:RD7=RS, RD6=CS/, RD5=WR/, RD4=RST/, RD1=DEBUG LED TRISE = 0; // すべてOutput:LCDデータ 8bit:RE0〜 RE7 TRISF = 0x0020; // RF5 input(今回の実験では未使用だが後閑さんの設定にしておく) TRISG = 0x02C0; // RG6,7,9 Input(OPアンプpin) LATDbits.LATD1= 0; // DEBUG LED 消灯 CNPU1bits.CN2PUE = 1; // RB0 Pullup(今回の実験では未使用だが後閑さんの設定にしておく) CNPU1bits.CN12PUE = 1; // RB15=DSW_b3 Pullup CNPU3bits.CN32PUE = 1; // RB14=DSW_b2 Pullup CNPU2bits.CN31PUE = 1; // RB13=DSW_b1 Pullup CNPU2bits.CN30PUE = 1; // RB12=DSW_b0 Pullup /* アナログピン指定 */ ANSF = 0; // すべてデジタル ANSB = 0; // いったんデジタルにセット ANSBbits.ANSB1 = 1; // OA2NB ANSBbits.ANSB2 = 1; // OA2NC ANSBbits.ANSB3 = 1; // OA2OUT ANSBbits.ANSB4 = 1; // AN4 ADC Input ANSBbits.ANSB5 = 1; // OA1OUT ANSG = 0; // いったんデジタルにセット ANSGbits.ANSG6 = 1; // OA1PB ANSGbits.ANSG7 = 1; // OA1NE ANSGbits.ANSG9 = 1; // DAC1OUT ///以下、オシロ用の設定なので今回は、未使用 /* /// タイマ2設定(A/D変換トリガ用) T2CON = 0; // Prescaler 1/1 TMR2 = 0; // カウンタクリア PR2 = 3; // 250nsec period (4MHz) /// DMA、ADC初期設定 Init(); /// ADC Start & Ready DMA ADSTATLbits.SL0IF = 0; // ADC Flag Clear DMACH0bits.CHEN = 1; // DMA Channel Enable & Start IFS0bits.DMA0IF = 0; // DMA Interrupt Flag Reset /// 変数初期化 Index = 0; // 初期状態にセット Flag = 0; MaxRes = 1000; */ /// 以下に書かれていたオシロ用のメインループと、サブ関数は今回未使用なので削除した // 液晶表示器の初期化(今回必要) lcd_Init(); lcd_Clear(BLACK); while(1){ DisplayFunc(); } } /* /// 以下、液晶ライブラリに移動(この遅延は、ハードウエア割込みと思われる。151202 /////////////////////////////////////////////// // タイマ4による1msec単位の遅延関数 Tcy=16MHz /////////////////////////////////////////////// void Delayms( unsigned int t){ IFS1bits.T4IF = 0; // 割り込みフラグクリア PR4 = 2000; // 1msec設定 T4CON = 0x8010; // タイマ4スタート プリスケーラ 1/8 while (t--) { // 繰り返し回数 while (!IFS1bits.T4IF); // 1msec待ち IFS1bits.T4IF = 0; // 割り込みフラグクリア } } */