Hallo,
mit dem 16 Bit (2 Byte) Problem hatte ich auch zu kämpfen.
Das Problem tritt unter Umständen immer dann auf, wenn Der Zählerstand zum Beispiel grad auf 256 steht.
Dann ist das High Byte auf 1 und das Low Byte auf 0.

während jetzt das Low Byte abgefragt wird, welches im Moment noch 0 war, springt der Wert eins runter.
dadurch steht nun im Low Byte plötzlich 255 und im High Byte ein 0
Jenachdem, wie der C Compiler seinen Code erstellt hat, kommt dann sicher Blödsinn raus.

Da der PIC nicht 16 Bit direkt vergleichen kann, kommt es hier zu "Unannehmlichkeiten"
Er läd z.B den Wert den Highbytes. Dieser stand auf 1 (wegen dem Zählerstand 256)
durch einen erneuten Zählerwechsel steht aber nun das Lowbyte auf 255 und das High Byte auf 0
Nun erfolgt der Zugriff aufs Low Byte, welches plötzlich auf 255 steht. Das muss unweigerlich in die Hose gehen.

Ich habe meine 16 Bit Timer Null Abfrage zum Beispiel so gelöst:

Lade das Low Byte des Zählers
oderiere das High Byte des Zählers.
oderiere nun nochmal das Low Byte des Zählers.

Wenn jetzt 0 rauskommt, ist der Zähler wirklich auf 0. Selbst wenn innerhalb der Abfrage sich der Zählerstand per Interrupt geändert hat.
Das macht sich in Assembler recht einfach. In "C" hat man nicht so ohne weiteres Zugriff auf die einzelnen Bytes eines
16 Bit Wertes.

in Assembler würde es dann so aussehen:

; warte bis der 16 Bit Zählerwert, welcher im Interrupt runtergezählt wird, Null wird

WarteAufNull:
movf ZaehlerLowByte,W
iorwf ZaehlerHighByte,W
iorwf ZaehlerLowByte,W
btfss STATUS,Z
goto WarteAufNull


vielleicht kannst Du ja etwas damit anfangen.
mfg. Siro