Обсуждаем контроллеры компании Atmel.
Ответить

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

Вт окт 11, 2022 23:29:35

Завтра попробую накидать пример с таблицей и подробным описанием. Если буду занят, в выходные.

Добавлено after 20 minutes 7 seconds:
MLX90640. И не только. Хотел бы указать на один момент. Не усложнять программу излишними сущностями. Нужно тщательно анализировать проект. И не нагромождать излишними действиями.

Примеры. Свойства объекта. Всегда смотрим на это. Что имеем на руках. Пусть у нас есть дискретный выход. Его состояние это уже вход для триггера.
Код:
   if (LED_1_PORT & (1<<LED_1))) // вариант 1
   if (! (check_led_1_state ())) // вариант 2. В этом случае мы не паримся, какой активный сигнал включения светодиода
      led_1_on ();
   else
      led_1_off ();

В данном случае мы видим, что переменную tr1 мы уже можем убрать. Поясняю. Булево значение триггера и состояние выхода уже даёт нам 4 состояния программы. Убираем триггер tr1, убираем 2 ненужных и непрогнозируемых, точнее, возможно, неучтенных, состояния.

Теперь, нам надо помигать светодиодом. В программном модуле уже есть признак состояние мигалки светодиода. Теперь мы можем избавиться от триггера tr2. Это ещё минус 2 состояния. Ненужных и непрогнозируемых, возможно, неучтенных.

Это правило верно в случае прямого вывода на пины МК. Оптимизация.

Цитата

Можно рассматривать состояние программы и более упрощенно, в виде совокупности значений всех управляющих переменных - переменных, участвующих в условиях переходов. Тогда изменение значения одной из управляющих переменных будет означать изменение состояния программы, а число состояний программы будет определяться максимально возможным количеством комбинаций значений управляющих переменных, возникающим при ее работе. Предположим, что в программе используются только двоичные управляющие переменные (флаги). В этом случае количество состояний программы, содержащей n двоичных управляющих переменных, будет лежать в интервале от n до 2n.

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

Ср окт 12, 2022 05:06:54

if (! (check_led_1_state ())) - не оптимально, потому что идет вызов функции со всеми ее последствиями. Переменная tr1 обходится "дешевле", то есть, работает быстрее и занимает меньше места в памяти программ.
У вас как раз наоборот получается - усложнение лишними взаимосвязями и написание лишних функций, без которых можно обойтись. То есть, этот участок кода невозможно использовать отдельно в другом месте без переделок. И если алгоритм оформить в виде отдельной функции, она не будет самодостаточной и потянет за собой обязательное включение в себя связей для check_led_1_state (). А если там не led, а relay, например, или светик подключен другим концом? Переименовывать или оставить так, но мысленно подразумевать реле?

И второй момент. Вы не поняли, для чего именно этот tr1 поставлен. Как раз он то и не должен зависеть от состояния выхода светодиода. tr1 как раз влияет НЕ на мигание, а на переключение РАЗРЕШЕНИЯ/ЗАПРЕТА мигания. Реализует поведение кнопки "первое нажатие - вкл, второе - выкл". Вот так то! По вашему же совету - "Нужно тщательно анализировать проект.". Вы в этом правы, проанализируйте более тщательно, прежде чем начать писать какие-то там "практикумы". Ошибки "учителей" незачем насаждать в головы учеников. Получится еще один Корабельников, к сожалению.

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

Ср окт 12, 2022 06:37:46

Я не зря говорил, что ты не учитываешь, что ты в теме avr. Здесь несколько другое. Архитектура другая. И особенности. Поэтому некоторые правила программирования отличаются.

Порой flash мало либо нужна скорость, генератор сигналов к примеру. И если убрать промежуточную переменную, которая отвечает за активный уровень сигнала, проверяя напрямую бит порта, можно существенно увеличить частоту сигнала.

