From d96385496e917853ae5e51e79ac94a848fac8b3b 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, 1 Mar 2024 17:18:14 +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.h?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Encoder.h | 61 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 49 insertions(+), 12 deletions(-) diff --git a/Encoder.h b/Encoder.h index 3aafb94..59a7fc1 100644 --- a/Encoder.h +++ b/Encoder.h @@ -6,7 +6,7 @@ // Определяем бит в регистре PIND для сигнала с DT энкодера. #define PIND_DT 0b01000000 - int encoder_state, prev_encoder_state = 3, state = 1; + int encoder_state, prev_encoder_state = 3, state = 1, total_state; void read_encoder_state(void) { @@ -19,19 +19,56 @@ void read_encoder_state(void) pin_clk_2 = (PIND & PIND_CLK) ? 1 : 0; // Устанавливаем значение PIN_DT_2 в зависимости от установки бита PIND_DT в PIND pin_dt_2 = (PIND & PIND_DT) ? 1 : 0; + // Получаем состояние энкодера + encoder_state = (pin_clk_2 << 1) | pin_dt_2; - if ( pin_clk_2 != prev_encoder_state) - { - prev_encoder_state = pin_clk_2; - if ( !pin_clk_2 ) + // Проверяем, изменилось ли состояние энкодера + + if (encoder_state != prev_encoder_state) + { + switch (encoder_state) { - switch(PIND & pin_dt_2 ) - { - case 0: state--; break; - case 1: state++; break; - } + case 0: // Поворот против часовой стрелки (CCW) + if (prev_encoder_state == 2) + state++; + else if (prev_encoder_state == 1) + state--; + break; + + case 1: // Поворот по часовой стрелке (CW) + if (prev_encoder_state == 0) + state++; + else if (prev_encoder_state == 3) + state--; + break; + + case 2: // Поворот против часовой стрелки (CCW) + if (prev_encoder_state == 3) + state++; + else if (prev_encoder_state == 0) + state--; + break; + + case 3: // Поворот по часовой стрелке (CW) + if (prev_encoder_state == 1) + state++; + else if (prev_encoder_state == 2) + state--; + break; } - } + // Устанавливаем значение prev_encoder_state равным текущему состоянию энкодера + prev_encoder_state = encoder_state; + if ( state == 4 ) + { + total_state++; + state=0; + } + if ( state == -4 ) + { + total_state--; + state=0; + } + } } void encoder_setup(void) @@ -45,7 +82,7 @@ int encoder_value(void) { // Читаем состояние энкодера read_encoder_state(); - return state; + return total_state; } //#include "enc.cpp"