У меня Ворд зависал то ли при запуске, то ли при открытии одного из дочерних окон (уже не помню точно). Не понимал почему. Случайно обнаружил, что это происходит, когда сетевой принтер был не в сети. Видимо, он пытался дождаться от него ответа.
!!! Очень важная информация, так как датчик HOA0902-11 работает по +5В, подключать напрямую сигналы "SPEED(TACH)" и "DIRECTION(DIR)" к микроконтроллеру STM32 (у которого логика работы по +3В) опасно, есть риск повреждения выводов, в следствии МК может просто выйти из строя.
Вообще-то необязательно. Многие пины у STM32 FT - толерантны к 5В. Там какие-то из порта PA только 3,3V only, ЕМНИП.
Конечно, все еще зависит от самого устройства, где работает МК. Если много процессорного времени занимают внутренние долгие, например, расчеты, то вклинивать в них периодические проверки кнопок, вероятно, действительно не самая лучшая идея.
Но если происходит много важных событий, требующих быстрой реакции, то зачем еще отвлекаться на прерывания кнопок. Пусть опрашиваются в фоне. Опрос может выполняться процессором как мало приоритетная задача «в свободное от работы время».
Подытоживая - я о том, что нельзя категорично сказать «нафиг опросы, делайте всегда через прерывания». Все зависит от ситуации.
Часто в коде есть более важные задачи, чем реакция на нажатие пользователем кнопки. Для них достаточно и обычного опроса. К тому же при опросе пропадает проблема дребезга контактов.
Я организую похожий на описанный в тех статьях подход с запуском задач с помощью простого диспетчера. Также есть односвязный список кнопок. Для кнопок есть отдельная задача опроса, которая периодически (раз в 20..50 мс) запускается для опроса всех кнопок в списке. Дребезг уже не страшен.
Сама функция опроса на данный момент такая:
Скрытый текст
void Controls_PushButtonsPooling(void)
{
// Take a push button from the list
PushButton_t * pb = PushButtonList;
while(pb != NULL)
{
// Get global time
uint32_t globalTime = TaskManager_GetTick();
// Update pressing time
uint32_t pressingTime = globalTime - pb->startPressTime;
// Update gap time
uint32_t gapTime = globalTime - pb->gapTime;
// The branch is executed when the push button is pressed
if (pb->pullType ? (!LL_GPIO_IsInputPinSet(pb->port, pb->pinMask)) : (LL_GPIO_IsInputPinSet(pb->port, pb->pinMask)))
{
// Push button press moment
if (pb->state == OPEN)
{
// Change push button state
pb->state = CLOSE;
// Reset start press time
pb->startPressTime = globalTime;
// Reset gap time
pb->gapTime = gapTime;
}
else
{
// The push button is still pressed during polling
if ((pressingTime >= PUSHBUTTON_LONGPRESS_TIMEOUT) && (pb->pressCounter == 0))
{
// Long press detected
pb->longHandler();
pb->pressCounter += 10;
}
// The push button is still pressed during polling - after first short press
else if ((pressingTime >= PUSHBUTTON_LONGPRESS_TIMEOUT) && (pb->pressCounter == 1))
{
// Short + long press detected
pb->shortLongHandler();
pb->pressCounter += 10;
}
}
}
// The branch is executed when the push button is released
else
{
// Push button release moment
if ((pb->state) == CLOSE)
{
// Reset gap time
pb->gapTime = globalTime;
pb->pressCounter++;
}
else
{
if (pressingTime < PUSHBUTTON_LONGPRESS_TIMEOUT) // Exclude push button release event after long press
{
// Time for the second press has expired
if ((gapTime > PUSHBUTTON_DBLCLK_TIMEOUT) && (pb->pressCounter == 1))
{
// Short press detected
pb->shortHandler();
pb->pressCounter = 0;
pb->gapTime = 0;
}
// Time for the second press has not yet expired
else if ((gapTime < PUSHBUTTON_DBLCLK_TIMEOUT) && (pb->pressCounter == 2))
{
// Second short press detected
pb->doubleShortHandler();
pb->pressCounter = 0;
pb->gapTime = 0;
}
}
else
{
pb->pressCounter = 0;
}
// Update start press time
pb->startPressTime = globalTime;
}
pb->state = OPEN;
}
// Go to next push button
pb = pb->next;
}
}
Думаю, по коду примерно будет понятно. Тут отслеживается одиночное короткое и длинное нажатия, двойное короткое нажатие, короткое+длинное нажатие. При необходимости, код можно и упростить, уйти от списка в пользу массива структур, можно придумать как отслеживать всякие другие комбинации нажатий, но мне пока хватало имеющихся.
Код написан для STM32, но платформо-зависимая там всего одна строчка по сути.
О, эту временную паузу я называю "плата должна настояться" :) Как правило, либо ошибки находятся, либо умные мысли приходят в голову о том, что можно немного поправить.
Тоже попробовал и тоже это отметил. Еще банально столбцы в табличном представлении нельзя расположить как хочется. И заметил несколько других неприятных для меня нюансов. Так что удалил)
И я с ними полностью согласен.
Ну не сидеть же сложа руки.
в последнем, наверное, именно "глазунья" подразумевается)
Не хватает в конце еще абзаца -
Если нужно, я могу подобрать материал для твоего проекта печатной платы. Хочешь, чтобы я это сделал?
У меня Ворд зависал то ли при запуске, то ли при открытии одного из дочерних окон (уже не помню точно). Не понимал почему. Случайно обнаружил, что это происходит, когда сетевой принтер был не в сети. Видимо, он пытался дождаться от него ответа.
Ладошкой!
В смысле не существует? Я сам его помню..
Вообще-то необязательно. Многие пины у STM32 FT - толерантны к 5В. Там какие-то из порта PA только 3,3V only, ЕМНИП.
Подробное раскрытие темы)
Как настроить индикатор частоты ЦП на корпусе?
Не подсказывайте им!
Про delay я ни слова не упомянул, если что.
Конечно, все еще зависит от самого устройства, где работает МК. Если много процессорного времени занимают внутренние долгие, например, расчеты, то вклинивать в них периодические проверки кнопок, вероятно, действительно не самая лучшая идея.
Но если происходит много важных событий, требующих быстрой реакции, то зачем еще отвлекаться на прерывания кнопок. Пусть опрашиваются в фоне. Опрос может выполняться процессором как мало приоритетная задача «в свободное от работы время».
Подытоживая - я о том, что нельзя категорично сказать «нафиг опросы, делайте всегда через прерывания». Все зависит от ситуации.
Часто в коде есть более важные задачи, чем реакция на нажатие пользователем кнопки. Для них достаточно и обычного опроса. К тому же при опросе пропадает проблема дребезга контактов.
Смотрю тут описывают варианты работы с кнопками.
Я организую похожий на описанный в тех статьях подход с запуском задач с помощью простого диспетчера. Также есть односвязный список кнопок. Для кнопок есть отдельная задача опроса, которая периодически (раз в 20..50 мс) запускается для опроса всех кнопок в списке. Дребезг уже не страшен.
Сама функция опроса на данный момент такая:
Скрытый текст
Каждая кнопка - это структура:
Думаю, по коду примерно будет понятно. Тут отслеживается одиночное короткое и длинное нажатия, двойное короткое нажатие, короткое+длинное нажатие. При необходимости, код можно и упростить, уйти от списка в пользу массива структур, можно придумать как отслеживать всякие другие комбинации нажатий, но мне пока хватало имеющихся.
Код написан для STM32, но платформо-зависимая там всего одна строчка по сути.
Менять подход к написанию программы.
Для начала можно почитать тут - Планировщик - chipenable.ru и далее по ссылкам там.
Потому что вот это
никуда не годится.
Легко
О, эту временную паузу я называю "плата должна настояться" :)
Как правило, либо ошибки находятся, либо умные мысли приходят в голову о том, что можно немного поправить.
И вот мы гадаем, какой может быть прок в троллейбусе, который идёт на восток
🙈🙈🙈
Можно попробовать отправить тов. Лисину - Lisin YT - YouTube
У него все это поставлено на поток.
Тоже попробовал и тоже это отметил. Еще банально столбцы в табличном представлении нельзя расположить как хочется. И заметил несколько других неприятных для меня нюансов. Так что удалил)