PIC32MX1/2/5 Starter Kitを使ってとりあえずLEDをチカチカさせます。
http://www.microchip.com/DevelopmentTools/ProductDetails.aspx?PartNO=dm320100
【環境】
OS:Windows 7(64bit)
IDE:MPLAB X IDE v3.20
レガシィなライブラリを使った実装
#include <plib.h>
const int LED1 = BIT_0;
int main() {
int i;
/* setup LED */
mPORTDSetPinsDigitalOut(LED1);
while(1) {
mPORTDToggleBits(LED1);
for (i = 0; i < 10000; i++);// wait
}
return 0;
}
このコードはJohn S. LoomisさんのLight Switches (updated 2008)に記載されているコード参考にしています。
もちろん動作するのですが、この環境(MPLAB X IDE v3.20)で使用しようとすると、plib.hを引っ張ってくる必要がありました。PIC32 Peripheral LibraryをキーワードにMicrochipからダウンロードします。
このライブラリはレガシィなものなので、ビルド実行時に結構な数のwarningを見ることになります。
plib.hを使用しない実装
#include <p32xxxx.h>
int main() {
int i;
/* setup LED */
TRISDbits.TRISD0 = 0x00;//※1
while(1) {
LATDbits.LATD0 ^= 0x01;
for (i = 0; i < 10000; i++);
}
return 0;
}
(※1)でDポートの0ビットを出力に設定しています。Dポートの0ビットというのがLED1にあたります。このTRISx(TRISA, TRISB etc)はThe data direction registerといって、データの方向を決めるレジスタです。1でInput、0でOutputに設定できます。
(※2)ではラッチの設定を行っており、実行の度にHigh-lowが切り替わるのでLEDが点滅するという動作になります。
forループはwaitの役割をしています。pic32用にxc32というコンパイラを使用しているのですが、MicrochipのFAQにも記載がある通り「Delay関数(マクロ)はありません」。遅延時間が必要な場合は「タイマを使います」ということなので、
タイマを使用した実装
#include <p32xxxx.h>
#include <plib.h>
int main()
{
TRISDbits.TRISD0 = 0x00;
// Timer Setup
OpenTimer2(T2_ON | T2_SOURCE_INT | T2_PS_1_256, 100);
ConfigIntTimer2(T2_INT_ON | T2_INT_PRIOR_2);
INTEnableSystemMultiVectoredInt();
while(1) {
//do nothing
}
return 0;
}
//Timer2 ISR
void __ISR(_TIMER_2_VECTOR, ipl2) handlesTimer2Ints(void) {
mT2ClearIntFlag();
LATDbits.LATD0 ^= 0x01;
}
PICの情報はたくさんあるのですが、自分の環境で動かそうとするとやはりデータシートをしっかりと読む必要があるということを痛感しました。
M5←ここのtutorialで勉強しました。