У меня получилось как-то так:
Код:
// winavr
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>
volatile unsigned char pwm; // шим
volatile unsigned char pwm_counter; // яркость
unsigned char rev; // переключение режимов
int main(void)
{
DDRB = 0x01;
TCCR0 |= (0<<CS02)|(1<<CS01)|(0<<CS00); // настройка тактирования таймера
TIMSK |= (1<<TOIE0); // настройка прерывания по переполнению
sei(); // включить глобальные прерывания
while(1)
{
// плавное мигание светодиодом
switch(rev)
{
case 0: // плавное разгорание
pwm_counter++;
if(pwm_counter == 255)
{
rev = 1;
};_delay_ms(4); // время разгорания
break;
case 1: // плавное затухание
pwm_counter--;
if(pwm_counter == 0)
{
rev = 0;
};_delay_ms(6); // время затухания
break;
}
}
}
SIGNAL(TIMER0_OVF_vect)
{
TCNT0 = 200; // частота шим
// программный ШИМ
if(pwm++ < pwm_counter)
{
PORTB|=_BV(0); // зажечь светодиод
}else{
PORTB&=~_BV(0);// погасить светодиод
}
}