Si puede conformarse con un tono de frecuencia de 976.5625 Hz en lugar de los 1000 Hz en su código, aquí está la solución (supuesto: Arduino Uno o Duemilanove, no estoy seguro de la Mega):
Conecte su salida al Pin 5 o 6 (los pines PWM) en lugar del pin 8.
Crea una variable global volátil:
volatile int_8 tone_tracker = 0;
Cambie su ISR Timer1 para que sea llamado cada 200 ms .
En el código ISR, cuente hasta 4 guardando el valor en tone_tracker, luego:
analogWrite (SPKR_PIN, 127);
La próxima vez que se invoque el ISR, establezca tone_tracker en 0 y:
analogWrite (SPKR_PIN, 0);
El problema debe resolverse.
Por qué funciona esto:
El código Timer0 ISR ahora simplemente activa y desactiva el tono a horas establecidas, dejando la generación de tonos real al hardware del microcontrolador.
El frecuencia de PWM predeterminada de Arduino en los pines 5 y 6 es 976.5625 Hz a menos que está modificando Timer0 en otra parte de su código (o haciendo otra cosa con PWM donde las bibliotecas realizan algunos cambios "invisibles").
Escribir el análogo 127 en el pin PWM genera una onda cuadrada de ciclo de trabajo del 50% en la frecuencia predeterminada de PWM. Eso genera el tono requerido.
En este enfoque, la generación real de tonos se realiza mediante la salida PWM del microcontrolador, no a través de un código de frecuencia variable impulsado por interrupciones, como se usa en la biblioteca de tonos.
El malabarismo con tone_tracker te da 200 x 4 = 800 mS de silencio, luego 200 x 1 = 200 mS de salida de tono. El temporizador ISR y el ISR serial pueden entrar en conflicto, pero eso no afecta a la generación de PWM. Por lo tanto, en el peor de los casos, el tono puede durar unos microsegundos más, o puede comenzar unos microsegundos más tarde, si la MCU está ocupada con comunicaciones en serie en ese momento, pero esto no sería perceptible para los oídos humanos.
Por supuesto, esto no funcionará tan fácilmente si necesita cualquier frecuencia de tono, excepto 976.5625 Hz (en los pines 5 y 6) o 488.28125 Hz (en los pines 3, 9, 10 y 11).