воскресенье, 24 марта 2013 г.

Программирование таймера/счетчика T0 в C (режим ШИМ)

Прежде чем приступать к программированию таймера/счетчика, рекомендую ознакомиться со следующей информацией:
Каждый таймер в микроконтроллере ATmega328 имеет два выхода ШИМ. В данном случае это выходы OC0A (12 ножка) и OC0B (11 ножка). Разрешение ШИМ сигнала составляет 8 бит, чего вполне достаточно для плавного изменения яркости светодиодов.

Предлагаю написать программ, которая будет плавно изменять яркость светодиодов, подключенных к выводам OC0A и OC0B. При этом когда уменьшается яркость первого, увеличивается яркость второго и наоборот.
Рисунок 1 - Схема подключения

Текст программы:

#include <avr/io.h> //подключение стандартной библиотеки ввода/вывода
#define F_CPU 8000000UL //определение тактовой частоты микроконтроллера для корректной работы функций задержки
#include <util/delay.h> //подключение библиотеки для генерации задержек
int main(void)
{
//SETUP
DDRD=0xFF; //порт D работает как выход, так как к нему относятся выводы OC0A и OC0B
TCCR0A=0b10100011; //выбираем неинверсный режим шим для обоих светодиодов
TCCR0B=0b00000001;  //выбираем работу таймера без предделителя тактовой частоты
while(1) //бесконечный цикл (основная программа)
{
for(int i=0;i<256;i++) //увеличиваем яркость первого диода, и уменьшаем яркость второго каждые 10 мс
{
OCR0A=i;
OCR0B=255-i;
_delay_ms(10);
}
for(int i=255;i>0;i--) //увеличиваем яркость второго диода, и уменьшаем яркость первого каждые 10 мс
{
OCR0A=i;
OCR0B=255-i;
_delay_ms(10);
}
}
}