#include "Encoder.h" #include #include /* Дефайны */ #define PIND_MASK 0b00001100 /* Переменные */ volatile int32_t next_state, prev_state, up_state, down_state, state; int sw34; // Передача int32_t encoder_value = 0; /* Прерывания */ ISR(TIMER1_COMPA_vect) { next_state = PIND & PIND_MASK; if (next_state != prev_state) { switch (prev_state) { case 8: { if (next_state == 3) state++; if (next_state == 0) state--; break; } case 0: { if (next_state == 2) state++; if (next_state == 1) state--; break; } case 4: { if (next_state == 0) state++; if (next_state == 3) state--; break; } case 12: { if (next_state == 1) state++; if (next_state == 2) state--; break; } default: { break; } } prev_state = next_state; // Присваиваем текущему состоянию предыдущее } TCNT1H = 0x00; TCNT1L = 0x00; // Обнуляем счетчик(на всякий случай) encoder_value = state; } void timer1_init() { TCCR1A = 0x00; TCCR1B |= (1 << CS11); // устанавливаем коэффициент деления 8 TCNT1H = 0x00; // Обнуляем старший и младший байты счетного регистра TCNT1L = 0x00; OCR1AH = 0x03; // Настройка регистра сравнения для старшего и младщего байта OCR1AL = 0xE8; TIMSK1 |= (1 << OCIE1A);// Разрешаем прерывание таймера по совпадению с OCR1A } void ports_init() { DDRD = 0x00; PORTD = 0x0C; } void encoder_Initialization() { ports_init(); // Настройка портов timer1_init(); // Инициализация таймера sei(); // Разрешаем глобальные прерывания } int32_t get_encoder_value() { return encoder_value; }