Потому и был выложен вариант с откатом к switch/case, что табличный способ с использованием ПЗУ или массива указателей для топикстартера пока "на грани восприятия". Это же не ассемблер. А Сишные конструкции мне пока под ардуинкой удобнее делать.
Именно. Таблицы предполагают понимание. С одной стороны, кажущаяся лёгкость. С другой, алгоритм уже сложнее отследить. Вдобавок. Индекс. Перебор строк. Накладные расходы. Индекс понятно. Небольшое количество строк тоже. Но когда строк много, увеличивается время на перебор.
Особо работа с таблицами в ПЗУ в АВРок... Под ассемблером еще терпимо, но под Си... В той "игрушке", что ранее выкладывал парочка табличных кодер/декодеров встроена была... Мало того, что чтение весьма специфично, так еще и индексация для восприятия немного заморочная для начала. То уже после освоения легко воспринимается.
Пояснение относительно таблицы переходов и состояний ДКА. А то "некоторые" ошибочно сравнили её с таблицей названий пунктов менюшки из ЧМИ Это, как у нас говорят, "две большие разницы". Так вот. Прямоугольная двухмерная таблица переходов и состояний конечного автомата:
В таблице вертикальные столбцы означают все варианты входных значений КА, называемые "входной алфавит КА". Строки по горизонтали представляют номера всех возможных состояний КА, в которых он может находиться. В ячейках таблицы помещены номера состояния, в которое перейдет КА из текущего состояния (по строке) в зависимости от входного значения (по столбцу). Пусть начальное состояние КА равно 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 присваивается некое число, которое нужно получить на выходе, в рассматриваемом случае - номер режима работы.
ну и соответственно, из таблицы значения извлекаются так:
Код:
mode = fsm_out[fsm_s];
Ну вот и всё! Программно очень даже незамудренно делается. Основная сложность, это составить таблицу состояний и переходов. Помочь в этом может составление графа переходов (ранее показывал) - кружочками обозначаются состояния КА, а стрелочки между ними показывают возможные переходы при каждом входном значении (показываются над стрелочками). Вот так:
Да, это далеко не новый алгоритм, он стар, как и сама математика. Глупо предъявлять претензии например теореме Пифагора за то, что она очень старая. Так же и здесь. Тем более, что запись КА на языке математических множеств - охренеть какая сумасшедше-выглядящая. Ну да, это ж высшая математика. Скажите спасибо, что еще не тензоры, хехе. Так что, показанная табличка не имеет никакого отношения к таблицам с названиями пунктов меню, показанным тут ранее нашим "главным учителем".
Напоминаю. Вопрос задал начинающий. Я ему показал самую простую реализацию конечных автоматов. Так называемую switch-case технологию. Потому что, switch-case легко реализует распараллеливание процессов. Псевдопараллельность. Дробит выполнение кода.
Напоминаю. Кое-кто ошибочно считает конечными автоматами все то, что имеет ветвление по switch-case. Но в этой табличке switch-case представлен в виде табличного метода и работает намного-намного-намного быстрее перебора условий case. Ну и вы же привели пример таблички с названиями пунктов меню, ошибочно сравнив её с таблицей переходов КА. "Учителю" следует учицца, учицца, учицца, как завещал другой великий учитель Программист не должен ограничиваться одним лишь познанием switch-case, а совершенствовать себя! Тем более, что по switch-case НЕ происходит никакого распараллеливания работы кода. Это просто ветвление по условию, не более того! Грамотный программист никогда не будет путать ветвление с работой операционной системы.
1 - ты показал табличный метод, утверждая при этом, что участникам форума типа неизвестны эти методы. Я же показал, что табличные интерпретаторы нам прекрасно известны.
2 - я говорю о псевдопараллельность процессов. Многие используют долгие циклы в своих проектах. К примеру, опрос в цикле. Delay. И многие начинающие не могут понять, как им реализовать параллельную работу программных модулей. Опрос кнопок, мигание светодиодов, что то вывести на экранчик и так далее. Как решить эту проблему? Полностью переработать свои прежние наработки. Раздробить выполнение всех программных модулей. Чтобы выполнение основного цикла, где выполняются какие либо программные модули, происходило с запасом за системный тик. Вводим понятие системный тик. Аппаратный таймер настраивается, к примеру на 1 мс. 5 мс. 10 мс. Это будет системный тик. То есть, за некоторую аналогию берется операционная система. Которая по таймеру переключает задачи. Только в нашем случае псевдопараллельность достигается дроблением выполнения кода. Условиями, ветвлениями по твоей терминологии. Состояниями конечных автоматов.
Но вы же сами просили чего-нить другого вместо switch-case Ну вот. А теперь это вам не нравится, то не устраивает. Вы окромя своего ничего и не воспринимаете другого, зависли, зашорились. А то, что вы показали - это всего лишь таблица названий пунктов меню. Вы конечно молодец, что знаете (слышали), как работать с индексами таблицы. Но вот так и не поняли практического использования таблиц на практике Учиццца, учицца и еще раз учицца, дорогой вы наш "учитель"! Не застревайте в старье, совершенствуйтесь, учитесь!
Да, кстати, помогите там топикстартеру, коль вы такой вумный! Не стесняйтесь, помогите делом человеку, непосредственно в ЕГО коде.
Ты показал нам всего лишь примитивный интерпретатор таблицы. Да, кому то это будет интересно. Но ты также обвернул это своим апломбом, наговорил много умных слов, дабы мы нижайшие склонились перед твоим ярким и могучим интеллектом.
Тебе самому не смешно?
Так. Народ. Пора с этим товарищем заканчивать в теме avr. Этот товарищ пришел к нам из темы arm. Это совершенно другие микроконтроллеры. Другая архитектура. Другие мощности и скорости. Он либо не осознает разницу между arm и avr. Либо откровенно глумится над всеми нами. Обратите все внимание, на каких интонациях он присутствует в этой теме. Свысока. Он arm-щик, а мы, значит, все убогие, ковыряемся с avr.
Тс уже стесняется задавать вопросы. Дело не в том, чтобы разобраться в коде. А понять проблему тс и тогда уже предметно разбираться.
Ну дак что ж поделать, если математическая запись выражений из теории множеств реализуется всего лишь таблицей На то и созданы алгоритмы, чтобы простым тривиальным способом описать сложные математические выражения. Алгоритмы ИИ, лексического разбора текста и тому подобные записываются как раз не портянками switch-case, а таблицами. Это не мной придумано, это общепринятая давняя практика. Глупо осуждать законы математики только за то, что они давно доказаны и написаны. "табличный интерпретатор"... хаха, у нас за такие выражения тапками бы закидали. Грамотный программист всегда знает и пользуется общепринятыми и общепонятными терминами и выражениями. А малограмотный придумывает только одному ему понятные названия
Топикстартер давно, еще в самом начале выложил свой код. И вам всего лишь следовало его исправить. Вот и займитесь этим прямо сейчас. Занимайтесь, гсподин Demiurg, вы же еще в самом начале обещали всех научить, как и что делать. У вас было достаточно времени, чтобы сделать хоть что-то работающее. Я за это время сделал двумя разными вариантами как раз то, что требовалось изначально - мигающие светики, переключаемые нажатием на одну из трех кнопок, повторное нажатие той же кнопки выключает мигание светика.
Последний раз редактировалось MLX90640 Пн окт 10, 2022 21:37:11, всего редактировалось 1 раз.
Э нет. Дарагой. Давай показывай кто ты есть на серьезных профильных форумах. Твой актив. То есть, устройства, приборы. Ты мне надоел. Так что давай. Показывай предметно.
Так тут тема то не для показывания моих работ, а для разбора проблемы топикстартера. Я уже дважды сделал и выложил видосы работающих согласно заданию примеров. ДВАЖДЫ! Двумя разными способами. Теперь очередь за Demiurg-ом. У нас всё по-честному, по-справедливости!
Цитата:
Ты мне надоел. Так что давай
Но зачем же я буду показывать, если я надоел? Это как-то нелогично ведь Ну а по проблеме этой темы я уже дважды в этой теме ПОКАЗАЛ видосы работающих примеров по этому заданию.
По справедливости будет, когда ты доказательно обоснуешь свою профессиональную состоятельность. И это не полторы поделки левой пяткой на коленке. А серьезная работа, соответствующая твоим заявлениям о гениальности и гибкости мышления. Я тебе сказал. Э Нэт дарагой. Ты пришел с другой темы. И с АВР ты походу даже не работал. И не понимаешь нюансов аврок.
В теме уже есть пример. Тс работает с протеусом. Пусть берет хекс, по дефайнам смотрит что куда. И прогоняет. Было тз. Пример сделан по тому тз. Потому что лично я в протеусе не работаю. И прогоняю все свои проекты, какие бы они ни были сложными, в симуляторе avr-studio. Даже проекты с развитыми меню.
Не отходи от темы. Доказательства профессиональной деятельности. Давай, обосновывай свое высомерное поведение. Я не про себя говорю. Ты здесь на всех свысока смотришь.
Показал примитивный интерпретатор, а поведение, как будто буран в космос запустил.
Ребята, давайте жить дружно. Вы все в большей или меньшей степени профессионалы. Зачем ломать копья. Каждый из Вас чувствует себя Гуру в своей профессиональной нише. Я всего лишь попросил помощи для улучшения своего кода, для возможности решить еще одну задачу в этом моем проекте. Честно скажу, я уже жалею, что попросил помощи на этом форуме, потому, что я считал форумчан людьми не только профессиональными, но и интеллигентными, поскольку эта профессия предполагает ум, терпение, умение постоянно обучаться, и умение оказывать помощь коллегам, пусть это и начинающие. Сейчас у меня уже меняется представление о таких форумах и форумчанах. К сожалению.
К сожалению, подобное случается. И не только на этом форуме. Признаю свою вину в том, что вовремя не остановился. Попробуем начать заново. Озвучьте ваши вопросы и затруднения.
Задача не изменилась, три канала кнопки + светодиоды. Если возможно изменить или добавить что-то к моему коду чтобы 1)переключение было с фиксацией, т.е. включение любого канала вызывает отключение включенного ранее, 2)в любом выбранном канале (или в нескольких) можно при его включении получать на выходе или +5в, или мигающий светодиод. Например 1 канал - выход +5в, 2 канал - на выходе мигающий светодиод с частотой, например, 10Гц,3 канал - с другой частотой, например 60Гц. Если это сложно или невозможно сделать с данным кодом, то просьба оставить все как есть - яс делаю что-то похожее за счет внешних диодов и оптопар ,т.к. мне уже показали, как сделать переключатель с фиксацией без мигания, а только с зажиганием (+5в) светодиодов, т.е. можно обойтись без серьезных изменений кода. Спасибо.
Вам важно, чтобы именно ваш код поправить? Потому что мне, да и многим проще создать проект заново. У каждого свои наработанные подходы, стили, методы реализации.
МК какой? Пины кнопок, пины выходов.
Цель? Научиться по примерам или создать конечный продукт. Если не секрет, что за девайс?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 448
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения