Pull to refresh
26
0.1
Михаил Царёв@aitras

Разработчик электроники

Send message

многие зрители восприняли это как вторжение

И я с ними полностью согласен.

в последнем, наверное, именно "глазунья" подразумевается)

Не хватает в конце еще абзаца -
Если нужно, я могу подобрать материал для твоего проекта печатной платы. Хочешь, чтобы я это сделал?

У меня Ворд зависал то ли при запуске, то ли при открытии одного из дочерних окон (уже не помню точно). Не понимал почему. Случайно обнаружил, что это происходит, когда сетевой принтер был не в сети. Видимо, он пытался дождаться от него ответа.

В смысле не существует? Я сам его помню..

!!! Очень важная информация, так как датчик HOA0902-11 работает по +5В, подключать напрямую сигналы "SPEED(TACH)" и "DIRECTION(DIR)" к микроконтроллеру STM32 (у которого логика работы по +3В) опасно, есть риск повреждения выводов, в следствии МК может просто выйти из строя.

Вообще-то необязательно. Многие пины у STM32 FT - толерантны к 5В. Там какие-то из порта PA только 3,3V only, ЕМНИП.

Не подсказывайте им!

Про delay я ни слова не упомянул, если что.

Конечно, все еще зависит от самого устройства, где работает МК. Если много процессорного времени занимают внутренние долгие, например, расчеты, то вклинивать в них периодические проверки кнопок, вероятно, действительно не самая лучшая идея.

Но если происходит много важных событий, требующих быстрой реакции, то зачем еще отвлекаться на прерывания кнопок. Пусть опрашиваются в фоне. Опрос может выполняться процессором как мало приоритетная задача «в свободное от работы время».

Подытоживая - я о том, что нельзя категорично сказать «нафиг опросы, делайте всегда через прерывания». Все зависит от ситуации.

Часто в коде есть более важные задачи, чем реакция на нажатие пользователем кнопки. Для них достаточно и обычного опроса. К тому же при опросе пропадает проблема дребезга контактов.

Смотрю тут описывают варианты работы с кнопками.

Я организую похожий на описанный в тех статьях подход с запуском задач с помощью простого диспетчера. Также есть односвязный список кнопок. Для кнопок есть отдельная задача опроса, которая периодически (раз в 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;
	}
}

Каждая кнопка - это структура:

typedef struct PushButton
{
	GPIO_TypeDef *port;
	uint32_t pinMask;
	uint8_t pullType;
	uint8_t state;
	uint32_t startPressTime;
	uint8_t pressCounter;
	uint32_t gapTime;
	void (*shortHandler) (void); // Short press handler pointer
	void (*longHandler) (void); // Long press handler pointer
	void (*doubleShortHandler) (void); // Double short press handler pointer
	void (*shortLongHandler) (void); // Short + long press handler pointer
	struct PushButton *next; // Next push button pointer
} PushButton_t;

Думаю, по коду примерно будет понятно. Тут отслеживается одиночное короткое и длинное нажатия, двойное короткое нажатие, короткое+длинное нажатие. При необходимости, код можно и упростить, уйти от списка в пользу массива структур, можно придумать как отслеживать всякие другие комбинации нажатий, но мне пока хватало имеющихся.

Код написан для STM32, но платформо-зависимая там всего одна строчка по сути.

как повысить отзывчивость на нажатие кнопок?

Менять подход к написанию программы.

Для начала можно почитать тут - Планировщик - chipenable.ru и далее по ссылкам там.

Потому что вот это

 while (1) {
    Delay_Ms(100);
    ... // куча наваленного подряд кода
}

никуда не годится.

О, эту временную паузу я называю "плата должна настояться" :)
Как правило, либо ошибки находятся, либо умные мысли приходят в голову о том, что можно немного поправить.

И вот мы гадаем, какой может быть прок в троллейбусе, который идёт на восток

Можно попробовать отправить тов. Лисину - Lisin YT - YouTube
У него все это поставлено на поток.

Тоже попробовал и тоже это отметил. Еще банально столбцы в табличном представлении нельзя расположить как хочется. И заметил несколько других неприятных для меня нюансов. Так что удалил)

1
23 ...

Information

Rating
3,789-th
Location
Россия
Date of birth
Registered
Activity