Hallo

Ich würde das weiterhin mit Soft-PWM lösen. Irgendein Timer läuft ja eh meist schon mit, da muss man dann nur noch seine eigene Funktion einklinken:
Code:
#include <avr/io.h>
#include <avr/interrupt.h>

#define led1_init DDRD |= (1<<PD2) // LEDs an PD2 und PD3
#define led1_on  PORTD |= (1<<PD2)
#define led1_off PORTD &= ~(1<<PD2)
#define led2_init DDRD |= (1<<PD3)
#define led2_on  PORTD |= (1<<PD3)
#define led2_off PORTD &= ~(1<<PD3)

volatile unsigned char p=0;
volatile unsigned char led1_pwm=0, led2_pwm=0;

void pause_ms(unsigned int dauer)
{
	while(dauer--)
	{
	   p=36;
	   while(p); // p wird in der ISR runtergezählt
	}
}

int main(void)
{
	cli();
	// Timer2: FastPWM, no prescaling, no OC2-Pin
	TCCR2 = (1 << WGM20) | (1 << WGM21) | (0 << COM20) | (0 << COM21) | (1 << CS20);
	OCR2  = 0x91; // duty cycle for 36kHz
	TIMSK |= (1 << TOIE2);
	led1_init;
	led2_init;
	sei();
	
   while(1)
	{
	   led1_pwm+=15;
	   if(led2_pwm) led2_pwm /=2; else led2_pwm=255;
	   pause_ms(500);
	}
   return(0);
}

SIGNAL (SIG_OVERFLOW2)
{
	static char led_pwm=0;

	TCNT2 += 0x25; // Frequenzkorrektur 36kHz

	if(led_pwm)
	{
		if(led_pwm>led1_pwm) led1_off;
		if(led_pwm>led2_pwm) led2_off;
	}
	else
	{
		if(led1_pwm) led1_on;
		if(led2_pwm) led2_on;
	}
	led_pwm++;

	if(p) p--; // 1/36000 Sek.
}
Für einen 8MHz-Mega8 auf Basis der 36kHz des Timer2 (aus der asuro-Lib). Soll das nun ein Mega8 oder ein Mega32 werden? Oder gar der RP6?

Gruß

mic