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