Таймер
- Войдите на сайт для отправки комментариев
Пнд, 21/01/2019 - 18:59
В произвольонм месте программы нужно однократно "зажигать" произвольный пин на произвольное время. При этом основной цикл должен продолжать крутиться. Желательно что бы зажжёный пин "гас" сам без дальнейшего вмешательства по истечению таймаута. Прошерстил на вскидку Timer, TimerOne и им подобные библиотеки, какие то каличные методы у их объектов ИМХО. Подскажите простой способ, уверен он гдето на поверхности.
TTimerList на github от меня. Найдешь?
Сдается мне, что только паразитировать на millis()...О Дет опередил, значит не только )))
Сейчас у меня так и работает. Хочу заменить этот костыль на нормальный код. Тем более приходится "уходить" в довольно длительные функции (до нескольких минут, обработка входящих/исходящий звонков и т.п.), в которых нужный миллис можно пропустить.
Так у него либа тоже паразитирует )))
Главное что хотелось бы - упорядочить кубло глобальных функций и переменных для всех таймеров что у меня крутятся.
TTimerList на github от меня. Найдешь?
void TTimerList::Step(void) { if (NOT active) return; // если все таймеры остановлены, то и смысла нет // сопсно рабочий цикл for (THandle i = 0; i < MAXTIMERSCOUNT; i++) // пробегаем по всему списку таймеров { byte sreg = SREG; // запомним состояние прерываний cli(); // чтоб никто не помешал изменить интервалы, запрещаем прерывания if (Items[i].CallingFunc == NULL) continue; // если функция-обрабоччик не назначена, уходим на следующий цикл if (NOT Items[i].Active) continue; // если таймер остановлен - тоже if (--Items[i].WorkingCounter > 0) continue; // уменьшаем на 1 рабочий счетчик Items[i].WorkingCounter = Items[i].InitCounter; // и записываем в рабочий счетчик начальное значение для счета сначала sei(); Items[i].CallingFunc(); // если достиг 0, вызываем функцию-обработчик SREG = sreg; // теперь и прерывания можно восстановить как было } }Глянул на код. И у меня вопрос, а в вот если в строках 9, 10 или 11 if выполнится, а таймер последний окажется, то что у нас с прерываниями будет?
приходится "уходить" в довольно длительные функции (до нескольких минут
Похоже на неправильное проектирование программы. Если у вас в коде есть конечный автомат (а практически во всех проектах сложнее светодиодов он есть) - в программе не должно быть функций длинее нескольких сотен миллисекунд. Никакие "несколько минут" в принципе не допустимы
да, это косяк первой версии, спасибо. Этот кусок теперь выглядит так, щас на git выложу
void TTimerList::Step(void) { if (!IsActive()) return; // если весь список остановлен, то смысла в переборе нет byte sreg = SREG; // запомним состояние прерываний // сопсно рабочий цикл for (THandle i = 0; i < MAXTIMERSCOUNT; i++) // пробегаем по всему списку таймеров { cli(); // чтоб никто не помешал изменить интервалы, запрещаем прерывания if (Items[i].СallingFunc==NULL) continue; // если функция-обрабоччик не назначена, уходим на следующий цикл if ( !Items[i].Active) continue; // если таймер остановлен - тоже if (--Items[i].WorkingCounter > 0) continue; // уменьшаем на 1 рабочий счетчик, если не ноль, то функцию вызывать рано Items[i].WorkingCounter = Items[i].InitCounter; // а если пора, то записываем в рабочий счетчик начальное значение для счета сначала sei(); Items[i].CallingFunc(); // и вызываем функцию-обработчик } SREG = sreg; // теперь и прерывания можно восстановить как было }с моим скудоумием, говнокод писать - много ума не надо. :)
да, это косяк первой версии, спасибо. Этот кусок теперь выглядит так, щас на git выложу
А что такого во второй версии существенного планируется?
там всё переделано напрочь
там всё переделано напрочь
И когда премьера ожидается?
И когда премьера ожидается?
А с какой целью интересуетесь? Вроде, то, что выложено, работает как надо, кому надо много таймеров - смело могут использовать её. Для себя я сделал уже десятую, наерна, версию, но в git не выложил, она на шаблонах, там не 2 файла качать надо, а четыре, зачем новичков пужать?
Ну, там написано, что новая версия будет совсем-совсем не совместима со старой. Вот и любопытствую
Ну, там написано, что новая версия будет совсем-совсем не совместима со старой. Вот и любопытствую
По пословице про обещанное )))
Да потерпите ж вы маленько, щас как раз описание пишу, полностью же переписывать надо, ждитя.
Просто, не думал, что кто-то этим пользуется.
Просто, не думал, что кто-то этим пользуется.
поэтому и тему про бочку удалили?
поэтому и тему про бочку удалили?
если удалили, значить она не несла никакой смысловой нагрузки. туда ей и дорога.
поэтому и тему про бочку удалили?
если удалили, значить она не несла никакой смысловой нагрузки. туда ей и дорога.
там стоко кода, а на подсмотреть?
кода там - кот накакалъ, я же не Гайвер. Если чо, на амперке тема с бочкой есть
кода там - кот накакалъ, я же не Гайвер. Если чо, на амперке тема с бочкой есть
Дида, а за что ты ее?
Дида, а за что ты ее?
#17
Дида, а за что ты ее?
#17
Ну как не несла, несла, я код с лёту не одолел, а ведь уже несколько не полный чайник )))
я код с лёту не одолел, а ведь уже несколько не полный чайник )))
Вооот. А для новичков это вапще тёмный лес и немцы под кустами. И смысл его выложивать?
я код с лёту не одолел, а ведь уже несколько не полный чайник )))
Вооот. А для новичков это вапще тёмный лес и немцы под кустами. И смысл его выложивать?
Так я что-то не сохранил, а тёмный лес - друг молодёжи )))
На амперке тема осталась и на github проект есть. Сылку дать?
На амперке тема осталась и на github проект есть. Сылку дать?
да
http://forum.amperka.ru/threads/%D0%9A%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D1%...