Deka, весь вопрос в точности соблюдения времянок протокола. Если надо совсем-совсем точно - то запрещаете все ( прерывания) и по тактам выстраиваете протокол. Время исполнения протокола - любая ИДЕ покажет. Но если что-то нужно поменять - такая "пирамидка" рассыпается, и приходится ее строить заново. Если контроллер работает только с одним протоколом (устройством) - то такой подход понять можно, но если снаружи происходит еще несколько событий, на которые нужно реагировать - то в итоге вы их пропустите

Обычно жертвуют одним аппаратным таймером. Он в прерывании отмеряет время кратное всем процессам.
В алгоритме протокола - сравнивают текущее число сработок таймера и предыдущее, если настало время что-то делать - делаем, нет - дальше ожидаем. При этом процессор в состоянии реагировать на остальные внешние и внутренние раздражители. Небольшое "дрожание" времени в протоколе наблюдаться будет (например из-за заходы в прерывания), но это плата за то, что такая "пирамидка" не распадется при изменении кода.