Страница 9 из 13

Re: Как поместить цикл в case оператора switch

Добавлено: Вт окт 11, 2022 15:34:43
Demiurg
Проект в каком компиляторе собирал?

Re: Как поместить цикл в case оператора switch

Добавлено: Вт окт 11, 2022 19:29:03
uuu000
GCC Microchip Studio

Re: Как поместить цикл в case оператора switch

Добавлено: Вт окт 11, 2022 20:03:24
OKF
Да пофигу компилятор! Вы логику то должны понимать?
Или это у вас вызывает затруднения?

Код: Выделить всё

void main(void) {
  setup();
  while (true)
    loop();
}
Исходный текст я уже привёл. Результат виден. Какие вопросы?

Re: Как поместить цикл в case оператора switch

Добавлено: Вт окт 11, 2022 20:45:26
Demiurg
OKF, это кому?

Добавлено after 16 minutes 54 seconds:
Посидел, подумал. Нет, так дело не пойдет.
Вольфганг Трамперт. AVR-RISC микроконтроллеры. В этой книге доступно и подробно показана архитектура мк avr. Примеры на ассемблере, но это не проблема. В книге много разных примеров. В том числе примеры работы с таймерами.
Вот вам урок. Читаете книгу, получите представление, как настраивать работу таймеров. Домашнее задание. Сделать тестовый проект. Генерация меандра, пусть примерно, 60 гц. Частота кварца 10 или 16 МГц.

Следующий урок. Пусть без подавления дребезга. Кнопка. Первое нажатие, запускаем генератор меандра. Второе нажатие остановка генерации. Запуск, остановку работу генератора сделать отдельными функциями. Потом как конечный автомат. Режимы IDLE, SET_RUN, RUN, STOP.

Следующий урок. Подавление дребезга. Есть цикл статей Татарчевского. Есть мой пример. У меня сделано практически по татарчевскому. Завтра покажу пример кнопки с подавлением дребезга.

Когда будет готов программный модуль кнопки с подавлением дребезга. Запуск генератора меандра

Re: Как поместить цикл в case оператора switch

Добавлено: Вт окт 11, 2022 21:13:15
Dimon456
Demiurg писал(а):Проект в каком компиляторе собирал?
с успехом сожрет winavr, iar, cvavr, да же тупо из под протеуса можно усе сделать, с небольшими изменениями и сожрет arduino_ide.
У него Makefile есть, при установленном winavr тупо из под командной строки можно собрать.
Даже можно попробовать и онлайн собрать.
В чем проблема вообще?

Вас просят подкорректировать чужой код - вот и корректируйте.

Re: Как поместить цикл в case оператора switch

Добавлено: Вт окт 11, 2022 21:22:02
Demiurg
Проблем нет. Есть пошаговое создание проекта. Берешь книжку, берешь карандаш, бумажку и рисуешь алгоритм. Сначала человеку нужно понять, в чем именно его затык. Он правильно в общем то делает.
От нас, мы ему примеров накидали. Разных.

Я от себя добавлю. Пусть раздербанит проект и покусочно поймет в чем его затык.

Re: Как поместить цикл в case оператора switch

Добавлено: Вт окт 11, 2022 21:27:08
Dimon456
Demiurg писал(а):Я от себя добавлю.
А ты не добавляй.
Из ваших всех примеров мне понравился пример MLX90640, но он не объяснил самого главного,
как создается сам рисунок?

Re: Как поместить цикл в case оператора switch

Добавлено: Вт окт 11, 2022 21:30:03
Demiurg
Табличный? Рисунок? Ты про рукописный? Или я упустил, в программе для графов, алгоритмов?

Re: Как поместить цикл в case оператора switch

Добавлено: Вт окт 11, 2022 21:35:56
Dimon456

Re: Как поместить цикл в case оператора switch

Добавлено: Вт окт 11, 2022 21:44:53
Demiurg
Номера строк это состояния. Номер символа это следующее состояние автомата. Графы это взаимосвязи. Сообщения, входные символы, короче, все входы автомата - следующие состояния автомата.

Теперь смотри. Первая строка это 0-вое состояние автомата. Номера символа в строке от 0. Смотрим. Первая строка 0 состояние. Первый нулевой символ там 0. Значит состояние остаётся прежним. Следующий символ в строке там 1. Значит следующее состояние автомата 1. И так далее.

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

Re: Как поместить цикл в case оператора switch

Добавлено: Вт окт 11, 2022 21:53:08
Dimon456
Demiurg, сам рисунок, нарисуй так что бы я понял.

Re: Как поместить цикл в case оператора switch

Добавлено: Вт окт 11, 2022 22:00:24
Demiurg
Мои все спят. Комп недоступен.

Re: Как поместить цикл в case оператора switch

Добавлено: Вт окт 11, 2022 22:02:10
Dimon456
Слушай, мне давно уже объяснили, что таблицей работать гораздо эффективнее, чем с вашими флагами.
Demiurg писал(а):Мои все спят. Комп недоступен.
Ты меня опять не понял, пусть лучше автор объясняет.

Re: Как поместить цикл в case оператора switch

Добавлено: Вт окт 11, 2022 22:18:09
Demiurg
Значит ты не так понял. Речь не о флагах. Применять таблицы или нет это твое решение.

Накалякал. Так понятно?

тут

Re: Как поместить цикл в case оператора switch

Добавлено: Вт окт 11, 2022 22:24:32
Dimon456
Demiurg писал(а):Так понятно?
Нет, если мне нет, значит и ТС нет. Ты не забывай, я не спец, я любитель.
Demiurg писал(а):Со Смарта большой размер файла
У меня проблем с инетом нет, оптика, 100Мбит/сек.

Что такое от 0 до 7, откуда 7 взялось? По чему не до 8? или до 16?

По чему s1 s2 s3, а s4 где?

Re: Как поместить цикл в case оператора switch

Добавлено: Вт окт 11, 2022 22:32:17
Demiurg
Конечный автомат. Число состояний конечно. Пусть при проектировании, анализе мы понимаем, что у нас 8 состояний. От 0 до 7. Это номера строк. Также, мы понимаем, что у нас 8 сообщений. От 0 до 7. Это номер символа в строке. Номера строк и символов это индекс. Пусть у нас состояние 0. Это первая строка. Индекс 0. Пришел символ на вход автомата. Пусть у нас будет сообщение со значением 0. Это первый символ в строке. Индекс 0. Пусть пришел в 0 состоянии символ со значением 5. Это первая строка 6 символ. Так понятно?

Re: Как поместить цикл в case оператора switch

Добавлено: Вт окт 11, 2022 22:35:29
MLX90640
[uquote="Dimon456",url="/forum/viewtopic.php?p=4303361#p4303361"]как создается сам рисунок?[/uquote]
Рисунок со стрелочками переходов? Он отражает таблицу, это одно и то же, только стрелками явно показаны переходы, которые в таблице показаны циферками. Да, на рисунке стрелочками составлять удобнее, потому что сразу видно.

На вход алгоритма поступают некоторые входные значения. В данном случае входная переменная может принимать 8 значений: от 0 до 7. Это определено нашими условиями, тем что для каждой кнопки выделен один бит, итого 3 бита, общее число комбинаций = 8. Если кнопок много, такой вариант будет неэффективен по числу комбинаций, поэтому входное значение должно содержать просто десятичный код нажатой кнопки (или код события, если нужны отпускания и нажатия).
Начальное (исходное) состояние, с которого вообще начинается "жизнь", обозначается s0. Затем, от него проводим стрелочки, над которыми пишем циферки значений, при поступлении которых алгоритм пойдет по тому или иному пути и перейдет в другое состояние. И далее, от каждого такого состояния проводятся стрелочки с циферками к другим состояниям. Если входное значение не меняет состояния, рисуется дуга возвращающая в тот же самый кружок.
Таким образом, по этому рисунку можно отследить поведение алгоритма при поступлении входного значения в каждом шаге опроса кнопок. В первом шаге на вход поступила 1 (нажата кнопка 1), по стрелочке перешли в s1. Во втором шаге опроса кнопок получили значение 0 (все кнопки отпущены), и по стрелочке перешли в состояние s4. В следующем шаге опроса получили значение 1 (снова нажата кнопка 1), перешли в состояние s7. Затем отпустили кнопку и вернулись в исходное состояние s0. Стрелочки показывают все возможные комбинации нажатий, удержаний и отпусканий кнопок в каждом цикле опроса кнопок. Число состояний s определяется исходя из того, какие входные последовательности возможны и как должен работать алгоритм.
А чтобы на выходе алгоритма получить конкретные цифры, которые можно применить дальше, нужно составить еще одну табличку, в которой каждому состоянию s соответствует число, нужное нам на выходе.