check_led_1_state () это макрос. Проверка бита порта. Прибив гвоздями в компиляторе это на дизассемблере будет одна команда. sbic либо sbis. Вместо чтения порта в регистр и затем проверка бита.

Завязывай с личными выпадами. Кто такой Корабельников знать не знаю. Повторяю. Ты в теме AVR. И си для этого МК несколько урезан.
И следующее тебе скажу, если бы ты на электрониксе вел себя подобным образом, тебя модераторы сразу бы пристрелили. На месте. В смысле забанили, либо удалили твой аккаунт. За неподобающее поведение.

На данный момент у начинающих несколько сложнее ситуация. На профильных форумах спецы либо перешли на другие архитектуры, либо жизненные обстоятельства. Темы avr подзаглохли. В том числе по причине беспредела токсичных товарищей.
Последний раз редактировалось Demiurg Ср окт 12, 2022 06:55:02, всего редактировалось 1 раз.

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

Ср окт 12, 2022 06:54:56

Да нет, архитектура тут не при чем. Правила алгоритма от архитектуры не зависят.
Нут нет никаких личных выпадов, это же вы постоянно переходите на личности и пытаетесь постоянно оскорбить меня, совершенно меня не зная, так что вините лишь себя самого. Но разговор не об этом. Разговор о том, что "учитель" не должен повторять ошибок учеников.

check_led_1_state () это макрос.

Без разницы. Ибо он выполняет совсем не то, что нужно. Он считывает состояние выхода, в то время как выход по условию - мигающий светик, и состояние выхода меняется вне пределов этого алгоритма. А по условию задачи нужно наоборот, реализовать поведение КНОПКИ вкл/выкл/переключение. Если бы у меня был АВР сейчас, я бы сделал ровно то же самое, там единственное различие - именно в именах регистров и в инициализации МК.
Вдумайтесь в исходные условия и алгоритм, проанализируйте прежде чем писать гневные обличающие посты. А то потом снова стыдно будет и начнете извиняться.

И если убрать промежуточную переменную, которая отвечает за активный уровень сигнала, проверяя напрямую бит порта, можно существенно увеличить частоту сигнала.

К большому для вас сожалению, это не так. Сравните ассемблерный код. Ну а для максимального быстродействия, можно вообще не считывать состояние выхода, а производить операцию XOR с выходом и битом = 1 в позиции выхода.
PORTB ^= 1 << bit; // операция XOR для быстрого переключения порта.
Не кипишите и не обличайте зазря, вначале вдумайтесь и проанализируйте.
Последний раз редактировалось MLX90640 Ср окт 12, 2022 07:08:12, всего редактировалось 1 раз.

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

Ср окт 12, 2022 07:08:05

MLX90640, интернет общение в данном случае это сухой текст. Эмоциональную окраску каждый придает сам. В соответствии с воспитанием, бытом, окружением, уровнем интеллекта и текущим эмоциональным состоянием.

Пусть тебя где то когда то задели мои слова. У тебя остались обидки. Ты тоже не смолчал.

Так вот. На данный момент я тебя вообще не трогаю. Упомянул твой пример. Это не выпад в твою сторону. Ты тоже анализируй, что я пишу. И если я где то ты меня не понял, я не прав, пиши корректно.

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

Ср окт 12, 2022 07:13:32

То, что вы пишите, проанализировано, я всё это увидел. Потому то и есть замечания по вашему написанному. Если бы не читал, замечаний не было бы. Вы не анализируете замечания и не пытаетесь даже разобраться и снова начинаете срач.
Конкретно сейчас я прочитал то что вы предложили, проанализировал и высказал замечания и есть к вам конкретные вопросы. Вам надлежит прочитать, обдумать и грамотно, без срача и перехода на личности, ТОЛЬКО ПО СУЩЕСТВУ ВОПРОСА ответить. Итак, повторю:

Переменная в моем примере tr1 относится НЕ к ВЫХОДУ светика, поскольку по условию задачи светик мигающий и состояние выхода меняется в другом месте. Переменная tr1 (tr2, tr3) реализует алгоритм КНОПКИ ВКЛ/ВЫКЛ. Не светодиода, а именно кнопки, определяя в дальнейшем, разрешить или нет мигание светика.
А для мигания светика можно вообще задействовать XOR, так будет быстрее.
Вы же предлагаете в алгоритме кнопки полагаться на текущее значение выхода светика, упуская из виду, что светик мигает, состояние выхода в момент нажатия кнопки будет случайным.

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

Ср окт 12, 2022 07:19:35

Позже отвечу на tr1. А пока. Я упомянул тебя, tr1 и ты снова начал выпадки. Завязывай. Заметь, с моей стороны выпада нет. Не превращай снова тему в срач.

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

Ср окт 12, 2022 07:45:16

Два, господин учитель мастерски умеет переводить стрелки и переврать все ровно наоборот, это у него не отнять. Наверно надо его цитаты вставлять, чтоб вино было сразу, что и как на самом деле было (ага, уже отредактировал задним числом, ну-ну, мастерский демагог)
. А вот алгоритмы составлять так, чтобы все работало по заданию, вот это даже на 10-й странице темы ну никак у него не выходит. Тзбави бох нас от таких "учителей"!

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

Ср окт 12, 2022 07:59:42

Код:
case RED_LED:
      if(act) ON(RLED_PORT, RLED_Pin);
      else OFF(RLED_PORT, RLED_Pin);
         break;


Уже не помню, почему я запомнил именно триггер. Но это уже не важно. То, о чем я говорил. act промежуточная переменная, от которой можно избавиться.

Суммируем. Перевирание событий, перенос с больной головы на здоровую. Переход на личности. Высокомерие. Откровенное неуважение ко всем участникам форума. Не признание собственных ошибок и утверждений. Открытое оскорбление.

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

Ср окт 12, 2022 08:26:26

Так что ли, графоманы?) https://wokwi.com/projects/345287267060810324

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

Ср окт 12, 2022 08:32:57

ТЗ тут. Плюс подавление дребегза контактов кнопок.

У тебя: подавления дребезга нет. Одновременная работа каналов при одновременно нажатых кнопках. Упрощение и лаконичность приветствуется, но не до фанатизма.

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

Ср окт 12, 2022 08:39:47

Не, ну с Demiurgom невозможно вести диалог, он мастерски переводит стрелки и перевирает тут же. Нет, этотбабмкое поведение. Отныне закидываю этого склочного враля в игнор, и пусть он ебется со своим ЧСВ сам как хочет и учит чему хочет. Всё то, чему он пытается "научить" - это граыомания, полная чушь, устаревшие и ошибочные рамочные шаблоны.
Да пашол он нахрен, пусть он хоть че пишет, все равно это глубоко ошибочно и так никто уже не делает.

Я выложил ДВА видео, где чётко видно, как работает, ничего не дребещжит, все чётко и безошибочно. Demiurg же на протяжении 10 страниц со скрипом едва-едва ворочая закостенелыми мозгами, обещал выложить видео, но так ничего и не сделал, тоьько снова пытается поучать тех, кто в своём развитии стоит на три десятка ступеней выше "учителя", у которого так ничерта и не получилось сделать именно то, что просил автор.

Demiurg, НЕ ВРИ, мля, не ври! Сколько можно врать? Кому ты тут что хочешь доказать? Да всем на тебя уже похрен, если не заметил.
Все работает тут как просил автор. Если ты слеп, протри очки.

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

Ср окт 12, 2022 08:44:35

ТЗ тут. Плюс подавление дребегза контактов кнопок.

У тебя: подавления дребезга нет.

Как это нет! Глаза разуй.)

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

Ср окт 12, 2022 09:29:45

