Например TDA7294

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

Текущее время: Вт авг 19, 2025 01:47:57

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


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



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

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


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

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


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

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


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

Карма: 2
Рейтинг сообщений: 164
Зарегистрирован: Ср авг 03, 2022 05:22:56
Сообщений: 848
Рейтинг сообщения: 0
Пояснение относительно таблицы переходов и состояний ДКА. А то "некоторые" ошибочно сравнили её с таблицей названий пунктов менюшки из ЧМИ :))) Это, как у нас говорят, "две большие разницы".
Так вот. Прямоугольная двухмерная таблица переходов и состояний конечного автомата:
Код:
const uint8_t fsm_table[][8] = {
   /* s  | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 */
   /* s0*/{0,  1,  2,  0,  3,  0,  0,  0},

   /* s1*/{4,  1,  1,  1,  1,  1,  1,  1},
   /* s2*/{5,  2,  2,  2,  2,  2,  2,  2},
   /* s3*/{6,  3,  3,  3,  3,  3,  3,  3},

   /* s4*/{4,  7,  2,  4,  3,  4,  4,  4},
   /* s5*/{5,  1,  7,  5,  3,  5,  5,  5},
   /* s6*/{6,  1,  2,  6,  7,  6,  6,  6},

   /* s7*/{0,  7,  7,  7,  7,  7,  7,  7} };

В таблице вертикальные столбцы означают все варианты входных значений КА, называемые "входной алфавит КА". Строки по горизонтали представляют номера всех возможных состояний КА, в которых он может находиться. В ячейках таблицы помещены номера состояния, в которое перейдет КА из текущего состояния (по строке) в зависимости от входного значения (по столбцу).
Пусть начальное состояние КА равно 0, активна строчка s0. На вход КА поступает входное значение, например, 2. На пересечении строки 0 и столбца 2 записано 2. Значит, следующее состояние КА будет = 2 и активная строчка переключится на строку s2. Это реализуется вот таким кодом:
Код:
uint8_t fsm_s = 0;   // переменная текущего номера состояния КА
/* переход на новое состояние через входное значение */
fsm_s = fsm_table[fsm_s][input_value];

то есть, новое состояние КА в переменной fsm_s будет запомнено. И в следующем цикле активной строчкой будет уже s2. Пусть на вход поступит значение, например 0. По таблице на пересечении столбца 0 и строки s2 находится следующее состояние 5, в которое КА перейдет, и активной станет строка s5. Ну и так далее.

Теперь надо связать эти состояния со значениями на выходе. Это называется "выходной алфавит КА". Каждому состоянию s присваивается некое число, которое нужно получить на выходе, в рассматриваемом случае - номер режима работы.
Код:
   /* таблица выходного алфавита КА */
   const int8_t fsm_out[] =
   /* s0 | s1 | s2 | s3 | s4 | s5 | s6 | s7 */
     {-1,   1,   2,   3,  -1,  -1,  -1,  0};

ну и соответственно, из таблицы значения извлекаются так:
Код:
mode = fsm_out[fsm_s];

Ну вот и всё! :)
Программно очень даже незамудренно делается. Основная сложность, это составить таблицу состояний и переходов. Помочь в этом может составление графа переходов (ранее показывал) - кружочками обозначаются состояния КА, а стрелочки между ними показывают возможные переходы при каждом входном значении (показываются над стрелочками). Вот так:
Изображение

Да, это далеко не новый алгоритм, он стар, как и сама математика. Глупо предъявлять претензии например теореме Пифагора за то, что она очень старая. Так же и здесь. Тем более, что запись КА на языке математических множеств - охренеть какая сумасшедше-выглядящая. Ну да, это ж высшая математика. Скажите спасибо, что еще не тензоры, хехе.
Так что, показанная табличка не имеет никакого отношения к таблицам с названиями пунктов меню, показанным тут ранее нашим "главным учителем".


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

Карма: 4
Рейтинг сообщений: 139
Зарегистрирован: Ср июн 25, 2008 15:19:44
Сообщений: 1478
Рейтинг сообщения: 0
Напоминаю. Вопрос задал начинающий. Я ему показал самую простую реализацию конечных автоматов. Так называемую switch-case технологию. Потому что, switch-case легко реализует распараллеливание процессов. Псевдопараллельность. Дробит выполнение кода.


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

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


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

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

2 - я говорю о псевдопараллельность процессов. Многие используют долгие циклы в своих проектах. К примеру, опрос в цикле. Delay. И многие начинающие не могут понять, как им реализовать параллельную работу программных модулей. Опрос кнопок, мигание светодиодов, что то вывести на экранчик и так далее. Как решить эту проблему? Полностью переработать свои прежние наработки. Раздробить выполнение всех программных модулей. Чтобы выполнение основного цикла, где выполняются какие либо программные модули, происходило с запасом за системный тик. Вводим понятие системный тик. Аппаратный таймер настраивается, к примеру на 1 мс. 5 мс. 10 мс. Это будет системный тик. То есть, за некоторую аналогию берется операционная система. Которая по таймеру переключает задачи. Только в нашем случае псевдопараллельность достигается дроблением выполнения кода. Условиями, ветвлениями по твоей терминологии. Состояниями конечных автоматов.

Ты опять начинаешь флудить.


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

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

