Arduinoで遊ぶページ

Arduinoで遊んだ結果を残すページです。
garretlab
disableTimer()

disableTimer()

概要

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

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

ソースコード

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

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()で設定したタイマ/カウンタをもとに戻します。

    
    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にすることで、割り込みを禁止しています。

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

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

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

バージョン

Arduino 1.8.3



メニューを表示するためにJavaScriptを有効にしてください。

Arduinoで遊ぶページ
Copyright © 2016 garretlab all rights reserved.
inserted by FC2 system