Таймер

vlad072
Offline
Зарегистрирован: 01.08.2017

В произвольонм месте программы нужно однократно "зажигать" произвольный пин на произвольное время. При этом основной цикл должен продолжать крутиться. Желательно что бы зажжёный пин "гас" сам без дальнейшего вмешательства по истечению таймаута. Прошерстил на вскидку Timer, TimerOne и им подобные библиотеки, какие то каличные методы у их объектов ИМХО. Подскажите простой способ, уверен он гдето на поверхности.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

TTimerList на github от меня. Найдешь?

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Сдается мне, что только паразитировать на millis()...О Дет опередил, значит не только )))

vlad072
Offline
Зарегистрирован: 01.08.2017

Сейчас у меня так и работает. Хочу заменить этот костыль на нормальный код. Тем более приходится "уходить" в довольно длительные функции (до нескольких минут, обработка входящих/исходящий звонков и т.п.), в которых нужный миллис можно пропустить.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Так у него либа тоже паразитирует )))

vlad072
Offline
Зарегистрирован: 01.08.2017

Главное что хотелось бы - упорядочить кубло глобальных функций и переменных для всех таймеров что у меня крутятся.

 

asam
Онлайн
Зарегистрирован: 12.12.2018

DetSimen пишет:

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 выполнится, а таймер последний окажется, то что у нас с прерываниями будет?

 

b707
Онлайн
Зарегистрирован: 26.05.2017

vlad072 пишет:

приходится "уходить" в довольно длительные функции (до нескольких минут

Похоже на неправильное проектирование программы. Если у вас в коде есть конечный автомат (а практически во всех проектах сложнее светодиодов он есть) - в программе не должно быть функций длинее нескольких сотен миллисекунд. Никакие "несколько минут" в принципе не допустимы

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

да, это косяк первой версии, спасибо.  Этот кусок теперь выглядит так, щас на 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;	                                  // теперь и прерывания можно восстановить как было
}

с моим скудоумием, говнокод писать - много ума не надо. :) 

 

asam
Онлайн
Зарегистрирован: 12.12.2018

DetSimen пишет:

да, это косяк первой версии, спасибо.  Этот кусок теперь выглядит так, щас на git выложу

А что такого во второй версии существенного планируется?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

там всё переделано напрочь

asam
Онлайн
Зарегистрирован: 12.12.2018

DetSimen пишет:

там всё переделано напрочь

И когда премьера ожидается?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

asam пишет:

И когда премьера ожидается?

А с какой целью интересуетесь?  Вроде, то, что выложено, работает как надо, кому надо много таймеров - смело могут использовать её.  Для себя я сделал уже десятую, наерна, версию, но в git не выложил, она на шаблонах, там не 2 файла качать надо, а четыре, зачем новичков пужать?

asam
Онлайн
Зарегистрирован: 12.12.2018

Ну, там написано, что новая версия будет совсем-совсем не совместима со старой. Вот и любопытствую

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

asam пишет:

Ну, там написано, что новая версия будет совсем-совсем не совместима со старой. Вот и любопытствую

По пословице про обещанное )))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Да потерпите ж вы маленько, щас как раз описание пишу, полностью же переписывать надо, ждитя.

Просто, не думал, что кто-то этим пользуется.  

IvanP
Offline
Зарегистрирован: 19.11.2018

DetSimen пишет:

Просто, не думал, что кто-то этим пользуется.  

поэтому и тему про бочку удалили?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

IvanP пишет:

поэтому и тему про бочку удалили?

если удалили, значить она не несла никакой смысловой нагрузки. туда ей и дорога. 

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

DetSimen пишет:

IvanP пишет:

поэтому и тему про бочку удалили?

если удалили, значить она не несла никакой смысловой нагрузки. туда ей и дорога. 

там стоко кода, а на подсмотреть?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

кода там - кот накакалъ, я же не Гайвер.  Если чо, на амперке тема с бочкой есть

bwn
Offline
Зарегистрирован: 25.08.2014

DetSimen пишет:

кода там - кот накакалъ, я же не Гайвер.  Если чо, на амперке тема с бочкой есть

Дида, а за что ты ее?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

bwn пишет:

Дида, а за что ты ее?

#17

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

DetSimen пишет:

bwn пишет:

Дида, а за что ты ее?

#17

Ну как не несла, несла, я код с лёту не одолел, а ведь уже несколько не полный чайник )))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ua6em пишет:

я код с лёту не одолел, а ведь уже несколько не полный чайник )))

Вооот.  А для новичков это вапще тёмный лес и немцы под кустами.  И смысл его выложивать?

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

DetSimen пишет:

ua6em пишет:

я код с лёту не одолел, а ведь уже несколько не полный чайник )))

Вооот.  А для новичков это вапще тёмный лес и немцы под кустами.  И смысл его выложивать?

Так я что-то не сохранил, а тёмный лес - друг молодёжи )))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

На амперке тема осталась и на github проект есть. Сылку дать?

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

DetSimen пишет:

На амперке тема осталась и на github проект есть. Сылку дать?

да

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017