Скачиваний:
0
Добавлен:
12.02.2026
Размер:
1.79 Кб
Скачать
/*
 * main.c
 *
 * Created: 2/25/2025 3:42:21 PM
 *  Author: Konstantin
 */ 

#include <avr/io.h>
#include <avr/interrupt.h>
#define frec 1000000
#define predD 1024
#define fdelay0 0.5
#define fdelay1 1
#define fdelay2 4
#define fdelay3	10
#define cou0 (frec/(2*predD*fdelay0)) - 1
#define cou1 (frec/(2*predD*fdelay1)) - 1
#define cou2 (frec/(2*predD*fdelay2)) - 1
#define cou3 (frec/(2*predD*fdelay3)) - 1

const uint16_t compare_values[] = {cou0, cou1, cou2, cou3};
uint8_t current_compare_val = 0;

int main(void)
{
	// Инициализация						// Настраиваем стек
	DDRA |= (1 << DDA5);					// Настаиваем порта пин PA5 как выход
	DDRB &= ~(1 << DDRB1);
	PUEB |= (1 << PUEB1);


	// Настройка таймера
	TCCR0B |= (1 << CS02) | (1 << CS00);	// Предделитель 1024
	TCCR0B |= (1 << WGM02);					// Включает режим CTC
	TIMSK0 |= (1 << OCIE0A);				// Разрешаем прерывания по достижению значения OCR0A
	OCR0A = cou0;							// Задаём размер OCR0A
	
	// Настройка прерывания по изменению уровня
	PCICR |= (1 << PCIE1)|(0 << PCIE0);  // Включение прерывания по изменению состояния на 1 для группы B
	PCMSK1 |= (1 << PCINT9); // Определяем что это будет именно для B1 (там где кнопка)

	sei();									// Разрешаем глобальные прерывания

	while (1) {								// Бесконечный цикл
	}				
}

ISR(TIM0_COMPA_vect)						// Прерывание по переполнению таймера
{
	PORTA = ~PINA;							// Записываем в порт А не А
}

ISR(PCINT1_vect) {
	if (!(PINB & (1 << PINB1))){
		current_compare_val++;					// Увеличиваем номер ячейки
		if (current_compare_val>3){				// Делаем так, чтобы не выходило за рамки 3
			current_compare_val = 0;
		}
		OCR0A = compare_values[current_compare_val];	// Ограничение таймера ставим
		TCNT0 = 0;										// Счётчик таймера = 0
	}
}
Соседние файлы в папке Lab_2_C_2