2012年9月1日土曜日

PIC32MX220F032B-02 LEDチカチカ(各種タイマ割り込み)をする


秋月にてPIC32MX220F032Bが220円と大変安価かつDIPにて32bitマイコンが手に入るようになりました.
折角なので,PIC16FシリーズだけでなくPIC32MXも遊んでみようと試みようと
後閑さんの『高速・多機能を実現する pic32mx活用ガイドブック
を購入させていただきました.
大変良くまとまっています.PIC32MXをC32コンパイラで使うなら手元に置いておきたい.購入するべきです.
しかしながらPIC32MX340F256H用に書かれたものであり,PIC16Fシリーズで扱っていたCCS-Cなどと異なり,単純なコピー&ペーストを行っただけではコンパイルエラーになったり正しい動作が行われなかったりしまてしまいました.
ここではPIC32MX220F032B用に書き直して紹介していきたいと思います.


注意:私の提供する情報を元に何らかのトラブルが生じても責任を負いません.


<今回行うこと>
PIC32MX220F032BにてI/Oの基本機能を扱えるようにします.
タイマ1,タイマ2,タイマ3を16ビットモードで,
タイマ4,タイマ5をタイマ45の32ビットモードとして扱います.
タイマの割り込みが行えているかどうか確認するために,RA0~RA3にLEDを取り付けてそれぞれの割り込みが行われた際にそれに対応したI/Oポートの出力状態を反転することで可視化を図ります.
  • タイマ1:100msecごとにRA0の出力を反転
  • タイマ2:200msecごとにRA1の出力を反転
  • タイマ3:400msecごとにRA2の出力を反転
  • タイマ45:800msecごとにRA3の出力を反転
<対象者>
PIC32MX220F032BでLEDチカチカ(+入力)をするを理解した方

<用意するもの>

<配線>
RA0~RA3にLEDがそれぞれ点灯するようにLEDおよび抵抗を接続してください.
私がブレッドボードにて配線を行った例を図1に示します.

図1 配線例
ブレッドボードでLEDを使用しようとすると抵抗によってスペースの無駄ができてしまいます.
私はこれを大変嫌っており,チップ抵抗とチップLEDを組み合わせたミニボードを自作し利用しています.

<プログラム>
以下からソースコードをダウンロードできます.(リンク先にてCtrl+SでZIP保存)
https://docs.google.com/open?id=0B25yKH5pEApFRkVhWFJVUmY5c0E

前回のプログラムから以下を追加するだけです.

    //Timer1 Enable Setting     25nsec x 64 x 62500 = 100msec
    OpenTimer1(T1_ON | T1_SOURCE_INT | T1_PS_1_64, 62500);
    //Timer1 interrupt Setting
    ConfigIntTimer1(T1_INT_ON | T1_INT_PRIOR_2);

    //Timer2 Enable Setting     25nsec x 256 x 31250 = 200msec
    OpenTimer2(T2_ON | T2_SOURCE_INT | T2_PS_1_256, 31250);
    //Timer2 interrupt Setting
    ConfigIntTimer2(T2_INT_ON | T2_INT_PRIOR_2);

    //Timer3 Enable Setting     25nsec x 256 x 62500 = 400msec
    OpenTimer3(T3_ON | T3_SOURCE_INT | T3_PS_1_256, 62500);
    //Timer3 interrupt Setting
    ConfigIntTimer3(T3_INT_ON | T3_INT_PRIOR_2);

    //Timer45 Enable Setting     25nsec x 256 x 125000 = 800msec
    OpenTimer45(T45_ON | T45_SOURCE_INT | T45_PS_1_256, 156250);
    //Timer45 interrupt Setting
    ConfigIntTimer45(T45_INT_ON | T45_INT_PRIOR_2);

    //割り込み許可
    INTEnableSystemMultiVectoredInt();

 /**********************************
*  Timer1割り込み処理
**********************************/
void __ISR(4, ipl2) T1_interrupt(void){
    mT1ClearIntFlag(); //割り込みフラグクリア
    mPORTAToggleBits( BIT_0 );
}

/**********************************
*  Timer2割り込み処理
**********************************/
void __ISR(8, ipl2) T2_interrupt(void){
    mT2ClearIntFlag(); //割り込みフラグクリア
    mPORTAToggleBits( BIT_1 );
}

/**********************************
*  Timer3割り込み処理
**********************************/
void __ISR(12, ipl2) T3_interrupt(void){
    mT3ClearIntFlag(); //割り込みフラグクリア
    mPORTAToggleBits( BIT_2 );
}

/**********************************
*  Timer45割り込み処理
**********************************/
void __ISR(20, ipl2) T45_interrupt(void){
    mT5ClearIntFlag(); //割り込みフラグクリア
    mPORTAToggleBits( BIT_3 );
}






ブログランキング・にほんブログ村へ

0 件のコメント:

コメントを投稿