PIC12F1822の割り込み処理について

このエントリーをはてなブックマークに追加

 

 割り込み処理について簡単に説明します。割り込み処理とは、動作中の処理を一時中断し、違う処理をさせる処理です。詳しくはこちら(ウィキペディア)を参照してください。
 PIC12F1822の割り込み処理について簡単に説明します。説明の内容は簡単に表現しているため、厳密ではないことがあります。また特殊な動作をすることがあるため、詳しくは「PIC12F1822について」からデータシートを参照してください。
 割り込み処理を有効にするにはGIEビットを1にします。割り込み処理が有効で割り込みが発生した場合、以下の動作を行います。

  1. 割り込みが発生
  2. GIEビットをリセット(自動)
  3. 割り込み処理
  4. 割り込み処理完了
  5. GIEビットをセット(自動)

 GIEビットがリセットされている際に割り込みが発生すると、その割り込みを保留します。保留された割り込みは、次にGIEビットがセットされた時に実行されます。

 

タイマ割り込みについて

 タイマ割り込みは指定時間経過した際、発生する割り込みです。ここでは「PIC12F1822」のTimer0を内部クロックを使用して使う方法について説明します。
 Timer0割り込みは、TMR0レジスタがFFhから00hにオーバーフローしたときに発生する割り込みです。TMR0レジスタの値は、1命令サイクルごとに1ずつ加算されます。TMR0レジスタに1ずつ加算されていき8ビットの最大値(255)を超えたとき(256になった時)に割り込みが発生します。
 それでは実際に使ってみましょう。今回は約1秒で割り込みを発生させる場合の設定方法で説明します。条件は以下の通りです。

  • 使用するPIC:「PIC12F1822」
  • 動作クロック周波数:32[MHz]
  • Timer0使用
  • 内部クロック使用
  • 1秒後割り込み発生

 

1.Timer0を有効にする

 Timer0を使うには、オプションレジスタの「TMR0CS」ピット(5ビット目)をクリアします。
OPTION_REG = 0b00000010;
注:ビットの開始はゼロ始まりです

 

2.TMR0の初期値設定

 1秒後に割り込みを発生させるには色々な計算が必要です。今回の条件の場合、1命令サイクルで1加算されます。「PIC12F1822」の場合、1命令を実行するのに4クロックを必要としますので、4で割ります。
32[MHz] ÷ 4 =8[MHz]

 続いて何回の命令で1加算するのかを設定します。計算を楽にするため1[MHz]にしたいので、1:8(8命令で1回分)の設定にします。OPTION_REGの下位3ビットがその設定になります。
OPTION_REG = 0b00000010;
(1:8の場合、010にします)

 さて、ここまでで1[MHz]になりました。Timer0は8ビットカウンタなので、最大でも255のカウントしかできません。なので単純に1回の割り込みで1秒を導くことがどうやってもできません。ということで、何回割り込みが発生したら1秒になるかを計算します。
 計算を楽にするために、100カウントアップした時に割り込みが発生するようにします。TMR0の初期値を設定すれば可能です。
オーバーフロー値 256 ー 100 = 156
ということで初期値は、
TMR0 = 156;
となります。

割り込み発生回数は、
1000000(1[MHz]) ÷ 100 = 10000
となり、10000回のTimer0割り込みが発生すると1秒経過したということになります。

 ちなみに、カウント数を100ではなく250にし、4000回の割り込みで1秒など色々なやり方がありますので、自分がいいと思う計算方法で設定してください。

 

3.TMR0の初期化

 Timer0割り込みが発生した際、TMR0IFが1になりますので、0で初期化しておきます。
TMR0IF = 0;
この値は割り込みが発生すると1になるので、割り込み発生後にも0を登録する必要があります。

 Timer0を有効にするために以下の設定をします。
TMR0IE = 1;

最後に割り込みを有効にするために以下の設定をします。
GIE = 1;

 

4.割り込み処理

 割り込み発生時の処理の流れです。

1.割り込み発生

 割り込みが発生すると、「interrupt」が付いた関数が呼び出されます。その関数内で、Timer0の割り込み処理かを判定します。TMR0IFがゼロでなければTimer0の割り込みとなります。

2.割り込み回数確認

 何回呼び出されたかを保存しておき、10000回目の呼び出し時に、処理を実行するようにします。

3.Timer0初期化

 Timer0の割り込みが呼ばれ、処理から抜けるときに、初期化を行います。(TMR0 = 156とTMR0IF = 0)

参考プログラムは「タイマで発光ダイオードを1秒ごとに点滅させる」を参照してください。

 

注意

 今回の方法では1秒で処理をさせるとしていますが、厳密にいうと1秒ではありません。数マイクロ秒から1ミリ秒くらいの誤差はあると考えてください。割り込み(割り込み時の処理)や通常処理など様々な処理があるので、正確に1秒を計算させることは非常に難しいです。

   

 

<更新履歴>

新規作成:2015年4月4日

 

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)