From 40c876d282257078f72d43c4551ab7d7a3dc4b56 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: Wed, 14 Feb 2024 16:08:48 +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 | 93 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 56 insertions(+), 37 deletions(-) diff --git a/Encoder.c b/Encoder.c index 5952461..ec1c9e1 100644 --- a/Encoder.c +++ b/Encoder.c @@ -1,43 +1,62 @@ -#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++; - } - if ( !(ENC_PIN & ENC_DAT) ) - { - state--; - } - while(!(ENC_PIN & ENC_CLK)) +#include + +#define F_CPU 1000000UL +#define PIND_MASK 0b11000011 +#define PIND_SHIFT 6 + +volatile uint8_t next_state, prev_state, state, state_1; +int sw34; // Передача + +void read_encoder_state() +{ + // Читаем состояние энкодера + next_state = (PIND & PIND_MASK) >> PIND_SHIFT; + + // Обновляем состояние энкодера + if (next_state != prev_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 = next_state; } - } - return state; } -//---------------------------------------------------------------------- -void encoder_Initialization() + +void setup() { - DDRD = 0b00000010; - PORTD = 0b00001110; + // Инициализация последовательного порта + Serial.begin(9600); + + // Настройка портов ввода-вывода + DDRD = 0x00; + PORTD = PIND_MASK; } -//---------------------------------------------------------------------- -int get_encoder_value() + +void loop() { - encoder(); - if(old_state != state) - { - old_state = encoder(); - } - return state; -} -//---------------------------------------------------------------------- + // Читаем состояние энкодера + read_encoder_state(); + + // Если состояние энкодера изменилось, выводим его в последовательный порт + if (state != sw34) + { + Serial.println(state); + sw34 = state; + } +} \ No newline at end of file