Windell tiene razón, si está hablando de PIC, la hoja de datos (y el hardware) ya lo manejan por usted.
Si no estás usando un PIC, el método general que utilizo es hacer esto:
byte hi, lo;
word timer_value;
do {
hi = TIMER_HI;
lo = TIMER_LO;
} while(hi != TIMER_HI);
timer_value = (hi << 8) | lo;
Lo que esto hace es leer el byte superior seguido del byte inferior, y continuar haciéndolo hasta que el byte alto no cambie. Esto maneja fácilmente el caso donde el byte bajo del valor de 16 bits se desborda entre lecturas. Se supone, por supuesto, que no hay efectos secundarios al leer el registro TIMER_HI varias veces. Si su microprocesador en particular no lo permite, es hora de tirarlo y usar uno que no sea tan inteligente. :-)
Este método TAMBIÉN asume que su temporizador no está cambiando tan rápidamente que corre el riesgo de desbordar los 8 bits bajos dentro de un ciclo de recuperación de procesador o dos. Si está ejecutando un temporizador tan rápido (o un microprocesador tan lento), es hora de repensar su implementación.