Как поместить цикл в case оператора switch
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Как поместить цикл в case оператора switch
Проект в каком компиляторе собирал?
- Реклама
Re: Как поместить цикл в case оператора switch
GCC Microchip Studio
Re: Как поместить цикл в case оператора switch
Да пофигу компилятор! Вы логику то должны понимать?
Или это у вас вызывает затруднения?
Исходный текст я уже привёл. Результат виден. Какие вопросы?
Или это у вас вызывает затруднения?
Код: Выделить всё
void main(void) {
setup();
while (true)
loop();
}-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Как поместить цикл в case оператора switch
OKF, это кому?
Добавлено after 16 minutes 54 seconds:
Посидел, подумал. Нет, так дело не пойдет.
Вольфганг Трамперт. AVR-RISC микроконтроллеры. В этой книге доступно и подробно показана архитектура мк avr. Примеры на ассемблере, но это не проблема. В книге много разных примеров. В том числе примеры работы с таймерами.
Вот вам урок. Читаете книгу, получите представление, как настраивать работу таймеров. Домашнее задание. Сделать тестовый проект. Генерация меандра, пусть примерно, 60 гц. Частота кварца 10 или 16 МГц.
Следующий урок. Пусть без подавления дребезга. Кнопка. Первое нажатие, запускаем генератор меандра. Второе нажатие остановка генерации. Запуск, остановку работу генератора сделать отдельными функциями. Потом как конечный автомат. Режимы IDLE, SET_RUN, RUN, STOP.
Следующий урок. Подавление дребезга. Есть цикл статей Татарчевского. Есть мой пример. У меня сделано практически по татарчевскому. Завтра покажу пример кнопки с подавлением дребезга.
Когда будет готов программный модуль кнопки с подавлением дребезга. Запуск генератора меандра
Добавлено after 16 minutes 54 seconds:
Посидел, подумал. Нет, так дело не пойдет.
Вольфганг Трамперт. AVR-RISC микроконтроллеры. В этой книге доступно и подробно показана архитектура мк avr. Примеры на ассемблере, но это не проблема. В книге много разных примеров. В том числе примеры работы с таймерами.
Вот вам урок. Читаете книгу, получите представление, как настраивать работу таймеров. Домашнее задание. Сделать тестовый проект. Генерация меандра, пусть примерно, 60 гц. Частота кварца 10 или 16 МГц.
Следующий урок. Пусть без подавления дребезга. Кнопка. Первое нажатие, запускаем генератор меандра. Второе нажатие остановка генерации. Запуск, остановку работу генератора сделать отдельными функциями. Потом как конечный автомат. Режимы IDLE, SET_RUN, RUN, STOP.
Следующий урок. Подавление дребезга. Есть цикл статей Татарчевского. Есть мой пример. У меня сделано практически по татарчевскому. Завтра покажу пример кнопки с подавлением дребезга.
Когда будет готов программный модуль кнопки с подавлением дребезга. Запуск генератора меандра
Re: Как поместить цикл в case оператора switch
с успехом сожрет winavr, iar, cvavr, да же тупо из под протеуса можно усе сделать, с небольшими изменениями и сожрет arduino_ide.Demiurg писал(а):Проект в каком компиляторе собирал?
У него Makefile есть, при установленном winavr тупо из под командной строки можно собрать.
Даже можно попробовать и онлайн собрать.
В чем проблема вообще?
Вас просят подкорректировать чужой код - вот и корректируйте.
- Реклама
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Как поместить цикл в case оператора switch
Проблем нет. Есть пошаговое создание проекта. Берешь книжку, берешь карандаш, бумажку и рисуешь алгоритм. Сначала человеку нужно понять, в чем именно его затык. Он правильно в общем то делает.
От нас, мы ему примеров накидали. Разных.
Я от себя добавлю. Пусть раздербанит проект и покусочно поймет в чем его затык.
От нас, мы ему примеров накидали. Разных.
Я от себя добавлю. Пусть раздербанит проект и покусочно поймет в чем его затык.
Re: Как поместить цикл в case оператора switch
А ты не добавляй.Demiurg писал(а):Я от себя добавлю.
Из ваших всех примеров мне понравился пример MLX90640, но он не объяснил самого главного,
как создается сам рисунок?
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Как поместить цикл в case оператора switch
Табличный? Рисунок? Ты про рукописный? Или я упустил, в программе для графов, алгоритмов?
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Как поместить цикл в case оператора switch
Номера строк это состояния. Номер символа это следующее состояние автомата. Графы это взаимосвязи. Сообщения, входные символы, короче, все входы автомата - следующие состояния автомата.
Теперь смотри. Первая строка это 0-вое состояние автомата. Номера символа в строке от 0. Смотрим. Первая строка 0 состояние. Первый нулевой символ там 0. Значит состояние остаётся прежним. Следующий символ в строке там 1. Значит следующее состояние автомата 1. И так далее.
Табличный метод неплох. Если состояний немного. В соответствии с утверждением, чем больше структур данных, тем короче код. Это да.
Но. Теряется наглядность. Также, это тебя не избавляет от написания кода, который соответствует таблице.
Теперь смотри. Первая строка это 0-вое состояние автомата. Номера символа в строке от 0. Смотрим. Первая строка 0 состояние. Первый нулевой символ там 0. Значит состояние остаётся прежним. Следующий символ в строке там 1. Значит следующее состояние автомата 1. И так далее.
Табличный метод неплох. Если состояний немного. В соответствии с утверждением, чем больше структур данных, тем короче код. Это да.
Но. Теряется наглядность. Также, это тебя не избавляет от написания кода, который соответствует таблице.
Последний раз редактировалось Demiurg Вт окт 11, 2022 21:54:57, всего редактировалось 1 раз.
Re: Как поместить цикл в case оператора switch
Demiurg, сам рисунок, нарисуй так что бы я понял.
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Как поместить цикл в case оператора switch
Мои все спят. Комп недоступен.
- Вложения
-
- 2yby9yi4v7_1.jpg
- (67.55 КБ) 32 скачивания
Re: Как поместить цикл в case оператора switch
Слушай, мне давно уже объяснили, что таблицей работать гораздо эффективнее, чем с вашими флагами.
Ты меня опять не понял, пусть лучше автор объясняет.Demiurg писал(а):Мои все спят. Комп недоступен.
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Как поместить цикл в case оператора switch
Значит ты не так понял. Речь не о флагах. Применять таблицы или нет это твое решение.
Накалякал. Так понятно?
тут
Накалякал. Так понятно?
тут
Re: Как поместить цикл в case оператора switch
Нет, если мне нет, значит и ТС нет. Ты не забывай, я не спец, я любитель.Demiurg писал(а):Так понятно?
У меня проблем с инетом нет, оптика, 100Мбит/сек.Demiurg писал(а):Со Смарта большой размер файла
Что такое от 0 до 7, откуда 7 взялось? По чему не до 8? или до 16?
По чему s1 s2 s3, а s4 где?
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Как поместить цикл в case оператора switch
Конечный автомат. Число состояний конечно. Пусть при проектировании, анализе мы понимаем, что у нас 8 состояний. От 0 до 7. Это номера строк. Также, мы понимаем, что у нас 8 сообщений. От 0 до 7. Это номер символа в строке. Номера строк и символов это индекс. Пусть у нас состояние 0. Это первая строка. Индекс 0. Пришел символ на вход автомата. Пусть у нас будет сообщение со значением 0. Это первый символ в строке. Индекс 0. Пусть пришел в 0 состоянии символ со значением 5. Это первая строка 6 символ. Так понятно?
Re: Как поместить цикл в case оператора switch
[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, которые сильно отличаются по величине, то табличный метод будет иметь перерасход памяти на промежуточные невостребованные ячейки.
Рисунок со стрелочками переходов? Он отражает таблицу, это одно и то же, только стрелками явно показаны переходы, которые в таблице показаны циферками. Да, на рисунке стрелочками составлять удобнее, потому что сразу видно.
На вход алгоритма поступают некоторые входные значения. В данном случае входная переменная может принимать 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, которые сильно отличаются по величине, то табличный метод будет иметь перерасход памяти на промежуточные невостребованные ячейки.
Последний раз редактировалось MLX90640 Вт окт 11, 2022 22:48:39, всего редактировалось 2 раза.
Re: Как поместить цикл в case оператора switch
Ты меня опять не понял.Demiurg писал(а):Число состояний конечно. Пусть при проектировании, анализе мы понимаем, что у нас 8 состояний.
У нас всего три кнопки, которые могут принимать всего 8 значений.
4 кнопки - уже 16 значений.
Танцуй от этого, учитель, мат надо сюда вставить, да хороший.
У меня внучка жмет на все кнопки на пульте ТВ, и еще и ножкой наступит.
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Как поместить цикл в case оператора switch
А давай без эмоций. Есть разные виды конечных автоматов. И если вдаваться в подробности, то, Гугл в помощь. Тем более что есть ещё математические модели конечных автоматов. А это уже не с форумов учиться.
Если 16 значений, значит, заманаешься рисовать. Сидеть и просчитывать все значения. Либо группировать и сортировать.
По поводу "учитель". Я в этом топике показал задумку. Практикум. И рамки этого практикума жёстко и строго очерчены.
И кстати, да. Если количество символов велико, как правильно отметил MLX90640, у табличного метода будет много неиспользуемых и повторяющихся ячеек. Поэтому, анализ входных символов. Группировка, сортировка, виды символов и так далее.
Пример. Пусть у нас матричная клава 4х4. От 0 до 9. A, B, C, D, *, #. От 0 до 9 это числовые значения. A, B, C, D, *, # - навигация и действия. От 0 до 9 это вводимые параметры. A, B, C, D, *, # - символы на вход автомата. На входе проверяем, если числовые и если нужно вводить параметры, вводим. Если служебные символы, то вот тебе символы для управления автоматом. Это и есть символы для таблицы.
Грубо, приблизительно как то так.
Если 16 значений, значит, заманаешься рисовать. Сидеть и просчитывать все значения. Либо группировать и сортировать.
По поводу "учитель". Я в этом топике показал задумку. Практикум. И рамки этого практикума жёстко и строго очерчены.
И кстати, да. Если количество символов велико, как правильно отметил MLX90640, у табличного метода будет много неиспользуемых и повторяющихся ячеек. Поэтому, анализ входных символов. Группировка, сортировка, виды символов и так далее.
Пример. Пусть у нас матричная клава 4х4. От 0 до 9. A, B, C, D, *, #. От 0 до 9 это числовые значения. A, B, C, D, *, # - навигация и действия. От 0 до 9 это вводимые параметры. A, B, C, D, *, # - символы на вход автомата. На входе проверяем, если числовые и если нужно вводить параметры, вводим. Если служебные символы, то вот тебе символы для управления автоматом. Это и есть символы для таблицы.
Грубо, приблизительно как то так.
Последний раз редактировалось Demiurg Вт окт 11, 2022 23:07:44, всего редактировалось 2 раза.
Re: Как поместить цикл в case оператора switch
[uquote="Dimon456",url="/forum/viewtopic.php?p=4303410#p4303410"]По чему s1 s2 s3, а s4 где?[/uquote]
Попробую еще раз и немного иначе описать. Задано было три кнопки. И выбрано было, что каждой кнопке соответствует один бит, то есть 3 бита, а значит 8 возможных комбинаций состояния этих кнопок. Итого, возможны 8 путей перехода в следующее состояние из текущего. Поэтому ширина таблицы - 8 ячеек.
Затем, задано 3 светодиода, которые будут включаться одной из трех кнопок. Причем, нажатие на ту же самую кнопку должно отключить этот светодиод (и все остальные тоже). А нажатие на любую другую кнопку переключить на другой соответствующий светодиод. Итого минимальное число состояний, реализующих заданный алгоритм работы = 1 исходное + 3 для переключения светодиодов по нажатию кнопки + 3 для отпускания кнопок и подготовки к выключению того же светика по следующему нажатию (как раз реализует тот самый триггер вкл/выкл-кнопки) + 1 для отключения всех светиков по нажатию кнопки.
Попробую еще раз и немного иначе описать. Задано было три кнопки. И выбрано было, что каждой кнопке соответствует один бит, то есть 3 бита, а значит 8 возможных комбинаций состояния этих кнопок. Итого, возможны 8 путей перехода в следующее состояние из текущего. Поэтому ширина таблицы - 8 ячеек.
Затем, задано 3 светодиода, которые будут включаться одной из трех кнопок. Причем, нажатие на ту же самую кнопку должно отключить этот светодиод (и все остальные тоже). А нажатие на любую другую кнопку переключить на другой соответствующий светодиод. Итого минимальное число состояний, реализующих заданный алгоритм работы = 1 исходное + 3 для переключения светодиодов по нажатию кнопки + 3 для отпускания кнопок и подготовки к выключению того же светика по следующему нажатию (как раз реализует тот самый триггер вкл/выкл-кнопки) + 1 для отключения всех светиков по нажатию кнопки.
Последний раз редактировалось MLX90640 Вт окт 11, 2022 23:10:19, всего редактировалось 1 раз.


