Добавлено after 16 minutes 54 seconds: Посидел, подумал. Нет, так дело не пойдет. Вольфганг Трамперт. AVR-RISC микроконтроллеры. В этой книге доступно и подробно показана архитектура мк avr. Примеры на ассемблере, но это не проблема. В книге много разных примеров. В том числе примеры работы с таймерами. Вот вам урок. Читаете книгу, получите представление, как настраивать работу таймеров. Домашнее задание. Сделать тестовый проект. Генерация меандра, пусть примерно, 60 гц. Частота кварца 10 или 16 МГц.
Следующий урок. Пусть без подавления дребезга. Кнопка. Первое нажатие, запускаем генератор меандра. Второе нажатие остановка генерации. Запуск, остановку работу генератора сделать отдельными функциями. Потом как конечный автомат. Режимы IDLE, SET_RUN, RUN, STOP.
Следующий урок. Подавление дребезга. Есть цикл статей Татарчевского. Есть мой пример. У меня сделано практически по татарчевскому. Завтра покажу пример кнопки с подавлением дребезга.
Когда будет готов программный модуль кнопки с подавлением дребезга. Запуск генератора меандра
с успехом сожрет winavr, iar, cvavr, да же тупо из под протеуса можно усе сделать, с небольшими изменениями и сожрет arduino_ide. У него Makefile есть, при установленном winavr тупо из под командной строки можно собрать. Даже можно попробовать и онлайн собрать. В чем проблема вообще?
Вас просят подкорректировать чужой код - вот и корректируйте.
Проблем нет. Есть пошаговое создание проекта. Берешь книжку, берешь карандаш, бумажку и рисуешь алгоритм. Сначала человеку нужно понять, в чем именно его затык. Он правильно в общем то делает. От нас, мы ему примеров накидали. Разных.
Я от себя добавлю. Пусть раздербанит проект и покусочно поймет в чем его затык.
Номера строк это состояния. Номер символа это следующее состояние автомата. Графы это взаимосвязи. Сообщения, входные символы, короче, все входы автомата - следующие состояния автомата.
Теперь смотри. Первая строка это 0-вое состояние автомата. Номера символа в строке от 0. Смотрим. Первая строка 0 состояние. Первый нулевой символ там 0. Значит состояние остаётся прежним. Следующий символ в строке там 1. Значит следующее состояние автомата 1. И так далее.
Табличный метод неплох. Если состояний немного. В соответствии с утверждением, чем больше структур данных, тем короче код. Это да. Но. Теряется наглядность. Также, это тебя не избавляет от написания кода, который соответствует таблице.
Последний раз редактировалось Demiurg Вт окт 11, 2022 21:54:57, всего редактировалось 1 раз.
Конечный автомат. Число состояний конечно. Пусть при проектировании, анализе мы понимаем, что у нас 8 состояний. От 0 до 7. Это номера строк. Также, мы понимаем, что у нас 8 сообщений. От 0 до 7. Это номер символа в строке. Номера строк и символов это индекс. Пусть у нас состояние 0. Это первая строка. Индекс 0. Пришел символ на вход автомата. Пусть у нас будет сообщение со значением 0. Это первый символ в строке. Индекс 0. Пусть пришел в 0 состоянии символ со значением 5. Это первая строка 6 символ. Так понятно?
Рисунок со стрелочками переходов? Он отражает таблицу, это одно и то же, только стрелками явно показаны переходы, которые в таблице показаны циферками. Да, на рисунке стрелочками составлять удобнее, потому что сразу видно.
На вход алгоритма поступают некоторые входные значения. В данном случае входная переменная может принимать 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 раз(а).
Число состояний конечно. Пусть при проектировании, анализе мы понимаем, что у нас 8 состояний.
Ты меня опять не понял. У нас всего три кнопки, которые могут принимать всего 8 значений. 4 кнопки - уже 16 значений. Танцуй от этого, учитель, мат надо сюда вставить, да хороший.
У меня внучка жмет на все кнопки на пульте ТВ, и еще и ножкой наступит.
А давай без эмоций. Есть разные виды конечных автоматов. И если вдаваться в подробности, то, Гугл в помощь. Тем более что есть ещё математические модели конечных автоматов. А это уже не с форумов учиться.
Если 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 раз(а).
Попробую еще раз и немного иначе описать. Задано было три кнопки. И выбрано было, что каждой кнопке соответствует один бит, то есть 3 бита, а значит 8 возможных комбинаций состояния этих кнопок. Итого, возможны 8 путей перехода в следующее состояние из текущего. Поэтому ширина таблицы - 8 ячеек. Затем, задано 3 светодиода, которые будут включаться одной из трех кнопок. Причем, нажатие на ту же самую кнопку должно отключить этот светодиод (и все остальные тоже). А нажатие на любую другую кнопку переключить на другой соответствующий светодиод. Итого минимальное число состояний, реализующих заданный алгоритм работы = 1 исходное + 3 для переключения светодиодов по нажатию кнопки + 3 для отпускания кнопок и подготовки к выключению того же светика по следующему нажатию (как раз реализует тот самый триггер вкл/выкл-кнопки) + 1 для отключения всех светиков по нажатию кнопки.
Последний раз редактировалось MLX90640 Вт окт 11, 2022 23:10:19, всего редактировалось 1 раз.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 331
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения