• 締切済み

PIC24F C言語プログラミングについて

PIC24Fについて こんにちわ PIC24Fの勉強をしています。 使っているPICはPIC24FJ64GA002で、コンパイラは MPLAB IDE,C30 です。 現在LEDを2つ使って、異なるタイミングで点滅させるプログラムを作りたいと思っています。 参考書に載っていたプログラムを参考にして、1つのLEDを点滅させることはできました。 下にそのプログラムを書きます。 #include "p24FJ64GA002.h" /// コンフィギュレーション ビットの設定 _CONFIG1( JTAGEN_OFF & GCP_OFF & GWRP_OFF & BKBUG_OFF & COE_OFF & ICS_PGx1& FWDTEN_OFF ) /// 8MHz*PLL4=32MHz (Full Speed) _CONFIG2( IESO_OFF & FNOSC_FRCPLL & FCKSM_CSDCMD & OSCIOFNC_OFF & IOL1WAY_OFF & I2C1SEL_PRI & POSCMOD_NONE) int main(void) { CLKDIV = 0; // クロックの分周1:1に設定 AD1PCFG = 0xFFFF; // ポートA全ディジタルに指定 /// ポートの入出力モード設定 TRISB = 0; // ポートB を出力に設定 /// タイマ1の設定 FOSC=16MHz,プリスケーラ 1:256, 200msec=5Hz PR1 = 12500-1; // 16000000/5/256=12500 T1CON = 0b1000000000110000; /// メイン ループ while(1) { if(IFS0bits.T1IF) // タイマ割り込みチェック { IFS0bits.T1IF = 0; // 割り込みフラグクリア /// LEDの反転制御 LATBbits.LATB15 = !LATBbits.LATB15; } } } 2つの点滅のタイミングをずらすために、またさらにPRレジスタ(PR2)を付け加え、適当な値にします。 すると、割り込みフラグT2IFビットがセットされると思います。 そこでさらにもう一つif文をつけ、同様の書式で異なるピンにLATを割り振ってやれば異なるタイミングで割り込みが起きるというやり方でやろうと思っています。(まずこれで正しいのかどうかもわかりませんが・・・。) ですがそれ以降がよくわかりません。 まず if文の中に入っている(IFS0bits.T1IF)とはどういう意味を持っているのでしょうか? C言語にも疎く、if文に=や不等号などの条件が入っていないものを見るのも初めてです。 この他、○○bits.○○ というような書き方が手持ちの参考書に頻出している上に、まだ読んでいる途中ですので何とも言えませんが、どこにも詳しく書いてありません。 LATBbits.LATB15 = !LATBbits.LATB15 くらいならなんとなく想像はつきますが書式もいまいちわかりません また、 同様にif文を使ってやる場合、IFSxレジスタは何を使えばいいのでしょうか? 割り込みベクタテーブル表を見ると、使っているタイマ1の割り込みフラグがIFS0<3>となっていましたので、PR2によりセットされたT2IFと合わせて if(IFS0bits.T2IF)~ と適当に入力してみましたが、シミュレータでもうまくいきません。 分かりづらい文章かと思いますが、よろしくお願いします。

みんなの回答

回答No.2

私もPIC24FJ64GA002と、PIC24FJ64GA004を使用しております。 さて、LED2個の時間差点滅プログラムのサンプルが、後閑氏の書籍に載っておりましたので、引用しておきます。MPLAB C30です。 *** 引用開始 *** /********************************************** * PIC24F標準基板(PIC24FJ64GA002) * Timer1 : タイマテスト 割り込みでLEDを点滅制御 *  タイマ1=500msec タイマ2=250msec *  スイッチによりCPUの割り込みレベル変更 LED高速点滅停止 ***********************************************/ #include "p24FJ64GA002.h" /// コンフィギュレーション ビットの設定 _CONFIG1( JTAGEN_OFF & GCP_OFF & GWRP_OFF & BKBUG_OFF & COE_OFF & ICS_PGx1& FWDTEN_OFF ) /// 8MHz*PLL4=32MHz (Full Speed) _CONFIG2( IESO_OFF & FNOSC_FRCPLL & FCKSM_CSDCMD & OSCIOFNC_OFF & IOL1WAY_OFF & I2C1SEL_PRI & POSCMOD_NONE) /************************ * メイン関数 ************************/ int main(void){ CLKDIV = 0; // クロック分周 1:1 AD1PCFG = 0xFFFF; // 全ポートをディジタルに指定 /// ポートの入出力モード設定 TRISB = 0xF0A0; // ポートB RB15-12,7,5 input CNPU2bits.CN23PUE = 1; // CN23 スイッチ用プルアップ /// タイマ1設定 /// 500msec周期  内部クロック,1/256,FOSC=16MHz T1CON = 0b1000000000110000; // PR1 = 31249; // 500msec IPC0bits.T1IP = 5; // 割り込みレベル5に設定 IEC0bits.T1IE = 1; // 割り込み許可 /// タイマ2設定 /// 250msec周期 内部クロック、1/256、FOSC=16MHz T2CON = 0b1000000000110000; PR2 = 15624; // 250msec IPC1bits.T2IP = 3; // 割り込みレベル3 IEC0bits.T2IE = 1; // 割り込み許可 /// メインループ while(1) { /// CPU割り込みレベル設定 if(PORTBbits.RB7) // スイッチの入力チェック SRbits.IPL = 2; // CPUの割り込みレベル2 else SRbits.IPL = 4; // CPUの割り込みレベル4 } } /********************* * タイマ1割り込み処理 **********************/ void __attribute__((interrupt, no_auto_psv)) _T1Interrupt(void){ IFS0bits.T1IF = 0; // 割り込みフラグクリア /// 2個のLEDの反転制御 LATBbits.LATB11 = !LATBbits.LATB11; LATBbits.LATB10 = !LATBbits.LATB10; } /********************** * タイマ2割り込み処理 **********************/ void __attribute__((interrupt, no_auto_psv)) _T2Interrupt(void){ IFS0bits.T2IF = 0; // 割り込みフラグクリア /// 2個のLEDの反転制御 LATBbits.LATB9 = !LATBbits.LATB9; LATBbits.LATB8 = !LATBbits.LATB8; } *** 引用 終わり *** 引用した書籍は、 C言語ではじめる PIC24F活用ガイドブック [大型本] 後閑 哲也 (著) 価格:¥ 3,360 大型本: 472ページ 出版社: 技術評論社 (2007/10/18) ISBN-10: 4774132470 ISBN-13: 978-4774132471 発売日: 2007/10/18 商品の寸法: 23 x 18 x 3.2 cm CDが添付されていて、全てのサンプルプログラムが公開されています。 この書籍はアマゾンなどで入手可能です。 頑張ってくださいね。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

えーと、まず「Cにおける論理値」と構造体、特に「ビットフィールド」をきっちり勉強されるのが良いかと思います。 一応解説すると、 > if文の中に入っている(IFS0bits.T1IF)とは IFS0bits.T1F != 0 と同じ意味を持ちます。 > ○○bits.○○ というような書き方 これは前述の通りビットフィールドのことを理解すればわかります。 PICやMPLABは使ったことがないのでどのレジスタを使うかと言った話には答えられませんが、そこより先に上記の理解を進めたほうがいいかと思います。

関連するQ&A