Добавил:
koba004
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#include <avr/io.h>
#include <avr/interrupt.h>
#define IRQs_FOR_DUTY_CHANGE 10 // Максимальное число прерываний
uint8_t irq_counter = 0; // Счётчик прерываний
uint8_t delta = 1; // Дельта изменения
int main(void)
{
// Устанавливаем Пин светодиода
DDRA |= (1 << DDRA5); // Направление выход
GTCCR |= (1 << REMAP); // Маска ШИМ на этот пин
// Установка таймера
// Устанавливаем на режим быстрый-ШИМ
TCCR0A |= (1 << COM0B1)|(1 << COM0B0)|(1 << WGM00);
TCCR0B |= (1 << WGM02)|(1 << CS00); // Устанавливаем предделитель
TIMSK0 |= (1 << TOIE0); // Разрешаем прерывание по переполнению
sei(); // Разрешим глобальные прерывания
while (1) {}
}
ISR(TIM0_OVF_vect) { //Сработало прерывание по переполнению
irq_counter++; // Увеличиваем счётчик прерываний
// Если прерываний 10
if (irq_counter == IRQs_FOR_DUTY_CHANGE) {
irq_counter = 0; // Сбросили счётчик
OCR0B += delta; // Изменяем порог переключения ШИМ
// Смотрим максимальное ли значение порога
if (OCR0B == 0xFF) {
delta = -1;
} // Или минимальное
if (OCR0B == 0) {
delta = 1;
}
}
} 