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

ライセンス

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/*
  Copyright (c) 2016 garretlab.
  Added source code explanation by garretlab.
*/

/* Tone.cpp

  A Tone Generator Library

  Written by Brett Hagman

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

Version Modified By Date     Comments
------- ----------- -------- --------
0001    B Hagman    09/08/02 Initial coding
0002    B Hagman    09/08/18 Multiple pins
0003    B Hagman    09/08/18 Moved initialization from constructor to begin()
0004    B Hagman    09/09/26 Fixed problems with ATmega8
0005    B Hagman    09/11/23 Scanned prescalars for best fit on 8 bit timers
                    09/11/25 Changed pin toggle method to XOR
                    09/11/25 Fixed timer0 from being excluded
0006    D Mellis    09/12/29 Replaced objects with functions
0007    M Sproul    10/08/29 Changed #ifdefs from cpu to register
0008    S Kanemoto  12/06/22 Fixed for Leonardo by @maris_HY
0009    J Reucker   15/04/10 Issue #292 Fixed problems with ATmega8 (thanks to Pete62)
0010    jipp        15/04/13 added additional define check #2923
*************************************************/

最終更新日

July 31, 2025

inserted by FC2 system