user60866: I'm simply trying to use timer 2 for tone generation and what I get is a very faint and strange tone (almost like its modulated somehow as there is a "pulsing" to it). Here's my simple code:
#include <Arduino.h>

#define SPEAKER_PORT PORTC
#define SPEAKER_BIT 2

void setup()
{
  pinMode(A2, OUTPUT);

  TCCR2A = _BV(WGM21);  // CTC mode
  TCCR2B = _BV(CS20);   // clk/1

  OCR2A = 200;  // 8-bit timer, so keep less than 256
  bitSet(TIMSK2, OCIE2A);  // enable OCR2A interrupt
}

void loop()
{
  // NOP
}

ISR(TIMER2_COMPA_vect)
{
  SPEAKER_PORT ^= _BV(SPEAKER_BIT);
}

Any obvious mistakes? Thanks for your help!

user60866: Looks like my tone frequency was possibly just too high for the buzzer I was using, causing strange output.
Adjusting the clock divider fixed the issue. That is, I changed the following:
TCCR2B = _BV(CS20);   // clk/1

to
TCCR2B = _BV(CS22) | _BV(CS20);  // clk/128

and now I get reasonable-sounding tones.
Note that the clock divider you choose is ultimately driven by what frequency range you want to support, and the bit width of the timer. The formula is something like:
freq = 16000000 / d / n / 2

where d is the clock divider value (like 128), and n is the counter value at which to interrupt (what goes in OCR2A for instance). n must fit into the bit width of the specific timer (on ATmega328P timer 1 is 16-bits wide, and timer 2 is 8-bits wide).
Hope this is helpful for anyone else running into these issues. Thanks so much to Kartman over at AVRFreaks.net for pointing me in the right direction.

user47961: I tried the code on an Uno and as you say, it does sound odd.
By my calculations, the frequency is 40kHz (16MHz/(200 x 2)), which is above the threshold of hearing. The sound we are actually hearing is probably the 3rd or 5th harmonic, at a reduced intensity and perhaps subject to jitter.
I tried changing
TCCR2B = _BV(CS20);   // clk/1
to 
TCCR2B = _BV(CS21);   // clk/8
which should mean that the frequency is now 5kHz (16MHz/8/(200 x 2)).
It sounds cleaner.

60866: <p>I'm simply trying to use timer 2 for tone generation and what I get is a very faint and strange tone (almost like its modulated somehow as there is a "pulsing" to it). Here's my simple code:</p>

<pre><code>#include &lt;Arduino.h&gt;

#define SPEAKER_PORT PORTC
#define SPEAKER_BIT 2

void setup()
{
  pinMode(A2, OUTPUT);

  TCCR2A = _BV(WGM21);  // CTC mode
  TCCR2B = _BV(CS20);   // clk/1

  OCR2A = 200;  // 8-bit timer, so keep less than 256
  bitSet(TIMSK2, OCIE2A);  // enable OCR2A interrupt
}

void loop()
{
  // NOP
}

ISR(TIMER2_COMPA_vect)
{
  SPEAKER_PORT ^= _BV(SPEAKER_BIT);
}
</code></pre>

<p>Any obvious mistakes? Thanks for your help!</p>
 60866: <p>Looks like my tone frequency was possibly just too high for the buzzer I was using, causing strange output.</p>

<p>Adjusting the clock divider fixed the issue. That is, I changed the following:</p>

<pre><code>TCCR2B = _BV(CS20);   // clk/1
</code></pre>

<p>to</p>

<pre><code>TCCR2B = _BV(CS22) | _BV(CS20);  // clk/128
</code></pre>

<p>and now I get reasonable-sounding tones.</p>

<p>Note that the clock divider you choose is ultimately driven by what frequency range you want to support, and the bit width of the timer. The formula is something like:</p>

<pre><code>freq = 16000000 / d / n / 2
</code></pre>

<p>where <code>d</code> is the clock divider value (like 128), and <code>n</code> is the counter value at which to interrupt (what goes in <code>OCR2A</code> for instance). <code>n</code> must fit into the bit width of the specific timer (on ATmega328P timer 1 is 16-bits wide, and timer 2 is 8-bits wide).</p>

<p>Hope this is helpful for anyone else running into these issues. Thanks so much to <a href="https://www.avrfreaks.net/comment/2795731#comment-2795731" rel="nofollow noreferrer">Kartman over at AVRFreaks.net for pointing me in the right direction</a>.</p>
 47961: <p>I tried the code on an Uno and as you say, it does sound odd.</p>

<p>By my calculations, the frequency is 40kHz (16MHz/(200 x 2)), which is above the threshold of hearing. The sound we are actually hearing is probably the 3rd or 5th harmonic, at a reduced intensity and perhaps subject to jitter.</p>

<p>I tried changing</p>

<p><code>TCCR2B = _BV(CS20);   // clk/1</code></p>

<p>to </p>

<p><code>TCCR2B = _BV(CS21);   // clk/8</code></p>

<p>which should mean that the frequency is now 5kHz (16MHz/8/(200 x 2)).</p>

<p>It sounds cleaner.</p>
