PIC32MX250F128Bのサンプルプログラム(タイマー割り込みを使ったLチカ)  投稿者:ケンケン  投稿日:2018年 9月23日(日)16時19分48秒 NE0356lan1.rev.em-net.ne.jp 返信・引用
  以前、PIC32MX370F512Hを使用するにあたり、必要最低限の回路とタイマー割り込みを
使ってLEDを点滅させるサンプルプログラムを紹介しました。
https://8130.teacup.com/kenken/bbs/656

考えてみれば、より低価格で手軽な28ピンDIPタイプのPIC32MX1xx/2xxシリーズのほうが
必要な人が多そうなので、あらためて紹介します。
内蔵クロックにより48MHzで動作させ、タイマー割り込みを使用してRB8に接続したLEDを
1秒間隔で点滅させます。

PIC32MXシリーズ用のXC32コンパイラは、v1.33あたりからそれまで内蔵していたPLIBと
呼ばれる周辺ライブラリを使わない方針となり、別途インストールが必要となりました。
PIC32MXの解説本やWebサイトの記事などはPLIBを使用しているものが多く、最新の
コンパイラではコンパイルすらできません。

どうもPIC32MXを初めて使う人がつまづく原因の多くがそこにありそうなので、PLIBを
使用しないでタイマー割り込みをさせるサンプルプログラムを紹介します。

■回路製作上の注意点(最低限の必要事項)
・VDD、VSSの端子は省略せずに全て電源/GNDに接続する
・AVDD、AVSSの端子も必ず電源/GNDに接続する
・MCLRは10KΩで電源にプルアップ
・電源端子間(8と13、27と28)にパスコンとして0.1μFのセラミックコンデンサを接続
・VCAP(20番ピン)には10μFのセラミックコンデンサを通してGNDに接続
・PICkit3等によるICSP書き込みはMCLRとPGECx、PGEDxを使用(xは1~3)
・USB搭載品(PIC32MX2xxシリーズ)では23番ピン(VUSB3V3)をVDDに接続
USB非搭載品(PIC32MX1xxシリーズ)では不要

以下、サンプルプログラムのソースです。
MPLAB Xで新規プロジェクトを作成し、このソース1つ追加するだけでビルド可能です。
最新のXC32 v2.10での動作を確認しています。

--------------------------------------------------------------

// タイマー割り込みによるLチカ for PIC32MX250F128B
// 内蔵クロック 48MHzで動作、周辺クロック:システムクロック = 1:1

// DEVCFG3
// USERID = No Setting
#pragma config PMDL1WAY = OFF           // Peripheral Module Disable Configuration (Allow multiple reconfigurations)
#pragma config IOL1WAY = OFF            // Peripheral Pin Select Configuration (Allow multiple reconfigurations)
#pragma config FUSBIDIO = OFF           // USB USID Selection (Controlled by Port Function)
#pragma config FVBUSONIO = OFF          // USB VBUS ON Selection (Controlled by Port Function)

// DEVCFG2
#pragma config FPLLIDIV = DIV_2         // PLL Input Divider (2x Divider)
#pragma config FPLLMUL = MUL_24         // PLL Multiplier (24x Multiplier)
#pragma config FPLLODIV = DIV_2         // System PLL Output Clock Divider (PLL Divide by 2)

// DEVCFG1
#pragma config FNOSC = FRCPLL           // Oscillator Selection Bits (Fast RC Osc with PLL)
#pragma config FSOSCEN = OFF            // Secondary Oscillator Enable (Disabled)
#pragma config IESO = OFF               // Internal/External Switch Over (Disabled)
#pragma config POSCMOD = OFF            // Primary Oscillator Configuration (Primary osc disabled)
#pragma config OSCIOFNC = OFF           // CLKO Output Signal Active on the OSCO Pin (Disabled)
#pragma config FPBDIV = DIV_1           // Peripheral Clock Divisor (Pb_Clk is Sys_Clk/1)
#pragma config FCKSM = CSDCMD           // Clock Switching and Monitor Selection (Clock Switch Disable, FSCM Disabled)
#pragma config WDTPS = PS1048576        // Watchdog Timer Postscaler (1:1048576)
#pragma config WINDIS = OFF             // Watchdog Timer Window Enable (Watchdog Timer is in Non-Window Mode)
#pragma config FWDTEN = OFF             // Watchdog Timer Enable (WDT Disabled (SWDTEN Bit Controls))

// DEVCFG0
#pragma config JTAGEN = OFF             // JTAG Enable (JTAG Disabled)
#pragma config ICESEL = ICS_PGx1        // ICE/ICD Comm Channel Select (Communicate on PGEC1/PGED1)
#pragma config PWP = OFF                // Program Flash Write Protect (Disable)
#pragma config BWP = OFF                // Boot Flash Write Protect bit (Protection Disabled)
#pragma config CP = OFF                 // Code Protect (Protection Disabled)

#include 
#include 

int counter=0;

// タイマー2割り込み処理ルーチン
void __ISR(_TIMER_2_VECTOR, IPL4AUTO) T2Interrupt(void) {
    counter++;
    if (counter == 10) {
        LATBINV = 0x100; // Toggle LED (RB8を反転)
        counter = 0;
    }
    IFS0bits.T2IF = 0; // Reset interrupt flag
}

int main(void) {
    // Data Memory SRAM wait states: Default Setting = 1; set it to 0
    BMXCONbits.BMXWSDRM = 0; // SRAMのウェイトステートを0にする

    // Set the interrupt controller for multi-vector mode
    INTCONSET = _INTCON_MVEC_MASK; //割り込みをマルチベクタモードに設定

    // Set the CP0 Status IE bit to turn on interrupts globally
    __builtin_enable_interrupts(); //割り込み有効化

    // ピンの入出力設定(全て出力)
    TRISA = 0;
    TRISB = 0;
    ANSELA =0;
    ANSELB =0;
    ODCA = 0;
    ODCB = 0;

    //タイマー2割り込み設定
    T2CON = 0x70; // prescale 1:256, 16bit mode
    PR2 = 18750; // 100ms (48MHz/256*0.1)
    TMR2 = 0; // clear Timer 2 counter

    IPC2bits.T2IP = 4; // T2割り込み優先度4に設定
    IFS0bits.T2IF = 0; // T2割り込みフラグをクリア
    IEC0bits.T2IE = 1; // T2割り込み有効化

    T2CONbits.TON = 1; // タイマー2開始
}