Hier ist mein Testprogramm für PWM:
Code:
#include <avr/io.h>
#include <avr/delay.h>
#include <inttypes.h>
#include "pwmRoutines.h"


// modifier for PWM signal width
// modification is based on pin interrupts
volatile uint8_t pwmWidth = 0x40;


void pwmInit( void )
{
	// enable PWM outputs
	DDRD = (1<<6) | (1<<5);

	pwmWidth = 0x10;
	// initialise time and pwm modes
	pwmInit0();
//  pwmInit1();
//	pwmInit2();
}



void pwmInit0( void )
{
	// 8 bit phase correct PWM
	TCCR0A = (1<<COM0A1)|(1<<COM0B1)|(1<<WGM00);

	// set prescaler for PWM frequency
	TCCR0B = (1<<CS01);

	// for fast initialisation (OCRxA/B values are taken on the first TCNTx = TOP)
	TCNT0 = 0xfe;
	
	// set initial PWM Width
	OCR0A = pwmWidth = 0x10;
	OCR0B = 0x03;
}


void pwmInit1( void )
{
	// 16 bit phase correct PWM
	TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10);

	// set prescaler for PWM frequency
	TCCR1B = (1<<CS11);

	// for fast initialisation (OCRxA/B values are taken on the first TCNTx = TOP)
	TCNT1 = 0x00fe;
	
	// set initial PWM Width
	OCR1A = (uint16_t)pwmWidth;
	OCR1B = (uint16_t)0x03;
}


void pwmInit2( void )
{
	// 8 bit phase correct PWM
	TCCR2A = (1<<COM2B1)|(1<<WGM20);

	// set prescaler for PWM frequency
	TCCR2B = (1<<CS21);

	// for fast initialisation (OCRxA/B values are taken on the first TCNTx = TOP)
	TCNT2 = 0xfe;

	// set initial PWM Width
	OCR2B = pwmWidth;
}



void pwmRun( void )
{
	while (1)
	{
		;
	}
}
pwmInitx() ist jeweils die Initialisierungsroutine für den TimerX. Verwendet wird ein ATMega168. Der pwmWidth Parameter wird in Interruptroutinen modifiziert. Alternativ geht aber das Setzen in pwmRun().