From 8bbf6b7dfb1b0951604f280ac8d7a8849c44a2e8 Mon Sep 17 00:00:00 2001 From: Dkx <45234736+dkxmercury@users.noreply.github.com> Date: Fri, 17 Jul 2026 17:06:55 +0500 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=B7=D0=B0=D0=BF=D0=B8=D1=81=D1=8C=20?= =?UTF-8?q?=5Fstate=20=D0=B2=D0=BD=D1=83=D1=82=D1=80=D0=B8=20=D0=BA=D1=80?= =?UTF-8?q?=D0=B8=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=BE=D0=B9=20=D1=81?= =?UTF-8?q?=D0=B5=D0=BA=D1=86=D0=B8=D0=B8=20=D0=B2=20uEncoderISR::tick?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _state лежит в одном байте с _e0/_e1, которые пишет tickISR из прерывания. Присвоение битового поля компилируется в read-modify-write всего байта (на AVR: ld / ori / st), поэтому прерывание между чтением и записью теряло своё обновление ног. Дальше pollRaw считал переход от старых значений и терял либо разворачивал щелчок. --- src/uEncoderISR.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/uEncoderISR.h b/src/uEncoderISR.h index 2163400..f49fa5a 100644 --- a/src/uEncoderISR.h +++ b/src/uEncoderISR.h @@ -19,9 +19,12 @@ class uEncoderISR : public uEncoderVirt { noInterrupts(); uint8_t state = _buf & 0xf; _buf >>= 4; + // _state лежит в одном байте с _e0/_e1, а их пишет tickISR. Запись + // битового поля это read-modify-write всего байта, поэтому вне + // критической секции прерывание потеряет своё обновление ног + _state = state ? state : State::Idle; interrupts(); - _state = state ? state : State::Idle; return state; }