前回はマイコンからPWMを出力するお話をしましたが、今回はタイマー割り込みのお話です。前回のPWMはマイコンのタイマー機能を利用していましたが、今回のタイマー割り込みもタイマーを使っています。とはいえ「割り込みってなんやねん」って思う方もいると思うので最初に軽く割り込みについて紹介します。

 

割り込みとは

 割り込みは、設定したトリガが発生した時に強制的に特定の処理をさせることを意味しています。トリガが発生した時にたとえ他の処理を行っていたとしても、割り込みに指定された処理を強制的に実行するため、トリガ発生時に確実な処理が可能になるというわけです。これを図示すると下の図のようになります。
1

 図からも、通常の処理を行っているときにトリガが入ると強制的に割り込み処理を開始し、割り込み処理が終了するまでは他の処理が中断されることがわかりますね。(Atmega328Pなどの1スレッドのマイコンの場合)

 

タイマー割り込みとは

タイマー割り込みでは、このトリガが「タイマー」によって発生します。つまり、一定の時間ごとに割り込み処理を行えるということです。ステッピングモータを回すパルスを発生させるときなど正確な時間間隔で似た処理を行いたいときなどに非常に使い勝手の良い処理と言えますね。それでは、続いてAtmega328Pにおけるタイマー割り込みの原理を紹介していきます。

タイマー割り込みは前回紹介したPWMと同様にマイコンのタイマー機能を使っており、マイコンのタイマーのカウンタがある状態になった時に、トリガを発生させるという仕組みです。ここでの、ある状態とは、タイマーがカウントの数がオーバーフロー(溢れ)した時比較値PWM生成の時の閾値 OCR0Bなど)と一致した時などを指します。つまり、タイマーのカウントが特定の値に達した時に、割り込み処理が実行されるというわけです。このタイミングを図示してみます。
2

 上の図がタイマーのカウンタがオーバーフローしたときの割り込み(マイコンではこれを溢れ割り込みと言います)を示しており、タイマーのカウンタがオーバーフローする↓で示したタイミングで割り込み処理が行われます。ただし、この溢れ割り込みのタイミングはタイマーの動作種別によりタイミングが変わります。(詳細は次の節)また、同様に下の図はタイマーのカウンタが比較Aに達した時の割り込み(比較A割り込み)を示しており、↓で示したタイミングで割り込み処理が実行されます。

 

タイマー割り込みの注意点

 先ほどの節でタイマー割り込みの原理を紹介しましたが実際にタイマー割り込みを使用するにあたって注意しなければならない点が複数あります。1つ目は溢れ割り込みのタイミングで2つ目は比較・捕獲割り込みのタイミング、3つ目はTOP値と比較・捕獲値の関係です。

溢れ割り込みのタイミング

 溢れ割り込みは定義上はカウンタの値がオーバーフローした時の割り込みです。しかし、溢れ割り込みでオーバーフローした時に割り込みが入るのはデータシート上「標準動作」と「比較一致タイマ/カウンタ解除(CTC)動作」のみであるということに注意しなければなりません。すなわちよく使われる、「高速PWM動作」「位相基準PWM動作」、「位相/周波数基準PWM動作」においてはタイマーのカウンタがオーバーフローした時に割り込みが実行されないというわけです。Atmega328pのデータシート(https://avr.jp/user/DS/PDF/mega328P.pdf )P.99(タイマー1)を確認すると、このことの記載がされており、タイマーの動作種別によりタイミングが異なると書かれています。そのタイミングはタイマー動作種別の表(以下に引用)に書かれています。
3
4

上が8ビットタイマーで下が16ビットタイマーの場合です。それぞれの表の右端の赤で囲んだ「TOV1設定時」の項目に溢れ割り込みが入るタイミングが書かれています。これより「高速PWM動作」ではタイマーのカウンタが「TOP値」に達した時、「位相基準PWM動作」「位相/周波数基準PWM動作」ではタイマーのカウンタが「BOTTOM(0)に達した時に割り込みが動作することがわかります。これを図示してみます。
4-1
 図を見れば「高速PWM動作」はTOP値で割り込みが入っていますが、TOP値は同時にBOTTOM値でもあるのでどちらかというと溢れ割り込みは、タイマーのカウンタが0になったタイミングで入ると考えても問題はないでしょう。以上が溢れ割り込みの動作のタイミングの注意点です。

 

比較・捕獲割り込みのタイミング

 比較A,B割り込みや捕獲割り込みはタイマーのカウンタの値が比較A,B(OCR*A,B)や捕獲値(ICR1)と一致した時をトリガとして割り込みが入ります。原理上はこれだけなのですが、タイマーの動作種別により割り込みが入るタイミングや回数が変わることに注意しなければなりません。割り込みが入るタイミングを図示してみます。
4-2
 この図を見れば、高速PWM動作ではカウンタ1周期の間に割り込みが1回で等間隔に割り込みが入るのに対して、位相(/周波数)基準PWM動作ではカウンタ1周期の間に2回割り込みが入り割り込みが入るタイミングが等間隔でないことがわかります。割り込み動作の時はカウンタが上昇時と下降時の区別がされずに単に値が一致した時がトリガとなるためこのような動作となります。

 

TOP値と比較値との関係

 この関係はタイマーのカウンタのTOP値と比較値が一定の関係にならないと割り込みが入らないことを示しています。割り込みが正しく入る条件はこのような関係です。

比較値≦TOP

この関係も原理から考えると非常にやさしいものですが2つの値の関係よってどのようになるかを図示してみます。
5

比較値とTOP値の関係を「比較値>TOP値」「比較値=TOP値」「比較値<TOP値」の3つの場合を図示してみました。この図を見れば、「比較値>TOP値」の時に割り込みが一切入らなくなることは明らかですね。また、「比較値=TOP値」はカウンタがTOP値に達した時に割り込みが入るため、カウンタ1周期につき1しか割り込みが入らないこともわかると思います。

 

以上の3つが割り込みを使うときの大きな注意点となります。続いて、各種レジスタの設定方法ですが、波の形と最大高さ関連の設定は前回のPWMの記事http://vvvf.blog.jp/archives/7662206.html)を参考に行ってください。ここではタイマー割り込みにおいてPWM出力時と異なるレジスタ設定の項目を紹介します。

 

割り込みのレジスタ設定

 6

初めに、各出力ポートの設定です。今回はPWM出力を利用しないので、すべて「標準ポート動作」(COM*x: 0 0)を選択します。TCCR0A,BTCCR1A,BTCCR2A,Bのその他の設定はPWMの時と同じようにしてください。

続いて、割り込み動作の許可の設定です。
7

この割り込み許可レジスタで、各種割り込みを許可する設定を行っています。利用する割り込みのビットを立てることで、割り込みが使用できるようになります。なお、捕獲割り込みは「ICR1」と一致時、比較一致割り込みは「OCR*A」「OCR*B」と一致した時に割り込みが入ります。

以上でレジスタの設定は終了ですが、割り込みを使用するにはプログラムですこし変わった書き方が必要となります。各レジスタの実際の設定値と合わせて、次のサンプルプログラムのところで紹介します。

 

文字数の関係でサンプルプログラムはその2に続きます