Arduinoで遊ぶページ

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

noTone()

概要

noTone()は、tone()関数で開始したピンへの方形波の出力を停止します。

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

noTone()のリファレンスはこちらを参照してください。

ソースコード

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

#define AVAILABLE_TONE_PINS 1

// Leave timer 0 to last.
const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 2 /*, 1, 0 */ };
static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255, 255 */ };

void noTone(uint8_t _pin)
{
  int8_t _timer = -1;
  
  for (int i = 0; i < AVAILABLE_TONE_PINS; i++) {
    if (tone_pins[i] == _pin) {
      _timer = pgm_read_byte(tone_pin_to_timer_PGM + i);
      tone_pins[i] = 255;
    }
  }
  
  disableTimer(_timer);

  digitalWrite(_pin, 0);
}

AVAILABLE_TONE_PINSは1に定義されています。同時にtone()を利用できるピンの数です。

tone_pin_to_timer_PGM[]は、利用するタイマ/カウンタを定義する配列です。現状、"2"だけが定義されています。

tone_pins[]は、tone_pin_to_timer_PGM[]に対応するタイマ/カウンタで利用しているピンを表します。tone()が実行された後は、tone()の出力を行っているデジタルピンの番号が入っています。

#define AVAILABLE_TONE_PINS 1

// Leave timer 0 to last.
const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 2 /*, 1, 0 */ };
static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255, 255 */ };

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

指定された_pinが利用中のピンかどうかを調べます。見つかった場合は、_timerにタイマの番号を代入し、tone_pins[i]を255(未使用)に設定します。

void noTone(uint8_t _pin)
{
  int8_t _timer = -1;
  
  for (int i = 0; i < AVAILABLE_TONE_PINS; i++) {
    if (tone_pins[i] == _pin) {
      _timer = pgm_read_byte(tone_pin_to_timer_PGM + i);
      tone_pins[i] = 255;
    }
  }

pgm_read_byte()は、指定したアドレス(PROGMEM領域)に格納されているデータを1バイト読み取るためのマクロです。tone_pin_to_timer_PGMは配列なので、tone_pin_to_timer_PGM+iは、配列の第i番目の要素を示します。

次にdisableTimer()を呼び出しタイマを停止します。最後に、digitalWrite()でピンへの出力を停止します。

  disableTimer(_timer);

  digitalWrite(_pin, 0);
}

最後に無条件でdigitalWrite()を行っているため、tone()で出力していないピンを指定しても、そのピンのデジタル出力はオフになります。

バージョン

Arduino 1.0.5



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

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