В двух словах это доходчиво не объяснить, а если объяснять по уму, там нужно уже прибегать к математическим заморочкам, довольно сложная штукенция - составление минимального детерминированного конечного автомата (МДКА). Могу только сказать, что основное назначение такого рода автоматов - это формирование поведения алгоритма в зависимости от приходящих значений. Хорошо работает в менюшках юзер-интерфейса, в разборе приходящих извне (например по UART-у) команд или ответов от того же GSM-модуля SIM800 или от модуля GPS.
В кнопках - да, прикольно, но нужно сразу отсеивать все ненужные комбинации одновременных нажатий, чтобы размер таблицы не разрастался в геометрической прогрессии.
В принципе, алгоритмы через таблицы переходов или через switch-case представляют собой разные записи того же самого. Однако, при сложных и длинных входных последовательностях (например, парсинг текста) запись через switch-case оказывается настолько длинной и нечитаемой, что прибегают именно к табличному методу. И наоборот, если входное число имеет например три варианта: 1, 50, 135, которые сильно отличаются по величине, то табличный метод будет иметь перерасход памяти на промежуточные невостребованные ячейки.

Re: Как поместить цикл в case оператора switch

Добавлено: Вт окт 11, 2022 22:36:51
Dimon456
Demiurg писал(а):Число состояний конечно. Пусть при проектировании, анализе мы понимаем, что у нас 8 состояний.
Ты меня опять не понял.
У нас всего три кнопки, которые могут принимать всего 8 значений.
4 кнопки - уже 16 значений.
Танцуй от этого, учитель, мат надо сюда вставить, да хороший.

У меня внучка жмет на все кнопки на пульте ТВ, и еще и ножкой наступит.

Re: Как поместить цикл в case оператора switch

Добавлено: Вт окт 11, 2022 22:49:55
Demiurg
А давай без эмоций. Есть разные виды конечных автоматов. И если вдаваться в подробности, то, Гугл в помощь. Тем более что есть ещё математические модели конечных автоматов. А это уже не с форумов учиться.

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

По поводу "учитель". Я в этом топике показал задумку. Практикум. И рамки этого практикума жёстко и строго очерчены.

И кстати, да. Если количество символов велико, как правильно отметил MLX90640, у табличного метода будет много неиспользуемых и повторяющихся ячеек. Поэтому, анализ входных символов. Группировка, сортировка, виды символов и так далее.

Пример. Пусть у нас матричная клава 4х4. От 0 до 9. A, B, C, D, *, #. От 0 до 9 это числовые значения. A, B, C, D, *, # - навигация и действия. От 0 до 9 это вводимые параметры. A, B, C, D, *, # - символы на вход автомата. На входе проверяем, если числовые и если нужно вводить параметры, вводим. Если служебные символы, то вот тебе символы для управления автоматом. Это и есть символы для таблицы.

Грубо, приблизительно как то так.

Re: Как поместить цикл в case оператора switch

Добавлено: Вт окт 11, 2022 23:05:59
MLX90640
[uquote="Dimon456",url="/forum/viewtopic.php?p=4303410#p4303410"]По чему s1 s2 s3, а s4 где?[/uquote]
Попробую еще раз и немного иначе описать. Задано было три кнопки. И выбрано было, что каждой кнопке соответствует один бит, то есть 3 бита, а значит 8 возможных комбинаций состояния этих кнопок. Итого, возможны 8 путей перехода в следующее состояние из текущего. Поэтому ширина таблицы - 8 ячеек.
Затем, задано 3 светодиода, которые будут включаться одной из трех кнопок. Причем, нажатие на ту же самую кнопку должно отключить этот светодиод (и все остальные тоже). А нажатие на любую другую кнопку переключить на другой соответствующий светодиод. Итого минимальное число состояний, реализующих заданный алгоритм работы = 1 исходное + 3 для переключения светодиодов по нажатию кнопки + 3 для отпускания кнопок и подготовки к выключению того же светика по следующему нажатию (как раз реализует тот самый триггер вкл/выкл-кнопки) + 1 для отключения всех светиков по нажатию кнопки.