flash()関数の処理が終ったら、loop()関数の中断していた場所に戻って、処理を再開します。最後にスケッチ先頭の#include文。MsTimer2.hを取り込むことでタイマー割り込み機能が使えるようになります。結果、LEDが0.5秒毎に点いたり消えたりという動作になります。試しに、タイマー割り込みではなく遅延処理を使ったLED点灯のスケッチも見てみましょう。いうスケッチがあります。delay(1000);}続に言うLEDピコピコというヤツです。1秒毎に点けて、消して、を繰り返します。delay()関数で1秒の待ち時間を作り出しています。これを実行して、先ほどのタイマー割り込みのスケッチと比べてみてください。遅延処理を使ったLEDピコピコは、時計の秒針よりもarduinoの点滅の方が少しずつ遅れていくはずです。かかっているからです。タイマー割り込みライブラリでの注意点メイン処理側と割り込み処理関数の間で”変数を共用”する場合には注意が必要になります。「時計を作ろう」というケースを想定してみてください。秒針を1進めておき、メイン処理側ではその秒数を読み出してLCDなどに表示しようということになるかと思います。割り込み処理内で秒数をカウントアップしつつ、メイン処理側で秒数を参照するという形になります。両方の処理で変数を共用することになります。変数の定義個所で、例えば以下のように宣言してください。一つの呪文やおまじないだと思って頂いていいです。こちらをご覧ください。最後に、ちょっとマニアック領域に入ってみます。気になってしまい、ライブラリソースの中身を少し眺めてみました。その内容を備忘録的にまとめておきたいと思います。AT-MEGA168のタイマー2は8ビット幅(0~255)のカウンターを持ったタイマーです。arduinoに組み込まれているクリスタルは16MHzです。カウンターが指定の値になったら自動的にカウンタを0に戻してまた数えなおすという機能です(この時割り込みも発生する)。カウンタの値が8ビット幅の中で任意の値になったらまた0からカウントしなおすということが自動で行えます。この比較する数の大きさを調節することで、割り込み間隔を長くしたり短くしたり任意に調整することが出来るわけです。速度を落としてから使うことも出来ます(少ないビット幅のカウンタでも長い間隔の割り込みが実現できるような工夫です)。MEGA168版のarduinoでは1/64にセットさるようにライブラリ内で組まれています。CTCで適用されるカウンタの上限値は250(ギリギリ8ビット幅以内!)に設定されています。割り込みが生じることになります。これはクリスタルの精度1クロック単位で正確に発生します。処理が行われています。指定したミリ秒に達すると、ようやく指定の関数を呼び出しに行きます。呼び出されるわけです。発生させることが出来るわけです。ズレは生じているはずです。「その若干のズレ」は累積していくことは無く、毎回毎回リセットされることになります。16MHzの仕様を踏襲しているのかについても考えてみました。タイマーを利用して1/1000秒を取り出しています(これらはタイマー0を使っている)。タイマー0やタイマー2は共に8ビット幅のカウンターを持ったタイマーです。タイマー1は16ビット幅です。出来なくなります(お暇な方は計算してみてください。端数が出てしまいます)。方がユーザの利便性が高いということなのだと思います。AVRといえばxMEGAシリーズは32MHz動作が可能です。判りませんが、その時には16MHzから一気に32MHzになるのでしょうか???気になるところです。入出力ピンが3.3Vになっちゃうんですよねぇ、xMEGAシリーズは。Design入門書WebIOPi・WiringPiでWebと電子回路を連動Arduino1.0対応です。お手にとって眺めて頂けるとうれしいです。