Типа бесплатное подавление дребезга я увидел ещё в предыдущем примере. Завтра у тс-а поменялись требования, другой проект, скажем счётчик импульсов. Снова переписывать программу? Притом кардинально?

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

Ср окт 12, 2022 09:35:36

Да! И новые деньги за изменение условий. А как же!
И переписывается не программа, а только одна функция.
Только не надо тулить мостра туда, где в нём нет никакой необходимости.

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

Ср окт 12, 2022 09:39:12

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

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

Ср окт 12, 2022 09:48:00

MLX90640, в теме два моих примера. Даже ТС-у достаточно взять хекс и прогнать его в протеусе. Либо прогнать в симуляторе avr-studio.

алгоритмы составлять
в данной теме ТЗ элементарно и свободно умозрительно.

Возвращаемся. Твои выпадки и лживые обвинения пропустим как лирику. Также как твою истерику в личке.

Ты позволяешь себе неадекватное поведение. Доказательства твоей профессиональной состоятельности в студию. Поделки выходного дня и отладочная плата не засчитываются.

Участникам форума дико интересно, чем же снискал славу сей муж на ниве отечественной промэлектроники.

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

Ср окт 12, 2022 10:51:40

Пардон, а кто вы такой, чтобы мне тут условия ставить? Я перед вами отчитываться и оправдываться не собираюсь, вы ещё не доросли до такого статуса.
Мои работы лежат не в осласти АВР-ок с покпзомерами, таймерами выключателей насосов. Мои работы лежат в области STM32, телеметрии, управления частотными приводами. Но вас они не касаются, вы все равно ничего в них не поймёте и начнёте снова обсирать. А зачем оно мне надо? Это не вашей компетенции дело, оно вас не касается. Так что успокойтесь и ведите себя прилично. А то потом опять извиняться начнёте.

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

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

Ср окт 12, 2022 11:11:57

MLX90640,Demiurg Ребяты, вам не надоело на людях собачиться меж собой, меряясь пиписьками и обкладывая друг друга луями? Решения есть разные, манера писания - тоже, а "моё - единственно правильное, поэтому ты - мудак" вынуждает негативно отнестись как к автору, так и к его идее, может быть, вполне годной. Идите в личку и сколько душа просит, охаживайте друг друга фекалью. Тема и сам ТС давно забыты, свирепствуют норовы баб с Комаровского рынка.
Мотивированное изложение контраргументов, не сопровождаемое "я - гений, ты - идиот" гораздо продуктивнее для утверждения своей точки зрения.
Эх, был бы я модером в МЯУ - клочки летели бы от этих наполненных злобой постов. :)) :? Ну вот укров натравливают на нас пиндосы, а тут - кто заставляет собачиться? Допустим, ты доказал, что твоя точка зрения оптимальна, но как человек (для меня) - ты уж под большим вопросом.
Последний раз редактировалось Jack_A Ср окт 12, 2022 11:22:19, всего редактировалось 1 раз.

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

Ср окт 12, 2022 11:20:57

Так мне давно уже надоело, тем более чтт работа давно уже выполнена, а срач начал НЕ Я. Я пробовал не обращать внимания. Но Demiurg никак не может остановиться срать и постоянно перевирает и пытается меня в чем то обвинить. Ну, чем мельче сошка, тем сильнее форс давит, ну че поделать.
Можно ж было спокойно сказать: "А я делаю иначе, мне так нравится." но нет же, началось сразу "ты дурак, твой код фигня, а я великий учитель сейчас научу тебя". Ну и дальше началось просто перевирание и представление ситуации, чтт дескать это наоборот я тут виноват. Хотя я до сего момента даже слова то плохого не сказал, переводя личные оскорбления в шутку. Но ведь Demiurg не унялся, потому и разговор пошёл в более жёстком ключе. Всё как в ситуации со взорваннвм мостом вон там. Тоже молчали и терпели, пока не закончилось терпение.
Ответить