Скачиваний:
0
Добавлен:
12.02.2026
Размер:
1.11 Кб
Скачать
#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;
		}
	}
}
Соседние файлы в папке Lab_3_C_1