diff --git a/Encoder.c b/Encoder.c index cbc69f9..5952461 100644 --- a/Encoder.c +++ b/Encoder.c @@ -1,72 +1,43 @@ -#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; // Присваиваем текущему состоянию предыдущее +#define ENC_CLK 0b00000100 +#define ENC_DAT 0b00001000 +#define ENC_PIN PIND +//---------------------------------------------------------------------- +int state; +int old_state = 0; +//---------------------------------------------------------------------- +int encoder() +{ + if ( !(ENC_PIN & ENC_CLK) ) + { + if ( ENC_PIN & ENC_DAT) + { + state++; } - TCNT1H = 0x00; - TCNT1L = 0x00; // Обнуляем счетчик(на всякий случай) - encoder_value = state; + if ( !(ENC_PIN & ENC_DAT) ) + { + state--; + } + while(!(ENC_PIN & ENC_CLK)) + { + + } + } + return state; } - -void timer1_init() { - TCCR1A = 0x00; - TCCR1B |= (1 << CS11); // устанавливаем коэффициент деления 8 - TCNT1H = 0x00; // Обнуляем старший и младший байты счетного регистра - TCNT1L = 0x00; - OCR1AH = 0x03; // Настройка регистра сравнения для старшего и младщего байта - OCR1AL = 0xE8; - TIMSK1 |= (1 << OCIE1A);// Разрешаем прерывание таймера по совпадению с OCR1A +//---------------------------------------------------------------------- +void encoder_Initialization() +{ + DDRD = 0b00000010; + PORTD = 0b00001110; } - -void ports_init() { - DDRD = 0x00; - PORTD = 0x0C; +//---------------------------------------------------------------------- +int get_encoder_value() +{ + encoder(); + if(old_state != state) + { + old_state = encoder(); + } + return state; } - -void encoder_Initialization() { - ports_init(); // Настройка портов - timer1_init(); // Инициализация таймера - sei(); // Разрешаем глобальные прерывания -} - -int32_t get_encoder_value() { - return encoder_value; -} \ No newline at end of file +//----------------------------------------------------------------------