Подключаем кнопку, настраиваем ШИМ на микроконтроллере Atmega8.

Для написания нашей программы, необходимо подключить кнопку к ножке PB0, и светодиод к ножке РВ3:

Прежде, чем приступить к настройки ШИМ, необходимо обратится к регистру TCCR2 который отвечает за работу данного ШИМ:

Разберем содержимое реестра:

Бит FOC2 отвечает за принудительное изменения состояния вывода  OC2  (использовать не будем).

Биты CS22,CS21,C20 отвечают за источник тактового сигнала счетчика. 

Биты WGM20, WGM21 отвечают за  режим работы таймера/счетчика.

Биты COM21, COM20 определяют поведение выхода.

CS22CS21CS20AS2=0AS2=1
000стопстоп
001clkclkt
010clk/8clkt/8
011clk/32clkt/32
100clk/64clkt/64
101clk/128clkt/128
110clk/256clkt/256
111clk/1024clkt/1024
WGM21WGM20Режим работы
00Normal
01Phase correct PWM (ШИМ с точной фазой)
10CTC (сброс при совпадении регистров OCR2 и TCNT2)
11Fast PWM (быстродействующий ШИМ)
COM21COM20Режим работы
00Таймер/счетчик отключен от вывода ОС2
01Состояние вывода меняется на противоположное(только в режимах Normal и CTC)
10«Вывод сбрасывается «0»
11«Вывод устанавливается «1»
clk — системный тактовый импульс.
clkt — тактовый импульс от внешнего кварца.

Текст самой программы (main.c):

#include <avr/io.h>
#include <util/delay.h>
#include "pwr.h"
void init(void);
void init_PWR(void); int main(void){ init(); init_PWR(); while (1){ if(B_PB0==0){// если кнопка нажата  while (OCR2<0xff){OCR2=OCR2+0x01;_delay_ms(15);}      while (OCR2>0x00){OCR2=OCR2-0x01;_delay_ms(15);}     } else {// если кнопка не нажата OCR2=0x00; } } } void init(void){ PORTB=0b00000001;//РВ0 с подтяжкой резистора к питанию. DDRB=0b00001000;//PB3 выход } void init_PWR(void){ ASSR=0x00;//регистр выбора источника тактового сигнала TCCR2=0b01101100;// настроен на делитель 128, быстродействующий ШИМ,  сброс вывода по 0. TCNT2=0x00;// счетный регистр, счет начинается с 0. OCR2=0x00;//регистра сравнения }

Текст pwr.h:

#ifndef PWR_H_
#define PWR_H_

#define F_CPU 1000000

#define B_PB0 (PINB&(1<<PB0)) // считываем значение входа

#endif /* PWR_H_ */

Залив данный код, Вы увидит как при нажатии кнопки у Вас плавно будет менять яркость светодиод.