Для написания нашей программы, необходимо подключить кнопку к ножке PB0, и светодиод к ножке РВ3:
Прежде, чем приступить к настройки ШИМ, необходимо обратится к регистру TCCR2 который отвечает за работу данного ШИМ:
Разберем содержимое реестра:
Бит FOC2 отвечает за принудительное изменения состояния вывода OC2 (использовать не будем).
Биты CS22,CS21,C20 отвечают за источник тактового сигнала счетчика.
Биты WGM20, WGM21 отвечают за режим работы таймера/счетчика.
Биты COM21, COM20 определяют поведение выхода.
CS22 | CS21 | CS20 | AS2=0 | AS2=1 |
---|---|---|---|---|
0 | 0 | 0 | стоп | стоп |
0 | 0 | 1 | clk | clkt |
0 | 1 | 0 | clk/8 | clkt/8 |
0 | 1 | 1 | clk/32 | clkt/32 |
1 | 0 | 0 | clk/64 | clkt/64 |
1 | 0 | 1 | clk/128 | clkt/128 |
1 | 1 | 0 | clk/256 | clkt/256 |
1 | 1 | 1 | clk/1024 | clkt/1024 |
WGM21 | WGM20 | Режим работы |
---|---|---|
0 | 0 | Normal |
0 | 1 | Phase correct PWM (ШИМ с точной фазой) |
1 | 0 | CTC (сброс при совпадении регистров OCR2 и TCNT2) |
1 | 1 | Fast PWM (быстродействующий ШИМ) |
COM21 | COM20 | Режим работы |
---|---|---|
0 | 0 | Таймер/счетчик отключен от вывода ОС2 |
0 | 1 | Состояние вывода меняется на противоположное(только в режимах Normal и CTC) |
1 | 0 | «Вывод сбрасывается «0» |
1 | 1 | «Вывод устанавливается «1» |
Текст самой программы (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_ */
Залив данный код, Вы увидит как при нажатии кнопки у Вас плавно будет менять яркость светодиод.