??? О_о. AVR STUDIO что ассемблер, что си, многофайловые проекты только в путь. Вы упускаете главное. Проектирование сверху вниз. В файлах вспомогательные функции. Они не должны волновать вас вообще. Настроил низкоуровневые функции. Дальше на одной страничке ты решаешь главную задачу. Я не хочу ничего плохого сказать. У всех разное мышление. У меня блочное мышление. Обьектное так сказать. Скомпилировали один блок, второй, десятый. Дальше я мыслю блоками. Массивами блоков. Вы же похоже можете в уме удержать только то, что у вас на глазах. Это ни плохо и не хорошо. Особенности мышления.
Похоже человек просто пока ничего большого не делал.... это ведь скролл у мыши смозолится пока нужный кусок найдёшь... действительно это важное умение разделить программу на максимально независимые блоки и организовать между ними максимально стандартизованное взаимодействие, тогда и код получается легко читаемым и править его под именяющиеся требования тоже намного проще. Это-ж красота: вот вкладочка (файлик) - тут у нас интерйейс пользователя, вот - взаимодействие с "соседями", тут - техпроцесс, математика, описание периферии... (если мк достаточно мощный и особенно для стм, там вообще ещё уровень абстракции добавлен... но сейчас не о них)...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Demiurg, В данном случае проект ТС уместится на одну страницу. Кто об этом будет спорить, можно к примеру инициализацию в отдельную функцию и в отдельный файл запихать, удобно. Но что бы поморгать светодиодом необходим многостраничный проект, о чем вы? Или задержку для лсд на КА? Еще хлеще. Исход один, работает, не важно как написано. А в ваших КА, ни чего нет, только основа, хотел глянуть как энкодер обрабатывается - нет, сам пиши. Где же ваша универсальность? Ни библиотек, ни примеров кода, то же нет, ни чего нет. Ардуино хоть как-то поддерживается, а эта ... Книжку кто-то написал и на полку положил, а вы ее нашли.
Заголовок сообщения: Re: Нестабильность из-за задержек
Добавлено: Пн апр 19, 2021 19:52:45
Друг Кота
Карма: 25
Рейтинг сообщений: 99
Зарегистрирован: Вс янв 24, 2010 19:19:52 Сообщений: 4470 Откуда: Главный Улей России (Moscow)
Рейтинг сообщения:0
Ну и срааач! Для решения такой задачи хватит и задержки на таймере. Лично у меня это самое первое, что внедряется сразу же после создания проекта. В более серьезных ядрах, вроде ARM, под это дело даже выделен отдельный таймер, называемый системным. Организуется просто:
Иходник Спойлер
Код:
/////////////////////////////////////////////////////////////////////////////////////// // The System Timer (systimer.c)
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Dimon456. Помните, я вам говорил, что у меня сложилось стойкое впечатление, что вы на других проецируете свои внутренние проблемы? Оказывается, ваша глубинная внутренняя проблема это отсутствие достойного примера энкодера. Гггг DX168B. И че? Мы в теме AVR. И я как бы тоже могу показать свой пример программного таймера.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
ТЗ обработчика энкодера. Кстати, уточняю. Мы говорим о крутилке, с кнопочкой или промышленном энкодере? Которые в ЧПУ станках ну и так далее. Дарю одно из своих решений. Не знаю, устроит или нет. Ставим 2 D или JK триггера. Дальше обработка не составляет труда. Выходы триггеров ставим на внешние прерывания и дальше просто и тупо считаем. Щас картинку поищу. Тут.
Да при чем тут энкодер, вам говорят ни библиотек, ни примеров кода. А я не стой категории что бы изобретать. А если и про энкодер говорить, то как же китайцы обошлись одной микрухой РТ6311 (2 энкодера, и одновременно)?
Мой пример обработки кнопок. Удержание, автоповтор. Не стесняйтесь, поделитесь каким нибудь несложным проектом на вашем подходе. Можете в личку. Дальше не пойдёт.
// if (Set_Is_Key_Plus_Pressed ()) a |= KEY_PLUS_BIT; // if (Set_Is_Key_Minus_Pressed ()) a |= KEY_MINUS_BIT; if (Set_Is_Key_Kn0_Pressed ()) a |= KEY_KN_0_BIT; if (Set_Is_Key_Kn1_Pressed ()) a |= KEY_KN_1_BIT; if (Set_Is_Key_Kn2_Pressed ()) a |= KEY_KN_2_BIT; if (Set_Is_Key_Kn3_Pressed ()) a |= KEY_KN_3_BIT; if (Set_Is_Key_Kn4_Pressed ()) a |= KEY_KN_4_BIT; if (Set_Is_Key_Kn5_Pressed ()) a |= KEY_KN_5_BIT; if (Set_Is_Key_Kn6_Pressed ()) a |= KEY_KN_6_BIT; if (Set_Is_Key_Kn7_Pressed ()) a |= KEY_KN_7_BIT; if (Set_Is_Key_Kn_Trig_Pressed ()) a |= KEY_TRIGGER_2_BIT;
return a; }
а потом вот это Спойлер
Код:
u16 recoding_keys (void) { switch (keys_curr) { //case KEY_PLUS_BIT: return KEY_PLUS_COD; //case KEY_MINUS_BIT: return KEY_MINUS_COD; case KEY_KN_0_BIT: return KEY_KN_0_COD; case KEY_KN_1_BIT: return KEY_KN_1_COD; case KEY_KN_2_BIT: return KEY_KN_2_COD; case KEY_KN_3_BIT: return KEY_KN_3_COD; case KEY_KN_4_BIT: return KEY_KN_4_COD; case KEY_KN_5_BIT: return KEY_KN_5_COD; case KEY_KN_6_BIT: return KEY_KN_6_COD; case KEY_KN_7_BIT: return KEY_KN_7_COD; case KEY_TRIGGER_2_BIT: return KEY_TRIGGER_2_COD; }
Задача в следующем: группа 4кнопки-4светодиода ( для краткости в дальнейшем 4кн-4сд) с зависимым включением, таких групп две, сами группы между собой независимы. Но нужна ещё 9-ая кн-триггер и к ней 2 сд: нажали кн -- один сд загорелся и второй заморгал, нажали ещё раз -- оба сд потухли
уважаемый Demiurg, мне все возможные комбинации описать? или еще как? Я до этого дошел, а ТС до этого навряд ли дойдет. У вас одновременно две кнопки нельзя нажать, а у ТС ожно три может нажиматься.
Так что не совсем все это универсально, и надо бы с напильником что-ли, хотя нет может болгаркой попробовать.
Ну да ладно, на досуге подумаю еще над этим автоматом.
Мой пример обработки кнопок. Удержание, автоповтор.
Это очень громоздко, а ведь ТС нужна не одна кнопка, а 10 и все желательно с антидребезгом... У меня есть пара классов кнопок, в них можно передать сразу 10 пинов, указать нужны ли длинные нажатия, отпускания или автоповторы, в случае одного из классов это задается для каждой кнопки индивидуально, дополнительно можно указать размер необязательной очереди и таблицу перекодировки, чтобы вместо масок возвращались именно коды кнопок, в случае использования очереди update() можно будет вызывать из прерывания и т.д.... В простейшем случае, без мигания светодиодом, код будет выглядеть так:
while(true) { buttons.update(); if(buttons.changed()) { auto state = buttons.state; leds.write(state.current); if(state.shortPressed & 0x200) .... // trigger } }
Правда он не скомпилируется потому что в списке диодов продублирован PB5, как было в оригинальном коде, и это наверняка ошибка. Естественно это пример не для TC, но всем остальным есть куда стремиться
Reflector, у ТС CVAVR. Где C++ нет в принципе, насколько я знаю, только голый Си. И зачем вообще примеры на другом языке, когда говорили только Сях.
Я и написал, что пример не для ТС, но по большому счету то же самое можно сказать и про примеры от Demiurga или Ivanoff-iv, так что CVAVR тут не причем. Народ демонстрирует как решает конкретную задачу наиболее простым и/или унифицированным способом, в процессе чего иногда происходит заимствование более эффективных подходов. Естественно никто сразу как я писать не станет, но после сопоставления двух примеров некоторые сомнения в эффективности собственного подхода возникнуть могут
Пошто не для ТС? его код подошел в мою заготовку практически без переделок...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
это же надо было так завернуть-заворотить? сначала родил кучу функций типа Set_Is_Key_KnХ_Pressed (), потом по этим функциям определил некоторое число для каждой кнопки, потом по этому числу определил код кнопки. а нет, чтобы сделать всего ОДНУ функцию, которая сразу бы возвращала код кнопки? или до такого простого решения с достигнутых "высот" грех опускаться?
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Reflector, а ему в них и не надо смотреть... не смотрит же он как внутри все остальные С конструкции выглядят... а то можно глянуть - открыть АСМ файл проекта и сказать, что С это сложно, запутанно и не понятно... а как пользоваться макросами - я подсказки оставил.
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Dimon456, в моем примере библиотечка опроса кнопок взята из первого попавшегося проекта с опросом кнопок. И да, одновременно нажатые кнопки в этой библиотечке не отслеживаются.
Starichok51, Dimon456 написал с моего примера. Поясню, почему в моем примере сделано именно так. Set_Is_Knopa_x это макрос. Компилятор этот макрос в дизасме компилирует достаточно компактно. Если у него хорошее настроение, то одной командой, sbis или sbic. Итак. У нас есть кнопы, разбросанные по разным портам. Собираем эти кнопы в переменной. Потом, если какая то кнопа нажата, проверяем на дребезг. Если прошли проверку дребезга, ищем соответствие бита, то есть кнопки коду нажатой кнопки. Этот метод хорош тем, что все кнопки в итоге опрашиваются как будто опрашиваем одну кнопку. Минус - нет отслеживания одновременно нажатых кнопок. Но мне это и не нужно было.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 33
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения