Estoy intentando generar audio a través de un conector de 3.5 mm utilizando un atmega644. Intenté seguir este tutorial , pero incluso con el muestreo proporcionado, sólo me da un gemido agudo. Leí mucho en la hoja de datos y encontré este código:
#define F_CPU 1000000
#include <stdint.h>
#include <avr/io.h>
#include "pcm_sample.h"
#include <avr/interrupt.h>
#define SAMPLE_RATE 8000;
volatile uint16_t sample = 0;
ISR(TIMER1_OVF_vect) {
if (sample >= pcm_length) {
sample = 0;
}
OCR1A = pcm_samples[sample++];
}
void init(void) {
DDRD = (1<<PD5); // OCR1A
// Fast PWM Mode 14, TOP=ICR1(0x7D), toggle OC1A on compare match
TCCR1A = (1<<COM1A1) | (1<<WGM11);
TCCR1B = (1<<CS10) | (1<<WGM12) | (1<<WGM13);
TIMSK1 = (1<<TOIE1); // Interrupt on overflow
// Timer ticks at 1us, samples every 125us, so overflow every 125us
ICR1 = 0x7D; // Overflow at 125
OCR1A = pcm_samples[0]; // Set initial duty
sei();
}
int main(void) {
init();
while (1);
}
Pero entonces no sale nada de la toma de auriculares. Mi primer pensamiento fue que la interrupción no se está disparando, pero estoy bastante seguro de que está bien configurado. ¿Alguna idea?
EDITAR: El bit WGM12 está en el registro TCCR1B y el temporizador 1 necesita una fuente de reloj, como señala Bruce Abbot a continuación. He cambiado esto en el código y ahora se dispara la interrupción, sin embargo todavía no reproduce el sonido. En su lugar, recibo un gemido agudo y ocasionalmente roto por un ruido sordo.
También, me di cuenta de que probablemente no había tiempo, así que cambié. Hice algunos cálculos y se me ocurrió lo anterior (espero que sea correcto). Se requería poder configurar cuando el Temporizador 1 se desbordó, así que he cambiado del Modo 5 al Modo 14. Después de corregir algunos errores matemáticos, está mejorando: ruido borroso en lugar de un silbido agudo.
La solución a esto fue una combinación de las siguientes respuestas y comentarios. El código anterior está funcionando, aunque es bastante baja la calidad que se puede escuchar claramente "está funcionando" (para esta aplicación, no me molesta la calidad, pero supongo que para corregirlo solo debe considerar una mayor tasa de muestreo como Chris Stratton menciona a continuación). Gracias a todos los que ayudaron.