Все таки ты больной. Ты закусился на мои слова о шаблонности. Как же ты подчеркиваешь свою якобы исключительность. Расписал применяемые тобой сокращения? Спасибо. Я писал на аасеблере несколько лет, потом перешёл на си. На ассемблере я при написании проектов держал в уме все переменные. А когда указатели на указатели на указатели, да ещё адреса. Это ммм. Жёстко. На си стало проще. Переход с обычного программирования на автоматное тоже дало слом мышления. И что? Ты все таки так и не понял, что я тебе говорил. У тебя болезненное самолюбие. Засрал всю тему. Доказывай свой профессионализм примерами, ответами. А не своей якобы исключительностью. Повторяю, не впечатлил. Не знаю, чем ты там занимаешься, какие устройства у тебя в активе. Я общался со специалистами у которых в активе серийные устройства. Тысячи. Десятки и сотни тысяч тиражи. Видел их примеры. И они не выеживались, как ты.
Demiurg, причем тут ВЫ и ваш жизненный путь? По делу темы есть что написать? Вон топикстартер ПРОСИЛ переделать ЕГО код так, чтобы светики замигали. Ну. У вас есть что по делу, кроме воспоминаний о вашем хероическом прошлом на ассемблере?
Заметка по ходу дела: на ассемблере НЕТ указателей. Это прерогатива Си-подобных языков. На асемблере есть косвенная адресация. Возможно, есть какие-то надстройки над ассемблером с некоторым подобием указателей. Но это уже не чистый ассемблер.
Demiurg, вот серьезно - УСПОКОЙСЯ. Уймись. Перестань переводить стрелки, это НЕ мужское поведение. Бабское. Склочная бабка на базаре какая-то, один-в-один. Это уже перешло все рамки приличий - переход на личности, оскорбления, флуд и срач. Скажи спасибо, что я просто не воспринимаю эти выпады от хрен знает какого поцыка из инета, без роду и племени, без образования и вообще от дырки от бублика. Топикстартер просил внести изменения в ЕГО код. Вот и займитесь этим. Остальное - ересь.
И вообще. Demiurg-у настоятельная рекомендация - следить за базаром и не толкать фуфло, по-русски говоря. Чел, видимо, в табло никогда не отхватывал, что распоясался тут и приборзел, начал переводить стрелки, передергивать, придумывать того, чего не было. С ним тут цацкаются, не обращают внимания на его оскорбления и переходы на личности, а эта тварь совсем наглость потеряла и просто охренела вконец. Это че ваще за срань такая? Кто такой этот Demiurg и кто ему позволял так разговаривать? Это ваще че за баба тут базарная завелась то? С ним по-человечьи, на "вы", сюси-пуси тут с ним, а эта дрянь берега попутала. Смотри-ка, нашелся хрен с горы. Насочинял тут, переврал всё и вся, и еще, дрянь такая, огрызается. Мало его били наверно, что попутал бабское базарное хайло и диалог специалистов. Смотри-ка, вылез тут. Понакалякал херни непристойной, а еще смеет, дрянь такая, людей осуждать тут. Ишь ты, мелкая сошка, а какой форс давит. Тьху, млин. Не матерился бы, так если ему позволить, эта дрянь так и на шею сядет.
Последний раз редактировалось MLX90640 Вс окт 09, 2022 21:03:44, всего редактировалось 1 раз.
Вариант для адуринки (нанки)... Схема собственно код: Спойлер
Код:
const byte Sn0 = 7; // линия D7 const byte Sn1 = 8; // линия D8 const byte Sn2 = 9; // линия D9 const byte LED0 = 4; // линия D4 const byte LED1 = 5; // линия D5 const byte LED2 = 6; // линия D6 volatile byte tmp0 = 0; // временный буфер 0 volatile byte tmp1 = 0; // временный буфер 1 volatile byte Flag = 0; // контрольный флаг void wait0(); void wait1();
void setup() { // put your setup code here, to run once: digitalWrite(LED0, HIGH); digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); pinMode(Sn0, INPUT_PULLUP); pinMode(Sn1, INPUT_PULLUP); pinMode(Sn2, INPUT_PULLUP); pinMode(LED0, OUTPUT); pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT);
}
void loop() { // put your main code here, to run repeatedly: // ожидание нажатия while (!Flag) { wait0(); if (tmp0==tmp1){Flag=1;} else {Flag=0; tmp1=tmp0;} delay(35); } switch (tmp1){ case 6: wait0(); if (tmp1==tmp0) { // выполнять, если нажатие подтверждено digitalWrite(LED0, LOW); digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); Flag=0; } break; case 5: wait0(); if (tmp1==tmp0) { // выполнять, если нажатие подтверждено digitalWrite(LED0, HIGH); digitalWrite(LED1, LOW); digitalWrite(LED2, HIGH); Flag=0; } break; case 3: wait0(); if (tmp1==tmp0) { // выполнять, если нажатие подтверждено digitalWrite(LED0, HIGH); digitalWrite(LED1, HIGH); digitalWrite(LED2, LOW); Flag=0; } break; default: // if nothing else matches, do the default // default is optional break; } /* * ожидание отпускания всех кнопок после того, как был завершен * хотя бы один из обработчиков * если при входе в селектор имело место отсутствие нажатий * или неразрешенная комбинация контроль отпускания игнорируется */ while(!Flag) { wait1(); if (tmp0==0) { //ожидание подтверждения отпускания delay(35); wait1(); if (tmp0==0){Flag=1; tmp1=0;} } } Flag=0; }
версия IDE 1.8.19 версия платформы ардуино нано 1.8.3 В данном случае все обьявления и описания/инициализации в одном файле(для адуринки это главный файл проекта *.ino). собственно та же структура селектора на основе switch/case, но захват данных с интервалами антидребезга вынесены до и после селектора. Отрабатывается последовательность обнаружение нажатия подтверждение нажатия исполнение задачи команды(кнопки) ожидание полного отпускания всех кноп подтверждение полного отпускания всех кноп далее с начала(возврат к началу сканирования). Алгоритм работы устройства - исходно все индикаторы погашены нажатие любой клавиши зажигает соответствующий кнопе светик и одновременно гасит остальные. прожка проверена на симуляторе ардуино UNO - UnoArduSim 2.9.2 (https://www.sites.google.com/site/unoardusim/) Относительно большой объем кода после компиляции обусловлен установленной в программе "по умолчанию" обработкой УАРТ - специфика ардуиноIDE, к данному проекту не относящаяся (скрыто от пользователя). А вот для одновременного обеспечения еще и мигания светика с определенной частотой уже потребуется аппаратный таймер. Так как мигалка действует параллельно исполнению основной программы. В данном случае в каждом исполнительном фрагменте нужно будет добавить перезагрузку параметров таймера и разрешение его работы вместо включения светика. Сигнал прерывания от таймера будет инвертировать соответствующий выход. Делать программный вариант также возможно, но его надо ставить за пределами селектора(подобно обработчику захвата нажатия/отпускания кнопок), а не внутри (в блоках case - исполнителя команды) так как необходимо одновременно и сканировать кнопы и выдавать меандр на активный выход.
BOB51, это пример, как из простого сделать сложное. Ты так окончательно запутаешь начинающего.) При нажатии кнопки чего хотелось бы делать со светодиодами?
На этом я пока заканчиваю. Написано со смартфона. Вечером, если получится, скомпилирую, покажу видео работы. В моих примерах показывается псевдопараллельная работа программных модулей. Выполнение основного цикла выполняется с запасом за системный тик. Скажем, в моих примерах это 1 мс. Распараллеливание процессов достигается проверкой условий, состояниями конечных автоматов. Никаких долгих циклов. Правило: основной цикл выполняется с запасом за системный тик. Показал программные таймеры. Взаимодействие программных модулей. Как опрашивать кнопки, в этом топике показаны несколько примеров. Если у тс есть вопросы, задавайте.
BOB51, это пример, как из простого сделать сложное. Ты так окончательно запутаешь начинающего.) При нажатии кнопки чего хотелось бы делать со светодиодами?
Ничего там сложного. Для мех. кноп стандартно: ожидание нажатия подтверждение нажатия и захват комбинации с линий возврата клавиатуры с установкой флага запроса обработки выполнение обработчика команды ожидание полного отпускания всех кноп подтверждение полного отпускания всех кноп и повтор... Единственно можно еще чуток "причесать" - цикл ожидания не while(условие), а do {обработчик}while(условие) и оба анализатора с их антидребезгом перенести в конец прожки (за селектором switch/case). Да еще добавить исходную хотелку топикстартера - програмо модифицируемую мигалку для каждого из включенных светиков. Причем, как я понял, мигалка также с изменяемыми параметрами и по частоте и по картинке в зависимости от главной задачи в данный момент для данного индикатора... (...Необходимо при переключении кнопкой с помощью оператора switch включать мигание светодиода с различной частотой на каком либо выводе... ...необходимо зациклить ее в теле case,но невозможно переключить switch в следующий case.Просто невозможно выйти из бесконечного цикла...) Вот и соорудил "универсальну трехкнопку"... Кыстати... У АВРки (для ардуино) при инициализации вывода как OUTPUT желательно предварительно добавлять вывод в PIN того уровня, что должен появиться сразу после инициализации, а уж потом разворачивать вывод как OUTPUT... Иначе есть вероятность "иголок" т.е. digitalWrite(pin, уровень по умолчанию) и затем pinMode(pin, OUTPUT)...
У АВРки (для ардуино) при инициализации вывода как OUTPUT желательно предварительно добавлять вывод в PIN того уровня, что должен появиться сразу после инициализации, а уж потом разворачивать вывод как OUTPUT... Иначе есть вероятность "иголок" т.е. digitalWrite(pin, уровень по умолчанию) и затем pinMode(pin, OUTPUT)...
Дядя, не смеши. При чём здесь Ардуино? И особенно "иголки" опасны для светодиодов.)
OKF, Мои примеры кажутся сложными, усложненными. На самом деле это не так. Тут уже шел разговор про алгоритмы, графы. Я ещё когда писал на асме, увидел ощутимый плюс такого подхода. Все собирается, как конструктор. И алгоритм легко просчитывается умственно. Не всегда, смотря что делать. Пример. Один светодиод. Нужно реализовать индикацию питания (постоянно включен), дежурный режим (мигание). Индикация ошибок, аварии. При этом кол-во ошибок может быть больше 10. И подобная индикация очень легко реализуется. Без флагов, на состояниях. Единицы короткие вспышки, десятки более длительные.
По поводу иголок. Сам лично встречал в приборах ошибочные срабатывания сдвиговых регистров, как раз из за неправильной инициализации выходов. Также был случай, так и не смог победить при использовании стороннего реле времени. При включении реле выдавало иголку. Для катушек реле, пускателей это не критично. А для меня это стало проблемой. Выход реле времени шел на дискретный вход блока управления.
Вообще-то это правило для всех АВРок, независимо от того, в каком виде их потреблять. Уж такова природа(структура) их портов. Исходно по reset лапки в Z состоянии, а дальше - как программа решит (и как внешняя схемотехника укажет). В том числе и при перезапуске после возможного сбоя.
Вот и я говорю, при чём здесь Ардуино, когда это правило для всех.) Да и дело не в иголках, а в том кому они могут мешать. В данном задании кому? Как и дребезг. И при чём здесь Ардуино вообще, а, Jack_A! А из говна накрутить "супер" - это да, это мы можем, правда, Demiurg? Я изменил Ардуино на AVR, найдите отличия. Там же: https://wokwi.com/projects/345112496512696914
Кстати... Раз уж писать "небрежно" и "топорно", то вот совершенно топорный код, написанный левой ногой и с наплеванием на все принцЫпы "инкапсуляхцыи". Но! С одной мааааленькой вишенкой на торте Таблица состояний и переходов конечного автормата. Я еще в прошлом примере хотел так написать, да не стал, дабы сильно не пугать некоторых "учителей" Вобщем... ну, это, как всегда - работает.
/** ---------- */ int main(void) { /* счетчики для таймеров мигания и опроса кнопок */ uint32_t cnt1 = PERIOD_1, cnt2 = PERIOD_2, cnt3 = PERIOD_3; uint32_t cntbtn = PERIOD_BTN;
/* переменные для разрешения мигания светодиодов */ uint8_t en1 = 0, en2 = 0, en3 = 0;
int8_t mode = 0; // переменная режима работы uint8_t read_btn; //переменная чтения входов uint8_t fsm_s = 0; // переменная текущего номера состояния КА
А это граф работы конечного автомата чтения кнопок. Допускающие последовательности: 1-0-1-0, 1-0-2-0, 2-0-3-0 ну и так далее... Итого. Блягодаря табличному методу переходов и состояний, вся долбаная процедура switch-case в кнопках заменена на две долбаные строчки
MLX90640, "небрежно" и "топорно" - это былокод. И это сплошь и рядом.( Ну ладно, если ты пишешь для себя, но если ты показываешь людям, неужто нельзя привести к удобочитаемому виду, дабы не позориться? Что бы это было понятно не только тебе самому... Это я не про вас, это я обобщённо.) Касательно графов - ну сложно это для начинающих, это уж больше для серьёзных людей, для профи, типа, Demiurg. ) Куда уж нам то...)
Давай без эпитетов. Посмотри на последние сообщения, пока тебя не было. Предложены разные примеры. Никто никого не цепляет, не задевает. Мы можем высказать свое мнение. Зацепило, не зацепило. А ТС учится на этих примерах. Ему предлагается выбор.
Один из первых интерпретаторов таблиц я увидел в одном из первых примеров. В 2007 или 8 году. Притом я начал изучать AVR, а пример был для пиков. На асме. И с тех пор я сделал много табличных интерпретаторов. Как асм так и си.
Многие здесь присутствующие тоже знают, что такое табличные методы. Прикинь?
Щас пороюсь, найду один из примеров, один коллега скидывал...
Последний раз редактировалось Demiurg Пн окт 10, 2022 17:39:46, всего редактировалось 1 раз.
Ну вот до этого написал по уму - сказали небрежно и запутанно. Щас написал примитивно и линейно - сказали быдлокод. вас, граждане, хер поймёшь - одному не нравится так, другом сяк. Хехе, тяжко жить на свете пионеру Пете. Вобщем, быдло или не быдло, но оно работает и поставленные задачи выполняет прозрачно и ясно.
Ты правила программирования озвучил, обвинил, что не соблюдаются правила. Твой код понимаешь только ты. И дело не в шаблонах, разрыве шаблонов. А в том, чтобы после тебя смогли прочитать код, понять его. У тебя это хромает. Ты не для нас пишешь. Мы и сами можем примеров накидать. Для новичков. Но, также мы смотрим. Чтобы перенять понравившиеся фишки.
Нашел. Один из примеров, на которых я учился. 2013 год.
//************************************************************************ //************************ Главный автомат ******************************* //************************************************************************
//================== STATE (PROC_DEVICE_INIT, proc_device_init) STATE (PROC_DEVICE_WEIGHT_MODE, proc_device_weight_mode) STATE (PROC_DEVICE_DOSER_IDLE_MODE, proc_device_doser_idle_mode) STATE (PROC_DEVICE_DOSER_MODE, proc_device_doser_mode) STATE (PROC_DEVICE_IDLE, proc_device_idle) STATE (PROC_DEVICE_EMERG_MODE, proc_device_emerg_mode) //==================
Update
Последний раз редактировалось Demiurg Пн окт 10, 2022 17:03:54, всего редактировалось 2 раз(а).
Ну вот до этого написал по уму - сказали небрежно и запутанно. Щас написал примитивно и линейно - сказали быдлокод. вас, граждане, хер поймёшь - одному не нравится так, другом сяк. Хехе, тяжко жить на свете пионеру Пете.
"Вас Петровых не понять - ей нравиться, тебе нет...") Не, не, не, это я не относительно вас. Я же пояснил (кажется).) Речь о ком? Правильно, о начинающем. Так зачем ему, раньше времени, пудрить мозги? Пущай осилит что попроще, или нет? Считаю, всё должно быть для него максимально понятно.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 435
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения