Не, много времени уйдет на обработку таймеров. Шаг в таймерах и так задается. Максимальное время 65535 мс, если шаг счета таймера 1 мс. В большинстве случаев этого достаточно. Если требуется больший шаг, выставляем дискретность в параметрах таймера, в задачах считаем дискретные шаги.
.equ PROC_HEAT_DELAY = 150
Set_Timer Par_Timer_Proc_Heat_Init
Set_State _PROC_HEAT_INIT_2
ret
Proc_Heat_Init_2:
Proc_Timer Par_Timer_Proc_Heat_Init
Par_Timer_Proc_Heat_Init:
par_timer ST_PROC_HEAT, 1<<ST_UNLOCK_FLG, PROC_HEAT_DELAY
Так я делал с шагом 100 мс, из старого проекта.
FORG_TIMER: // Дополнительный счетчик в задаче.
.byte 1
FORG_VALUE_BUF: // Заданное значение в настройках.
.byte 1
Proc_Weld_Forg:
Proc_Timer Param_Timer_Weld // Таймер, шаг 100 мс.
sbrs r16,n_ST_TIME_OUT
ret
ldd r16,Y+DISP_FORG_TIMER // Счетчик
ldd r17,Y+DISP_FORG_VALUE_BUF // Заданное значение в настройках.
inc r16
std Y+DISP_FORG_TIMER,r16
cp r16,r17
brlo Proc_Weld_Forg_End
rcall LED1_OFF
ldd r16,Y+DISP_MODE_WELD_BUF
sbrs r16,n_MODE_WELD
rjmp Proc_Weld_Set_Wait_Run
ldd r16,Y+DISP_PAUSE_VALUE_BUF
cpi r16,0
breq Proc_Weld_Set_Wait_Run
Set_State _PROCESS_WELDING,_PROC_WELD_PAUSE
Proc_Weld_Forg_End:
ret
Param_Timer_Weld: // № в массиве, биты статуса, время таймера.
par_timer ST_PROC_WELD, 1<<ST_UNLOCK_FLG, ST_0_1_s