久しぶりに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を利用してタイマー割込みをやってみようという方の参考になれば幸いです。