From b61a098ea6836bc72512193437b8a52ca38efc02 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: Sun, 25 Feb 2024 17:46:04 +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 | 51 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/Encoder.c b/Encoder.c index 3cb64c7..231b800 100644 --- a/Encoder.c +++ b/Encoder.c @@ -7,7 +7,7 @@ // Определяем бит в регистре PIND для сигнала с DT энкодера. #define PIND_DT 0b01000000 -volatile uint8_t encoder_state, prev_encoder_state, state; +volatile uint8_t encoder_state, prev_encoder_state, state = 1; int sw34, pin_clk_2, pin_dt_2; @@ -22,24 +22,44 @@ void read_encoder_state() // Устанавливаем значение PIN_DT_2 в зависимости от установки бита PIND_DT в PIND pin_dt_2 = (PIND & PIND_DT) ? 1 : 0; // Получаем состояние энкодера + + // Определяем и сохраняем следующее состояние энкодера encoder_state = (pin_clk_2 << 1) | pin_dt_2; // Проверяем, изменилось ли состояние энкодера if (encoder_state != prev_encoder_state) { - switch ((prev_encoder_state << 2) | encoder_state) + switch (encoder_state) { - case 1: // поворот по часовой стрелке - state++; + case 0: // Поворот против часовой стрелки (CCW) + if (prev_encoder_state == 3) + state++; + else if (prev_encoder_state == 0) + state--; break; - case 2: // поворот против часовой стрелке - state--; + 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; - } + + // Устанавливаем значение prev_encoder_state равным текущему состоянию энкодера + prev_encoder_state = encoder_state; +} } @@ -65,4 +85,15 @@ uint8_t encoder_value() sw34 = state; return state; } +} + +void setup() +{ + encoder_setup(); +} + +void loop() +{ + //encoder_value(); + Serial.println(encoder_value()); } \ No newline at end of file