disableTimer()

概要

disableTimer()は、tone()で設定したタイマ/カウンタを初期化します。

tone()の出力に利用しているタイマ/カウンタの番号を調べてタイマ/カウンタを停止します。

ソースコード

disableTimer()は、hardware/arduino/avr/cores/arduino/Tone.cpp に定義されています。以下に全ソースコードを示します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
void disableTimer(uint8_t _timer)
{
  switch (_timer)
  {
    case 0:
        TIMSK0 = 0;
      break;
 
   case 1:
      bitWrite(TIMSK1, OCIE1A, 0);
      break;
 
    case 2:
        bitWrite(TIMSK2, OCIE2A, 0); // disable interrupt
        TCCR2A = (1 << WGM20);
        TCCR2B = (TCCR2B & 0b11111000) | (1 << CS22);
        OCR2A = 0;
      break;
  }
}

disableTimer()の入力は_timerでuint8_t型の変数です。返却値はありません。

_timerの値によって分岐します。現状の実装では、2か-1が渡ってきます。_timerが-1のときは何もせずに終了します。_timerが2のときは、TIMSK2TCCR2ATCCR2BOCR2Aを設定し、tone()で設定したタイマ/カウンタをもとに戻します。

13
14
15
16
17
18
case 2:
    bitWrite(TIMSK2, OCIE2A, 0); // disable interrupt
    TCCR2A = (1 << WGM20);
    TCCR2B = (TCCR2B & 0b11111000) | (1 << CS22);
    OCR2A = 0;
  break;

TIMSK2は、割り込みマスクを制御するレジスタで、tone()関数でOCIE2Aビットを1に設定し、割り込みを許可しています。ここでは、bitWrite()を使ってOCIE2Aビットを0にすることで、割り込みを禁止しています。

TCCR2ATCCR2Bは、タイマ/カウンタ2を制御するレジスタです。詳細は、analogWrite()のページを見てください。

TCCR2Aの、WGM20だけを1にしています。他のビットは0になります。この場合、タイマ/カウンタ2は、Phase Correct PWMモードで動作します。analogWrite()で利用するモードで、init()でも同様の設定を行っています。

TCCR2Bは、0b11111000と論理積をとったうえで、CS22ビットを設定しています。上位5ビットは元の値を保持したうえで、下位3ビットのうちCS22ビットだけを1に設定しています。これによりクロックの分周比を64にしています。これも、analogWrite()で利用する際の値で、init()で設定した値と同じです。

バージョン

Arduino AVR Boards 1.8.6

最終更新日

March 21, 2023

inserted by FC2 system