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開始
}
