From 965250ecd01a943fb279bd412ef402a0b96721c0 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, 18 Feb 2024 12:00:30 +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 | 160 ++++++------------------------------------------------ 1 file changed, 18 insertions(+), 142 deletions(-) diff --git a/Encoder.c b/Encoder.c index a76f0b1..28898cd 100644 --- a/Encoder.c +++ b/Encoder.c @@ -1,163 +1,38 @@ +// Включаем библиотеку для работы с портами ввода-вывода микроконтроллера AVR. #include - +// Определяем частоту процессора микроконтроллера в 1 МГц. #define F_CPU 1000000UL +// Определяем бит в регистре PIND для сигнала с клока энкодера. #define PIND_CLK 0b00010000 +// Определяем бит в регистре PIND для сигнала с DT энкодера. #define PIND_DT 0b01000000 -//#define PIND_MASK PIND_CLK + PIND_DT +// Определяем сдвиг для получения значения сигнала с клока энкодера. +#define PIND_SHIFT_1 (4) +// Определяем сдвиг для получения значения сигнала с DT энкодера. +#define PIND_SHIFT_2 (5) volatile uint8_t next_state, prev_state, state, state_1; -int sw34, PIND_SHIFT_1, PIND_SHIFT_2, PIND_MASK, PIN_CLK_2, PIN_DT_2; // Передача +int sw34, PIND_MASK, PIN_CLK_2, PIN_DT_2; void read_encoder_state() { - PIND_SHIFT_1 = 0; - PIND_SHIFT_2 = 0; + // Устанавливаем начальные значения переменных равное 0 + PIN_CLK_2 = 0; + PIN_DT_2 = 0; PIND_MASK = 0; - if(PIND_CLK == 4 & PIND_DT == 8) //0b00001100 = 12 - { - PIND_SHIFT_1 = 2; - PIND_SHIFT_2 = 2; - } - if(PIND_CLK == 4 & PIND_DT == 16) //0b00010100 = 20 - { - PIND_SHIFT_1 = 2; - PIND_SHIFT_2 = 3; - } - if(PIND_CLK == 4 & PIND_DT == 32) //0b00100100 = 36 - { - PIND_SHIFT_1 = 2; - PIND_SHIFT_2 = 4; - } - if(PIND_CLK == 4 & PIND_DT == 64) //0b01000100 = 68 - { - PIND_SHIFT_1 = 2; - PIND_SHIFT_2 = 5; - } - if(PIND_CLK == 4 & PIND_DT == 128) //0b10000100 = 132 - { - PIND_SHIFT_1 = 2; - PIND_SHIFT_2 = 6; - } - - - if(PIND_CLK == 8 & PIND_DT == 4) //0b00001100 = 12 - { - PIND_SHIFT_1 = 3; - PIND_SHIFT_2 = 2; - } - if(PIND_CLK == 8 & PIND_DT == 16) //0b00011000 = 24 - { - PIND_SHIFT_1 = 3; - PIND_SHIFT_2 = 3; - } - if(PIND_CLK == 8 & PIND_DT == 32) //0b00101000 = 40 - { - PIND_SHIFT_1 = 3; - PIND_SHIFT_2 = 4; - } - if(PIND_CLK == 8 & PIND_DT == 64) //0b01001000 = 72 - { - PIND_SHIFT_1 = 3; - PIND_SHIFT_2 = 5; - } - if(PIND_CLK == 8 & PIND_DT == 128) //0b10001000 = 136 - { - PIND_SHIFT_1 = 3; - PIND_SHIFT_2 = 6; - } - - - if(PIND_CLK == 16 & PIND_DT == 4) //0b00010100 = 16 - { - PIND_SHIFT_1 = 4; - PIND_SHIFT_2 = 2; - } - if(PIND_CLK == 16 & PIND_DT == 8) //0b00011000 = 24 - { - PIND_SHIFT_1 = 4; - PIND_SHIFT_2 = 3; - } - if(PIND_CLK == 16 & PIND_DT == 32) //0b00110000 = 48 - { - PIND_SHIFT_1 = 4; - PIND_SHIFT_2 = 4; - } - if(PIND_CLK == 16 & PIND_DT == 64) //0b01010000 = 80 - { - PIND_SHIFT_1 = 4; - PIND_SHIFT_2 = 5; - } - if(PIND_CLK == 16 & PIND_DT == 128) //0b10010000 = 144 - { - PIND_SHIFT_1 = 4; - PIND_SHIFT_2 = 6; - } - - - if(PIND_CLK == 32 & PIND_DT == 4) //0b00100100 = 36 - { - PIND_SHIFT_1 = 5; - PIND_SHIFT_2 = 2; - } - if(PIND_CLK == 32 & PIND_DT == 8) //0b00101000 = 40 - { - PIND_SHIFT_1 = 5; - PIND_SHIFT_2 = 3; - } - if(PIND_CLK == 32 & PIND_DT == 16) //0b00110000 = 48 - { - PIND_SHIFT_1 = 5; - PIND_SHIFT_2 = 4; - } - if(PIND_CLK == 32 & PIND_DT == 64) //0b01100000 = 96 - { - PIND_SHIFT_1 = 5; - PIND_SHIFT_2 = 5; - } - if(PIND_CLK == 32 & PIND_DT == 128) //0b10100000 = 160 - { - PIND_SHIFT_1 = 5; - PIND_SHIFT_2 = 6; - } - - - if(PIND_CLK == 64 & PIND_DT == 4) //0b01000100 = 68 - { - PIND_SHIFT_1 = 6; - PIND_SHIFT_2 = 2; - } - if(PIND_CLK == 64 & PIND_DT == 8) //0b01001000 = 72 - { - PIND_SHIFT_1 = 6; - PIND_SHIFT_2 = 3; - } - if(PIND_CLK == 64 & PIND_DT == 16) //0b01010000 = 80 - { - PIND_SHIFT_1 = 6; - PIND_SHIFT_2 = 4; - } - if(PIND_CLK == 64 & PIND_DT == 32) //0b01100000 = 96 - { - PIND_SHIFT_1 = 6; - PIND_SHIFT_2 = 5; - } - if(PIND_CLK == 64 & PIND_DT == 128) //0b11000000 = 192 - { - PIND_SHIFT_1 = 6; - PIND_SHIFT_2 = 6; - } - - + // Значение переменной PIN_CLK_2 равно результату побитовой операции "И" между PIND и PIND_CLK с последующим сдвигом на PIND_SHIFT_1 бит вправо PIN_CLK_2 = (PIND & PIND_CLK) >> PIND_SHIFT_1; + // Значение переменной PIN_DT_2 равно результату побитовой операции "И" между PIND и PIND_DT с последующим сдвигом на PIND_SHIFT_2 бит вправо PIN_DT_2 = (PIND & PIND_DT) >> PIND_SHIFT_2; + // Значение переменной PIND_MASK равно сумме значений переменных PIN_CLK_2 и PIN_DT_2 PIND_MASK = (PIN_CLK_2 + PIN_DT_2); - // Читаем состояние энкодера + // Определяем и сохраняем следующее состояние энкодера, применяя побитовое "И" между PIND и PIND_MASK next_state = (PIND & PIND_MASK); - // Обновляем состояние энкодера + // Проверяем, изменилось ли состояние энкодера if (next_state != prev_state) { switch (next_state) @@ -179,6 +54,7 @@ void read_encoder_state() else if (prev_state == 0) state--; break; } + // Устанавливаем значение prev_state равным текущему состоянию энкодера prev_state = next_state; } }