Были бы макросы чуть гибче (или я чуть умней )... применение метода стало бы ещё проще - убрались бы имена потока как минимум из задержек и завершения, убрались бы номера задержек... и задержки бы стали ровно как стандартный встроенный делай - только с одной цифрой = время задержки. ну, впринципе и так получилось не сильно сложно... Вот, ещё примеры - задержка внутри цикла, моргушки с условием и без, обработка долгого кода с понижением его приоритета... код постарался по максимуму снабдить комментариями.Спойлер
Код:
#include <mega8.h> #include <delay.h>
// частота цикла в кГц #define Speed_temp 0.1 //начинаем поток (имя потока) #define StartPotok(pot) {static unsigned int pot##_EscapeIteration=1; \ static unsigned char pot##_StepOfPotok=0; \ if (pot##_EscapeIteration) {(pot##_EscapeIteration)--; \ if ((pot##_EscapeIteration)==0) { \ switch (pot##_StepOfPotok){case 0: (pot##_EscapeIteration)=0 //задержка в потоке (имя потока, номер задержки, длительность задержки-циклов) #define Delay_n(pot,step,tim) pot##_StepOfPotok=step; pot##_EscapeIteration=(tim)+1; \ goto pot##_End; case(step): (pot##_EscapeIteration)=0 //задержка в потоке (имя потока, номер задержки, длительность задержки-мс) #define Delay_t(x,step,tim) Delay_n(x,step,(tim)*(Speed_temp)) //заканчиваем поток (имя потока) #define EndPotok_n(pot,tim) default: pot##_EscapeIteration=(tim)+1; pot##_StepOfPotok=0; pot##_End:};};};} #define EndPotok_t(pot,tim) EndPotok_n(pot,(tim)*(Speed_temp)) #define EndPotok(pot) EndPotok_n(pot,0)
// Timer1 output compare A interrupt service routine interrupt [TIM1_COMPA] void timer1_compa_isr(void) {PORTC.6=1; //diagnostic out
#asm("sei") //подобие вытесняющей многозадачности (без него - кооперативный) /*в задачу, которую прервало прерывание мы не попадём, т.к. пока она не отработает - вход в неё блокируется поэтому в прерывании выполнятся остальные задачи, прерывание завершится и выполнение приостановленной задачи возобновится*/
StartPotok(key_trigg); //// кнопка-триггер с антидребезгом if(!PINC.2) //проверка { Delay_t(key_trigg,3,10); //задержка 10 ms (номера могут быть не по порядку, главное, чтоб не повторялись и были от 1 до 255) if(!PINC.2) //повторная проверка { PINC.0=1; // переключение d9 (записью 1 в регистр PIN производится переключение 1->0 0->1 порта) do { Delay_t(key_trigg,1,0); }while (!PINC.2);//ждём отпускания }; } EndPotok(key_trigg);
StartPotok(morgD11); // моргунчик d11 - проверка что мк работает PINC.3=1; //(моргает всегда, т.к. нет запрещающих моргание условий) Delay_t(morgD11,1,190); //моргает чуть быстрее чем d10 EndPotok(morgD11);
//приоритет зависшей задачи понижается она продолжит выполняться но только в фоне //если зависнет 2я задача - первая зависшая будет остановлена, пока не развиснет 2я StartPotok(largeoperation); //долгая, возможно зависшая задача... PORTC.4=1; //мигаем желтым светодиодом D13 delay_ms(300); //вот он - зависон (не знаю, какими вычислениями занять, поэтому просто делай) PORTC.4=0; Delay_t(largeoperation,1,300);//когда зависание пройдёт - приоритет задачи будет восстановлен EndPotok(largeoperation); //окончание зависания определяется по достижению меток задержек или конца потока.
//не оформлять код в поток можно только при полной уверенности, //что он успеет отработать за время между прерываниями и не зависнет! //очень рекомендую так не делать, и оформить его в поток. if (!PIND.0) {PORTB.0=1; PORTB.1=0; PORTB.2=0; PORTB.3=0;}; if (!PIND.1) {PORTB.1=1; PORTB.0=0; PORTB.2=0; PORTB.3=0;}; if (!PIND.2) {PORTB.2=1; PORTB.0=0; PORTB.1=0; PORTB.3=0;}; if (!PINC.5) {PORTB.5=1; PORTB.0=0; PORTB.1=0; PORTB.3=0;}; if (!PIND.3) {PORTB.3=1; PORTB.0=0; PORTB.1=0; PORTB.2=0;}; ///////// 2-ая группа кнопок if (!PIND.4) {PORTB.4=1; PORTB.5=0; PORTB.6=0; PORTB.7=0;}; if (!PIND.5) {PORTB.5=1; PORTB.6=0; PORTB.7=0; PORTB.4=0;}; if (!PIND.6) {PORTB.6=1; PORTB.4=0; PORTB.5=0; PORTB.7=0;}; if (!PIND.7) {PORTB.7=1; PORTB.4=0; PORTB.5=0; PORTB.6=0;}; }
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Заголовок сообщения: Re: Нестабильность из-за задержек
Добавлено: Вт апр 20, 2021 14:32:48
Прочитал все страницы и не понял, что тут за алгоритм выдумывается? Какая задача поставлена? Просто стало любопытно... Если прочитать первый пост ТС, то алгоритм выходит проще простого. Но так как дискуссия на 5 страниц – подозреваю что что-то делается в дополнении к поставленной задачи ТС. Или я ошибаюсь? Не смотрел алгоритм ТС но из его первого поста не понятно, могут ли быть нажаты две кнопки одновременно в одной группе и как должен отработать алгоритм – включить оба выхода соответствующим нажатым кнопкам или выбрать какой-то приоритет между этими кнопками? И ещё, на порт РD подключаются кнопки с фиксацией или без фиксации?
ЗЫ. Я так понимаю ТС уже всё для себя решил и тема теперь живёт по инерции – верно?
Самсусамыч, Привет! Да, первоначально вопрос стоял (в переводе): почему программные задержки в одной части кода мешают работе другой части кода и что нужно сделать, чтобы не мешали... этот вопрос породил небольшое противостояние на тему многозадачности, который почему-то перешел с темы многозадачности на тему опроса кнопок... ПС кнопки без фиксации, если я правильно понял, то кроме поставленного вопроса алгоритм Sergbernа, его полностью устраивал.
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Последний раз редактировалось Ivanoff-iv Вт апр 20, 2021 14:42:18, всего редактировалось 1 раз.
Обсуждение касается и вопросов ТС, и живёт своей жизнью. Лично я учился в том числе и на подобных обсуждениях. Народ предлагает свои способы решения задач, обсуждает достоинства и недостатки, обмениваются опытом. Порой в подобных обсуждениях можно найти решения каких то своих проблем. В том числе и достаточно обширных, необязательно локальных.
Добавлено after 2 minutes 14 seconds: Ivanoff-iv, опрос кнопок предполагает обработку дребезга контактов. А это таймеры, ну и так далее. Так что эта тема не просто близка, она напрямую связана со псевдопараллельностью процессов.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Опрос кнопок - один из процессов... и всё... просто кнопки тоже бывают разные... мне нравится прицепить кнопки к выводам разрядов семисегментного индикатора... но опрос там уже немного другой... проблемы сделать антидребезг обычной кнопки вообще не вижу... опрашивай в процессе, считай что вышло и делай выводы... хоть различай короткое-длинное, хоть 1-2-3 кратность нажатия...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Раз кнопки бес фиксации, то получается пока удерживаешь кнопку нажатой – соответствующий выход имеет высокий уровень? А как отпустил кнопку – на выходе появился низкий уровень? Как с вопросом по нажатию двух кнопок в одной группе? Как должно работать?
А вы сами себе задачу поставьте. Необязательно смотреть в задачу ТС-а. Представьте, что вы делаете автомат световых эффектов. С управлением от кнопок. Какой алгоритм захотите, такой и будет.
думаю, что ТС не думал о нжатии сразу нескольких кнопок... да и дело тут уже не в алгоритме мигания светодиодами, а впринципе... в принципе построения кода... я уже отклонился от линии автора... (добавил ещё кнопок и светодиодов..., но те что стоят изначально - работают по алгоритму автора). кстати Самсусамыч, у меня был подобный распределённый диспетчер и для АБ... не помню уже показывал ли я его тебе, если нет - поищу...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
думаю, что ТС не думал о нжатии сразу нескольких кнопок...
А как у ТС сделан алгоритм выполнения работы выходов одной группы? По принципу однорядных кнопок П2К (одну нажал, все остальные отключились)? Или ещё как-то?
4 подряд... опрос следующей кнопки, если она нажата - затирает состояние, оставленное предыдущими итерациями и выставляет на 4 вывода порта свой паттерн. паттерн прост горит тьлько тот светодиод из 4х, какая кнопка нажата. паттерн выставляется побитной записью в порт. таких конструкций 2, одна работает на битах 0-3, вторая на битах 4-7.
Добавлено after 1 minute 48 seconds: т.е. да как П2К, но при одновреме6ом нажатии горит только втарший
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
уточню: кнопки без механической фиксации, программно: 1 кнопка - триггер, и 2 группы по 4 кнопки типа "кто последний тот и папа"
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
2 группы по 4 кнопки типа "кто последний тот и папа"
Вот и мой вариант… нажатие кнопки включает соответствующий светик группы, отключая при этом ранние включенные светики этой группы. Группы независимы… ну и кнопка для двух светиков… Первая группа: Кнопки: РD0; PD1; PD2; PD3. Светики: PB0; PB1; PB2; PB3.
МК мега8 тактируется от внутреннего генератора на 8 МГц.
ЗЫ. Есть и фишка в алгоритме… если для включения очередного светика нажать и не отпуская её нажать любую другую кнопку из группы, то засветится следующий светик не гася предыдущий. Выключить светики можно нажав повторно на кнопку того светика который необходимо погасить. Второй светик останется включенным. Таким образом можно зажечь одновременно все 4 светика. Но можно эту фишку и убрать, изменив алгоритм.
Последний раз редактировалось Самсусамыч Вт апр 20, 2021 18:35:28, всего редактировалось 2 раз(а).
Задача в следующем: группа 4кнопки-4светодиода ( для краткости в дальнейшем 4кн-4сд) с зависимым включением, таких групп две, сами группы между собой независимы.
думаю П2К. Demiurg, ваш proc_device полностью переписывать надо. Одним словом тот же самый алгоритм только в упакованном виде, если распаковать там целая портянка получится. Честно говоря я ожидал большего, к примеру:
Код:
if (Set_Is_Key_Kn0_Pressed ()) a |= KEY_KN_0_BIT;
это должно было задаваться отдельной задачей, к примеру у меняСпойлер
Dimon456, в моем примере я показал только кнопку триггер. То есть, пример подавления дребезга, удержание, двухрежимный автоповтор. Держим кнопку, включается один автоповтор, держим дальше, долбит ещё быстрее. Включение одного светодиода, и мигалка. На тот момент ТС не ответил, когда я просил полное ТЗ. А код я тогда не стал глядеть. Не до того было. Я сейчас крайне занят. Ну а дальше вы все потянулись. Как я уже писал, технически, на остальных кнопках подавление дребезга как бы можно и не делать, ну выставит программа порты ещё раз. Не айс, конечно. А дальше ТС перестал участвовать в теме.
Самсусамыч, ну и кто в твоем хексе увидит твой алгоритм? или ты думаешь, что народ кинется собирать макет и прошивать твой хекс, чтобы посмотреть его работу?
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Starichok51, емнип он пишет на алгоритмбилдере, "исходник" всё-равно мало кому понятен будет. А вообще.... господа, создали бы отдельную тему по-хорошему где обсуждали. А то ТС уже наверное заблудился и запутался тут.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения