Например TDA7294

Форум РадиоКот • Просмотр темы - Как поместить цикл в case оператора switch
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Сб авг 16, 2025 10:54:14

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 252 ]    , , 3, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Как поместить цикл в case оператора switch
СообщениеДобавлено: Пт окт 07, 2022 13:48:01 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1472
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15136
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
На три контрольных линии будет всего 7 возможных результатов - достаточно или switch-case или массива с указателями на функции обработки.
8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить цикл в case оператора switch
СообщениеДобавлено: Пт окт 07, 2022 14:12:08 
Опытный кот
Аватар пользователя

Карма: 2
Рейтинг сообщений: 164
Зарегистрирован: Ср авг 03, 2022 05:22:56
Сообщений: 848
Рейтинг сообщения: 1
А мои предпочтения таковы, что не следует пихать невпихуемое и отделять неотделяемое. Конечно, кто как хочет, так и др...ит, но все же есть некоторые общепринятые принципы.

Вот, например, знаете, как схематично выглядит граф переходов КА? Вот так: вверху показаны состояния и переходы алгоритма обычной одиночной кнопки, а внизу - одиночной переключающей кнопки.
Изображение

Состояние S0 - начальное. Когда на вход поступает 0 (кнопка не нажата) КА остаётся в том же состоянии. Когда на вход поступает 1 (кнопка нажата), КА переходит в состояние S1. И остаётся в нем до тех пор, пока не поступит 0 (отпускание кнопки).
На нижнем графе есть ещё два состояния, показывающий переключающей эффект кнопки.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить цикл в case оператора switch
СообщениеДобавлено: Пт окт 07, 2022 14:44:18 
Это не хвост, это антенна

Карма: 4
Рейтинг сообщений: 139
Зарегистрирован: Ср июн 25, 2008 15:19:44
Сообщений: 1478
Рейтинг сообщения: 0
MLX90640 Без обид. Вы сейчас говорите мне шаблоны. Свои устоявшиеся шаблоны.

Пусть у нас массив входов. Пусть это контакты, которые дребезжат. Есть подход, когда все входы, все кнопки можно рассматривать как одну сущность. Пример. Считали входы, упаковали в переменную. При следующем считывании входов мы сравниваем предыдущую переменную с текущей. Если изменилось, устанавливаем таймер на подавление дребезга. Время вышло, снова считываем и сравниваем, если равно, считаем что есть изменение. Конкретно у этого примера два-три состояния. Сегодня позже или завтра я покажу примеры. С кнопками чуток посложнее. Нужно ли удержание, автоповтор. Игнор одновременно нажатых кнопок и так далее.

Лично для вас уточнение, я занимаюсь промышленным оборудованием. И у меня в активе как единичные блоки управления, так и небольшие серии. Станки, которые работают круглосуточно.


Последний раз редактировалось Demiurg Пт окт 07, 2022 14:56:46, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить цикл в case оператора switch
СообщениеДобавлено: Пт окт 07, 2022 14:53:15 
Опытный кот
Аватар пользователя

Карма: 2
Рейтинг сообщений: 164
Зарегистрирован: Ср авг 03, 2022 05:22:56
Сообщений: 848
Рейтинг сообщения: 0
А почему вы думаете, что мои "шаблоны" ошибочны? :)
И почему не допускает пересмотра своих шаблонов? Примеры ваши показывают не обязательно - они и так понятны, ваш шаблон мыслей понятен.
Например с дребезгом. Шаблонный метод - использовать таймер, задержки и т. п. Но ведь есть просто определённый интервал опроса кнопок. Например, каждые 20 мс. Если кнопка очень дребезжащая, можно поставить интегрирующий счётчик, который при каждом считывания инкрементируется или декрементируется, накапливая сумму.

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить цикл в case оператора switch
СообщениеДобавлено: Пт окт 07, 2022 15:01:26 
Это не хвост, это антенна

Карма: 4
Рейтинг сообщений: 139
Зарегистрирован: Ср июн 25, 2008 15:19:44
Сообщений: 1478
Рейтинг сообщения: 0
Я не сказал, что ошибочны. Я указал вам, что вы говорите о шаблонах. Не о жёстких правилах, а именно о шаблонах.
Подобные споры уже были, не раз. Не только на этом форуме. И не обязательно с моим участием.
Поэтому, без эмоций, негатива. Конструктивный диалог.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить цикл в case оператора switch
СообщениеДобавлено: Пт окт 07, 2022 15:47:11 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1472
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15136
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Обычно для МК весьма удачный вариант с табличным декодером в ПЗУ и системой определения стабильного статуса группы линий по двух/троекратному совпадению через определенный промежуток времени. А чего там дальше с полученными данными делать - то уж кому чего удобнее.
Подобная "векторная" клавиатура и под ассемблером неплохо работает и в си (у меня правда вариант адуринки в качестве подопытного был).
Но смысл усложнения только или для увеличенного количества опрашиваемых линий(сигналов) и/или в том случае, когда одна и та же линия может давать старт различным подпрограммам (в зависимости от текущего статуса многофункционального устройства).
Для простейших задач и более простые решения вполне подходят.
8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить цикл в case оператора switch
СообщениеДобавлено: Пт окт 07, 2022 16:08:14 
Это не хвост, это антенна

Карма: 4
Рейтинг сообщений: 139
Зарегистрирован: Ср июн 25, 2008 15:19:44
Сообщений: 1478
Рейтинг сообщения: 0
BOB51, привет. Ты меня знаешь. Мне есть с чем сравнивать. И я учился у лучших специалистов.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить цикл в case оператора switch
СообщениеДобавлено: Пт окт 07, 2022 16:38:49 
Опытный кот
Аватар пользователя

Карма: 2
Рейтинг сообщений: 164
Зарегистрирован: Ср авг 03, 2022 05:22:56
Сообщений: 848
Рейтинг сообщения: 0
. Конструктивный диалог.

Так я и веду конструктивный диалог. Но это ведь вы начали критиковать меня. Почему ж я не могу тогда покритиковать ваши шаблоны :)
Вот например, объсните-таки всё-ж, какой "лучший специалист" научил вас делать вот так:
Цитата:
Код:
   switch (_proc_device)
   {
      case 0:
         bla_bla; // инициализация
         all_outputs_off ();
         _proc_device = 1;
         break;

      case 1:
         if (G .....


То есть, зачем ИНИЦИАЛИЗАЦИЮ вставлять вот именно сюда, да еще и через switch-case? Только не показывайте это АРМ-щикам - засмеют ведь :) Вот просто объясните, зачем и откуда у вас такой "шаблон" появился и чем он обоснован? Вот лично я категорически не согласен, и могу объяснить почему. Потому что инициализация входов, выходов, интерфейсов типа SPI и UART производится в другом месте программы и логически инициализация никак не связана с нормальной работой. Это просто логически несвязанные действия. Как говорится, покажите этих "учителей" и я порву их на британский флаг :) В свое время был один "учитель", Корабельников его фамилия. Такого накуевертил, что уши дыбом вставали от его "уроков".

То, что вы написали, в представлении теории КА выглядит вот так:
Изображение
есть единственный переход из S0 (инициализация) в S1 (работа), а дальнейшие любые переходы возвращают в то же самое состояние S1 (работа). И всё, на этом КА закончился. Остальная же часть является простой комбинаторикой и к КА не относится.
Вот так то.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить цикл в case оператора switch
СообщениеДобавлено: Пт окт 07, 2022 16:49:12 
Это не хвост, это антенна