Да, кстати, помогите там топикстартеру, коль вы такой вумный! Не стесняйтесь, помогите делом человеку, непосредственно в ЕГО коде.


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

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

Тебе самому не смешно?

Так. Народ. Пора с этим товарищем заканчивать в теме avr. Этот товарищ пришел к нам из темы arm. Это совершенно другие микроконтроллеры. Другая архитектура. Другие мощности и скорости. Он либо не осознает разницу между arm и avr. Либо откровенно глумится над всеми нами. Обратите все внимание, на каких интонациях он присутствует в этой теме. Свысока. Он arm-щик, а мы, значит, все убогие, ковыряемся с avr.

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

Пора с этим заканчивать.


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

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

Топикстартер давно, еще в самом начале выложил свой код. И вам всего лишь следовало его исправить. Вот и займитесь этим прямо сейчас. Занимайтесь, гсподин Demiurg, вы же еще в самом начале обещали всех научить, как и что делать. У вас было достаточно времени, чтобы сделать хоть что-то работающее. Я за это время сделал двумя разными вариантами как раз то, что требовалось изначально - мигающие светики, переключаемые нажатием на одну из трех кнопок, повторное нажатие той же кнопки выключает мигание светика.


Последний раз редактировалось MLX90640 Пн окт 10, 2022 21:37:11, всего редактировалось 1 раз.

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

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

Надеюсь, ты хотя бы на электрониксе есть


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

Карма: 2
Рейтинг сообщений: 164
Зарегистрирован: Ср авг 03, 2022 05:22:56
Сообщений: 848
Рейтинг сообщения: 0
Так тут тема то не для показывания моих работ, а для разбора проблемы топикстартера. Я уже дважды сделал и выложил видосы работающих согласно заданию примеров. ДВАЖДЫ! Двумя разными способами. Теперь очередь за Demiurg-ом. У нас всё по-честному, по-справедливости!

Цитата:
Ты мне надоел. Так что давай

Но зачем же я буду показывать, если я надоел? Это как-то нелогично ведь :)))
Ну а по проблеме этой темы я уже дважды в этой теме ПОКАЗАЛ видосы работающих примеров по этому заданию.


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

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


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

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


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

Карма: 4
Рейтинг сообщений: 139
Зарегистрирован: Ср июн 25, 2008 15:19:44
Сообщений: 1478
Рейтинг сообщения: 0
В теме уже есть пример. Тс работает с протеусом. Пусть берет хекс, по дефайнам смотрит что куда. И прогоняет. Было тз. Пример сделан по тому тз.
Потому что лично я в протеусе не работаю. И прогоняю все свои проекты, какие бы они ни были сложными, в симуляторе avr-studio. Даже проекты с развитыми меню.

Не отходи от темы. Доказательства профессиональной деятельности. Давай, обосновывай свое высомерное поведение. Я не про себя говорю. Ты здесь на всех свысока смотришь.

Показал примитивный интерпретатор, а поведение, как будто буран в космос запустил.


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

Зарегистрирован: Пн окт 05, 2020 17:20:11
Сообщений: 44
Рейтинг сообщения: 0
Ребята, давайте жить дружно. Вы все в большей или меньшей степени профессионалы. Зачем ломать копья. Каждый из Вас чувствует себя Гуру в своей профессиональной нише. Я всего лишь попросил помощи для улучшения своего кода, для возможности решить еще одну задачу в этом моем проекте. Честно скажу, я уже жалею, что попросил помощи на этом форуме, потому, что я считал форумчан людьми не только профессиональными, но и интеллигентными, поскольку эта профессия предполагает ум, терпение, умение постоянно обучаться, и умение оказывать помощь коллегам, пусть это и начинающие. Сейчас у меня уже меняется представление о таких форумах и форумчанах. К сожалению.


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

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


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

Зарегистрирован: Пн окт 05, 2020 17:20:11
Сообщений: 44
Рейтинг сообщения: 0
Задача не изменилась, три канала кнопки + светодиоды. Если возможно изменить или добавить что-то к моему коду чтобы 1)переключение было с фиксацией, т.е. включение любого канала вызывает отключение включенного ранее, 2)в любом выбранном канале (или в нескольких) можно при его включении получать на выходе или +5в, или мигающий светодиод. Например 1 канал - выход +5в, 2 канал - на выходе мигающий светодиод с частотой, например, 10Гц,3 канал - с другой частотой, например 60Гц. Если это сложно или невозможно сделать с данным кодом, то просьба оставить все как есть - яс делаю что-то похожее за счет внешних диодов и оптопар ,т.к. мне уже показали, как сделать переключатель с фиксацией без мигания, а только с зажиганием (+5в) светодиодов, т.е. можно обойтись без серьезных изменений кода.
Спасибо.


Вложения:
temp2.rar [105.26 KiB]
Скачиваний: 27
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как поместить цикл в case оператора switch
СообщениеДобавлено: Вт окт 11, 2022 14:37:47 
Это не хвост, это антенна

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

МК какой? Пины кнопок, пины выходов.

Цель? Научиться по примерам или создать конечный продукт. Если не секрет, что за девайс?


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

Зарегистрирован: Пн окт 05, 2020 17:20:11
Сообщений: 44
Рейтинг сообщения: 0
Все есть в файле (Atmega 8) temp2.rar. Научиться на примере с этим кодом, который я хорошо понимаю


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

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


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

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


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

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


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