From f75998e4796bcb610f25b8c3ef278597895bf9ff 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: Thu, 22 Feb 2024 13:24:57 +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 | 60 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/Encoder.c b/Encoder.c index 3a198b3..239b9b2 100644 --- a/Encoder.c +++ b/Encoder.c @@ -7,7 +7,7 @@ // Определяем бит в регистре PIND для сигнала с DT энкодера. #define PIND_DT 0b01000000 -volatile uint8_t next_state, prev_state, state; +volatile uint8_t encoder_state, prev_encoder_state, state; int sw34, pin_clk_2, pin_dt_2; @@ -21,33 +21,43 @@ void read_encoder_state() pin_clk_2 = (PIND & PIND_CLK) ? 1 : 0; // Устанавливаем значение PIN_DT_2 в зависимости от установки бита PIND_DT в PIND pin_dt_2 = (PIND & PIND_DT) ? 1 : 0; - // Определяем и сохраняем следующее состояние энкодера - next_state = (pin_clk_2 << 1) | pin_dt_2; + // Определяем и сохраняем следующее состояние энкодера + // Получаем состояние энкодера + encoder_state = (pin_clk_2 << 1) | pin_dt_2; // Проверяем, изменилось ли состояние энкодера - if (next_state != prev_state) + if (encoder_state != prev_encoder_state) { - switch (next_state) - { - case 0: // CW - if (prev_state == 3) state++; - else if (prev_state == 0) state--; - break; - case 1: // CCW - if (prev_state == 1) state++; - else if (prev_state == 2) state--; - break; - case 2: // CW - if (prev_state == 1) state++; - else if (prev_state == 3) state--; - break; - case 3: // CCW - if (prev_state == 2) state++; - else if (prev_state == 0) state--; - break; - } - // Устанавливаем значение prev_state равным текущему состоянию энкодера - prev_state = next_state; + switch (encoder_state) + { + case 0: // Поворот против часовой стрелки (CCW) + if (prev_encoder_state == 3) + state++; + else if (prev_encoder_state == 0) + state--; + break; + case 1: // Поворот по часовой стрелке (CW) + if (prev_encoder_state == 1) + state++; + else if (prev_encoder_state == 2) + state--; + break; + case 2: // Поворот против часовой стрелки (CCW) + if (prev_encoder_state == 1) + state++; + else if (prev_encoder_state == 3) + state--; + break; + case 3: // Поворот по часовой стрелке (CW) + if (prev_encoder_state == 2) + state++; + else if (prev_encoder_state == 0) + state--; + break; + } + + // Устанавливаем значение prev_encoder_state равным текущему состоянию энкодера + prev_encoder_state = encoder_state; } }