Precisão nas temporizações com uC

Faço pequenos projetos com uC. Como são pequenos, geralmente uso a linguagem assembler.
Quando envolvem algum cálculo, que eu não possa escolher uma solução mais simples, uso uma linguagem de mais alto nível, que a assembler.
Já fiz um frequencímetro com a linguagem assembler, em que o período de contagem dos pulsos é de 1 segundo, tal que este período é formado por EXATOS 5.000.000 de pulsos de um clock de um cristal de 20MHz / 4 = 5MHz.
Quando uso a programação em linguagem de mais alto nível, e auxiliado pelos temporizadores internos do uC, nunca descobri um modo de obter a precisão obtida com a linguagem assembler. Tem sempre uma interrupção, que degringola a precisão da medida.
Até aí tudo bem!
Agora vem a pergunta!
Como vocês fazem para obter uma grande precisão nas temporizações usadas em seus projetos?
MOR_AL
Quando envolvem algum cálculo, que eu não possa escolher uma solução mais simples, uso uma linguagem de mais alto nível, que a assembler.
Já fiz um frequencímetro com a linguagem assembler, em que o período de contagem dos pulsos é de 1 segundo, tal que este período é formado por EXATOS 5.000.000 de pulsos de um clock de um cristal de 20MHz / 4 = 5MHz.
Quando uso a programação em linguagem de mais alto nível, e auxiliado pelos temporizadores internos do uC, nunca descobri um modo de obter a precisão obtida com a linguagem assembler. Tem sempre uma interrupção, que degringola a precisão da medida.
Até aí tudo bem!
Agora vem a pergunta!
Como vocês fazem para obter uma grande precisão nas temporizações usadas em seus projetos?
MOR_AL