"Программный таймер" - это вырожденный случай оси, предоставляющей
сервис времени. Не имеет никакого смысла тратить время на вырожденные случаи. Лучше один раз сделать в общем виде, а потом пользоваться осью для широкого круга применений, включая вырожденные случаи "программных таймеров".
Пример простой кооперативной оси для Ардуино с тиком 1 мс - по ссылке https://github.com/akouz/a_coos