@John: Thanks for the reply. Let me check my math. If I want a 1KHz signal, and no prescaler, I use:
OCR1A = (16000000 / 1000) - 1;
= 16000 - 1;
= 15999;
When I do this, I get a beautiful square wave on the scope. However, changing the frequency to 5KHz, and the most I get out is 2.38KHz. I have a rotary encoder on Int0 and Int1 that allows me to change the frequency. When I see the frequency I want, I use the rotary switch to select the current frequency (as displayed on an LCD). All that stuff is working fine. When I shove the new frequency into the equation above (cli() before I reset and sei() after), it does not change the scope output. As I mentioned, I can't get anything out above 2.38Khz. Could it be too much code in the ISR? I do have a small switch with a few statements in each, all volatile variables.
I know this has to be a "flat-forehead" moment, where someone points out my error and I slap my forehead with a loud "Duh", but so far, no joy.