Добавил:
koba004
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#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;
} 