先にアラームの割り込みについて書いてしまったが、そもそものアラームの仕組みについて覚書きしておく。
データシートの表現を目覚まし時計になぞらえると、アラームをセットすることはEnable、アラームが鳴ることはOccurと書かれている。
何だかどういう日本語が適当なのか分からないが、「起動」と「発生」と書くことにする。
私には、どちらかと言うとこのアラームの仕組みの方が若干理解しにくかったのだが、そうは言っても、一度飲み込めてしまえば要点は以下の3つだけだ。
Alarm Value Registerに書かれている時刻と実際の時刻を比較して、両者が同じならAlarmが発生する。
比較する際に、余分な部分はマスクしておいて、必要な部分だけを比較する。
このマスクの仕方によって、時間間隔が決まる。
例えば、2015/11/09 00:37:25 からスタートして10分間隔でアラームを発生させたいとする。
1回目は2015/11/09 00:47:25、その次は2015/11/09 00:57:25にアラームが鳴ればいい。
ずっと進んで、一時間半後の2015/11/09 02:17:25、2日後の2015/11/11 00:37:25にもアラームが鳴る。
アラームが発生する時刻に共通なのは最後の7:25の部分で、それならこの7:25の部分だけを比較すればいいことになる。
そうすれば、10分に1度だけこの部分が同じになるので、必然的に10分間隔でアラームが発生することになる。
この要領で、隠す部分を変更することで、時間間隔を決めることが出来る。
ちなみに、比較するためのAlarm Value Registerには####/##/## ##:#7:25を書いておけばいいことになり、#の部分は何でもいい。
データと一緒に時刻が並んだところを想像すると、00:10:00、00:20:00、00:30:00となっている方が見栄えがいい。
それなら、もともとAlarm Value Registerの初期値は0のようなのでAlarm Value Registerにはいっさい触らなくてもいい。
せっかく区別をつけようと始めに断ったのに「起動」は出てこなかったな。
アラームを起動するには ALCFGRPTbits.ALRMEN = 1; だ。