Vielen Dank schonmal!
Damit kann ich zumindest schonmal die Frequenz(en) erzeugen. Das funktioniert auch schon sehr zuverlässig (hab mehrere Töne mit unserem Klavier verglichen).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); }
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?







Zitieren

Lesezeichen