Попробовал запустить в AVR Toolchain, оказывается у вас зависимость от версии.
у меня зависимость от версии по минимуму, т.е. ниже определенной версии не будет поддержки __flash, а значит, и мои файлы не соберутся. но AVR Toolchain давно имеет соответствующую версию! почему у вас не собралось - не понимаю: я тестировал у себя от версии 4.9.2 и до 9.2.0
Demiurg писал(а):
Это не моя личная хотелка.
это ваша личная хотелка - смотрите на WiseLord, он буквально за 5 минут запустил и на своем AVR (я тестировал на меге8, а он на меге328), и на stm32, и никаких скомпилированных проектов ему не потребовалось. я предоставил полностью готовые примеры с готовыми makefile для atmega8, в комплекте с протеусом - хоть собирайте сами, хоть тестируйте готовое! а остальное - "за свой счет"
Demiurg писал(а):
при этом без опроса флага готовности
самая порочная практика из всех, что я встречал - игнорировать рекомендации даташита, полагаясь на какие-то задержки. я так не делал, и не буду делать. и вам не советую
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Еб... Вы один из самых упоротых и узколобых собеседников. Это не эмоции. Мне есть с чем сравнивать. Я не знаю как вы пришли в программирование микроконтроллеров. Лично я, как и многие другие от железа. И программирование как таковое малая часть нашей деятельности. И вы сами по форумам видите, что у многих ситуация в разы хуже, чем у меня, к примеру. Дисплеи по даташитам работают штатно, если соблюдать времянки. Без опроса флага готовности. А впрочем, что я время теряю. По проекту меню откланиваюсь. ебитесь варитесь сами в собственном соку. У меня на нынешний момент была единственная проблема - с необязательным параметром. Наверное пришло время решать её самому. Лично.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
нет, не пробовал. у меня как-то с GIT не складывается... только и могу поглядеть файлы в браузере. с stm32 вообще никак не связан (ни тулчейна нет, ни МК), а под AVR не увидел какой-то заметной разницы в ваших модификациях. даже несколько удивлен количеству "лишних" файлов
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Всё эти файлы avr_fmenu.* - это файлы проекта, чтобы открыть код в QtCreator. По сути, они не нужны для сборки. Достаточно только в PATH иметь make и компилятор (avr-gcc и arm-none-eabi-gcc соответственно).
вы будете смеяться: внешний диск я использую Eclipse, и много раз хотел как-то приспособить либо встроенную в него возможность контроля версий, либо при помощи плагинов что-то подключить... но так и не уразумел, как всем этим добром пользоваться, чтобы "на кнопочку нажал - и готово". поэтому вот так как-то...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
я использую Eclipse, и много раз хотел как-то приспособить либо встроенную в него возможность контроля версий, либо при помощи плагинов что-то подключить... но так и не уразумел, как всем этим добром пользоваться
А я пользуюсь QtCreator, в котором тоже есть поддержка разных систем контроля версий, но я эти функционалом не пользуюсь.
Вот и Вам я бы посоветовал изучить эти несколько команд консольного git, и пользоваться ими. А когда войдёте во вкус и поймёте, как это работает "снизу" - можно положить и IDE- шным функционалом пользоваться, если возникнет желание.
я бы посоветовал изучить эти несколько команд консольного git
да не вы первый мне это советуете... но я очень ленивый: это ж надо консоль открывать, команды вбивать... еще помнить их... не, мне или "кнопочку", или уж по-старинке - на внешний диск Total Commander-ом
сейчас я вообще все на внешнем диске держу: и проекты, и тулченый, и Eclipse (пользуюсь тем, что Eclipse можно обдурить, введя в него относительные пути)... зато могу на любом компе работать, хоть в гостях
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Нет, по мне - написание кода без истории и системы контроля версий - это просто мазохизм.
Помнить максимум десяток простых (двухсловных) команд - это проще, чем помнить для всего объёма кода, зачем вот в этом месте была заведена какая-то переменная год назад, и почему два года назад я вот тут сделал вот так.
Вот минимальный список команд - просто для локальной работы:
Код:
git init - создать в некотором рабочем каталоге git репозиторий git add <относительный путь> - добавить текущие изменения в файл(ах)/каталогу в список для индексации gid commit - зафиксировать список для индексации (создать коммит в истории с текущим состоянием дерева проекта) git log - посмотреть историю коммитов git show <хэш коммита> - посмотреть изменения, сделанные в этом комите.
Этого вполне достаточно просто для хранения истории своих изменений в каталоге "на внешнем диске" А если захочется свой локальный репозиторий на тот же Github отправлять или оттуда забирать - то ещё понадобятся пара команд:
Код:
git push - отправить текущее состояние (последний коммит со всей историей) на удалённый сервер git pull - забрать последние изменения с сервера (если, к примеру, работали на другой машине и пушили раньше оттуда на сервер)
А дальше уже есть другие "фишки", типа как работа с несколькими ветками кода - когда можно временно переключиться на другую ветку, сделать в ней пару "рабочих" коммитов, потом вернуться на основное состояние и работать дальше там. Но это уже после "вхождения во вкус".
Не так уж и сложно запомнить, как по мне.
А особая прелесть - когда есть несколько проектов с похожим кодом (кусками кода), и нужно изменения в одном проекте забрать в другой - тоже всё упрощается донельзя. Но это уже чуть более высокий уровень владения Git-ом.
Добавлено after 17 minutes 37 seconds: А вот небольшая иллюстрация локальной работы с Git в изначально пустом каталоге:
теорию я знаю. но применять её на практике... увы. Eclipse дает мне возможность иметь локальную историю изменений, я насроил до 100 предыдущих вариантов - и мне пока хватает без всяких Git-ов. а осальное для работы с Git в Eclipse совсем не интуитивно (для меня). а я уже устал заниматься тем, что всякий раз что-то углубленно изучать и настраивать только для того, чтобы потом пару раз поиспользовать.
мне бы кнопочку...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
typedef const struct Menu_Item { const struct Menu_Item *Next; /**< Указатель на следующий пункт меню этого пункта меню */ const struct Menu_Item *Previous; /**< Указатель на предыдущий пункт меню этого пункта меню */ const struct Menu_Item *Parent; /**< Указатель на родительский пункт меню этого пункта меню */ const struct Menu_Item *Child; /**< Указатель на дочерний пункт меню этого пункта меню */ const char id; } Menu_Item_t;
у каждого пункта меню свой уникальный идентификатор id. Самих функций здесь не много
как я выше уже написал, у каждого меню свой уникальный идентификатор id, берется отсюда
Код:
STATE ( NOT, NULL ), STATE (SETTING_ENTER, settings_enter ), STATE (CALIBRATIONS_DEVICES, Calibrations_Devices ), STATE (CALIBRATION_VOLTMETER, Calibration_Voltmeter ), STATE (VOLTMETER_1, Voltmeter_1 ), STATE (VOLTMETER_2, Voltmeter_2 ),
в основной программе я получаю этот id текущего пункта меню
switch(id) { case setting_enter: settings_enter(); break; case calibrations_devices: Calibrations_Devices(); break; case calibration_voltmeter: Calibration_Voltmeter(); break;
ну так это у вас полчилоь классическое меню, без возможности делать динамичекое название пункта, без встроенного редактирования параметров... по id перебирать варианты... оно, конечно, полезно, но скучновато...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Я же вам писал, запятую поставьте там где мне надо СпойлерМеню
Код:
// Menus Name | Next | Prev | Parent | Child | SelectFunction MENU_ITEM(Menu_5_1_1, NULL_MENU, Menu_5_1, NULL_MENU, NULL_MENU, T_VOLTAGES); ///
Опрос кнопок, на BTN_SHRT1 и BTN_SHRT2 энкодер висит
Код:
if (button == BTN_SHRT4) { lcd_clear();//очистка LCD и перевод курсора в 0.0 Menu_Navigate(MENU_NEXT); if(id == T_VOLTAGES) { if(table_u++ == U_33) table_u = U_33; } }
if (button == BTN_SHRT3) { lcd_clear();//очистка LCD и перевод курсора в 0.0 Menu_Navigate(MENU_PREVIOUS); }
if (button == BTN_SHRT2) { switch(id) { case CALIBRATIONS_DEVICES: case CALIBRATION_TABLE: case CALIBRATION_VOLTMETER: case CALIBRATION_AMMETER: case TABLE_VOLTAGES: case TABLE_CURRENT: lcd_clear();//очистка LCD и перевод курсора в 0.0 Menu_Navigate(MENU_CHILD); break; default: break; } if(id == T_VOLTAGES) {variable[table_u].U_table--; variable[table_u].U_table = normalize (((int16_t)variable[table_u].U_table), ((int16_t)(0)), ((int16_t)(UImax_pwm)));} } if (button == BTN_SHRT1) { switch(id) { case CALIBRATIONS_DEVICES: case CALIBRATION_TABLE: case CALIBRATION_VOLTMETER: case CALIBRATION_AMMETER: case TABLE_VOLTAGES: case TABLE_CURRENT: lcd_clear();//очистка LCD и перевод курсора в 0.0 Menu_Navigate(MENU_PARENT); break; default: break; } if(id == T_VOLTAGES) {variable[table_u].U_table++; variable[table_u].U_table = normalize (((int16_t)variable[table_u].U_table), ((int16_t)(0)), ((int16_t)(UImax_pwm)));} }
ARV, все равно чуть ли не для каждого пункта меню вы будете писать свою функцию, универсальности здесь нет и не зачем усложнять высокоинтеллектуальными кодами в которых трудно разобраться. Попробуйте написать мой пункт меню T_voltages на своем FlexMenu с тем же алгоритмом и стем же отображением на lcd?
отнюдь. я задумал упростить типичные пункты меню, сделав из сразу готовыми фукнциями. при этом возможность сделать свою уникальную для вывода уникального содержимого так же имеется. вы же исключили в принципе возможность упрощения чего-либо. так что не все равно. в качестве универсального решения вы предложили самое примитивное. да, оно 100% универсально - бери напильник и допиливай под себя. я преложил решение, которое хоть на 10%, но позволяет обойтись без напильника. множество настроек могут быть реализованы изначальным вариантом FlexMenu практически без усиилий программиста, разве что описать тип данных придется, и выделить ячейки EEPROM под них.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
самая порочная практика из всех, что я встречал - игнорировать рекомендации даташита, полагаясь на какие-то задержки. я так не делал, и не буду делать. и вам не советую
Да ладно! Все времена выполнения команд как раз таки в ДШ чётко расписаны. Да и к чему эти излишние телодвижения с готовностью и с дополнительным пином?
А в чем сакральный смысл наличия бита готовности, если можно по задержкам?
Имхо, дело в том, что задержки указываются для определенных условий, например, тактовой частоты контроллера дисплея. А разные производители разных дисплеев вольны выбирать разные частоты... И разработчик обречен на штудирование документации при каждой смене поставщика или производителя... Или разработчик делает по готовности, и спит спокойно при любых ветрах перемен.
Что практичнее?
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
ARV, я даже и не думал что так будет работатьСпойлерid
Код:
STATE (STANDARD_SCREEN, standard_screen ), // STATE (MODE_BP, standard_screen ), // STATE (POWER, standard_screen ), // STATE (CHARGE, standard_screen ), // STATE (OPERATION, standard_screen ), // STATE (TIMING, standard_screen ), //
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения