Hallo Apfeldieb,

hier mal ein Code für einen Atmega32:

Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

/*------------------------------------------------------------------------------------------------*/

volatile unsigned char buffer;
int i,a;

/*------------------------------------------------------------------------------------------------*/

void uart_init(void);
void port(void);
void Motor (void);

/*------------------------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------------------------*/


int main(void)
{
     port();
	 uart_init();
	     while (1){
			 Motor();
         }
}


/*------------------------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------------------------*/

void uart_init(void)
{
	/* Baudrate: 115200*/
	UBRRH  = 0;                               
    UBRRL  = 7;
	UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN); 
	UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}


/*------------------------------------------------------------------------------------------------*/


/* Interrupt wird ausgelöst sobald neue Daten im USART-Empfangspuffer liegen */
SIGNAL(SIG_UART_RECV)
{
	buffer = UDR;
}

/*------------------------------------------------------------------------------------------------*/

void port(void)
{
    DDRD =0x30;
	DDRB =0x17;
}


/*------------------------------------------------------------------------------------------------*/

void Motor (void)
{
		 while(1){
		 sei();
		 
		 /*-----3600------*/
		 
		 if (buffer=='1') {
		     buffer =0;
			 PORTD =0x30;
			 TCCR1A = 0xA1;
	         TCCR1B = 0x02;
			 PORTB =0x11;
			 for (i=0;i<255;i++)
			 {
			 OCR1A =i++;
	         OCR1B =i++;
			 for (a=0;a<11;a++){
			 _delay_ms (10);}
			 }
			 OCR1A =0;
	         OCR1B =0;
			 for (a=0;a<100;a++){
			 _delay_ms (10);}
			 OCR1A =255;
	         OCR1B =255;
			 for (a=0;a<100;a++){
			 _delay_ms (10);}
			 OCR1A =0;
	         OCR1B =0;
			 }
			 
		 
		  /*-----7200------*/
		 
	     if (buffer=='2'){
		     buffer =0;
			 PORTD =0x30;
			 TCCR1A = 0xA3;
	         TCCR1B = 0x01;
			 PORTB =0x11;
			 for (i=0;i<1023;i++)
			 {
			 OCR1A =i++;
	         OCR1B =i++;
			 for (a=0;a<3;a++){
			 _delay_ms (10);}
			 }
			 OCR1A =0;
	         OCR1B =0;
			 for (a=0;a<100;a++){
			 _delay_ms (10);}
			 OCR1A =1023;
	         OCR1B =1023;
			 for (a=0;a<100;a++){
			 _delay_ms (10);}
			 OCR1A =0;
	         OCR1B =0;
			 }
			 
			 
		 /*-----14400------*/
			 
		 if (buffer=='3') {
		     buffer =0;
			 PORTD =0x30;
			 TCCR1A = 0xA2;
	         TCCR1B = 0x01;
			 PORTB =0x11;
			 for (i=0;i<511;i++)
			 {
			 OCR1A =i++;
	         OCR1B =i++;
			 for (a=0;a<6;a++){
			 _delay_ms (10);}
			 }
			 OCR1A =0;
	         OCR1B =0;
			 for (a=0;a<100;a++){
			 _delay_ms (10);}
			 OCR1A =511;
	         OCR1B =511;
			 for (a=0;a<100;a++){
			 _delay_ms (10);}
			 OCR1A =0;
	         OCR1B =0;
			 }
			 
		 /*-----28800------*/
			 
		 if (buffer=='4') {
		     buffer =0;
			 PORTD =0x30;
			 TCCR1A = 0xA1;
	         TCCR1B = 0x01;
			 PORTB =0x11;
			 for (i=0;i<255;i++)
			 {
			 OCR1A =i++;
	         OCR1B =i++;
			 for (a=0;a<11;a++){
			 _delay_ms (10);}
			 }
			 OCR1A =0;
	         OCR1B =0;
			 for (a=0;a<100;a++){
			 _delay_ms (10);}
			 OCR1A =255;
	         OCR1B =255;
			 for (a=0;a<100;a++){
			 _delay_ms (10);}
			 OCR1A =0;
	         OCR1B =0;
			 }
			 
		 }
}
Dabei werden bei untersch. PWM-Frequenzen die OCR1 Werte in einer for-Schleife hochgezählt, danach auf null gesetzt und nochmal kurz auf volldampf.
War mal für ein Motortest.

Die Interrupt-Sache habe ich selbst nur aus dem Netz zurecht gestückelt, das andere mit Hilfe des Forums und des Datenblattes.

Hier noch eine kleine Übersicht über die Frequenzeinstellung.
http://www.deviantart.com/deviation/49689249/

Gruß
Stefan