Vielen Dank schonmal!
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>


// Initialisiert Timer1, um mit einer Frequenz von freq IRQs auszulösen
void timer1_init( uint16_t freq )
{
	// ATmega: Mode #4 für Timer1 und voller MCU-Takt (Prescale=1)
	TCCR1A = 0;
	TCCR1B = ( 1 << WGM12 ) | ( 1 << CS10 );
	
	// OutputCompare1A Register setzen
	OCR1A = ( uint16_t ) ( ( uint32_t ) 1000000 / freq -1 ); // konstante 1000000, weil F_CPU auf meinen 16MHz-Quarz gesetzt ist
	
	// OutputCompare1A Interrupt aktivieren
	TIMSK |= ( 1 << OCIE1A );
}

// Die Interrupt Service Routine (ISR) wird mit
// der Frequenz freq ausgeführt.
SIGNAL(SIG_OUTPUT_COMPARE1A)
{
	// mach was
	PORTD ^= ( 1 << PD6 );
}

int main( void )
{
	DDRD |= ( 1 << PD6 );
	
	timer1_init( 264 );
	sei();

	while (1);
}
Damit kann ich zumindest schonmal die Frequenz(en) erzeugen. Das funktioniert auch schon sehr zuverlässig (hab mehrere Töne mit unserem Klavier verglichen).
Aber wie bringe ich den AVR dann dazu, den Ton nur ne bestimmte Zeit zu spielen? Nehm ich da 'ne Zählvariable, die den Ton nur "rauslässt", wenn der Ist-Wert noch unter dem Soll-Wert liegt?