JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

PIC16F1827 MCC TMR2 割込みテスト

2023-03-19 20:13:06 | MPLAB X MCC
 久しぶりにPICの記事です。

 PIC16F1827を使って、MPLAB X+ XC8 + MCCという環境で周波数カウンタを作ってみようと思っています。その準備段階でPC16F1827のTMR2割込みのテストをします。具体的には、TMR2で0.5s(500ms)ごとに割込みを発生させ、LEDを点滅させてみます。なお、MPLAB XはV6.00をXC8はv2.40を使っています。

 回路図です。LEDは、RA2に接続します。


 プロジェクトを作成してからMCCで各種の設定を行います。
 まず、Syatem moduleの設定です。
 クロックは、内部クロック4MHzとしました。Low-voltage Programming Enableはチェックを外しておきます。RA2はoutputに設定します。


 TMR2(8bit timer)を導入して設定します。設定の前にTMR2の構造を見ておきます。

 TMR2のクロックソースは、Fosc/4です。今回Fosc=4MHzですから1MHz(1us)がTMR2に入ります。
 Prescalerは、1:1~1:64の間で設定できます。今回は1:4としました。TR2には、250KHz(4us)が入ります。PR2(プリセットレジスタ 8bit)とPostscalerを設定することによりTMR2出力の周期を設定することができます。
 MCCでは、Postsaclerの分周比とTimer Periodを設定すれば自動的にPR2の値が設定されます。(PR2は8bitのため設定できる周期の範囲が表示されます)今回は、Postscaler 1:10 とし、Timer Period10msとしました。


 更に、Softwear Setting で、50倍して、Callback Function Rateを500msとしたました。

 Interrupts moduleの設定です。
 Single ISR interruptとTMR2 のEnableにチェックを入れます。



 MCCの設定は以上です。Generateして各種cファイルを生成します。

 main.cです。
 Global InterruptsとPeripheral Interruptsを有効にします。
 RA2に接続したLEDは最初消しておき、TMR2をスタートさせます。
----------------------------------------------------------------------------------
#include "mcc_generated_files/mcc.h"
void main(void)
{
     // initialize the device
     SYSTEM_Initialize();

     // Enable the Global Interrupts
     INTERRUPT_GlobalInterruptEnable();

     // Enable the Peripheral Interrupts
     INTERRUPT_PeripheralInterruptEnable();

     LATA2 = 0;
     TMR2_StartTimer();//TMR2 start
     while (1)
    {
    }
}
----------------------------------------------------------------------------------

 さて、TMR2割込みがあった時の処理ルーチンはどこに書いたら良いのでしょうか。簡単には分からずあれこれやってもうまくいかず、分かるまで丸1日かかってしまいました。各cファイルをよく読めばわかるのですが、英文なので・・・・

 timer.cファイルの中のTMR2_CallBack()関数の中に処理を書きます。
 今回は、RA2に接続したLEDを点滅させるだけなので、LATA2を反転させる式 LATA2 = 1 - LATA2;を書き込みました。
----------------------------------------------------------------------------------
void TMR2_CallBack(void)
{
    LATA2 = 1 - LATA2;
     // Add your custom callback code here
     // this code executes every TMR2_INTERRUPT_TICKER_FACTOR periods of TMR2
     if(TMR2_InterruptHandler)
    {
         TMR2_InterruptHandler();
    }
}
----------------------------------------------------------------------------------
 これで、コンパイル書き込みをしました。RA2に接続したLEDが0.5秒ごとに点滅しました。

 MCCを利用したTMR割込みの例をネットで探したのですが、あまり見つけることができす、四苦八苦でした。これからMCCを利用してタイマー割込みをやってみようという方の参考になれば幸いです。

最新の画像もっと見る

コメントを投稿