Карма: 4
Рейтинг сообщений: 139
Зарегистрирован: Ср июн 25, 2008 15:19:44
Сообщений: 1478
Рейтинг сообщения: 0
MLX90640, я не критиковать начал. А указал на шаблоны. Вы до сих пор не поняли, о чем я говорю. Совсем не поняли. Есть электронщики, которые пришли от железа. Есть электронщики, которые пришли от программизма. Дос, венда и прочее. Есть теоретики. Есть практики. У всех свои подходы. Мало того, эмбеддинг. Тоже градации. "Арм", "АВР", "дос", венда линух. Плевать. Даже больше скажу. Релейщики. У всех свои шаблоны. Наработки. И так далее. Я говорил о типах мышления. Если вы этого не поняли и не хотите понимать, дальнейший наш диалог не имеет никакого смысла.
Типы мышления, шаблоны и так далее.
Мне откровенно насрать, какой вы умный, что вы сделали раньше. Но мне не насрать на конструктивную идею. Не зашоренную шаблонами. И не противоречащую правилам. А что так можно было?!....
Понимаете?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить цикл в case оператора switch
СообщениеДобавлено: Пт окт 07, 2022 16:55:32 
Опытный кот
Аватар пользователя

Карма: 2
Рейтинг сообщений: 164
Зарегистрирован: Ср авг 03, 2022 05:22:56
Сообщений: 848
Рейтинг сообщения: 0
Нет, мы не про шаблоны. Мы про то, что вы там написали выше, про ваших "учителей", если так угодно. Вот объясните, для какой цели вас научили ставить инициализацию входов кнопок в ту же место, где идет расшифровка полученных кодов и событий кнопок. Ну как логически это объяснить то? Физически кнопки читаются в другой функции. По какой логике вы действовали, поставив инит именно в это место, да еще и применив switch-case для переключения из инициал. в режим норм.работы. Вот как это логически объяснить то?
Потому что если убрать этот инит, то КА просто уже не будет существовать. Комбинационная логика через переключатель switch-case не относится к КА с точки зрения теории КА! Вот в чем беда вашего шаблона то. Вас просто неверно информировали по этой теме :)

Что же касается моих "шаблонов", то вы просто не поняли, что для наглядности я указал раздельные входные параметры для трех кнопок, и из-за этого операторы выбора приобрели вид if(), а не switch. Хотя, не меняя состава параметров можно провести логическое объединение входных параметров в единую переменную и вернуться к привычному вам switch-case шаблону. Тут уже не важно, дело привычки и шаблона.
Но всё остальное составляет именно логику типичного КА с памятью внутренних состояний в переменных p и tr.
И если вам так привычнее по вашему шаблону, то переменную p можно вынести в отдельную ф-цию вызываемую из этого функционального блока. Опять же, это вам так привычнее, это ваше шаблонное мышление не дало вам понять иную форму записи и начать спорить.
Хотя, чисто логически, нет большого смысла разделять функции не по логике работы в конкретной поставленной задаче, а по своим зашитым раз и навсегда шаблонам. Программист должен обладать гибким умом и уметь выбирать разные способы ("шаблоны") исходя из конкретных условий.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить цикл в case оператора switch
СообщениеДобавлено: Пт окт 07, 2022 17:43:38 
Это не хвост, это антенна

Карма: 4
Рейтинг сообщений: 139
Зарегистрирован: Ср июн 25, 2008 15:19:44
Сообщений: 1478
Рейтинг сообщения: 0
Уважаемый!!!! Вы не поняли. И не понимаете. В первую очередь. Вы не понимаете, что такое интернет общение. Если бы я смотрел тебе в глаза, ты бы понимал меня на порядок глубже, чем через сухой безэмоциональный текст на форуме. Твои представления о конечных автоматах какое то. Ммм. Куцее. Также. Твои представления обо мне на основании написанного мной. Тоже куцее. Оторванное от реальности. Я бы сказал, ботан, заучка. Но ты же оскорбишься?
В данный момент я вижу перед собой системщика. Чистого программиста. Который более озабочен шаблонами программизма. И оторванного от железа.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить цикл в case оператора switch
СообщениеДобавлено: Пт окт 07, 2022 17:56:19 
Опытный кот
Аватар пользователя

