Скачиваний:
0
Добавлен:
12.02.2026
Размер:
1.4 Кб
Скачать
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 8000000

#define USART_BAUDRATE 9600
#define BAUD_PRESCALE ((F_CPU / (USART_BAUDRATE * 16UL)) - 1)
#define IRQs_FOR_DUTY_CHANGE 20

#define ADC_FS 5  // Частота выполнения АЦП-преобразования (Гц)
#define TIMER_COUNT ((F_CPU / (8 * ADC_FS)) - 1) // Значение для OCR0A

uint8_t irq_counter = 0;  // Счётчик прерываний

int main(void)
{
	DDRA &= ~(1 << DDRA6);
	// Устанавливаем Пин светодиода
	DDRA |= (1 << DDRA5);  // Направление выход
	GTCCR |= (1 << REMAP);  // Маска ШИМ на этот пин
	
	// Настройка ядра
	CCP = 0xD8; // Устанавливаем ПД 0
	CLKPSR = 0;
	
	// Настройка UART
	UBRR = BAUD_PRESCALE;
	UCSRB |= (1 << TXEN);
	UCSRC = (1 << UCSZ1)|(1 << UCSZ0);
	
	// Настройки таймера
	TCCR0A |= (1 << WGM01)|(1 << COM0B0)|(1 << COM0B1);
	TCCR0B |= (1 << WGM03)|(1 << WGM02)|(1 << CS01);
	ICR0 = 256;
	OCR0B = 0;
	TIMSK0 |= (1 << TOIE0);
	
	// Настройка АЦП
	ADCSRA |= (1 << ADEN)|(1 << ADPS2)|(1 << ADIE);
	ADCSRB |= (1 << ADLAR);
	ADMUX |= (1 << MUX1)|(1 << MUX0);
	
	sei();
	while (1)
	{

	}
}

ISR(TIM0_OVF_vect)
{
	irq_counter++;
	// Если прерываний 20
	if (irq_counter == IRQs_FOR_DUTY_CHANGE) {
		irq_counter = 0;  // Сбросили счётчик
		ADCSRA |= (1 << ADSC);
	}
}

ISR(ADC_vect)
{
	//DDRA = 0;
	//uint16_t analogReading;
	OCR0BL = ADCL;
	OCR0BH = ADCH;
	UDR = ADCH;
}
Соседние файлы в папке Lab_4_C