Hallo Martin,
schön, dass Du noch eine einfachere Lösung gefunden hast. Die Werte TMRx_internal kannte ich noch gar nicht.
Mit meinem Codebeispiel wollte ich Dir das architekturbedingte Verhalten der Timerregister demonstrieren. Und die Simulation verhält sich nunmal exakt wie der reale Prozessor. Intern verfügt der Timer immer über den korrekten Wert des High-Byte, dieser wird allerdings erst in den für den Benutzer sichtbaren Pufferregister kopiert, wenn man auf das low-byte des Timers zugreift.
Aus dem Datasheet, Chapter 12.2:
When the RD16 control bit
(T1CON<7>) is set, the address for TMR1H is mapped
to a buffer register for the high byte of Timer1. A read
from TMR1L will load the contents of the high byte of
Timer1 into the Timer1 high byte buffer. This provides
the user with the ability to accurately read all 16 bits of
Timer1 without having to determine whether a read of
the high byte, followed by a read of the low byte, has
become invalid due to a rollover between reads.
Gruß
Daniel