要旨

 PIC18F14K50にてタイマ割り込みのプログラムを組み定期的にLEDを点滅させる実験を行った。


背景と目的

 PICマイコンには割り込み機能としてさまざまなものがあるが、その中で非常にポピュラーなものにタイマ割り込みがある。これはタイマで時間をカウントし一定時間経過すると現在実行中の処理をいったん止め、特定の処理をさせることができる。したがって、一定周期で何らかの処理を呼び出し実行することができるので、たとえば、一定時間ごとに測定をしたいとか何かを表示したいといった場合に有効である。そこで、今回はタイマ割り込みが使えるようにプログラムを組み動作を確認してみる。


活動の詳細
1.構想

 今回使用する実験対象は、またもやおなじみの『PICで動かすUSB』評価基板である。そして、割り込み処理で実行させる内容は特に凝ったことはせず簡単なLEDの点滅とした。ただし、評価基板に実装されているLEDはUSBの状態表示で使用しているので、それとは別に新たにRC2ポートに青LEDを接続した。(写真1を参照)プログラム中ではRC2ポートをHIGH/LOWさせればよい。

写真
写真1 青LEDを追加した評価基板(ちなみに青白のツイスト線は以前のA/D変換実験で使用したアナログ入力、灰色の線は以前のPWMモジュールの実験で使用したPWM出力)

2.プログラムの製作

 今回、割り込み要因とするタイマはTimer1モジュールとした。理由は特にない。動作条件は以下の2つを指定する。

  • 16ビットモード
  • Timer1をシステムクロックとして使用しない
  • クロックソースは命令サイクルクロック(Fosc/4=12MHz)

 上記の条件にて、LEDを1秒周期で点滅させることにする。つまり、0.5秒ごとにRC2ポート出力反転させる。そこで、必要なレジスタ設定であるがT1CONレジスタの各種設定を行うため以下の記述を追加する。なお、プリスケーラは4:1を選択してあるが理由については後述する。

T1CON = 0xA1;

 それとRC2ポートをディジタルピンに設定する必要があるので以下の記述が必要である。

ANSELbits.ANS6 = 0; //ディジタルピンにする
TRISCbits.TRISC2 = 0; //出力

 そして、最も重要なTimer1を割り込みとして使用するための記述は以下のとおり。それぞれ割り込みの許可と割り込み優先度の設定である。Timer1割り込みを使用するには、グローバル、ペリフェラル、Timer1割り込みの3つの許可が必要である。優先度は今回の実験ではどちらでもいいのだがとりあえず高とした。

INTCON = 0xC0; //グローバル割り込み、ペリフェラル割り込みを許可
PIE1bits.TMR1IE = 1; //Timer1割り込みを許可
IPR1bits.TMR1IP = 1; //Timer1割り込みの優先度を高に設定

 次は、割り込み処理の関数である。この実験ではMCHPFSUSBのサンプルプロジェクトを改造しているので割り込み処理はYourHighPriorityISRCodeという関数の中に書けばよい。その内容は、以下のとおり。流れとしては、最初に割り込み要因を調べそれがTimer1割り込みであれば処理を行う。処理内容はフラグクリアを最初に忘れないようにする。これを忘れると次の割り込みが起こらない。そして、t1intr_coutというカウンタをデクリメントしているが、これは点滅周期を0.5秒にするための時間稼ぎである。先ほどプリスケーラを4:1としたので、割り込み周期は12MHz÷4÷65536≒45.8Hzなので、約23回に一回RC2ポート出力の反転を行えば1秒周期で点滅することになる。このt1intr_coutは割り込み関数が呼ばれないときは値を保っていなければいけないので、これはグローバルで宣言しておく。mLED_3_Toggle()はサンプルプログラム内のマクロ定義にあるのでそのまま使用した。

  if(PIR1bits.TMR1IF) //割り込み要因がTimer1割り込みなら
  {
   PIR1bits.TMR1IF = 0; //flag clear
   t1intr_count--; //カウンタをデクリメント
   if(t1intr_count == 0) //カウンタが0なら
   {
    t1intr_count = 23; //カウンタを23に
    mLED_3_Toggle(); //RC2ポート出力を反転
   }
  }

3.動作確認

 上記のプログラムを焼きこみ、動作を確認したところ正しく動作した。LED点滅を写真で表すのは困難なので、ここではRC2ポートの出力波形を観測した結果を図3に示す。確かに約1秒周期でポート出力がHIGH/LOWしている。

出力波形
図3 RC2ポートの出力波形

まとめと今後の課題

 PIC18F14K50にてタイマ割り込みのプログラムを組み正しくタイマ割り込みを行わせることができた。割り込み処理や割り込み速度などを変えればいろいろな応用が利くと思うので、今後これを活用してみたい。