Карма: 2
Рейтинг сообщений: 164
Зарегистрирован: Ср авг 03, 2022 05:22:56
Сообщений: 848
Рейтинг сообщения: 0
Так вы же сами сказали - без эмоций, сухо и конструктивно, и без перехода на личности. Ну так и держите себя в руках.
Вот я конструктивно и веду диалог, спрашивая, почему и кто научил вас вставлять инициализацию именно в этот участок кода и почему надо тратить лишнюю переменную на переключение от инита входов/выходов к нормальной работе.
Вот конструктивно, вот ведь есть программный счетчик Programm Counter, он заведует переключением инструкций исполняемого кода. Так вот, если написать:
Код:
int main(void)
{
     MCU_Init();
     Devices_Init();
     while(1)
     {
         /* рабочий цикл */
    }
}

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

Цитата:
Твои представления о конечных автоматах какое то. Ммм. Куцее.

Хм. Теория конечных автоматов фпомощь. Там капец сколько всего "некуцего". И в принципе, там ясно сказано, что простая комбинаторика (через switch-case в том числе) без памяти состояний не является конечным автоматом. Как бы вот. Смотрите графы, читайте описания.
КА применяется например в парсинге (синтаксическом разборе) текста, в поиске заданной последовательности во входном потоке. ИИ тоже основывается на КА.


Последний раз редактировалось MLX90640 Пт окт 07, 2022 18:08:02, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить цикл в case оператора switch
СообщениеДобавлено: Пт окт 07, 2022 18:06:43 
Это не хвост, это антенна

Карма: 4
Рейтинг сообщений: 139
Зарегистрирован: Ср июн 25, 2008 15:19:44
Сообщений: 1478
Рейтинг сообщения: 0
Del


Последний раз редактировалось Demiurg Сб окт 08, 2022 04:38:18, всего редактировалось 2 раз(а).

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить цикл в case оператора switch
СообщениеДобавлено: Пт окт 07, 2022 18:08:33 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1472
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15136
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Снова "споры о Курице и Яйце", только излишний накал страстей.
:tea:
Гораздо проще алгоритм нарисовать, а уже далее как его реализовать - это уже в каждом случае самостоятельное решение при множестве возможных вариантов, зависящих от не меньшего количества "объективных и субьективных факторов".
Да и сами алгоритмы не менее двух вариантов рисования имеют.
Так шо... не царапаемся - выкладываем свои версии - а уж тоаикстартер будет решать, что там ему больше подходит.
:beer:
Вот, к примеру, мое видение "векторной" клавиатуры на 5 кнопок в многофункциональной игрушке на основе адуринки:
viewtopic.php?p=4270284#p4270284
(архив проекта download/file.php?id=383794)
а вот такой алгоритм я закладывал в проект обработчика механического энкодера (сам проект под ассемблером для ПИКов и АВРок макетами проверялся):
https://img.radiokot.ru/files/20529/10olmil01x.GIF
Но я ж не профи - просто самоучка-любитель.
8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить цикл в case оператора switch
СообщениеДобавлено: Пт окт 07, 2022 18:12:43 
Опытный кот
Аватар пользователя

