И чем вас смущает эта строка.Нажимаю кнопку выставляется флаг.Когда выставляется флаг в обработчике прерываний по таймеру начинает счёт переменная.
Скорее всего компилятор должен жаловаться на логичнское И, между частью операндов в строке. И что он МОЖЕТ ошибиться, если нет скобок. Жалоба на неоднозначную трактовку сравнений.
ivan dimir, просто они тебе ни чего другого не могут предложить. +2 страницы библиотека обработки кнопок +6 страниц микроменю, это примерный подсчет и в итоге >16 страниц "индусокода", в котором только автор может разобраться.
Конечно на конечных автоматах это все просто делается, а тут увы, всего 1 страница и абсолютно не читаемый код.
ivan dimir, просто они тебе ни чего другого не могут предложить. +2 страницы библиотека обработки кнопок +6 страниц микроменю, это примерный подсчет и в итоге >16 страниц "индусокода", в котором только автор может разобраться.
Конечно на конечных автоматах это все просто делается, а тут увы, всего 1 страница и абсолютно не читаемый код.
Что такое конечный автомат? И как его создать.Обьясните нерусскому электрику.Принцып.Или алгоритм создания этого конечного автомата.Какой ?
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
ivan dimir, а слабо в гугле набить "finite state machine"? Все очень просто: алгоритм разбивается на этапы, которые можно однозначно охарактеризовать конечным количеством состояний. Все, дальше ты в switch'е проверяешь текущее состояние и выполняешь в зависимости от него какие-то действия. Например, работа с USB основана на конечном автомате, твои кнопки удобней будет конечным автоматом реализовать и т.д., и т.п. Я ж тебе давал ссылку на обработку кнопок в конечном автомате:
Код:
switch(e){ case EVT_NONE: // just pressed case EVT_RELEASE: if((k->counter += d) > PRESSTHRESHOLD) k->event = EVT_PRESS; break; case EVT_PRESS: // hold if((k->counter += d)> HOLDTHRESHOLD) k->event = EVT_HOLD; break; default: break; }
(правда, этот пример неудачный. Нельзя так делать. Надо сначала выставить состояние и лишь потом ждать нужное время; а здесь выходит, что событие нажатия система получит лишь через PRESSTHRESHOLD мс, а это около 30 и выше!)
Бывают автоматы иерархические: когда в каждом состоянии есть какие-то подсостояния.
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Ну так сравни объем одного и того же кода без КА и с ними! Я уж молчу о простоте сопровождения кода. С КА воткнуть новое состояние намного проще, чем без оного!
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Может можно.Но по памяти в avr .Не совсем работает.С глюком.Но вижу что эклипсе др среда.Ей пофиг атомарные операции.Нужно попробывать ваш вариант.Спасибо.Я кстати подумал об этом.И у меня один маленький вопрос.В каких случаях нужно применять указатели ?
Добавлено after 9 minutes 12 seconds: Хотя по мне две переменные. Бараны на лево.Козлы на право.Вот принцып.Код увеличился.Ну и структуры тоже код увеличили.Когда слишком много переменных .То структуры в помощь.
Конечные автоматы очень удобны, быстры при разборе сложных условий, а ещё их очень просто и удобно рисовать. Заметьте, сначала рисуем автомат, а потом его кодируем. Учитесь рисовать и работать с КА, ибо это очень эффективный способ создания ПО! Заумь начинается, когда у вас при анализе получается 100500 if-then-else, а в самой глубине goto.
Макрос интересный, согласен. Хотя писать такие не люблю - компилятор любит их разворачивать в inline-функции, а мне привычнее немного иначе оформить код - обработка ввода, фильтры, вызов события. Когда-то писал функции обработки меню для графического экрана, с курсором (не указателем мыши, а виртуальным, прыгающим по кнопкам) и в какой-то момент понял, что дошёл до копии классического же меню. А потом понадобилось сделать "активную" кнопку, которая ловит хуки событий. Вот там всё стало странным, но решилось небольшой модификацией примитивов обработчиков. Ладно, это другая тема уже.
Меня заинтересовал ваш код у вас флаги в качестве кнопок?И меня заинтерисовала функция ScanButtons()? Что это ? И с чем его едят.Код ваш похож на мой единственное что переход на ноль при ++ и переход с нуля на 1023 при --.И замедление показаний.Ну а так ваш код лучше.Правда я использовал число 4095 дискретность ацп.1023 у avr.Да и ещё при переключении меню сначала нажимаем кнопку я выставляю флаг потом при ожатии флаг сбрасываю и срабатывает меню.
И чем вас смущает эта строка.Нажимаю кнопку выставляется флаг.Когда выставляется флаг в обработчике прерываний по таймеру начинает счёт переменная.
Скорее всего компилятор должен жаловаться на логичнское И, между частью операндов в строке. И что он МОЖЕТ ошибиться, если нет скобок. Жалоба на неоднозначную трактовку сравнений.
ivan dimir, код не мой, код опубликовал AlanDrakes в этой теме 2 сообщение, я просто взял и использовал.
ivan dimir писал(а):
И меня заинтерисовала функция ScanButtons()?
AlanDrakes писал(а):
или хотя бы обрабатывать кнопки в функции
что и требовалось.
ivan dimir писал(а):
что переход на ноль при ++ и переход с нуля на 1023 при --
здесь мне не понятно было, а переспрашивать не стал, в качестве демонстрации.
ivan dimir писал(а):
И замедление показаний.
опять не понятно, что значит замедление?
Код:
#define BTN_TIME 50
число 50 взято с потолка, в зависимости от тактовой частоты чипа это число будет меняться, это число больше определяет сколько надо времени держать нажатой кнопку до ее срабатывания, до установки флага. Попробуйте поиграться от 5-250.
KA = 0; while (1) { switch (KA) { case 0: инит_всего(); KA = 1; break; case 1: опрос_кнопок(); KA = 2; break; case 2: действие(); KA = 3; break; case 3: вывод_лсд(); KA = 1; break; default: в пиииии.....(); } }
Dimon456, все равно неправильно. У тебя - не конечный автомат, а тупой последовательный код, написанный через жопу!
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Eddy_Em, мне что, твои куски коды сюда начать выкладывать? В любой момент времени мы можем прерваться и прочитать состояние KA и узнать в каком состоянии находится последовательный код. В своем проекте я хотел использовать совт_таймер, как бы не из ваших КАСпойлер
Dimon456, вот, ты как раз сделал то, о чем я ТСу уже давно пытаюсь вталдычить: SysTick нужно использовать для отсчета условного внутреннего времени. И в конечных автоматах для выставления длинных задержек именно его и использовать, а не как абдуринщики вызывать delay_ms(500)! Скажем, надо тебе сделать переинициализацию дисплея в процессе работы. А там бывают приличные паузы. Ты процесс разбиваешь на несколько кусков. Как только нужна пауза, у тебя состояние, скажем, WAIT_FOR_SOMETH. В нем тупо проверяешь: если миллисекунды натикали достаточно, то переходишь в следующее состояние, если нет - остаешься в этом.
В общем, не понял ты вообще никак, что такое конечные автоматы и в чем их прелесть. А твой код "софтового таймера" - ад какой-то.
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 37
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения