From c1e95c9295e25a80231b00c237859eb0b8b49c36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=91=D0=BC=20=D0=9D=D0=BE=D0=B2=D0=B8?= =?UTF-8?q?=D0=BA=D0=BE=D0=B2?= Date: Fri, 2 Feb 2024 16:50:06 +0000 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20Encoder.c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Encoder.c | 107 ++++++++++++++++++++---------------------------------- 1 file changed, 39 insertions(+), 68 deletions(-) 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 +//----------------------------------------------------------------------