🛠 Плавающий баг или очередная работа за кадром
Полгода назад я столкнулся с неочевидным поведением микросхемы аналого-цифрового преобразователя HX711, которое периодически приводило к ложным нажатиям. Проблема проявлялась случайным образом, но достаточно редко и во время игры особого дискомфорта не приносила, люди её просто не замечали. Но она долго не давала мне покоя, т.к. я не понимал причин и списывал всё на помехи в сети.
Это сугубо техническая заметка с примером проблемы, которая осталась скрыта от посетителей, но по факту отняла много времени. Гуманитарии могут пройти мимо 🤓
Даже с наличием осциллографа поймать её было весьма не просто – всё дело оказалось в наложении прерывания микроконтроллера на опрос HX711 в строго определенный момент времени, что приводило к сбросу микросхемы. При съёме показаний с АЦП, микроконтроллер дергает ногу PD_SCK и считывает бит с выхода DOUT, обычно это занимает 1 микросекунду. Но если в момент, когда PD_SCK в высоком уровне, приходило сообщение на шину данных, микроконтроллер отвлекался на его обработку и временно забывал про считывание показаний (см. осциллограмму). Вот тут и возникала не совсем очевидная проблема – если задержать высокий уровень на ноге PD_SCK более, чем на 60 мкс, микросхема HX711 выключалась, а после включения, естественно, показания считывались некорректно, что приводило к скачку веса и ложному нажатию.
Что интересно, проблема решается всего двумя строчками кода: запретом любых аппаратных прерываний перед опросом показаний и разрешением после опроса. Но в библиотеке, к сожалению, это не было учтено 😐
UPD: после этой заметки от канала отписалось 10 человек 😅
Post #184
1.9K

- 👍 24
- 🔥 16
- 🤓 6
- ❤ 2
- 😁 1