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