イベントタイマー割込み 使い方
先の記事「マイコンって何が出来るの?」では、マイコン仕掛けは端子信号を秩序立てて扱うことが出来ると書きました。
時間軸に沿って秩序立てる方法の王道、マイコンを使う場合、これがなくては始まらないと言っても過言ではない「イベントタイマー割り込み」について書いてみます。
私の場合、イベントタイマー割込みを使わないアプリケーションは、皆無に近い状況です。
ESP32のMicroPythonにおける、タイマー割込みについて書きます。
machine.Timer クラスをインポート
次のように、machineモジュールのTimerクラスをインポートします。
from machine import Timer
割込み処理関数の定義
イベントタイマーによる割込み処理関数を準備します。
def int_100ms_timer0(t): # イベントタイマー 100msec
この記事では、100msec周期で連続して発生する割り込みについて書きます。100msec周期でセンサーの値を読み出して処理するようなケースを想定しています。
キー入力を扱う場合はの周期は50msec程度が良いようです。
int_100ms_timer0の部分は任意で、以下のタイマー起動時に指定したcallback=以下と同名にします。
LEDの点灯/消灯を切り替えたり、メインループに割込みを知らせるフラグを立てるような処理を書き加えます。フラグ等はglobal変数にしてメインループに知らせます。
インスタンス作成とタイマー初期化
以下はmainの記述です。
次のようにタイマーを初期化して起動します。
t0 = Timer(0)
t0.init(period=100, mode=Timer.PERIODIC, callback=int_100ms_timer0)
Timer(0)のカッコ内は0~3まで、つまり4つまでの独立したタイマーを使えるようですが、私は今のところ2個までしか使ったことがありません。
period=以下はタイマー周期をmsec単位で指定するようです。
Timer.PERIODICの部分は、周期的に連続して発生させるモードのようです。
他にTimer.ONE_SHOTが使えるようですが、私は使ったことがありません。
callback=以下は前述の割込み処理関数と同じ名前にします。
タイマー停止
以下のようにしてイベントタイマーを停止させます。
t0.deinit()
一定の条件が揃った時に、一旦割り込み発生を停止してWiFiでデータを送るような時に使っています。
停止のタイミング次第では予期しない割込みが発生することがあるようなので、私は直後に割込み周期+αのsleepを入れて使っています。
再起動させる時には、前述の初期化部分だけを実行すれば使えています。
t0.init(period=100, mode=Timer.PERIODIC, callback=int_100ms_timer0)
これからも気が付いたことなど加筆修正して行きます。
皆さん、宜しくお願いいたします。
出来ればサポート頂けると、嬉しいです。 新しい基板や造形品を作る資金等に使いたいと思います。