Карма: 2
Рейтинг сообщений: 164
Зарегистрирован: Ср авг 03, 2022 05:22:56
Сообщений: 848
Рейтинг сообщения: 0
Что случилось? Так сложно ответить чтоль по существу, без перехода на личности и эмоций? Вы же сами просили - сухо, безэмоционально и конструктивно по делу.
Ну дак вот. По делу: почему вы считаете, что
Код:
switch (_proc_device)
   {
      case 0:
         bla_bla; // инициализация
         _proc_device = 1;
         break;
      case 1:
if (G .....


более правильное, чем общепринятое
Код:
int main(void)
{
     Init();
     while(1)
     {
         /* рабочий цикл */
    }
}

Шаблон? Почему тогда им все пользуются и лишь только вы изобреДате что-то нелогичное?

Код:
Тебе сколько лет? Мне 44.

42. А что? Следующий вопрос будет о размере пиписьки? :))) ну я как-то никогда не мерил линейкой, если честно :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить цикл в case оператора switch
СообщениеДобавлено: Пт окт 07, 2022 18:14:46 
Это не хвост, это антенна

Карма: 4
Рейтинг сообщений: 139
Зарегистрирован: Ср июн 25, 2008 15:19:44
Сообщений: 1478
Рейтинг сообщения: 0
Del


Последний раз редактировалось Demiurg Сб окт 08, 2022 04:37:44, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить цикл в case оператора switch
СообщениеДобавлено: Пт окт 07, 2022 18:18:23 
Опытный кот
Аватар пользователя

Карма: 2
Рейтинг сообщений: 164
Зарегистрирован: Ср авг 03, 2022 05:22:56
Сообщений: 848
Рейтинг сообщения: 0
Нет, до пезды примеры не нужны :)))
Не на примерах, на словах расскажите, почему и кто так научил делать? Корабельников, штоль?
Впрочем, можете показать примеры. А я вам конструктивно и сухо расскажу, почему ваши шаблоны нелогичны.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить цикл в case оператора switch
СообщениеДобавлено: Пт окт 07, 2022 18:23:42 
Это не хвост, это антенна

Карма: 4
Рейтинг сообщений: 139
Зарегистрирован: Ср июн 25, 2008 15:19:44
Сообщений: 1478
Рейтинг сообщения: 0
Del


Последний раз редактировалось Demiurg Сб окт 08, 2022 04:37:23, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить цикл в case оператора switch
СообщениеДобавлено: Пт окт 07, 2022 18:28:05 
Опытный кот
Аватар пользователя

Карма: 2
Рейтинг сообщений: 164
Зарегистрирован: Ср авг 03, 2022 05:22:56
Сообщений: 848
Рейтинг сообщения: 0
Ну так для того, чтобы ничего не упустить, есть юнит-тесты. Тестирование то есть. По отдельным фукнциональным блокам, и в целом. Юнит-тесты - обязательная вещь для проверки поведения тестируемого модуля при различных входных условиях. Как же без тестирования выпускать устройство то. Разве ваши учителя не знали об этом?
Ну и голова программисту дана не для того, чтобы наушники в нее вставлять :)
У АРМ-щиков например есть вообще стандартная ф-ция SystemInit(), а кодогенератор Cube генерирует весь инит хардвара в одном месте. Десятки тысяч людей не могут одновременно ошибаться.
Бывает конечно логика работы программы, когда инит и переинит некоторых модулей происходит прямо во время рабочего процесса. Но это скорее исключение, чем правило. Просто потому, что модуль переключается в другой режим работы и его настройки меняются.

Мне 30-35? Да, спасибо, я весьма молодо выгляжу внешне, многие это отмечают. Веду здоровый образ жизни, занимаюсь спортом. Но как бы личности непристало тут обсуждать, так ведь? Ну и библейское - НЕ СУДИ И НЕ СУДИМ БУДЕШЬ :))) Вкупаетесь? То-то же!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить цикл в case оператора switch
СообщениеДобавлено: Пт окт 07, 2022 18:39:55 
Это не хвост, это антенна

Карма: 4
Рейтинг сообщений: 139
Зарегистрирован: Ср июн 25, 2008 15:19:44
Сообщений: 1478
Рейтинг сообщения: 0
Del


Последний раз редактировалось Demiurg Сб окт 08, 2022 04:37:07, всего редактировалось 1 раз.

Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 252 ]    , , 3, , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 284


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y