最近授業で割込みについて習ったんですが、まぁ、、なんか用語が多いよね・・・・・(何が何を指しているのがすごいわかりにくい。)
ということで、自分の中の整理も兼ねて、マイコンにおける「割込み処理」に関する代表的な用語についてまとめたいと思います。
多少は参考になるかも。
割込みでよく出てくる単語をまとめたい
今回は割込みに関してよく出てくる単語をまとめておきたいと思います。
データシート等読んでいると、メーカーやマイコンの種類によって名前がマチマチで、何が同じものを指しているか分かりにくいと感じることがあります。
今回はそのあたりをまとめられれば思います。
今回は以下の用語についてまとめてみました。(割と下のまとめだけで完結している気もしますが・・・・)
・割込み処理:そもそもどんな処理か?
・割込み要因:割込みを発生させる要素
・割込み要求/割込み許可:割込みが発生したら1になるフラグ/割込みを許可する場合に1にするフラグ
・割込み処理の実装例:PICマイコンで割込みを実装する場合の例(別記事)
”割込み処理” とは?
割込み処理についてざっくり説明
割込み処理のざっくりとした説明をしてみたい思います。
割込み処理を原理的に説明すると、レジスタのアドレスがジャンプして~みたいな話になります。
が、取っ掛かりとしては正直微妙だと思うので、今回は用途から説明してみます。
端的に言うと、割込み処理は、特定のタイミングで別の処理(=割込み処理)をさせたいときに使えます。
リアルタイムな動作が求められる場合や、マイコンに搭載された周辺機能などを便利場合に便利な処理になります。
例として、イメージとしては、Arduinoの「void loop()」を実行中に、ボタンが押されたらそれに応じて動作を変えることを考えてみます。
(以下、Arduinoの「void loop()」など、無限ループの中で動いている関数を"メイン関数"と呼ぶことにします)
例えば、メイン関数の実行中にスイッチの状態(マイコンのポートの状態)を監視していたとします。
スイッチが押されたらLEDを点灯させたい、みたいな要求があった場合、メイン関数の中でスイッチを接続したポートの状態を監視すれば、ボタンが押されたときに動作を変えることができます。
ですが、もしこのメイン関数の中に、60秒間の待ち時間処理があったとしたら、問題が生じます。
メイン関数の中でポートの状態を見ていたい場合、一度スイッチの状態を監視した後、次に状態をチェックするのは60秒間の待ち時間処理が終わった後になります。
もしスイッチを押された瞬間に動作を変えたかったとしたら、60秒も待っていたのでは遅すぎます。
そこで、「割込み処理」を使うとします。
この「割込み処理」を使うと、ボタンが押される前の処理(例えば、待ち時間をdelay_ms(60000)みたいな関数で数えているときなど)をいったん中断し、割込み処理に設定した処理を優先して実行します。
こんな感じで、リアルタイムに処理をしたかったり、処理に優先順位をつけたい場合などに、「割込み処理」が使えます。
PWMなども、割込みを利用した機能の一つです。
割込み要因(○○IF)について(PIC16F1827:260円くらい、を例に説明)
実際のマイコンの例があると説明しやすいので、よく使っているPIC16F1827を例に説明してみます。
PIC16Fシリーズには、割込みとして下記のような要因が用意されています。
「割込み要因」というのは、どんな処理があったらメイン関数の処理を中断するのか、その原因になった処理を言います。
例えば、先ほどのスイッチが押された(=マイコンのポートの状態が変化した)場合なら、マイコンのポートの状態が変化したら割込みを発生させる「外部入力割込み」などが使えます。
下図においては、「INTF、INTE」と書いているものがこれに該当します。(ポートがL➡H、H➡Lになったら割込みを発生させる)
マイコンにはプログラムする人が便利なように、複数の割込み要因が用意されています。
以下の左側にあるものはすべて「割込み要因」で、いずれかの要因が発生したら、いったんメイン関数の処理を中断し、「割込み処理」内に設定された処理を実行します。
割込み要求(○○IF)についてざっくり説明
上で載せた図について、もう少し詳しく説明してみたいと思います。
上の図において、INTEやCCP、TMRなどは、すべて割込み要因の略称などを表しています。
実際には○○IF、○○IEのANDを取るような表記になっています。
この○○IFというのは、1コ上で説明した割込み割込み要因によって、「割込み処理を実行したい」と要求があった場合に0→1になるフラグのことです。
上の図のうち「○○IF」という記載のあるものは全部、「割込み要因」によって0→1にセットされた「割込み要求(フラグ)」と言えます。
例えばタイマ機能のTMR1が要因の割込みが発生した場合、TMR1割込み要求フラグ(TMR1IF)が0→1にセットされます。
同様に、タイマ機能のTMR2が要因の割込みが発生した場合、TMR2割込み要求フラグ(TMR2IF)が0→1にセットされます。
プログラムを書いている人は、この割込み要求フラグを確認することで、どんな割込み要因で割込みが発生したのかを知ることができます。
割込み許可(○○IE)についてざっくり説明
次に○○IEと表記のあるものについて説明します。
上の図のうち、「○○IE」という記載のある者は全部、「割込み要因」による割込みを許可するかどうかを決める「割込み許可(フラグ)」になります。
もうちょい段階的に説明すると、
割込み許可フラグ「○○IE」は、
①ある割込み要因で、
②割込み要求フラグ「○○IF」がセットされたときに、
③メイン関数を中断して割込み処理を実行するかどうかを決めるもの
、になります。
ちなみに、「IE」は「Interrupt Enable」の略です。
「割込み許可フラグ(○○IE)」が1に設定されていると、「割込み要求フラグ(○○IF)」がセットされた際にANDゲートの出力が1となり、後ろにつながれたORゲートを介して「To Interrupt Logic」に信号が入り、割込み処理が発生します。
このような流れでメイン関数を中断し、割込み処理を実行します。(終了後はメイン関数に戻ります)
要するに、割込みがあるごとに「割込み要求(○○IF)」は0→1にセットされるけど、実際にメイン関数を中断して割込み処理を実行するかどうかは別に決められるということです。
追記:割込み処理の実装例
最後に割込み処理を実行するためのプログラムの例を紹介します。
ArduinoでPWM割込みを使用する例
-
【Arduiono】Arduinoでタイマ割込みを使用したPWM制御を行う方法を紹介する
今回はArduiono、いや、Arduinoに搭載されたマイコン「ATmega328P」のタイマ機能を使用してPWM制御を行ってみました。 備忘録。 ※本記事ではATmega328PBのデータシートを ...
続きを見る
最近Arduinoよりは若干敷居が高めな?PICマイコンに触れてみました。
個人的な感想として、PICマイコンの方がArduinoよりは難易度が上がる気がしますが、Aruduinoよりもプログラムの中身が見えるのでわかりやすいかもしれません。
まとめ
今回は割込み処理に関連して出てくる用語とプログラムの実装例について紹介してみました。
ざっくりとですが、割と良い感じにまとまったかもしれません。
最近授業で触ったPICマイコンで遊んでいますが、割込みを利用すると機能の少ないマイコンだったとしても、割と自由な動作ができるな~と感じます。
将来的にPICの使い方を紹介するまとめ記事を描いてみたいな~なんて思わなかったり、思ったり・・・
今後も更新します。
それでは、また。