Arduino Zero / M0 用タイマー割り込みライブラリ

Arduino Zero や Arduino M0 が出てだいぶ経ちますが、未だに使いこなせていません。
というよりも資料が少なく、ライブラリも対応していないものがあったりまだまだ使いづらいのが現状です。

そんな中、最近になってようやく Arduino Zero 用のタイマー割り込みライブラリを見つけました。
なんとAdafruitが出しているじゃありませんか。

「これを使えば・・・!」と思ってダウンロードしてみるも、エラーを吐いて使えないという。
そんなわけで「じゃあ作っちゃおう」ということで自分なりに作ってみました。

スポンサーリンク

Adafruitのタイマー割り込みライブラリ

自作ライブラリの紹介の前にAdafruitのタイマー割り込みライブラリの話をもう少しだけします。
Adafruitのタイマー割り込みライブラリを使ったときのエラーが以下になります。

error: expected '}' at end of input
exit status 1
expected '}' at end of input

‘}’ が抜けてるか多いのかなと思ったのですが、setup関数とloop関数の中身のコードを書いてもだめなのです。
以下のような感じですね。

#include <Adafruit_ZeroTimer.h>

void setup() {
}

void loop() {
}

それもどこに原因があるかもわからないのです。
詳細なエラーを表示しても分かりませんでした、完全にお手上げです。
Arduino Zero と Arduino M0 のどちらで試してもダメだったのでボードによるものではなさそうです。
私の環境だけかもしれませんが。

自作 Arduino Zero / M0 用タイマー割り込みライブラリ

というわけで本題ですが、申し訳ないですがAdafruitのタイマー割り込みの劣化版としか言えないです。
Adafruitの方はタイマーが3つ使えるようです。
私が悩みながら作ったのは2個です。
TCTCCというカウンタがあるので2個使えるということです。

名前は「ZeroTimer」です、似てますけど。
もしよろしければダウンロードしてご使用下さい。

下記は”TC“を使った例ですが、関数も本当に単純なものしかつけていません。
TCCを使うには TCC.starTimer みたいな感じにします。

#include <ZeroTimer.h>

void setup() {
  SerialUSB.begin(115200);
  TC.startTimer(500000, call);
}

void loop() {
}

void call() {
  SerialUSB.println(micros());
}

startTimer(unsigned long period, void (*f)())

startTimer関数は呼び出し間隔と呼び出す関数を指定し、同時にタイマー割り込みを開始します。
呼び出し間隔はマイクロ秒で指定可能です。
上記のサンプルのプログラムでは500[ms](500000[us])ごとに “call” という関数が呼び出されるようになります。

setPeriod(unsigned long period)

こちらは呼び出し間隔を変えるだけの関数です。
途中で間隔を変えたい場合に使います。

使えなくなるPWMピン

これはM0でしか試していませんが、おそらくピン配置は同じなのでZero, M0のどちらとも同じかと思います。
TCのタイマー割り込みを使うと 4, 5, 6, 7, 10, 12 ピンのPWMが使えなくなります。
TCCのタイマー割り込みを使うと2, 3, 6, 7, 13 ピンのPWMが使えなくなります。

6, 7ピンがどちらを使っても使えなくなるのが謎ですが、PWMを使えるピンの半分ほどが使えなくなるので注意が必要です。

精度

サンプルプログラムみたいな単純な処理だと、10[us]くらいの誤差です。
クロックの分周比にもよると思いますが、こんなもんじゃないんですかね。


ちなみに停止用の関数を用意していません。
また使う機会や要望があれば考えます。
中身も見てほしくないほど雑です(笑)
暇ができたらもうちょっと真面目に作ろうかなと思います。
純粋にAdafruitのタイマー割り込みライブラリが使いたいんですが・・・

スポンサーリンク

Leave a Comment